From e144ac5272dfe31984c4b0eebf7063ca03ed7b78 Mon Sep 17 00:00:00 2001 From: Samuli Virtapohja <l4721@student.jamk.fi> Date: Tue, 9 Jul 2019 13:34:21 +0300 Subject: [PATCH] reformat trackdata, change getplayers --- src/tracking/geo.dto.ts | 14 ++++++++++++++ src/tracking/tracking.controller.ts | 5 +++-- src/tracking/tracking.dto.ts | 10 ++++++---- src/tracking/tracking.entity.ts | 4 +++- src/tracking/tracking.service.ts | 29 +++++++++++++++-------------- 5 files changed, 41 insertions(+), 21 deletions(-) create mode 100644 src/tracking/geo.dto.ts diff --git a/src/tracking/geo.dto.ts b/src/tracking/geo.dto.ts new file mode 100644 index 0000000..352faf7 --- /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 35b4cdb..ca0e79e 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 8dc949c..81cc715 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 7af1ca4..c2699a0 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 532e7a7..9941256 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(), }; }), ); -- GitLab