feat: concept seeding

This commit is contained in:
2025-01-14 22:46:47 +01:00
parent b1ac26aa91
commit 2252da20f5
5 changed files with 999 additions and 67 deletions
+40 -57
View File
@@ -1,28 +1,11 @@
import { import { Controller, Get, Sse } from '@nestjs/common';
Body,
Controller,
Delete,
Get,
HttpException,
HttpStatus,
Param,
ParseIntPipe,
Post,
Put,
Sse,
UseGuards,
} from '@nestjs/common';
import { ApiBody, ApiOperation, ApiTags } from '@nestjs/swagger'; import { ApiOperation, ApiTags } from '@nestjs/swagger';
import { AuthGuard } from 'src/users/guards/auth.guard';
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 { ConceptService } from './concept.service'; import { ConceptService } from './concept.service';
import { Concept } from './entities/concept.entity';
import { ConceptPipe } from './concept.pipe';
import { ConceptRecieveDTO } from './dto/conceptrecieve.dto';
import { import {
ConceptResponseDTO, ConceptResponseDTO,
ConceptTypeResponseDTO, ConceptTypeResponseDTO,
@@ -47,25 +30,25 @@ export class ConceptController {
); );
} }
@Delete(':id') // @Delete(':id')
@ApiOperation({ summary: 'Delete a concept' }) // @ApiOperation({ summary: 'Delete a concept' })
@UseGuards(AuthGuard) // @UseGuards(AuthGuard)
async delete(@Param('id') id: number) { // async delete(@Param('id') id: number) {
const concept = await this.conceptService.getById(id); // const concept = await this.conceptService.getById(id);
if (!concept) { // if (!concept) {
throw new HttpException('Concept not found', HttpStatus.NOT_FOUND); // throw new HttpException('Concept not found', HttpStatus.NOT_FOUND);
} // }
await this.conceptService.delete(concept); // await this.conceptService.delete(concept);
} // }
@Post('/') // @Post('/')
@ApiOperation({ summary: 'Submit a concept' }) // @ApiOperation({ summary: 'Submit a concept' })
@ApiBody({ type: ConceptRecieveDTO }) // @ApiBody({ type: ConceptRecieveDTO })
@UseGuards(AuthGuard) // @UseGuards(AuthGuard)
async create(@Body('value') value: string) { // async create(@Body('value') value: string) {
const concept = await this.conceptService.create(value, 'placeholder.jpg'); // const concept = await this.conceptService.create(value, 'placeholder.jpg');
return new ConceptResponseDTO(concept); // return new ConceptResponseDTO(concept);
} // }
@Get('/') @Get('/')
@ApiOperation({ summary: 'List enabled concept' }) @ApiOperation({ summary: 'List enabled concept' })
@@ -91,25 +74,25 @@ export class ConceptController {
); );
} }
@Put(':id/enable') // @Put(':id/enable')
@ApiOperation({ summary: 'Enable a concept' }) // @ApiOperation({ summary: 'Enable a concept' })
@UseGuards(AuthGuard) // @UseGuards(AuthGuard)
async enable( // async enable(
@Param('id', ParseIntPipe) _id: string, // @Param('id', ParseIntPipe) _id: string,
@Param('id', ConceptPipe) concept: Concept, // @Param('id', ConceptPipe) concept: Concept,
) { // ) {
await this.conceptService.enable(concept); // await this.conceptService.enable(concept);
return new ConceptResponseDTO(concept); // return new ConceptResponseDTO(concept);
} // }
@Put(':id/disable') // @Put(':id/disable')
@ApiOperation({ summary: 'Disable a word' }) // @ApiOperation({ summary: 'Disable a concept' })
@UseGuards(AuthGuard) // @UseGuards(AuthGuard)
async disable( // async disable(
@Param('id', ParseIntPipe) _id: string, // @Param('id', ParseIntPipe) _id: string,
@Param('id', ConceptPipe) concept: Concept, // @Param('id', ConceptPipe) concept: Concept,
) { // ) {
await this.conceptService.disable(concept); // await this.conceptService.disable(concept);
return new ConceptResponseDTO(concept); // return new ConceptResponseDTO(concept);
} // }
} }
+11 -2
View File
@@ -12,7 +12,8 @@ import {
} from 'events/concept.events'; } from 'events/concept.events';
import { ConceptType } from './entities/concepttype.entity'; import { ConceptType } from './entities/concepttype.entity';
import typeSeeds from './concept.seed.json'; import typeSeeds from './seeds/concepttype.seed.json';
import conceptSeeds from './seeds/concept.seed.json';
@Injectable() @Injectable()
export class ConceptService { export class ConceptService {
@@ -23,7 +24,15 @@ export class ConceptService {
private conceptTypeRepository: Repository<ConceptType>, private conceptTypeRepository: Repository<ConceptType>,
private eventEmitter: EventEmitter2, private eventEmitter: EventEmitter2,
) { ) {
void conceptTypeRepository.save(typeSeeds as DeepPartial<ConceptType>[]); void conceptTypeRepository
.upsert(typeSeeds as DeepPartial<ConceptType>[], {
conflictPaths: ['id'],
})
.then(() => {
void conceptRepository.upsert(conceptSeeds as DeepPartial<Concept>[], {
conflictPaths: ['id'],
});
});
} }
async getById(id: number) { async getById(id: number) {
+2 -8
View File
@@ -1,16 +1,10 @@
import { import { Column, Entity, ManyToOne, PrimaryColumn, Unique } from 'typeorm';
Column,
Entity,
ManyToOne,
PrimaryGeneratedColumn,
Unique,
} from 'typeorm';
import { ConceptType } from './concepttype.entity'; import { ConceptType } from './concepttype.entity';
@Entity() @Entity()
@Unique(['value']) @Unique(['value'])
export class Concept { export class Concept {
@PrimaryGeneratedColumn() @PrimaryColumn()
id: number; id: number;
@Column() @Column()
+946
View File
@@ -0,0 +1,946 @@
[
{
"id": 1,
"type": {
"id": 1
},
"value": "object",
"enabled": true
},
{
"id": 2,
"type": {
"id": 1
},
"value": "family",
"enabled": true
},
{
"id": 3,
"type": {
"id": 1
},
"value": "female",
"enabled": true
},
{
"id": 4,
"type": {
"id": 1
},
"value": "male",
"enabled": true
},
{
"id": 5,
"type": {
"id": 1
},
"value": "job",
"enabled": true
},
{
"id": 6,
"type": {
"id": 1
},
"value": "activity",
"enabled": true
},
{
"id": 7,
"type": {
"id": 1
},
"value": "animals",
"enabled": true
},
{
"id": 8,
"type": {
"id": 1
},
"value": "nature",
"enabled": true
},
{
"id": 9,
"type": {
"id": 1
},
"value": "litterature",
"enabled": true
},
{
"id": 10,
"type": {
"id": 1
},
"value": "music",
"enabled": true
},
{
"id": 11,
"type": {
"id": 1
},
"value": "cinema",
"enabled": true
},
{
"id": 12,
"type": {
"id": 1
},
"value": "art",
"enabled": true
},
{
"id": 13,
"type": {
"id": 1
},
"value": "television",
"enabled": true
},
{
"id": 14,
"type": {
"id": 1
},
"value": "title",
"enabled": true
},
{
"id": 15,
"type": {
"id": 1
},
"value": "idea",
"enabled": true
},
{
"id": 16,
"type": {
"id": 1
},
"value": "expression",
"enabled": true
},
{
"id": 17,
"type": {
"id": 1
},
"value": "location",
"enabled": true
},
{
"id": 18,
"type": {
"id": 1
},
"value": "city",
"enabled": true
},
{
"id": 19,
"type": {
"id": 1
},
"value": "date",
"enabled": true
},
{
"id": 20,
"type": {
"id": 1
},
"value": "party",
"enabled": true
},
{
"id": 21,
"type": {
"id": 1
},
"value": "naval transport",
"enabled": true
},
{
"id": 22,
"type": {
"id": 1
},
"value": "aerial transport",
"enabled": true
},
{
"id": 23,
"type": {
"id": 1
},
"value": "land transport",
"enabled": true
},
{
"id": 24,
"type": {
"id": 1
},
"value": "tools",
"enabled": true
},
{
"id": 25,
"type": {
"id": 1
},
"value": "games",
"enabled": true
},
{
"id": 26,
"type": {
"id": 1
},
"value": "clothes",
"enabled": true
},
{
"id": 27,
"type": {
"id": 1
},
"value": "food",
"enabled": true
},
{
"id": 28,
"type": {
"id": 1
},
"value": "house",
"enabled": true
},
{
"id": 29,
"type": {
"id": 2
},
"value": "real",
"enabled": true
},
{
"id": 30,
"type": {
"id": 2
},
"value": "fictive",
"enabled": true
},
{
"id": 31,
"type": {
"id": 2
},
"value": "young",
"enabled": true
},
{
"id": 32,
"type": {
"id": 2
},
"value": "old",
"enabled": true
},
{
"id": 33,
"type": {
"id": 2
},
"value": "slow",
"enabled": true
},
{
"id": 34,
"type": {
"id": 2
},
"value": "fast",
"enabled": true
},
{
"id": 35,
"type": {
"id": 2
},
"value": "protect",
"enabled": true
},
{
"id": 36,
"type": {
"id": 2
},
"value": "attack",
"enabled": true
},
{
"id": 37,
"type": {
"id": 2
},
"value": "love",
"enabled": true
},
{
"id": 38,
"type": {
"id": 2
},
"value": "death",
"enabled": true
},
{
"id": 39,
"type": {
"id": 2
},
"value": "happy",
"enabled": true
},
{
"id": 40,
"type": {
"id": 2
},
"value": "sad",
"enabled": true
},
{
"id": 41,
"type": {
"id": 2
},
"value": "electronics",
"enabled": true
},
{
"id": 42,
"type": {
"id": 2
},
"value": "mechanics",
"enabled": true
},
{
"id": 43,
"type": {
"id": 2
},
"value": "money",
"enabled": true
},
{
"id": 44,
"type": {
"id": 2
},
"value": "time",
"enabled": true
},
{
"id": 45,
"type": {
"id": 2
},
"value": "religion",
"enabled": true
},
{
"id": 46,
"type": {
"id": 2
},
"value": "authority",
"enabled": true
},
{
"id": 47,
"type": {
"id": 2
},
"value": "chemistry",
"enabled": true
},
{
"id": 48,
"type": {
"id": 2
},
"value": "medecine",
"enabled": true
},
{
"id": 49,
"type": {
"id": 2
},
"value": "head",
"enabled": true
},
{
"id": 50,
"type": {
"id": 2
},
"value": "arm",
"enabled": true
},
{
"id": 51,
"type": {
"id": 2
},
"value": "torso",
"enabled": true
},
{
"id": 52,
"type": {
"id": 2
},
"value": "leg",
"enabled": true
},
{
"id": 53,
"type": {
"id": 2
},
"value": "ear",
"enabled": true
},
{
"id": 54,
"type": {
"id": 2
},
"value": "nose",
"enabled": true
},
{
"id": 55,
"type": {
"id": 2
},
"value": "eye",
"enabled": true
},
{
"id": 56,
"type": {
"id": 2
},
"value": "mouth",
"enabled": true
},
{
"id": 57,
"type": {
"id": 3
},
"value": "rain",
"enabled": true
},
{
"id": 58,
"type": {
"id": 3
},
"value": "thunder",
"enabled": true
},
{
"id": 59,
"type": {
"id": 3
},
"value": "night",
"enabled": true
},
{
"id": 60,
"type": {
"id": 3
},
"value": "day",
"enabled": true
},
{
"id": 61,
"type": {
"id": 3
},
"value": "fire",
"enabled": true
},
{
"id": 62,
"type": {
"id": 3
},
"value": "water",
"enabled": true
},
{
"id": 63,
"type": {
"id": 3
},
"value": "wind",
"enabled": true
},
{
"id": 64,
"type": {
"id": 3
},
"value": "earth",
"enabled": true
},
{
"id": 65,
"type": {
"id": 3
},
"value": "stone",
"enabled": true
},
{
"id": 66,
"type": {
"id": 3
},
"value": "wood",
"enabled": true
},
{
"id": 67,
"type": {
"id": 3
},
"value": "metal",
"enabled": true
},
{
"id": 68,
"type": {
"id": 3
},
"value": "cloth",
"enabled": true
},
{
"id": 69,
"type": {
"id": 3
},
"value": "plastic",
"enabled": true
},
{
"id": 70,
"type": {
"id": 3
},
"value": "paper",
"enabled": true
},
{
"id": 71,
"type": {
"id": 3
},
"value": "inverse",
"enabled": true
},
{
"id": 72,
"type": {
"id": 3
},
"value": "cut",
"enabled": true
},
{
"id": 73,
"type": {
"id": 3
},
"value": "multiple",
"enabled": true
},
{
"id": 74,
"type": {
"id": 3
},
"value": "puzzle",
"enabled": true
},
{
"id": 75,
"type": {
"id": 3
},
"value": "inside",
"enabled": true
},
{
"id": 76,
"type": {
"id": 3
},
"value": "grid",
"enabled": true
},
{
"id": 77,
"type": {
"id": 3
},
"value": "zero",
"enabled": true
},
{
"id": 78,
"type": {
"id": 3
},
"value": "one",
"enabled": true
},
{
"id": 79,
"type": {
"id": 4
},
"value": "line",
"enabled": true
},
{
"id": 80,
"type": {
"id": 4
},
"value": "curve",
"enabled": true
},
{
"id": 81,
"type": {
"id": 4
},
"value": "plus",
"enabled": true
},
{
"id": 82,
"type": {
"id": 4
},
"value": "zigzag",
"enabled": true
},
{
"id": 83,
"type": {
"id": 4
},
"value": "spiral",
"enabled": true
},
{
"id": 84,
"type": {
"id": 4
},
"value": "sinusoid",
"enabled": true
},
{
"id": 85,
"type": {
"id": 4
},
"value": "circle",
"enabled": true
},
{
"id": 86,
"type": {
"id": 4
},
"value": "disk",
"enabled": true
},
{
"id": 87,
"type": {
"id": 4
},
"value": "triangle",
"enabled": true
},
{
"id": 88,
"type": {
"id": 4
},
"value": "star",
"enabled": true
},
{
"id": 89,
"type": {
"id": 4
},
"value": "square",
"enabled": true
},
{
"id": 90,
"type": {
"id": 4
},
"value": "plane",
"enabled": true
},
{
"id": 91,
"type": {
"id": 4
},
"value": "cube",
"enabled": true
},
{
"id": 92,
"type": {
"id": 4
},
"value": "sphere",
"enabled": true
},
{
"id": 93,
"type": {
"id": 4
},
"value": "prism",
"enabled": true
},
{
"id": 94,
"type": {
"id": 4
},
"value": "cylinder",
"enabled": true
},
{
"id": 95,
"type": {
"id": 4
},
"value": "cone",
"enabled": true
},
{
"id": 96,
"type": {
"id": 4
},
"value": "hole",
"enabled": true
},
{
"id": 97,
"type": {
"id": 4
},
"value": "tall",
"enabled": true
},
{
"id": 98,
"type": {
"id": 4
},
"value": "small",
"enabled": true
},
{
"id": 99,
"type": {
"id": 4
},
"value": "large",
"enabled": true
},
{
"id": 100,
"type": {
"id": 4
},
"value": "narrow",
"enabled": true
},
{
"id": 101,
"type": {
"id": 4
},
"value": "up",
"enabled": true
},
{
"id": 102,
"type": {
"id": 4
},
"value": "down",
"enabled": true
},
{
"id": 103,
"type": {
"id": 4
},
"value": "left",
"enabled": true
},
{
"id": 104,
"type": {
"id": 4
},
"value": "right",
"enabled": true
},
{
"id": 105,
"type": {
"id": 4
},
"value": "repeat",
"enabled": true
},
{
"id": 106,
"type": {
"id": 4
},
"value": "action",
"enabled": true
},
{
"id": 107,
"type": {
"id": 5
},
"value": "red",
"enabled": true
},
{
"id": 108,
"type": {
"id": 5
},
"value": "orange",
"enabled": true
},
{
"id": 109,
"type": {
"id": 5
},
"value": "yellow",
"enabled": true
},
{
"id": 110,
"type": {
"id": 5
},
"value": "green",
"enabled": true
},
{
"id": 111,
"type": {
"id": 5
},
"value": "blue",
"enabled": true
},
{
"id": 112,
"type": {
"id": 5
},
"value": "purple",
"enabled": true
},
{
"id": 113,
"type": {
"id": 5
},
"value": "pink",
"enabled": true
},
{
"id": 114,
"type": {
"id": 5
},
"value": "brown",
"enabled": true
},
{
"id": 115,
"type": {
"id": 5
},
"value": "black",
"enabled": true
},
{
"id": 116,
"type": {
"id": 5
},
"value": "gray",
"enabled": true
},
{
"id": 117,
"type": {
"id": 5
},
"value": "white",
"enabled": true
},
{
"id": 118,
"type": {
"id": 5
},
"value": "transparent",
"enabled": true
}
]