diff --git a/src/draw/draw.service.ts b/src/draw/draw.service.ts index 97556e6e7282919465f76026163bf1649bf8f3d1..ffa48d4b634a35c6b0dc4bb26391d269c9f9b76a 100644 --- a/src/draw/draw.service.ts +++ b/src/draw/draw.service.ts @@ -18,7 +18,8 @@ export class DrawService { if (data.mapDrawingId == null || data.mapDrawingId == '') { // luo uuden instanssin. - return this.mapDrawingRepository.insert(drawing)[0]; + const mapDrawing = await this.mapDrawingRepository.insert(drawing); + return mapDrawing.identifiers; } else { //päivittää mapDrawingin return await this.mapDrawingRepository.save(drawing); diff --git a/src/tracking/tracking.controller.ts b/src/tracking/tracking.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..fdd8fb8609fa152cfd57b90d38e04f6183132a74 --- /dev/null +++ b/src/tracking/tracking.controller.ts @@ -0,0 +1,33 @@ +import { + Controller, + Post, + Param, + UseGuards, + UsePipes, + Body, +} from '@nestjs/common'; + +import { TrackingService } from './tracking.service'; +import { TrackingDTO } from './tracking.dto'; +import { User } from '../user/user.decorator'; +import { Roles, GameStates } from '../shared/guard.decorator'; +import { ValidationPipe } from '../shared/validation.pipe'; + +@Controller('tracking') +export class TrackingController { + constructor(private trackingservice: TrackingService) {} + + // inserts tracking data to the database + // :id is the id of the game + @Post('location/:id') + @Roles('soldier') + @GameStates('started') + @UsePipes(new ValidationPipe()) + async trackLocation( + @User('id') userId, + @Param('id') id, + @Body() trackdata: TrackingDTO, + ) { + return this.trackingservice.trackLocation(userId, id, trackdata); + } +} diff --git a/src/tracking/tracking.dto.ts b/src/tracking/tracking.dto.ts new file mode 100644 index 0000000000000000000000000000000000000000..8dc949c954931fb730a455ba2096f89fe9bb5fec --- /dev/null +++ b/src/tracking/tracking.dto.ts @@ -0,0 +1,8 @@ +import { Game_PersonEntity } from '../game/game.entity'; +import { Allow } from 'class-validator'; + +export class TrackingDTO { + @Allow() + data: JSON; + gamepersonId: Game_PersonEntity; +} diff --git a/src/tracking/tracking.entity.ts b/src/tracking/tracking.entity.ts new file mode 100644 index 0000000000000000000000000000000000000000..b31239101176a0316031cf6c1449205a26bcd150 --- /dev/null +++ b/src/tracking/tracking.entity.ts @@ -0,0 +1,10 @@ +import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from 'typeorm'; +import { Game_PersonEntity } 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 new file mode 100644 index 0000000000000000000000000000000000000000..45b167fc526ab41addbb87575518c9acae884482 --- /dev/null +++ b/src/tracking/tracking.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; + +import { TrackingController } from './tracking.controller'; +import { TrackingService } from './tracking.service'; +import { TrackingEntity } from './tracking.entity'; +import { Game_PersonEntity } from '../game/game.entity'; + +@Module({ + imports: [TypeOrmModule.forFeature([TrackingEntity, Game_PersonEntity])], + controllers: [TrackingController], + providers: [TrackingService], +}) +export class TrackingModule {} diff --git a/src/tracking/tracking.service.ts b/src/tracking/tracking.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..6dc01c1d9c6dbfcf7336750602d2c90c5092f81b --- /dev/null +++ b/src/tracking/tracking.service.ts @@ -0,0 +1,63 @@ +import { Injectable, HttpStatus, HttpException } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; + +import { Game_PersonEntity } from '../game/game.entity'; +import { TrackingEntity } from './tracking.entity'; +import { TrackingDTO } from './tracking.dto'; + +@Injectable() +export class TrackingService { + constructor( + @InjectRepository(TrackingEntity) + private trackingrepository: Repository<TrackingEntity>, + @InjectRepository(Game_PersonEntity) + private gamepersonrepository: Repository<Game_PersonEntity>, + ) {} + + async trackLocation(personId, gameId, trackdata: TrackingDTO) { + // find player + let gameperson = await this.gamepersonrepository.findOne({ + game: gameId, + person: personId, + }); + if (!gameperson) { + throw new HttpException( + 'You have not joined this game', + HttpStatus.BAD_REQUEST, + ); + } + let trackedperson = await this.trackingrepository.findOne({ + gamepersonId: gameperson, + }); + + // 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); + trackedperson.gamepersonId = gameperson; + return await this.trackingrepository.save(trackedperson); + } + } + + private async mapFunction(data): Promise<Number> { + return await data.map(type => { + return type; + }); + } +}