From 54439b7eb36bdeee8a19c09bfe9575876bd9525e Mon Sep 17 00:00:00 2001 From: portable Date: Tue, 25 Feb 2025 07:11:44 +0100 Subject: [PATCH] "feat: game moode create, voting and share" --- backend/src/app.module.ts | 2 ++ .../src/game-mode/dto/create-game-mode.dto.ts | 20 +++++++++++++ .../src/game-mode/dto/update-game-mode.dto.ts | 4 +++ .../game-mode/entities/game-mode.entity.ts | 26 +++++++++++++++++ .../game-mode/game-mode.controller.spec.ts | 20 +++++++++++++ backend/src/game-mode/game-mode.controller.ts | 18 ++++++++++++ backend/src/game-mode/game-mode.module.ts | 9 ++++++ .../src/game-mode/game-mode.service.spec.ts | 18 ++++++++++++ backend/src/game-mode/game-mode.service.ts | 28 +++++++++++++++++++ 9 files changed, 145 insertions(+) create mode 100644 backend/src/game-mode/dto/create-game-mode.dto.ts create mode 100644 backend/src/game-mode/dto/update-game-mode.dto.ts create mode 100644 backend/src/game-mode/entities/game-mode.entity.ts create mode 100644 backend/src/game-mode/game-mode.controller.spec.ts create mode 100644 backend/src/game-mode/game-mode.controller.ts create mode 100644 backend/src/game-mode/game-mode.module.ts create mode 100644 backend/src/game-mode/game-mode.service.spec.ts create mode 100644 backend/src/game-mode/game-mode.service.ts diff --git a/backend/src/app.module.ts b/backend/src/app.module.ts index 91ffa5e5..f577799b 100644 --- a/backend/src/app.module.ts +++ b/backend/src/app.module.ts @@ -24,6 +24,7 @@ import { TournamentModule } from './tournament/tournament.module'; import { GameGateway } from './websocket-game comms/providers/gamegateway'; import { GameModule } from './websocket-game comms/game.module'; import { AchievementModule } from './achievement/achievement.module'; +import { GameModeModule } from './game-mode/game-mode.module'; import { SocialModule } from './social/social.module'; import { AchievementModule } from './achievement/achievement.module'; @@ -52,6 +53,7 @@ import { AchievementModule } from './achievement/achievement.module'; TournamentModule, AchievementModule, SocialModule, + GameModeModule, ], controllers: [AppController], providers: [ diff --git a/backend/src/game-mode/dto/create-game-mode.dto.ts b/backend/src/game-mode/dto/create-game-mode.dto.ts new file mode 100644 index 00000000..011496ee --- /dev/null +++ b/backend/src/game-mode/dto/create-game-mode.dto.ts @@ -0,0 +1,20 @@ +import { IsString, IsBoolean, IsObject, IsNotEmpty } from 'class-validator'; + +export class GameModeDto { + @IsString() + @IsNotEmpty() + name: string; + + @IsObject() + @IsNotEmpty() + rules: { + timeLimit: number; + pointSystem: Record; + powerUpsAllowed: string[]; + minimumPlayers: number; + specialConditions: string[]; + }; + + @IsBoolean() + isPublic: boolean; +} \ No newline at end of file diff --git a/backend/src/game-mode/dto/update-game-mode.dto.ts b/backend/src/game-mode/dto/update-game-mode.dto.ts new file mode 100644 index 00000000..a068c10c --- /dev/null +++ b/backend/src/game-mode/dto/update-game-mode.dto.ts @@ -0,0 +1,4 @@ +import { PartialType } from '@nestjs/swagger'; +import { CreateGameModeDto } from './create-game-mode.dto'; + +export class UpdateGameModeDto extends PartialType(CreateGameModeDto) {} diff --git a/backend/src/game-mode/entities/game-mode.entity.ts b/backend/src/game-mode/entities/game-mode.entity.ts new file mode 100644 index 00000000..70c5d3c9 --- /dev/null +++ b/backend/src/game-mode/entities/game-mode.entity.ts @@ -0,0 +1,26 @@ +import { User } from 'src/user/user.entity'; +import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from 'typeorm'; + +@Entity() +export class GameMode { + @PrimaryGeneratedColumn() + id: string; + + @Column() + name: string; + + @Column('json') + rules: { + timeLimit: number; + pointSystem: Record; + powerUpsAllowed: string[]; + minimumPlayers: number; + specialConditions: string[]; + }; + + @Column() + isPublic: boolean; + + @ManyToOne(() => User, (user) => user.gameModes) + creator: User; +} \ No newline at end of file diff --git a/backend/src/game-mode/game-mode.controller.spec.ts b/backend/src/game-mode/game-mode.controller.spec.ts new file mode 100644 index 00000000..35310a3f --- /dev/null +++ b/backend/src/game-mode/game-mode.controller.spec.ts @@ -0,0 +1,20 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { GameModeController } from './game-mode.controller'; +import { GameModeService } from './game-mode.service'; + +describe('GameModeController', () => { + let controller: GameModeController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [GameModeController], + providers: [GameModeService], + }).compile(); + + controller = module.get(GameModeController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/backend/src/game-mode/game-mode.controller.ts b/backend/src/game-mode/game-mode.controller.ts new file mode 100644 index 00000000..f8e56c78 --- /dev/null +++ b/backend/src/game-mode/game-mode.controller.ts @@ -0,0 +1,18 @@ +import { Controller, Get, Post, Body, Request} from '@nestjs/common'; +import { GameModeService } from './game-mode.service'; +import { GameModeDto } from './dto/create-game-mode.dto'; + +@Controller('game-mode') +export class GameModeController { + constructor(private readonly gameModeService: GameModeService) {} + + @Post() + async createGameMode(@Body() data: GameModeDto, @Request() req) { + return this.gameModeService.createGameMode(data, req.user); + } + + @Get() + async getAllGameModes() { + return this.gameModeService.getAllGameModes(); + } +} diff --git a/backend/src/game-mode/game-mode.module.ts b/backend/src/game-mode/game-mode.module.ts new file mode 100644 index 00000000..4f449f8f --- /dev/null +++ b/backend/src/game-mode/game-mode.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { GameModeService } from './game-mode.service'; +import { GameModeController } from './game-mode.controller'; + +@Module({ + controllers: [GameModeController], + providers: [GameModeService], +}) +export class GameModeModule {} diff --git a/backend/src/game-mode/game-mode.service.spec.ts b/backend/src/game-mode/game-mode.service.spec.ts new file mode 100644 index 00000000..a4f66d68 --- /dev/null +++ b/backend/src/game-mode/game-mode.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { GameModeService } from './game-mode.service'; + +describe('GameModeService', () => { + let service: GameModeService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [GameModeService], + }).compile(); + + service = module.get(GameModeService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/backend/src/game-mode/game-mode.service.ts b/backend/src/game-mode/game-mode.service.ts new file mode 100644 index 00000000..6c31c60d --- /dev/null +++ b/backend/src/game-mode/game-mode.service.ts @@ -0,0 +1,28 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { User } from 'src/user/user.entity'; +import { Repository } from 'typeorm'; +import { GameModeDto } from './dto/create-game-mode.dto'; +import { GameMode } from './entities/game-mode.entity'; + + +@Injectable() +export class GameModeService { + constructor( + @InjectRepository(GameMode) + private gameModeRepository: Repository + ) {} + + async createGameMode(data: GameModeDto, user: User) { + const gameMode = this.gameModeRepository.create({ ...data, creator: user }); + return this.gameModeRepository.save(gameMode); + } + + async getAllGameModes() { + return this.gameModeRepository.find({ relations: ['creator'] }); + } + + async upvoteGameMode(id: string) { + return this.gameModeRepository.increment({ id }, 'votes', 1); + } +} \ No newline at end of file