diff --git a/Prototype/server/src/controllers/searchController.ts b/Prototype/server/src/controllers/searchController.ts new file mode 100644 index 0000000..08a7b25 --- /dev/null +++ b/Prototype/server/src/controllers/searchController.ts @@ -0,0 +1,35 @@ +import { Body, Controller, Post, Route, SuccessResponse, Tags } from "tsoa"; +import HttpStatusCode from "../interfaces/http-status"; +import esClient from "../elasticsearch"; +import { Search } from "../interfaces/search"; +import { EhrFile } from "../interfaces/ehr-fs"; + +@Route("/search") +export class SearchController extends Controller { + @Post("/") + @Tags("Search") + @SuccessResponse(HttpStatusCode.OK) + public async searchFile(@Body() search: Search): Promise { + const result = await esClient.search }>({ + index: "ehr-api-client", + query: { + bool: { + must: search.AND?.map((v) => ({ match: { [v.field]: v.value } })), + should: search.OR?.map((v) => ({ match: { [v.field]: v.value } })), + }, + }, + }); + + return result.hits.hits.length > 0 + ? result.hits.hits + .map((v) => { + if (!v._source) return; + + const { attachment, ...rest } = v._source; + + return rest; + }) + .flatMap((v) => (!!v ? [v] : [])) + : []; + } +} diff --git a/Prototype/server/src/interfaces/search.ts b/Prototype/server/src/interfaces/search.ts new file mode 100644 index 0000000..74b5286 --- /dev/null +++ b/Prototype/server/src/interfaces/search.ts @@ -0,0 +1,10 @@ +export interface Search { + AND?: { + field: string; + value: string; + }[]; + OR?: { + field: string; + value: string; + }[]; +}