From ee5964d9144101c894c5f07934c548641f9b7a2f Mon Sep 17 00:00:00 2001
From: Samuli Virtapohja <l4721@student.jamk.fi>
Date: Thu, 4 Jul 2019 13:00:21 +0300
Subject: [PATCH] tracking done, waiting timestamp confirmations

---
 src/tracking/tracking.controller.ts | 27 ++++++++++++++--
 src/tracking/tracking.dto.ts        |  6 ++++
 src/tracking/tracking.entity.ts     | 17 ++++++++++
 src/tracking/tracking.module.ts     |  6 +++-
 src/tracking/tracking.service.ts    | 48 ++++++++++++++++++++++++++++-
 5 files changed, 100 insertions(+), 4 deletions(-)
 create mode 100644 src/tracking/tracking.dto.ts
 create mode 100644 src/tracking/tracking.entity.ts

diff --git a/src/tracking/tracking.controller.ts b/src/tracking/tracking.controller.ts
index ef91aae..eaac10c 100644
--- a/src/tracking/tracking.controller.ts
+++ b/src/tracking/tracking.controller.ts
@@ -1,4 +1,27 @@
-import { Controller } from '@nestjs/common';
+import {
+  Controller,
+  Get,
+  Post,
+  Param,
+  UseGuards,
+  UsePipes,
+  Body,
+} from '@nestjs/common';
+import { TrackingService } from './tracking.service';
+import { Roles } from '../shared/roles.decorator';
+import { AuthGuard } from '../shared/auth.guard';
+import { ValidationPipe } from '../shared/validation.pipe';
+import { TrackingDTO } from './tracking.dto';
 
 @Controller('tracking')
-export class TrackingController {}
+export class TrackingController {
+  constructor(private trackingservice: TrackingService) {}
+
+  @Post('location/:id')
+  @UseGuards(new AuthGuard())
+  @UsePipes(new ValidationPipe())
+  @Roles('soldier')
+  async trackLocation(@Param('id') id, @Body() trackdata: TrackingDTO) {
+    return this.trackingservice.trackLocation(trackdata);
+  }
+}
diff --git a/src/tracking/tracking.dto.ts b/src/tracking/tracking.dto.ts
new file mode 100644
index 0000000..a84b324
--- /dev/null
+++ b/src/tracking/tracking.dto.ts
@@ -0,0 +1,6 @@
+import { Game_PersonEntity } from '../game/game.entity';
+
+export class TrackingDTO {
+  data: JSON;
+  gamepersonId: Game_PersonEntity;
+}
diff --git a/src/tracking/tracking.entity.ts b/src/tracking/tracking.entity.ts
new file mode 100644
index 0000000..c64f64f
--- /dev/null
+++ b/src/tracking/tracking.entity.ts
@@ -0,0 +1,17 @@
+import {
+  Entity,
+  PrimaryGeneratedColumn,
+  Column,
+  ManyToOne,
+  OneToOne,
+  JoinColumn,
+} from 'typeorm';
+import { Game_PersonEntity, GameEntity } from '../game/game.entity';
+
+@Entity('Tracking')
+export class TrackingEntity {
+  @PrimaryGeneratedColumn('uuid') id: string;
+  @Column({ type: 'json', nullable: true }) data: JSON;
+  @ManyToOne(type => Game_PersonEntity, person => person.gamepersonId)
+  gamepersonId: Game_PersonEntity;
+}
diff --git a/src/tracking/tracking.module.ts b/src/tracking/tracking.module.ts
index ccaf813..aaea41a 100644
--- a/src/tracking/tracking.module.ts
+++ b/src/tracking/tracking.module.ts
@@ -1,9 +1,13 @@
 import { Module } from '@nestjs/common';
 import { TrackingController } from './tracking.controller';
 import { TrackingService } from './tracking.service';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { Game_PersonEntity } from 'src/game/game.entity';
+import { TrackingEntity } from './tracking.entity';
 
 @Module({
+  imports: [TypeOrmModule.forFeature([TrackingEntity])],
   controllers: [TrackingController],
-  providers: [TrackingService]
+  providers: [TrackingService],
 })
 export class TrackingModule {}
diff --git a/src/tracking/tracking.service.ts b/src/tracking/tracking.service.ts
index d768c99..94eeeeb 100644
--- a/src/tracking/tracking.service.ts
+++ b/src/tracking/tracking.service.ts
@@ -1,4 +1,50 @@
 import { Injectable } from '@nestjs/common';
+import { Repository } from 'typeorm';
+import { Game_PersonEntity } from '../game/game.entity';
+import { InjectRepository } from '@nestjs/typeorm';
+import { TrackingEntity } from './tracking.entity';
+import { TrackingDTO } from './tracking.dto';
 
 @Injectable()
-export class TrackingService {}
+export class TrackingService {
+  constructor(
+    @InjectRepository(TrackingEntity)
+    private trackingrepository: Repository<TrackingEntity>,
+  ) {}
+
+  async trackLocation(trackdata: TrackingDTO) {
+    // find player
+    let trackedperson = await this.trackingrepository.findOne({
+      gamepersonId: trackdata.gamepersonId,
+    });
+
+    // if player has pushed tracking data, update entry
+    if (trackedperson) {
+      //add coordinates
+      trackedperson.data['geometry']['coordinates'].push(
+        await this.mapFunction(trackdata.data['geometry']['coordinates']),
+      );
+      //add timestamp
+      trackedperson.data['geometry']['properties']['time'].push(
+        new Date(Date.now()),
+      );
+
+      return await this.trackingrepository.save(trackedperson);
+    } else {
+      // first entry will be empty
+      // initialize coordinates
+      trackdata.data['geometry']['coordinates'] = [];
+      // initialize timestamp
+      trackdata.data['geometry']['properties']['time'] = [];
+      trackedperson = await this.trackingrepository.create(trackdata);
+
+      return await this.trackingrepository.save(trackedperson);
+    }
+  }
+
+  private async mapFunction(data): Promise<Number> {
+    return await data.map(type => {
+      return type;
+    });
+  }
+}
-- 
GitLab