Skip to content
Snippets Groups Projects
game.controller.ts 3.97 KiB
Newer Older
Samuli Virtapohja's avatar
Samuli Virtapohja committed
import {
  Controller,
  Post,
  UseGuards,
  Body,
  Get,
  Param,
  UsePipes,
  Put,
L4168's avatar
L4168 committed
  UseInterceptors,
  ClassSerializerInterceptor,
Ronnie Friman's avatar
Ronnie Friman committed
  Delete,
Ronnie Friman's avatar
Ronnie Friman committed
  UploadedFile,
L4168's avatar
L4168 committed
  Res,
Samuli Virtapohja's avatar
Samuli Virtapohja committed
} from '@nestjs/common';
Ronnie Friman's avatar
Ronnie Friman committed
import { FileInterceptor } from '@nestjs/platform-express';
import { diskStorage } from 'multer';
import { extname } from 'path';
import { GameService } from './game.service';
L4168's avatar
L4168 committed
import { AuthGuard } from '../shared/auth.guard';
import { User } from '../user/user.decorator';
Ronnie Friman's avatar
Ronnie Friman committed
import { GameDTO, FlagboxEventDTO, GameStateDTO, newGameDTO } from './game.dto';
import { ValidationPipe } from '../shared/validation.pipe';
import { Roles, GameStates } from '../shared/guard.decorator';
L4168's avatar
L4168 committed
import { GameEntity } from './game.entity';
L4072's avatar
L4072 committed
/////////////////////////////////////////////////////////////////////////
///     GameController                                                ///
///                                                                   ///
///     Functions for creating, editing, deleting and listing games.  ///
///     Also there are functions to get objective point info and list ///
///     of Factions in game                                           ///
///                                                                   ///
/////////////////////////////////////////////////////////////////////////

@Controller('game')
export class GameController {
Samuli Virtapohja's avatar
Samuli Virtapohja committed
  constructor(private gameservice: GameService) {}
Samuli Virtapohja's avatar
Samuli Virtapohja committed
  @Post('new')
  @UseGuards(new AuthGuard())
  @UsePipes(new ValidationPipe())
Ronnie Friman's avatar
Ronnie Friman committed
  async newGame(@User('id') person, @Body() body: newGameDTO) {
Samuli Virtapohja's avatar
Samuli Virtapohja committed
    return this.gameservice.createNewGame(person, body);
  }
L4168's avatar
L4168 committed
  @Put('edit/:id')
Samuli Virtapohja's avatar
Samuli Virtapohja committed
  @Roles('admin')
  @GameStates('CREATED')
Samuli Virtapohja's avatar
Samuli Virtapohja committed
  @UsePipes(new ValidationPipe())
  async editGame(@Param('id') id: string, @Body() body: GameDTO) {
L4168's avatar
L4168 committed
    body.id = id;
Samuli Virtapohja's avatar
Samuli Virtapohja committed
    return this.gameservice.editGame(id, body);
  }
Ronnie Friman's avatar
Ronnie Friman committed
  @Delete('delete/:id')
  @Roles('admin')
  @GameStates('CREATED')
  async deleteGame(@Param('id') id: string) {
    return this.gameservice.deleteGame(id);
  }

  @Put('edit-state/:id')
  @Roles('admin')
  @UsePipes(new ValidationPipe())
  async updateGameState(@Param('id') id: string, @Body() body: GameStateDTO) {
    return this.gameservice.updateGameStatus(body);
  }

Samuli Virtapohja's avatar
Samuli Virtapohja committed
  @Get('listgames')
  async listGames(state) {
    return this.gameservice.listGames(state);
  }

  @Get('listgames/:state')
  async listGamesState(@Param('state') state: string) {
    return this.gameservice.listGames(state);
L4168's avatar
L4168 committed
  // ClassSerializerInterceptor removes excluded columns set in Entities
  @UseInterceptors(ClassSerializerInterceptor)
Samuli Virtapohja's avatar
Samuli Virtapohja committed
  @Get(':id')
  async returnGameInfo(@Param('id') id: string) {
    return this.gameservice.returnGameInfo(id);
  }
L4168's avatar
L4168 committed

L4168's avatar
L4168 committed
  @Get('get-factions/:id')
  @Roles('admin')
  async returnGameFactions(@Param('id') id: GameEntity) {
    return this.gameservice.listFactions(id);
  }

Ronnie Friman's avatar
Ronnie Friman committed
  @Get('flag-events/:id')
  async returnFlagboxInfo(@Param('id') id: GameEntity) {
    return this.gameservice.returnObjectivePointInfo(id);
  }

L4168's avatar
L4168 committed
  @Get('flag/:id')
  async flagboxQuery(@Param('id') id: string) {
L4168's avatar
L4168 committed
    return this.gameservice.flagboxQuery(id);
L4168's avatar
L4168 committed
  }

  @Post('flag/:id')
L4168's avatar
L4168 committed
  @GameStates('STARTED')
L4168's avatar
L4168 committed
  async flagboxEvent(@Param('id') id: string, @Body() data: FlagboxEventDTO) {
    return this.gameservice.flagboxEvent(id, data);
L4168's avatar
L4168 committed
  }
Ronnie Friman's avatar
Ronnie Friman committed

  @Post('upload')
  @UseInterceptors(
    FileInterceptor('image', {
      storage: diskStorage({
        destination: './images',
        filename: (req, file, cb) => {
          // Generating a 32 random chars long string
          const randomName = Array(32)
            .fill(null)
            .map(() => Math.round(Math.random() * 16).toString(16))
            .join('');
          //Calling the callback passing the random name generated with the original extension name
          cb(null, `${randomName}${extname(file.originalname)}`);
        },
      }),
    }),
  )
  uploadImage(@UploadedFile() image) {
    return image;
  }
L4168's avatar
L4168 committed

  @Get('images/:img')
  returnImage(@Param('img') image, @Res() res) {
    return res.sendFile(image, { root: 'images' });
  }