Commit 81f2692e authored by Lorenzo Trujillo Rojas's avatar Lorenzo Trujillo Rojas
Browse files

Merge branch 'main' into 'main'

generar custom ruta

See merge request !92
parents 19f2ab8e a9dd3958
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -7,3 +7,13 @@ export class CreateRouteReq {
  @ApiProperty({ name: 'end', type: Number })
  end: number;
}

export class CreateCustomRouteReq {
  @ApiProperty({ name: 'placesIds', type: [Number] })
  placesIds: number[];
  @ApiProperty({ name: 'start', type: Number })
  start: number;

  @ApiProperty({ name: 'end', type: Number })
  end: number;
}
+20 −2
Original line number Diff line number Diff line
import { Controller, Param, UseGuards, Req, Query, Body, Post, Get, Patch } from '@nestjs/common';
import { RouteService } from './route.service';
import { ApiBearerAuth, ApiBody, ApiParam, ApiQuery, ApiTags } from '@nestjs/swagger';
import { ApiBearerAuth, ApiBody, ApiOperation, ApiParam, ApiQuery, ApiTags } from '@nestjs/swagger';
import { LANGUAGES } from 'src/shared/enum/languages.enum';
import { AuthUserGuard } from 'src/auth/user/authUser.guard';
import { CustomUserRequest } from 'src/auth/user/interface/customUserReq';
import { CreateRouteReq } from './dto/create-route-req';
import { CreateCustomRouteReq, CreateRouteReq } from './dto/create-route-req';
import { RouteStatus } from './entities/route.entity';
import { UpdateRouteStatusDto } from './dto/updateRouteStatus.dto';

@@ -82,4 +82,22 @@ export class RouteController {
  async updateRoute(@Body() updateRouteStatusDto: UpdateRouteStatusDto, @Param('idRoute') idRoute: number) {
    return await this.routeService.updateRoute(idRoute, updateRouteStatusDto.status);
  }

  @Post('custom/:idTown/:lang')
  @ApiOperation({ summary: 'Create a custom route' })
  @ApiBearerAuth('jwt')
  @UseGuards(AuthUserGuard)
  async createCustomRoute(
    @Req() req: CustomUserRequest,
    @Body() createRouteReq: CreateCustomRouteReq,
    @Param('lang') lang: LANGUAGES,
  ) {
    try {
      const { email } = req.user;
      return await this.routeService.createCustomRoute(email, lang as LANGUAGES, createRouteReq);
    } catch (error) {
      console.log(error);
      return error;
    }
  }
}
+56 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@ import { CreateTravelPlaceDto } from 'src/travel-place/dto/create-travel-place.d
import { UserService } from 'src/user/user.service';
import { TravelPlace } from 'src/travel-place/entities/travel-place.entity';
import { ServerConstants } from 'src/constants/server.contants';
import { CreateCustomRouteReq } from './dto/create-route-req';

@Injectable()
export class RouteService {
@@ -179,4 +180,59 @@ export class RouteService {

    return res;
  }

  async createCustomRoute(email: string, lang: LANGUAGES, createRouteReq: CreateCustomRouteReq) {
    const { start, end, placesIds } = createRouteReq;
    if (placesIds.length === 0) return [];
    const place = await this.placeService.findOneAndTradAndAvailable(placesIds[0], lang);
    const user = await this.userService.findOne(email);

    const town: Town = await this.townRepository.findOneBy({ townId: place.idTown });

    const places = [];
    for (const idPlace of placesIds) {
      const place = await this.placeService.findOneAndTradAndAvailable(idPlace, lang);
      places.push(place);
    }
    const placesNotVisited: RecommendPlace[] = places.map((place: GetPlaceDto) => {
      return {
        idPlace: place.idPlace,
        openAt: place.openAt,
        closeAt: place.closeAt,
        categories: place.categories.map((category) => category.idCategory),
        rating: 0,
      };
    });

    const system = new RecommendationsSystem([], placesNotVisited, start, end);
    const chosen: RecommendPlace[] = system.recommend();
    const startDate: Date = new Date();
    startDate.setHours(start);
    const endDate = new Date();
    endDate.setHours(end);
    const createRouteDto: CreateRouteDto = { startDate, endDate, town, user };
    const idRoute = (await this.routeRepository.save(createRouteDto)).idRoute;

    for (const curRecommended of chosen) {
      const place = await this.placeService.findOneAndTradAndAvailable(curRecommended.idPlace, lang);
      const endDate = new Date();
      endDate.setHours(curRecommended.closeAt);
      endDate.setMinutes(0);
      const startDate = new Date();
      startDate.setHours(curRecommended.openAt);
      startDate.setMinutes(0);

      const createTravelPlace: CreateTravelPlaceDto = {
        ...place,
        done: false,
        idRoute,
        endDate,
        startDate,
      };

      await this.travelPlaceService.create(createTravelPlace);
    }

    return await this.getRouteById(idRoute, email, lang);
  }
}