diff --git a/src/migrations/1760548310371-projectmeta.ts b/src/migrations/1760548310371-projectmeta.ts new file mode 100644 index 0000000..aa2295e --- /dev/null +++ b/src/migrations/1760548310371-projectmeta.ts @@ -0,0 +1,15 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class Projectmeta1760548310371 implements MigrationInterface { + name = "Projectmeta1760548310371"; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `ALTER TABLE \`project\` ADD \`meta\` longtext NULL` + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`project\` DROP COLUMN \`meta\``); + } +} diff --git a/src/project/constants.ts b/src/project/constants.ts new file mode 100644 index 0000000..9da4709 --- /dev/null +++ b/src/project/constants.ts @@ -0,0 +1,11 @@ +type item = { + id: string; + path: string; +}; + +export type TMeta = { + migrations: item[]; + queries: item[]; + functions: item[]; + settings: item[]; +}; diff --git a/src/project/entities/project.entity.ts b/src/project/entities/project.entity.ts index 4d445bf..0b3d35f 100644 --- a/src/project/entities/project.entity.ts +++ b/src/project/entities/project.entity.ts @@ -15,6 +15,7 @@ import { FunctionEntity } from "../../query/entities/function.entity"; import { RedisNode } from "../../redisManager/entities/redis.node.entity"; import { Log } from "../../query/logger/entities/log.entity"; import { ProjectSetting } from "../settings/entities/project.setting.entity"; +import { TMeta } from "../constants"; @Entity("project") export class Project { @@ -43,6 +44,16 @@ export class Project { @OneToMany(() => ProjectSetting, (setting) => setting.project) settings: ProjectSetting[]; + @Column({ + type: "longtext", + nullable: true, + transformer: { + to: (value: TMeta) => JSON.stringify(value), + from: (value: string) => JSON.parse(value) as TMeta, + }, + }) + meta: TMeta; + @ManyToMany(() => RedisNode, (redisNode) => redisNode.projects) @JoinTable() redisNodes: RedisNode[]; diff --git a/src/project/project.controller.ts b/src/project/project.controller.ts index 0ea01ef..3cd5309 100644 --- a/src/project/project.controller.ts +++ b/src/project/project.controller.ts @@ -4,6 +4,7 @@ import { Delete, Get, Inject, + Post, Put, Req, UseGuards, @@ -13,6 +14,7 @@ import { ApiTokenGuard } from "src/api/guards/api-token.guard"; import { AdminGuard } from "src/api/guards/admin.guard"; import { Request } from "express"; import { ProjectSettingService } from "./settings/project.setting.service"; +import { TMeta } from "./constants"; @Controller("project") @UseGuards(ApiTokenGuard) @@ -36,6 +38,14 @@ export class ProjectController { return this.projectService.getProjectDetails(req.apiToken.project.id); } + @Post("update/meta") + updateProjectMeta( + @Body() body: { meta: TMeta }, + @Req() req: Request & { apiToken: { project: { id: string } } } + ) { + return this.projectService.updateMeta(req.apiToken.project.id, body.meta); + } + @Put("create-without-db") @UseGuards(AdminGuard) createProjectWithoutDB(@Body() body: { name: string }) { diff --git a/src/project/project.service.ts b/src/project/project.service.ts index a7a572a..0896982 100644 --- a/src/project/project.service.ts +++ b/src/project/project.service.ts @@ -5,6 +5,7 @@ import { Project } from "./entities/project.entity"; import { RedisClient } from "src/redis/redis.service"; import { DatabaseManagerService } from "src/databaseManager/database/database.manager.service"; import { ProjectSettingService } from "./settings/project.setting.service"; +import { TMeta } from "./constants"; @Injectable() export class ProjectService { @@ -45,16 +46,30 @@ export class ProjectService { return projectSaved; } + async updateMeta(projectId: string, meta: TMeta) { + return this.projectRepository.update({ id: projectId }, { meta }); + } + async getProjectDetails(projectId: string) { const project = await this.projectRepository.findOne({ where: { id: projectId }, - relations: ["database", "database.migrations", "queries", "functions"], + relations: [ + "database", + "database.migrations", + "queries", + "functions", + "settings", + ], }); return { migrations: project?.database?.migrations || [], queries: project?.queries || [], functions: project?.functions || [], + settings: project?.settings || [], + meta: project?.meta || null, + name: project?.name || "", + id: project?.id || "", }; } @@ -89,7 +104,7 @@ export class ProjectService { redisNodes: redisNodeId, }); } - + async getAllApiTokens(projectId: string) { const project = await this.projectRepository.findOne({ where: { id: projectId },