diff --git a/src/tracking/geo.dto.ts b/src/tracking/geo.dto.ts new file mode 100644 index 0000000000000000000000000000000000000000..352faf704db72912a548734185d277253d67c789 --- /dev/null +++ b/src/tracking/geo.dto.ts @@ -0,0 +1,14 @@ +import { IsNumber, Min, Max, Allow } from 'class-validator'; + +export class GeoDTO { + @IsNumber() + @Min(-90) + @Max(90) + lat: number; + @IsNumber() + @Min(-180) + @Max(180) + lng: number; + @Allow() + time: number; +} diff --git a/src/tracking/tracking.controller.ts b/src/tracking/tracking.controller.ts index 35b4cdbc122e7cc52fa67f7b689bb1dfc6674a24..ca0e79ee5195503f61d827dbc170474e66fd1bad 100644 --- a/src/tracking/tracking.controller.ts +++ b/src/tracking/tracking.controller.ts @@ -13,6 +13,7 @@ import { TrackingDTO } from './tracking.dto'; import { User } from '../user/user.decorator'; import { Roles, GameStates } from '../shared/guard.decorator'; import { ValidationPipe } from '../shared/validation.pipe'; +import { GeoDTO } from './geo.dto'; @Controller('tracking') export class TrackingController { @@ -27,9 +28,9 @@ export class TrackingController { async trackLocation( @User('id') userId, @Param('id') id, - @Body() trackdata: TrackingDTO, + @Body() trackdata: GeoDTO, ) { - return this.trackingservice.trackLocation(userId, id, trackdata[0]); + return this.trackingservice.trackLocation(userId, id, trackdata); } @Get('players/:id') diff --git a/src/tracking/tracking.dto.ts b/src/tracking/tracking.dto.ts index 8dc949c954931fb730a455ba2096f89fe9bb5fec..81cc71597fa93910cb195b1fd4e30f38c62c1f05 100644 --- a/src/tracking/tracking.dto.ts +++ b/src/tracking/tracking.dto.ts @@ -1,8 +1,10 @@ import { Game_PersonEntity } from '../game/game.entity'; -import { Allow } from 'class-validator'; +import { Allow, ValidateNested } from 'class-validator'; +import { GeoDTO } from './geo.dto'; +import { Type } from 'class-transformer'; export class TrackingDTO { - @Allow() - data: JSON; - gamepersonId: Game_PersonEntity; + @ValidateNested() + @Type(() => GeoDTO) + data: GeoDTO; } diff --git a/src/tracking/tracking.entity.ts b/src/tracking/tracking.entity.ts index 7af1ca40806131b1a9517ae5489dc649184d56b4..c2699a09388ce8ad47c7119b46f4614fa52b34ec 100644 --- a/src/tracking/tracking.entity.ts +++ b/src/tracking/tracking.entity.ts @@ -1,11 +1,13 @@ import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from 'typeorm'; import { Game_PersonEntity, GameEntity } from '../game/game.entity'; import { FactionEntity } from 'src/faction/faction.entity'; +import { GeoDTO } from './geo.dto'; @Entity('Tracking') export class TrackingEntity { @PrimaryGeneratedColumn('uuid') id: string; - @Column({ type: 'json', nullable: true }) data: JSON; + @Column({ type: 'json', nullable: true }) data: GeoDTO[]; + @ManyToOne(type => Game_PersonEntity, person => person.gamepersonId, { onDelete: 'CASCADE', }) diff --git a/src/tracking/tracking.service.ts b/src/tracking/tracking.service.ts index 532e7a7193b99746badf58ac74d836bc402326c4..9941256dde52240d7c90b45d61b7b32ef4e1c242 100644 --- a/src/tracking/tracking.service.ts +++ b/src/tracking/tracking.service.ts @@ -6,6 +6,8 @@ import { Game_PersonEntity } from '../game/game.entity'; import { TrackingEntity } from './tracking.entity'; import { TrackingDTO } from './tracking.dto'; import { FactionEntity } from '../faction/faction.entity'; +import { NotificationGateway } from 'src/notifications/notifications.gateway'; +import { GeoDTO } from './geo.dto'; @Injectable() export class TrackingService { @@ -16,7 +18,7 @@ export class TrackingService { private gamepersonrepository: Repository<Game_PersonEntity>, ) {} - async trackLocation(personId, gameId, trackdata: TrackingDTO) { + async trackLocation(personId, gameId, trackdata: GeoDTO) { // find player let gameperson = await this.gamepersonrepository.findOne({ where: { game: gameId, person: personId }, @@ -34,25 +36,24 @@ export class TrackingService { // if player has pushed tracking data, update entry if (trackedperson) { + trackdata['time'] = Date.now(); //add coordinates - trackedperson.data['geometry']['coordinates'].push( - await this.mapFunction(trackdata.data['geometry']['coordinates']), - ); + trackedperson.data.push(trackdata); //add timestamp - trackedperson.data['properties']['time'].push(new Date(Date.now())); - - return await this.trackingrepository.save(trackedperson); + await this.trackingrepository.save(trackedperson); + return { code: 201, message: 'Location updated!' }; } else { // first entry will be empty - // initialize coordinates - trackdata.data['geometry']['coordinates'] = []; - // initialize timestamp - trackdata.data['properties']['time'] = []; - trackedperson = await this.trackingrepository.create(trackdata); + trackdata['time'] = Date.now(); + // initialize data + trackedperson = await this.trackingrepository.create(trackedperson); + trackedperson.data = [trackdata]; trackedperson.faction = gameperson.faction; trackedperson.game = gameId; trackedperson.gamepersonId = gameperson; - return await this.trackingrepository.save(trackedperson); + await this.trackingrepository.save(trackedperson); + + return { code: 201, message: 'Entry Created!' }; } } @@ -85,7 +86,7 @@ export class TrackingService { gamepersonId: player['gamepersonId']['gamepersonId'], gamepersonRole: player['gamepersonId']['role'], factionId: player['faction']['factionId'], - coordinates: player['data']['geometry']['coordinates'].pop(), + coordinates: player['data'].pop(), }; }), );