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