diff --git a/events b/events index fc3f0e1..1473c5c 160000 --- a/events +++ b/events @@ -1 +1 @@ -Subproject commit fc3f0e1677d2e503dc0b198659e820e092cc654d +Subproject commit 1473c5c1326a7b5915741973a09f0a0b35a2f641 diff --git a/src/app.module.ts b/src/app.module.ts index a86bec3..e769b4e 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -9,12 +9,12 @@ import { Game } from './games/entities/game.entity'; import { Topic } from './word/entities/topic.entity'; import { Word } from './word/entities/word.entity'; import { Player } from './games/entities/player.entity'; -import { Concept } from './games/entities/concept.entity'; import { ConceptInTurn } from './games/entities/concept_in_turn.entity'; import { ConfigService } from '@nestjs/config'; import { WordModule } from './word/words.module'; import { Message } from './games/entities/message.entity'; import { LobbyModule } from './lobby/lobby.module'; +import { Concept } from './concept/entities/concept.entity'; const configService = new ConfigService(); diff --git a/src/concept/concept.module.ts b/src/concept/concept.module.ts new file mode 100644 index 0000000..2b9f2be --- /dev/null +++ b/src/concept/concept.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; + +import { TypeOrmModule } from '@nestjs/typeorm'; + +import { UsersModule } from 'src/users/users.module'; +import { Concept } from './entities/concept.entity'; + +@Module({ + imports: [UsersModule, TypeOrmModule.forFeature([Concept])], +}) +export class ConceptModule {} diff --git a/src/concept/concept.service.ts b/src/concept/concept.service.ts new file mode 100644 index 0000000..8b28e53 --- /dev/null +++ b/src/concept/concept.service.ts @@ -0,0 +1,68 @@ +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; + +import { EventEmitter2 } from '@nestjs/event-emitter'; +import { Concept } from './entities/concept.entity'; +import { + ConceptDeleteEvent, + ConceptCreateEvent, + ConceptEnableEvent, + ConceptDisableEvent, +} from 'events/concept.events'; + +@Injectable() +export class WordService { + sse_prefix = 'sse.concept'; + constructor( + @InjectRepository(Concept) private conceptRepository: Repository, + private eventEmitter: EventEmitter2, + ) {} + + async getById(id: number) { + return await this.conceptRepository.findOneBy({ id }); + } + + async delete(concept: Concept) { + const conceptId = concept.id; + await this.conceptRepository.remove(concept); + this.eventEmitter.emit(this.sse_prefix, new ConceptDeleteEvent(conceptId)); + } + + async create(value: string, image: string) { + const concept = this.conceptRepository.create(); + concept.value = value; + try { + await this.conceptRepository.save(concept); + this.eventEmitter.emit(this.sse_prefix, new ConceptCreateEvent(concept)); + return concept; + } catch { + throw new HttpException('Concept already exists', HttpStatus.CONFLICT); + } + } + + async listActive() { + const words = await this.conceptRepository.findBy({ enabled: true }); + return words; + } + + async list() { + const words = await this.conceptRepository.find(); + return words; + } + + async enable(concept: Concept) { + concept.enabled = true; + await this.conceptRepository.save(concept); + this.eventEmitter.emit(this.sse_prefix, new ConceptEnableEvent(concept.id)); + } + + async disable(concept: Concept) { + concept.enabled = false; + await this.conceptRepository.save(concept); + this.eventEmitter.emit( + this.sse_prefix, + new ConceptDisableEvent(concept.id), + ); + } +} diff --git a/src/concept/entities/concept.entity.ts b/src/concept/entities/concept.entity.ts new file mode 100644 index 0000000..29cfd97 --- /dev/null +++ b/src/concept/entities/concept.entity.ts @@ -0,0 +1,14 @@ +import { Column, Entity, PrimaryGeneratedColumn, Unique } from 'typeorm'; + +@Entity() +@Unique(['value']) +export class Concept { + @PrimaryGeneratedColumn() + id: number; + + @Column() + value: string; + + @Column({ default: false }) + enabled: boolean; +} diff --git a/src/games/controllers/games.controller.ts b/src/games/controllers/games.controller.ts index fd4ca77..e65cdf6 100644 --- a/src/games/controllers/games.controller.ts +++ b/src/games/controllers/games.controller.ts @@ -20,9 +20,10 @@ import { EventEmitter2 } from '@nestjs/event-emitter'; import { GameService } from '../services/games.service'; import { ConfigService } from '@nestjs/config'; import { SessionData } from 'express-session'; -import { WordResponseDTO } from 'events/dto/wordresponse.dto'; +// import { WordResponseDTO } from 'events/dto/wordresponse.dto'; import { WordRecieveDTO } from 'src/word/dto/wordrecieve.dto'; import { LobbyService } from 'src/lobby/lobby.service'; +import { WordResponseDTO } from 'events/dto/wordresponse.dto'; @ApiTags('game') @Controller('games/:id') diff --git a/src/games/entities/concept.entity.ts b/src/games/entities/concept.entity.ts deleted file mode 100644 index a929071..0000000 --- a/src/games/entities/concept.entity.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { - Column, - Entity, - JoinTable, - ManyToOne, - OneToMany, - OneToOne, - PrimaryGeneratedColumn, - Unique, -} from 'typeorm'; -import { Player } from './player.entity'; - -@Entity() -@Unique(['value']) -export class Concept { - @PrimaryGeneratedColumn() - id: number; - - @Column() - value: string; -} diff --git a/src/games/entities/concept_in_turn.entity.ts b/src/games/entities/concept_in_turn.entity.ts index 40b7eab..cb8bd85 100644 --- a/src/games/entities/concept_in_turn.entity.ts +++ b/src/games/entities/concept_in_turn.entity.ts @@ -1,15 +1,6 @@ -import { - Column, - Entity, - JoinTable, - ManyToOne, - OneToMany, - OneToOne, - PrimaryGeneratedColumn, - Unique, -} from 'typeorm'; -import { Concept } from './concept.entity'; +import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'; import { Game } from './game.entity'; +import { Concept } from 'src/concept/entities/concept.entity'; @Entity() export class ConceptInTurn { diff --git a/src/games/entities/message.entity.ts b/src/games/entities/message.entity.ts index d6f4be5..173c85d 100644 --- a/src/games/entities/message.entity.ts +++ b/src/games/entities/message.entity.ts @@ -3,9 +3,7 @@ import { Entity, JoinColumn, ManyToOne, - OneToMany, PrimaryGeneratedColumn, - Unique, } from 'typeorm'; import { Player } from './player.entity'; diff --git a/src/games/entities/player.entity.ts b/src/games/entities/player.entity.ts index eecee01..d76ed54 100644 --- a/src/games/entities/player.entity.ts +++ b/src/games/entities/player.entity.ts @@ -3,12 +3,8 @@ import { Column, Entity, JoinColumn, - JoinTable, - ManyToMany, ManyToOne, - OneToMany, PrimaryGeneratedColumn, - Unique, } from 'typeorm'; import { Game } from './game.entity'; diff --git a/src/games/services/games.service.ts b/src/games/services/games.service.ts index f87e69f..aadbf5e 100644 --- a/src/games/services/games.service.ts +++ b/src/games/services/games.service.ts @@ -12,7 +12,6 @@ import { EventEmitter2 } from '@nestjs/event-emitter'; import { Player } from '../entities/player.entity'; import { User } from 'src/users/entities/user.entity'; -import { WordService } from 'src/word/services/word.service'; import { GameEndTurnEvent, GameMessageDeleteEvent, @@ -21,6 +20,7 @@ import { } from 'events/game.events'; import random from 'random'; import { Message } from '../entities/message.entity'; +import { WordService } from 'src/word/word.service'; @Injectable() export class GameService { diff --git a/src/lobby/lobby.controller.ts b/src/lobby/lobby.controller.ts index 6be8688..aa61eb7 100644 --- a/src/lobby/lobby.controller.ts +++ b/src/lobby/lobby.controller.ts @@ -5,7 +5,6 @@ import { Param, Delete, UseGuards, - Session, HttpException, HttpStatus, Sse, diff --git a/src/lobby/lobby.module.ts b/src/lobby/lobby.module.ts index 0db9518..aa151d4 100644 --- a/src/lobby/lobby.module.ts +++ b/src/lobby/lobby.module.ts @@ -1,6 +1,5 @@ import { Module, forwardRef } from '@nestjs/common'; import { UsersModule } from 'src/users/users.module'; -import { WordModule } from 'src/word/words.module'; import { LobbyController } from './lobby.controller'; import { LobbyService } from './lobby.service'; import { GamesModule } from 'src/games/games.module'; diff --git a/src/lobby/lobby.service.spec.ts b/src/lobby/lobby.service.spec.ts index 7aafd97..4f70d52 100644 --- a/src/lobby/lobby.service.spec.ts +++ b/src/lobby/lobby.service.spec.ts @@ -3,11 +3,11 @@ import { LobbyService } from './lobby.service'; import { TypeOrmModule } from '@nestjs/typeorm'; import { EventEmitterModule } from '@nestjs/event-emitter'; import { User } from 'src/users/entities/user.entity'; -import { Concept } from '../games/entities/concept.entity'; import { ConceptInTurn } from '../games/entities/concept_in_turn.entity'; import { Game } from '../games/entities/game.entity'; import { Player } from '../games/entities/player.entity'; import { GameService } from '../games/services/games.service'; +import { Concept } from 'src/concept/entities/concept.entity'; describe('LobbyService', () => { let service: LobbyService; diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index 3a57cc4..e9a2d18 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -7,7 +7,6 @@ import { HttpStatus, Redirect, Param, - ParseIntPipe, UseGuards, } from '@nestjs/common'; import { UsersService } from './users.service'; diff --git a/src/word/pipe/word.pipe.ts b/src/word/pipe/word.pipe.ts index f5f5e78..a20dfc8 100644 --- a/src/word/pipe/word.pipe.ts +++ b/src/word/pipe/word.pipe.ts @@ -4,7 +4,7 @@ import { Injectable, PipeTransform, } from '@nestjs/common'; -import { WordService } from '../services/word.service'; +import { WordService } from '../word.service'; @Injectable() export class WordPipe implements PipeTransform { diff --git a/src/word/controllers/word.controller.ts b/src/word/word.controller.ts similarity index 89% rename from src/word/controllers/word.controller.ts rename to src/word/word.controller.ts index bff0d8c..52653d0 100644 --- a/src/word/controllers/word.controller.ts +++ b/src/word/word.controller.ts @@ -13,17 +13,17 @@ import { UseGuards, } from '@nestjs/common'; -import { WordService } from '../services/word.service'; import { ApiBody, ApiOperation, ApiTags } from '@nestjs/swagger'; import { AuthGuard } from 'src/users/guards/auth.guard'; -import { WordResponseDTO } from '../../../events/dto/wordresponse.dto'; -import { WordRecieveDTO } from '../dto/wordrecieve.dto'; -import { WordPipe } from '../pipe/word.pipe'; -import { Word } from '../entities/word.entity'; +import { WordRecieveDTO } from './dto/wordrecieve.dto'; +import { WordPipe } from './pipe/word.pipe'; +import { Word } from './entities/word.entity'; import { GetUser } from 'src/users/user.pipe'; import { User } from 'src/users/entities/user.entity'; import { fromEvent, map, Observable } from 'rxjs'; import { EventEmitter2 } from '@nestjs/event-emitter'; +import { WordService } from './word.service'; +import { WordResponseDTO } from 'events/dto/wordresponse.dto'; @ApiTags('words') @Controller('words') diff --git a/src/word/services/word.service.ts b/src/word/word.service.ts similarity index 87% rename from src/word/services/word.service.ts rename to src/word/word.service.ts index bc822fe..fc89aba 100644 --- a/src/word/services/word.service.ts +++ b/src/word/word.service.ts @@ -1,21 +1,16 @@ -import { - HttpCode, - HttpException, - HttpStatus, - Injectable, -} from '@nestjs/common'; +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; -import { Word } from '../entities/word.entity'; + import { User } from 'src/users/entities/user.entity'; import { EventEmitter2 } from '@nestjs/event-emitter'; +import { Word } from './entities/word.entity'; import { - WordCreateEvent, WordDeleteEvent, - WordDisableEvent, + WordCreateEvent, WordEnableEvent, -} from '../../../events/word.events'; -import { HttpErrorByCode } from '@nestjs/common/utils/http-error-by-code.util'; + WordDisableEvent, +} from 'events/word.events'; @Injectable() export class WordService { diff --git a/src/word/words.module.ts b/src/word/words.module.ts index 2deb75d..9a7cf28 100644 --- a/src/word/words.module.ts +++ b/src/word/words.module.ts @@ -2,9 +2,9 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Word } from './entities/word.entity'; -import { WordController } from './controllers/word.controller'; -import { WordService } from './services/word.service'; +import { WordController } from './word.controller'; import { UsersModule } from 'src/users/users.module'; +import { WordService } from './word.service'; @Module({ imports: [UsersModule, TypeOrmModule.forFeature([Word])],