diff --git a/src/app.module.ts b/src/app.module.ts index 738a6c116590f6bd236f94f89030749a1905ac12..dbb03cf7baa35d2d4deafdbff6ba67bd64381c92 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -2,7 +2,6 @@ import { Module } from '@nestjs/common'; import { APP_FILTER, APP_INTERCEPTOR, APP_GUARD } from '@nestjs/core'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Connection } from 'typeorm'; - import { AppController } from './app.controller'; import { AppService } from './app.service'; import { UserModule } from './user/user.module'; @@ -14,6 +13,8 @@ import { RolesGuard } from './shared/roles.guard'; import { TaskModule } from './task/task.module'; import { DrawModule } from './draw/draw.module'; import { FactionModule } from './faction/faction.module'; +import { TrackingModule } from './tracking/tracking.module'; + @Module({ imports: [ @@ -24,6 +25,7 @@ import { FactionModule } from './faction/faction.module'; TaskModule, DrawModule, FactionModule, + TrackingModule, ], controllers: [AppController], providers: [ diff --git a/src/draw/draw.service.ts b/src/draw/draw.service.ts index 97556e6e7282919465f76026163bf1649bf8f3d1..e3b62b5132223f466fa94661d4748b3f7cd497f5 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..140b51e0ce816c2ac5c8b2b11ced8eee2b7d869f --- /dev/null +++ b/src/tracking/tracking.controller.ts @@ -0,0 +1,32 @@ +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'; +import { User } from 'src/user/user.decorator'; + +@Controller('tracking') +export class TrackingController { + constructor(private trackingservice: TrackingService) {} + + @Post('location/:id') + @UseGuards(new AuthGuard()) + @UsePipes(new ValidationPipe()) + @Roles('soldier') + 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..a84b324791d5e0e4f35add430d24cce2e3016278 --- /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 0000000000000000000000000000000000000000..c64f64f1bb90a8f7cbcb662956f883f895f17221 --- /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 new file mode 100644 index 0000000000000000000000000000000000000000..a6f3ff1734adba3435360213c13cf024fe3cb288 --- /dev/null +++ b/src/tracking/tracking.module.ts @@ -0,0 +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, 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..06f665c4f8471c0863ab8c22da34c0fa9fb9d36b --- /dev/null +++ b/src/tracking/tracking.service.ts @@ -0,0 +1,62 @@ +import { Injectable, HttpStatus, HttpException } 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 { + 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; + }); + } +}