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