refactor : add concept module

This commit is contained in:
2024-12-31 14:16:10 +01:00
parent d968f7b7e6
commit 0500415252
19 changed files with 115 additions and 65 deletions
+1 -1
Submodule events updated: fc3f0e1677...1473c5c132
+1 -1
View File
@@ -9,12 +9,12 @@ import { Game } from './games/entities/game.entity';
import { Topic } from './word/entities/topic.entity'; import { Topic } from './word/entities/topic.entity';
import { Word } from './word/entities/word.entity'; import { Word } from './word/entities/word.entity';
import { Player } from './games/entities/player.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 { ConceptInTurn } from './games/entities/concept_in_turn.entity';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { WordModule } from './word/words.module'; import { WordModule } from './word/words.module';
import { Message } from './games/entities/message.entity'; import { Message } from './games/entities/message.entity';
import { LobbyModule } from './lobby/lobby.module'; import { LobbyModule } from './lobby/lobby.module';
import { Concept } from './concept/entities/concept.entity';
const configService = new ConfigService(); const configService = new ConfigService();
+11
View File
@@ -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 {}
+68
View File
@@ -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<Concept>,
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),
);
}
}
+14
View File
@@ -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;
}
+2 -1
View File
@@ -20,9 +20,10 @@ import { EventEmitter2 } from '@nestjs/event-emitter';
import { GameService } from '../services/games.service'; import { GameService } from '../services/games.service';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { SessionData } from 'express-session'; 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 { WordRecieveDTO } from 'src/word/dto/wordrecieve.dto';
import { LobbyService } from 'src/lobby/lobby.service'; import { LobbyService } from 'src/lobby/lobby.service';
import { WordResponseDTO } from 'events/dto/wordresponse.dto';
@ApiTags('game') @ApiTags('game')
@Controller('games/:id') @Controller('games/:id')
-21
View File
@@ -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;
}
+2 -11
View File
@@ -1,15 +1,6 @@
import { import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from 'typeorm';
Column,
Entity,
JoinTable,
ManyToOne,
OneToMany,
OneToOne,
PrimaryGeneratedColumn,
Unique,
} from 'typeorm';
import { Concept } from './concept.entity';
import { Game } from './game.entity'; import { Game } from './game.entity';
import { Concept } from 'src/concept/entities/concept.entity';
@Entity() @Entity()
export class ConceptInTurn { export class ConceptInTurn {
-2
View File
@@ -3,9 +3,7 @@ import {
Entity, Entity,
JoinColumn, JoinColumn,
ManyToOne, ManyToOne,
OneToMany,
PrimaryGeneratedColumn, PrimaryGeneratedColumn,
Unique,
} from 'typeorm'; } from 'typeorm';
import { Player } from './player.entity'; import { Player } from './player.entity';
-4
View File
@@ -3,12 +3,8 @@ import {
Column, Column,
Entity, Entity,
JoinColumn, JoinColumn,
JoinTable,
ManyToMany,
ManyToOne, ManyToOne,
OneToMany,
PrimaryGeneratedColumn, PrimaryGeneratedColumn,
Unique,
} from 'typeorm'; } from 'typeorm';
import { Game } from './game.entity'; import { Game } from './game.entity';
+1 -1
View File
@@ -12,7 +12,6 @@ import { EventEmitter2 } from '@nestjs/event-emitter';
import { Player } from '../entities/player.entity'; import { Player } from '../entities/player.entity';
import { User } from 'src/users/entities/user.entity'; import { User } from 'src/users/entities/user.entity';
import { WordService } from 'src/word/services/word.service';
import { import {
GameEndTurnEvent, GameEndTurnEvent,
GameMessageDeleteEvent, GameMessageDeleteEvent,
@@ -21,6 +20,7 @@ import {
} from 'events/game.events'; } from 'events/game.events';
import random from 'random'; import random from 'random';
import { Message } from '../entities/message.entity'; import { Message } from '../entities/message.entity';
import { WordService } from 'src/word/word.service';
@Injectable() @Injectable()
export class GameService { export class GameService {
-1
View File
@@ -5,7 +5,6 @@ import {
Param, Param,
Delete, Delete,
UseGuards, UseGuards,
Session,
HttpException, HttpException,
HttpStatus, HttpStatus,
Sse, Sse,
-1
View File
@@ -1,6 +1,5 @@
import { Module, forwardRef } from '@nestjs/common'; import { Module, forwardRef } from '@nestjs/common';
import { UsersModule } from 'src/users/users.module'; import { UsersModule } from 'src/users/users.module';
import { WordModule } from 'src/word/words.module';
import { LobbyController } from './lobby.controller'; import { LobbyController } from './lobby.controller';
import { LobbyService } from './lobby.service'; import { LobbyService } from './lobby.service';
import { GamesModule } from 'src/games/games.module'; import { GamesModule } from 'src/games/games.module';
+1 -1
View File
@@ -3,11 +3,11 @@ import { LobbyService } from './lobby.service';
import { TypeOrmModule } from '@nestjs/typeorm'; import { TypeOrmModule } from '@nestjs/typeorm';
import { EventEmitterModule } from '@nestjs/event-emitter'; import { EventEmitterModule } from '@nestjs/event-emitter';
import { User } from 'src/users/entities/user.entity'; 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 { ConceptInTurn } from '../games/entities/concept_in_turn.entity';
import { Game } from '../games/entities/game.entity'; import { Game } from '../games/entities/game.entity';
import { Player } from '../games/entities/player.entity'; import { Player } from '../games/entities/player.entity';
import { GameService } from '../games/services/games.service'; import { GameService } from '../games/services/games.service';
import { Concept } from 'src/concept/entities/concept.entity';
describe('LobbyService', () => { describe('LobbyService', () => {
let service: LobbyService; let service: LobbyService;
-1
View File
@@ -7,7 +7,6 @@ import {
HttpStatus, HttpStatus,
Redirect, Redirect,
Param, Param,
ParseIntPipe,
UseGuards, UseGuards,
} from '@nestjs/common'; } from '@nestjs/common';
import { UsersService } from './users.service'; import { UsersService } from './users.service';
+1 -1
View File
@@ -4,7 +4,7 @@ import {
Injectable, Injectable,
PipeTransform, PipeTransform,
} from '@nestjs/common'; } from '@nestjs/common';
import { WordService } from '../services/word.service'; import { WordService } from '../word.service';
@Injectable() @Injectable()
export class WordPipe implements PipeTransform { export class WordPipe implements PipeTransform {
@@ -13,17 +13,17 @@ import {
UseGuards, UseGuards,
} from '@nestjs/common'; } from '@nestjs/common';
import { WordService } from '../services/word.service';
import { ApiBody, ApiOperation, ApiTags } from '@nestjs/swagger'; import { ApiBody, ApiOperation, ApiTags } from '@nestjs/swagger';
import { AuthGuard } from 'src/users/guards/auth.guard'; import { AuthGuard } from 'src/users/guards/auth.guard';
import { WordResponseDTO } from '../../../events/dto/wordresponse.dto'; import { WordRecieveDTO } from './dto/wordrecieve.dto';
import { WordRecieveDTO } from '../dto/wordrecieve.dto'; import { WordPipe } from './pipe/word.pipe';
import { WordPipe } from '../pipe/word.pipe'; import { Word } from './entities/word.entity';
import { Word } from '../entities/word.entity';
import { GetUser } from 'src/users/user.pipe'; import { GetUser } from 'src/users/user.pipe';
import { User } from 'src/users/entities/user.entity'; import { User } from 'src/users/entities/user.entity';
import { fromEvent, map, Observable } from 'rxjs'; import { fromEvent, map, Observable } from 'rxjs';
import { EventEmitter2 } from '@nestjs/event-emitter'; import { EventEmitter2 } from '@nestjs/event-emitter';
import { WordService } from './word.service';
import { WordResponseDTO } from 'events/dto/wordresponse.dto';
@ApiTags('words') @ApiTags('words')
@Controller('words') @Controller('words')
@@ -1,21 +1,16 @@
import { import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
HttpCode,
HttpException,
HttpStatus,
Injectable,
} from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm'; import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm'; import { Repository } from 'typeorm';
import { Word } from '../entities/word.entity';
import { User } from 'src/users/entities/user.entity'; import { User } from 'src/users/entities/user.entity';
import { EventEmitter2 } from '@nestjs/event-emitter'; import { EventEmitter2 } from '@nestjs/event-emitter';
import { Word } from './entities/word.entity';
import { import {
WordCreateEvent,
WordDeleteEvent, WordDeleteEvent,
WordDisableEvent, WordCreateEvent,
WordEnableEvent, WordEnableEvent,
} from '../../../events/word.events'; WordDisableEvent,
import { HttpErrorByCode } from '@nestjs/common/utils/http-error-by-code.util'; } from 'events/word.events';
@Injectable() @Injectable()
export class WordService { export class WordService {
+2 -2
View File
@@ -2,9 +2,9 @@ import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm'; import { TypeOrmModule } from '@nestjs/typeorm';
import { Word } from './entities/word.entity'; import { Word } from './entities/word.entity';
import { WordController } from './controllers/word.controller'; import { WordController } from './word.controller';
import { WordService } from './services/word.service';
import { UsersModule } from 'src/users/users.module'; import { UsersModule } from 'src/users/users.module';
import { WordService } from './word.service';
@Module({ @Module({
imports: [UsersModule, TypeOrmModule.forFeature([Word])], imports: [UsersModule, TypeOrmModule.forFeature([Word])],