Loading backend/src/route/dto/create-route-req.ts +10 −0 Original line number Diff line number Diff line Loading @@ -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; } backend/src/route/route.controller.ts +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'; Loading Loading @@ -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; } } } backend/src/route/route.service.ts +56 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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); } } Loading
backend/src/route/dto/create-route-req.ts +10 −0 Original line number Diff line number Diff line Loading @@ -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; }
backend/src/route/route.controller.ts +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'; Loading Loading @@ -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; } } }
backend/src/route/route.service.ts +56 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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); } }