From 2fb2a16c5652e26dc7199284c5edf5b7a789e5e0 Mon Sep 17 00:00:00 2001 From: Mathis Date: Tue, 8 Oct 2024 15:39:12 +0200 Subject: [PATCH] Add machine creation endpoint Implemented a new endpoint to create machines in the system. Added the required DTO for machine creation data validation and integrated it into the controller. Updated service methods to handle machine creation and improved the `findFilesForMachine` method for clarity and functionality. --- .../src/app/machines/machines.controller.ts | 6 ++- apps/backend/src/app/machines/machines.dto.ts | 11 +++++ .../src/app/machines/machines.service.ts | 47 +++++++++++++++---- 3 files changed, 54 insertions(+), 10 deletions(-) create mode 100644 apps/backend/src/app/machines/machines.dto.ts diff --git a/apps/backend/src/app/machines/machines.controller.ts b/apps/backend/src/app/machines/machines.controller.ts index c1856a7..dce7219 100644 --- a/apps/backend/src/app/machines/machines.controller.ts +++ b/apps/backend/src/app/machines/machines.controller.ts @@ -1,4 +1,5 @@ import { + Body, Controller, DefaultValuePipe, Delete, @@ -13,6 +14,7 @@ import { UseGuards, } from "@nestjs/common"; import { AdminGuard } from "apps/backend/src/app/auth/auth.guard"; +import { CreateMachineDto } from "apps/backend/src/app/machines/machines.dto"; import { MachinesService } from "apps/backend/src/app/machines/machines.service"; @Controller("machines") @@ -29,7 +31,9 @@ export class MachinesController { //TODO DTO @UseGuards(AdminGuard) @Post("new") - async newMachine() {} + async newMachine(@Body() body: CreateMachineDto) { + return await this.machineService.create(body.machineName, body.machineType); + } @UseGuards(AdminGuard) @Delete(":machineId") diff --git a/apps/backend/src/app/machines/machines.dto.ts b/apps/backend/src/app/machines/machines.dto.ts new file mode 100644 index 0000000..a93e519 --- /dev/null +++ b/apps/backend/src/app/machines/machines.dto.ts @@ -0,0 +1,11 @@ +import { MaxLength, MinLength } from "class-validator"; + +export class CreateMachineDto { + @MaxLength(128) + @MinLength(4) + machineName: string; + + @MaxLength(64) + @MinLength(2) + machineType: string; +} diff --git a/apps/backend/src/app/machines/machines.service.ts b/apps/backend/src/app/machines/machines.service.ts index fc29661..e90700c 100644 --- a/apps/backend/src/app/machines/machines.service.ts +++ b/apps/backend/src/app/machines/machines.service.ts @@ -1,7 +1,12 @@ -import { Injectable, NotFoundException } from "@nestjs/common"; +import { + Injectable, + InternalServerErrorException, + NotFoundException, +} from "@nestjs/common"; import { DbService } from "apps/backend/src/app/db/db.service"; import { FilesForMachinesTable, + FilesTable, MachinesTable, } from "apps/backend/src/app/db/schema"; import { eq, ilike } from "drizzle-orm"; @@ -35,18 +40,38 @@ export class MachinesService { } //TODO The method to create a machine + async create(machineName: string, machineType: string) { + try { + const newMachine = await this.database + .use() + .insert(MachinesTable) + .values({ + machineName, + machineType, + }) + .prepare("createMachine") + .execute(); + console.log("Created a new machine.", newMachine); + return newMachine; + } catch (e) { + console.error(e); + throw new InternalServerErrorException( + "Insertion of the new machine failed, see the server console for more information.", + ); + } + } //TODO a method to delete a machine and delete the associated FilesTypeForMachine row /** - * Retrieves a list of files associated with a specific machine from the database. + * Finds files associated with a specific machine. * - * @param {number} limit - The maximum number of files to retrieve. - * @param {number} offset - The offset from which to start retrieving files. - * @param {string} searchField - The specific field to search within the files. - * @param {string} machineId - The unique identifier of the machine. - * @return {Promise} A promise that resolves to an array of file records for the machine. - * @throws {NotFoundException} If the machine with the given id is not found. + * @param {number} limit - The maximum number of files to return. + * @param {number} offset - The number of files to skip before starting to return results. + * @param {string} searchField - The field to search within for files. + * @param {string} machineId - The ID of the machine to find files for. + * @returns {Promise>} A promise that resolves to an array of files associated with the specified machine. + * @throws {NotFoundException} If the machine ID is not found. */ async findFilesForMachine( limit: number, @@ -66,11 +91,15 @@ export class MachinesService { return await this.database .use() - .select() + .select({ + associatedMachine: FilesForMachinesTable.machineId, + data: FilesTable, + }) .from(FilesForMachinesTable) .where(eq(FilesForMachinesTable.machineId, machineId)) .limit(limit) .offset(offset) + .leftJoin(FilesTable, eq(FilesTable.uuid, FilesForMachinesTable.fileId)) .prepare("findFilesForMachineId") .execute(); }