diff --git a/.vscode/settings.json b/.vscode/settings.json index 66f850b..3cc4817 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,5 +9,9 @@ "eslint.useFlatConfig": true, "[json]": { "editor.defaultFormatter": "vscode.json-language-features" + }, + "files.exclude": { + "**/dist": true, + "**/node_modules": true } } diff --git a/eslint.config.mjs b/eslint.config.mjs index 4bffc4c..e1ec0b4 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,3 +1,6 @@ +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ +/* eslint-disable @typescript-eslint/no-unsafe-call */ +/* eslint-disable @typescript-eslint/no-unsafe-assignment */ import typescriptEslintEslintPlugin from '@typescript-eslint/eslint-plugin'; import globals from 'globals'; import tsParser from '@typescript-eslint/parser'; @@ -39,7 +42,7 @@ export default [ parserOptions: { project: 'tsconfig.json', - tsconfigRootDir: '/home/legonzaur/Documents/code/concept/back', + tsconfigRootDir: __dirname, }, }, diff --git a/events b/events index 1473c5c..a99853f 160000 --- a/events +++ b/events @@ -1 +1 @@ -Subproject commit 1473c5c1326a7b5915741973a09f0a0b35a2f641 +Subproject commit a99853f417ff81ec1e879aa2a91fde6e9708646f diff --git a/src/concept/concept.controller.ts b/src/concept/concept.controller.ts index 70bd353..ab1d968 100644 --- a/src/concept/concept.controller.ts +++ b/src/concept/concept.controller.ts @@ -23,7 +23,10 @@ import { ConceptService } from './concept.service'; import { Concept } from './entities/concept.entity'; import { ConceptPipe } from './concept.pipe'; import { ConceptRecieveDTO } from './dto/conceptrecieve.dto'; -import { ConceptResponseDTO } from 'events/dto/conceptresponse.dto'; +import { + ConceptResponseDTO, + ConceptTypeResponseDTO, +} from 'events/dto/conceptresponse.dto'; @ApiTags('concepts') @Controller('concepts') @@ -72,6 +75,14 @@ export class ConceptController { ); } + @Get('/types') + @ApiOperation({ summary: 'List concept types' }) + async readTypes() { + return (await this.conceptService.listTypes()).map( + (w) => new ConceptTypeResponseDTO(w), + ); + } + @Get('/all') @ApiOperation({ summary: 'List all concepts' }) async readAll() { diff --git a/src/concept/concept.module.ts b/src/concept/concept.module.ts index 96985d1..c07bd65 100644 --- a/src/concept/concept.module.ts +++ b/src/concept/concept.module.ts @@ -6,9 +6,10 @@ import { UsersModule } from 'src/users/users.module'; import { Concept } from './entities/concept.entity'; import { ConceptService } from './concept.service'; import { ConceptController } from './concept.controller'; +import { ConceptType } from './entities/concepttype.entity'; @Module({ - imports: [UsersModule, TypeOrmModule.forFeature([Concept])], + imports: [UsersModule, TypeOrmModule.forFeature([Concept, ConceptType])], providers: [ConceptService], controllers: [ConceptController], }) diff --git a/src/concept/concept.seed.json b/src/concept/concept.seed.json new file mode 100644 index 0000000..f5216be --- /dev/null +++ b/src/concept/concept.seed.json @@ -0,0 +1,22 @@ +[ + { + "id": 1, + "value": "type" + }, + { + "id": 2, + "value": "subtype" + }, + { + "id": 3, + "value": "material" + }, + { + "id": 4, + "value": "shape" + }, + { + "id": 5, + "value": "color" + } +] \ No newline at end of file diff --git a/src/concept/concept.service.ts b/src/concept/concept.service.ts index 8dc9dc8..3c19929 100644 --- a/src/concept/concept.service.ts +++ b/src/concept/concept.service.ts @@ -1,6 +1,6 @@ import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; +import { DeepPartial, Repository } from 'typeorm'; import { EventEmitter2 } from '@nestjs/event-emitter'; import { Concept } from './entities/concept.entity'; @@ -10,14 +10,21 @@ import { ConceptEnableEvent, ConceptDisableEvent, } from 'events/concept.events'; +import { ConceptType } from './entities/concepttype.entity'; + +import typeSeeds from './concept.seed.json'; @Injectable() export class ConceptService { sse_prefix = 'sse.concept'; constructor( @InjectRepository(Concept) private conceptRepository: Repository, + @InjectRepository(ConceptType) + private conceptTypeRepository: Repository, private eventEmitter: EventEmitter2, - ) {} + ) { + void conceptTypeRepository.save(typeSeeds as DeepPartial[]); + } async getById(id: number) { return await this.conceptRepository.findOneBy({ id }); @@ -31,7 +38,11 @@ export class ConceptService { async create(value: string, image: string) { const concept = this.conceptRepository.create(); + const conceptType = await this.conceptTypeRepository.findOneByOrFail({ + id: 1, + }); concept.value = value; + concept.type = conceptType; try { await this.conceptRepository.save(concept); this.eventEmitter.emit(this.sse_prefix, new ConceptCreateEvent(concept)); @@ -46,6 +57,10 @@ export class ConceptService { return concepts; } + async listTypes() { + return await this.conceptTypeRepository.find(); + } + async list() { const concepts = await this.conceptRepository.find(); return concepts; diff --git a/src/concept/entities/concept.entity.ts b/src/concept/entities/concept.entity.ts index 4597a1c..8946793 100644 --- a/src/concept/entities/concept.entity.ts +++ b/src/concept/entities/concept.entity.ts @@ -21,7 +21,7 @@ export class Concept { @ManyToOne(() => ConceptType, { eager: true, - nullable: true, + nullable: false, onDelete: 'CASCADE', }) type: ConceptType; diff --git a/src/concept/entities/concepttype.entity.ts b/src/concept/entities/concepttype.entity.ts index b0df66b..98cd8cb 100644 --- a/src/concept/entities/concepttype.entity.ts +++ b/src/concept/entities/concepttype.entity.ts @@ -2,6 +2,7 @@ import { Column, Entity, OneToMany, + PrimaryColumn, PrimaryGeneratedColumn, Unique, } from 'typeorm'; @@ -10,7 +11,7 @@ import { Concept } from './concept.entity'; @Entity() @Unique(['value']) export class ConceptType { - @PrimaryGeneratedColumn() + @PrimaryColumn() id: number; @Column() diff --git a/tsconfig.json b/tsconfig.json index 239aa10..e53000c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,6 +12,7 @@ "baseUrl": "./", "incremental": true, "skipLibCheck": true, - "esModuleInterop": true + "esModuleInterop": true, + "resolveJsonModule": true } }