diff --git a/.gitignore b/.gitignore index a4fcb88d..86579fad 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .DS_Store pgdata -dist \ No newline at end of file +dist +node_modules/ \ No newline at end of file diff --git a/api/prisma/schema.prisma b/api/prisma/schema.prisma index bc04fbad..79c178af 100644 --- a/api/prisma/schema.prisma +++ b/api/prisma/schema.prisma @@ -252,6 +252,8 @@ model Template { Audit Audit[] ExecutionAudit ExecutionAudit[] transformers TransformerPathMapping[] + + @@index([tag]) } model Audit { diff --git a/api/src/app.module.ts b/api/src/app.module.ts index b9fd1f8a..1d981051 100644 --- a/api/src/app.module.ts +++ b/api/src/app.module.ts @@ -14,6 +14,7 @@ import { EjsService } from './engines/ejs/ejs.service'; import { VMService } from './core/lambda/vm.service'; import { SingletonServiceModule } from './singletonService.module'; import { I18nController } from './core/i18n/i18n/i18n.controller'; +import { SearchController } from './core/search/search.controller'; @Module({ imports: [SingletonServiceModule], @@ -23,6 +24,7 @@ import { I18nController } from './core/i18n/i18n/i18n.controller'; TemplateController, LambdaService, I18nController, + SearchController, ], exports: [VMService], providers: [ diff --git a/api/src/core/i18n/i18n/i18n.controller.ts b/api/src/core/i18n/i18n/i18n.controller.ts index f1449459..ea78794c 100644 --- a/api/src/core/i18n/i18n/i18n.controller.ts +++ b/api/src/core/i18n/i18n/i18n.controller.ts @@ -1,8 +1,8 @@ -import { Body, Controller, Delete, Get, Param, Post } from '@nestjs/common'; +import { Body, Controller, Post } from '@nestjs/common'; import { Template, TemplateType, Prisma } from '@prisma/client'; import { PrismaService } from '../../../prisma.service'; import { TransformerService } from '../../transformer/transformer.service'; -import { RenderDto, RenderDtoTest, RenderResponse } from '../../dto/render'; +import { RenderDto, RenderResponse } from '../../dto/render'; import { JsTLService } from 'src/engines/jstl/jstl.service'; import { TemplateService } from '../../template/template.service'; import { JinjaService } from 'src/engines/jinja/jinja.service'; diff --git a/api/src/core/search/search.controller.spec.ts b/api/src/core/search/search.controller.spec.ts new file mode 100644 index 00000000..6d6bad58 --- /dev/null +++ b/api/src/core/search/search.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { SearchController } from './search.controller'; + +describe('SearchController', () => { + let controller: SearchController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [SearchController], + }).compile(); + + controller = module.get(SearchController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/api/src/core/search/search.controller.ts b/api/src/core/search/search.controller.ts new file mode 100644 index 00000000..cf0747ea --- /dev/null +++ b/api/src/core/search/search.controller.ts @@ -0,0 +1,21 @@ +/* eslint-disable prettier/prettier */ +import { Controller, Get, Query } from '@nestjs/common'; +import { Template } from '@prisma/client'; +import { TemplateService } from '../template/template.service'; + +@Controller('search') +export class SearchController { + constructor( + private readonly templateService: TemplateService, + ){} + + @Get('tag') + async searchTag(@Query() queryString: string): Promise{ + return this.templateService.searchTag(queryString); + } + + @Get('body') + async searchTemplateBody(@Query() queryString: string): Promise{ + return this.templateService.searchBody(queryString); + } +} diff --git a/api/src/core/template/template.service.ts b/api/src/core/template/template.service.ts index 8a214567..92878a5f 100644 --- a/api/src/core/template/template.service.ts +++ b/api/src/core/template/template.service.ts @@ -58,4 +58,39 @@ export class TemplateService { where, }); } + + async searchTag(queryString: string): Promise { + return this.prisma.template.findMany({ + take: 200, + where: { + tag: { + has: queryString, + }, + }, + }); + } + + async searchBody(queryString: string): Promise { + return this.prisma.template.findMany({ + take: 200, + where: { + OR: [ + { + body: { + contains: queryString, + mode: 'insensitive', + }, + bodyI18n: { + every: { + body: { + contains: queryString, + mode: 'insensitive', + }, + }, + }, + }, + ], + }, + }); + } }