diff --git a/Prototype/server/src/controllers/cabinetController.ts b/Prototype/server/src/controllers/cabinetController.ts index 13bd6f9..344eb82 100644 --- a/Prototype/server/src/controllers/cabinetController.ts +++ b/Prototype/server/src/controllers/cabinetController.ts @@ -1,23 +1,10 @@ -import { - Body, - Controller, - Delete, - Get, - Path, - Post, - Put, - Route, - Security, - SuccessResponse, - Tags, -} from "tsoa"; +import { Body, Controller, Delete, Get, Path, Post, Put, Route, SuccessResponse, Tags } from "tsoa"; import * as Minio from "minio"; import minioClient from "../storage"; import { EhrFolder } from "../interfaces/ehr-fs"; import HttpStatusCode from "../interfaces/http-status"; -import HttpError from "../interfaces/http-error"; -import { listFolder, pathExist } from "../utils/minio"; +import { listFolder } from "../utils/minio"; @Route("cabinet") export class CabinetController extends Controller { @@ -30,7 +17,6 @@ export class CabinetController extends Controller { @Post("/") @Tags("Cabinet") - @Security("bearerAuth") @SuccessResponse(HttpStatusCode.CREATED) public async createCabinet(@Body() body: { name: string }) { const uploaded = await minioClient @@ -95,94 +81,7 @@ export class CabinetController extends Controller { stream.on("close", () => minioClient.removeObjects("ehr", objects)); stream.on("error", () => reject(new Error("Object storage error occured."))); - resolve(true); - }); - } - - @Get("/{cabinetName}/drawer") - @Tags("Drawer") - @SuccessResponse(HttpStatusCode.OK) - public listDrawer(@Path() cabinetName: string) { - return listFolder(`${cabinetName}/`); - } - - @Post("/{cabinetName}/drawer") - @Tags("Drawer") - @SuccessResponse(HttpStatusCode.NO_CONTENT) - public async createDrawer(@Path() cabinetName: string, @Body() body: { name: string }) { - if (!(await pathExist(`${cabinetName}/`))) { - throw new HttpError(HttpStatusCode.PRECONDITION_FAILED, "Cabinet cannot be found."); - } - - const uploaded = await minioClient - .putObject("ehr", `${cabinetName}/${body.name}/.keep`, "", 0, { - createdAt: new Date().toISOString(), - createdBy: "SomeUser", - }) - .catch((e) => console.error(e)); - - if (!uploaded) { - throw new Error("Object storage error occured."); - } - - this.setStatus(HttpStatusCode.CREATED); - return; - } - - @Put("/{cabinetName}/drawer/{drawerName}") - @Tags("Drawer") - @SuccessResponse(HttpStatusCode.NO_CONTENT, "Success") - public async editDrawer( - @Path() cabinetName: string, - @Path() drawerName: string, - @Body() body: { name: string }, - ): Promise { - const fullpath = `${cabinetName}/${drawerName}/`; - - return new Promise((resolve, reject) => { - const stream = minioClient.listObjectsV2("ehr", fullpath, true); - - stream.on("data", (v) => { - if (!(v && v.name)) return; - - const destination = `${cabinetName}/${body.name}/${v.name.slice(fullpath.length)}`; - const source = `/ehr/${v.name}`; - const cond = new Minio.CopyConditions(); - - minioClient.copyObject("ehr", destination, source, cond, (e) => { - if (e) { - return reject(new Error("Failed to move.")); - } - return minioClient.removeObject("ehr", v.name); - }); - }); - - stream.on("end", () => { - this.setStatus(HttpStatusCode.NO_CONTENT); - resolve(); - }); - stream.on("error", () => reject(new Error("Object storage error occured."))); - }); - } - - @Delete("/{cabinetName}/drawer/{drawerName}") - @Tags("Drawer") - @SuccessResponse(HttpStatusCode.OK) - public async deleteDrawer(@Path() cabinetName: string, @Path() drawerName: string) { - return new Promise((resolve, reject) => { - const objects: string[] = []; - const stream = minioClient.listObjectsV2("ehr", `${cabinetName}/${drawerName}/`, true); - - stream.on("data", (v) => { - if (!(v && v.name)) return; - - objects.push(v.name); - }); - - stream.on("close", () => minioClient.removeObjects("ehr", objects)); - stream.on("error", () => reject(new Error("Object storage error occured."))); - - resolve(true); + resolve(this.setStatus(HttpStatusCode.NO_CONTENT)); }); } } diff --git a/Prototype/server/src/controllers/drawerController.ts b/Prototype/server/src/controllers/drawerController.ts new file mode 100644 index 0000000..c66dec5 --- /dev/null +++ b/Prototype/server/src/controllers/drawerController.ts @@ -0,0 +1,99 @@ +import { Body, Controller, Delete, Get, Path, Post, Put, Route, SuccessResponse, Tags } from "tsoa"; +import * as Minio from "minio"; +import minioClient from "../storage"; + +import HttpStatusCode from "../interfaces/http-status"; +import HttpError from "../interfaces/http-error"; +import { listFolder, pathExist } from "../utils/minio"; + +@Route("/cabinet") +export class DrawerController extends Controller { + @Get("/{cabinetName}/drawer") + @Tags("Drawer") + @SuccessResponse(HttpStatusCode.OK) + public listDrawer(@Path() cabinetName: string) { + return listFolder(`${cabinetName}/`); + } + + @Post("/{cabinetName}/drawer") + @Tags("Drawer") + @SuccessResponse(HttpStatusCode.CREATED) + public async createDrawer(@Path() cabinetName: string, @Body() body: { name: string }) { + if (!(await pathExist(`${cabinetName}/`))) { + throw new HttpError(HttpStatusCode.PRECONDITION_FAILED, "Cabinet cannot be found."); + } + + const uploaded = await minioClient + .putObject("ehr", `${cabinetName}/${body.name}/.keep`, "", 0, { + createdAt: new Date().toISOString(), + createdBy: "SomeUser", + }) + .catch((e) => console.error(e)); + + if (!uploaded) { + throw new Error("Object storage error occured."); + } + + return this.setStatus(HttpStatusCode.CREATED); + } + + @Put("/{cabinetName}/drawer/{drawerName}") + @Tags("Drawer") + @SuccessResponse(HttpStatusCode.NO_CONTENT) + public async editDrawer( + @Path() cabinetName: string, + @Path() drawerName: string, + @Body() body: { name: string }, + ): Promise { + const fullpath = `${cabinetName}/${drawerName}/`; + + if (!(await pathExist(fullpath))) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "Resource cannot be found."); + } + + return new Promise((resolve, reject) => { + const stream = minioClient.listObjectsV2("ehr", fullpath, true); + + stream.on("data", (v) => { + if (!(v && v.name)) return; + + const destination = `${cabinetName}/${body.name}/${v.name.slice(fullpath.length)}`; + const source = `/ehr/${v.name}`; + const cond = new Minio.CopyConditions(); + + minioClient.copyObject("ehr", destination, source, cond, (e) => { + if (e) { + return reject(new Error("Failed to move.")); + } + return minioClient.removeObject("ehr", v.name); + }); + }); + + stream.on("end", () => { + resolve(this.setStatus(HttpStatusCode.NO_CONTENT)); + }); + stream.on("error", () => reject(new Error("Object storage error occured."))); + }); + } + + @Delete("/{cabinetName}/drawer/{drawerName}") + @Tags("Drawer") + @SuccessResponse(HttpStatusCode.NO_CONTENT) + public async deleteDrawer(@Path() cabinetName: string, @Path() drawerName: string) { + return new Promise((resolve, reject) => { + const objects: string[] = []; + const stream = minioClient.listObjectsV2("ehr", `${cabinetName}/${drawerName}/`, true); + + stream.on("data", (v) => { + if (!(v && v.name)) return; + + objects.push(v.name); + }); + + stream.on("close", () => minioClient.removeObjects("ehr", objects)); + stream.on("error", () => reject(new Error("Object storage error occured."))); + + resolve(true); + }); + } +}