From b4886d68bf8a15667301fc268732228b6835ece9 Mon Sep 17 00:00:00 2001 From: Matthieu Date: Tue, 29 Jul 2025 21:04:15 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20Modules=20de=20fonctionnalit=C3=A9s=20a?= =?UTF-8?q?vanc=C3=A9es=20-=20Ajout=20des=20modules=20Documents=20et=20Cha?= =?UTF-8?q?mps=20personnalis=C3=A9s=20pour=20la=20gestion=20des=20fichiers?= =?UTF-8?q?=20et=20m=C3=A9tadonn=C3=A9es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/custom-fields/custom-fields.controller.ts | 54 +++++++++++ src/custom-fields/custom-fields.module.ts | 12 +++ src/custom-fields/custom-fields.service.ts | 94 +++++++++++++++++++ src/documents/documents.controller.spec.ts | 21 +++++ src/documents/documents.controller.ts | 48 ++++++++++ src/documents/documents.module.ts | 9 ++ src/documents/documents.service.spec.ts | 19 ++++ src/documents/documents.service.ts | 91 ++++++++++++++++++ 8 files changed, 348 insertions(+) create mode 100644 src/custom-fields/custom-fields.controller.ts create mode 100644 src/custom-fields/custom-fields.module.ts create mode 100644 src/custom-fields/custom-fields.service.ts create mode 100644 src/documents/documents.controller.spec.ts create mode 100644 src/documents/documents.controller.ts create mode 100644 src/documents/documents.module.ts create mode 100644 src/documents/documents.service.spec.ts create mode 100644 src/documents/documents.service.ts diff --git a/src/custom-fields/custom-fields.controller.ts b/src/custom-fields/custom-fields.controller.ts new file mode 100644 index 0000000..e7b7b08 --- /dev/null +++ b/src/custom-fields/custom-fields.controller.ts @@ -0,0 +1,54 @@ +import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common'; +import { CustomFieldsService } from './custom-fields.service'; +import { CreateCustomFieldValueDto, UpdateCustomFieldValueDto } from '../shared/dto/custom-field.dto'; + +@Controller('custom-fields') +export class CustomFieldsController { + constructor(private readonly customFieldsService: CustomFieldsService) {} + + @Post('values') + createCustomFieldValue(@Body() createCustomFieldValueDto: CreateCustomFieldValueDto) { + return this.customFieldsService.createCustomFieldValue(createCustomFieldValueDto); + } + + @Get('values/:entityType/:entityId') + findCustomFieldValuesByEntity( + @Param('entityType') entityType: string, + @Param('entityId') entityId: string, + ) { + return this.customFieldsService.findCustomFieldValuesByEntity(entityType, entityId); + } + + @Get('values/:id') + findOneCustomFieldValue(@Param('id') id: string) { + return this.customFieldsService.findOneCustomFieldValue(id); + } + + @Patch('values/:id') + updateCustomFieldValue( + @Param('id') id: string, + @Body() updateCustomFieldValueDto: UpdateCustomFieldValueDto, + ) { + return this.customFieldsService.updateCustomFieldValue(id, updateCustomFieldValueDto); + } + + @Delete('values/:id') + removeCustomFieldValue(@Param('id') id: string) { + return this.customFieldsService.removeCustomFieldValue(id); + } + + @Post('values/upsert') + upsertCustomFieldValue(@Body() body: { + customFieldId: string; + entityType: string; + entityId: string; + value: string; + }) { + return this.customFieldsService.upsertCustomFieldValue( + body.customFieldId, + body.entityType, + body.entityId, + body.value, + ); + } +} \ No newline at end of file diff --git a/src/custom-fields/custom-fields.module.ts b/src/custom-fields/custom-fields.module.ts new file mode 100644 index 0000000..91938a5 --- /dev/null +++ b/src/custom-fields/custom-fields.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { CustomFieldsService } from './custom-fields.service'; +import { CustomFieldsController } from './custom-fields.controller'; +import { PrismaModule } from '../prisma/prisma.module'; + +@Module({ + imports: [PrismaModule], + controllers: [CustomFieldsController], + providers: [CustomFieldsService], + exports: [CustomFieldsService], +}) +export class CustomFieldsModule {} \ No newline at end of file diff --git a/src/custom-fields/custom-fields.service.ts b/src/custom-fields/custom-fields.service.ts new file mode 100644 index 0000000..cd15efe --- /dev/null +++ b/src/custom-fields/custom-fields.service.ts @@ -0,0 +1,94 @@ +import { Injectable } from '@nestjs/common'; +import { PrismaService } from '../prisma/prisma.service'; +import { CreateCustomFieldValueDto, UpdateCustomFieldValueDto } from '../shared/dto/custom-field.dto'; + +@Injectable() +export class CustomFieldsService { + constructor(private prisma: PrismaService) {} + + // Créer une valeur de champ personnalisé + async createCustomFieldValue(createCustomFieldValueDto: CreateCustomFieldValueDto) { + return this.prisma.customFieldValue.create({ + data: createCustomFieldValueDto, + include: { + customField: true, + }, + }); + } + + // Trouver toutes les valeurs de champs personnalisés pour une entité + async findCustomFieldValuesByEntity(entityType: string, entityId: string) { + const whereClause = { + [entityType + 'Id']: entityId, + }; + + return this.prisma.customFieldValue.findMany({ + where: whereClause, + include: { + customField: true, + }, + }); + } + + // Trouver une valeur de champ personnalisé par ID + async findOneCustomFieldValue(id: string) { + return this.prisma.customFieldValue.findUnique({ + where: { id }, + include: { + customField: true, + }, + }); + } + + // Mettre à jour une valeur de champ personnalisé + async updateCustomFieldValue(id: string, updateCustomFieldValueDto: UpdateCustomFieldValueDto) { + return this.prisma.customFieldValue.update({ + where: { id }, + data: updateCustomFieldValueDto, + include: { + customField: true, + }, + }); + } + + // Supprimer une valeur de champ personnalisé + async removeCustomFieldValue(id: string) { + return this.prisma.customFieldValue.delete({ + where: { id }, + }); + } + + // Créer ou mettre à jour une valeur de champ personnalisé + async upsertCustomFieldValue(customFieldId: string, entityType: string, entityId: string, value: string) { + // D'abord, essayer de trouver une valeur existante + const existingValue = await this.prisma.customFieldValue.findFirst({ + where: { + customFieldId, + [entityType + 'Id']: entityId, + }, + }); + + if (existingValue) { + // Mettre à jour la valeur existante + return this.prisma.customFieldValue.update({ + where: { id: existingValue.id }, + data: { value }, + include: { + customField: true, + }, + }); + } else { + // Créer une nouvelle valeur + return this.prisma.customFieldValue.create({ + data: { + customFieldId, + value, + [entityType + 'Id']: entityId, + }, + include: { + customField: true, + }, + }); + } + } +} \ No newline at end of file diff --git a/src/documents/documents.controller.spec.ts b/src/documents/documents.controller.spec.ts new file mode 100644 index 0000000..2a3db51 --- /dev/null +++ b/src/documents/documents.controller.spec.ts @@ -0,0 +1,21 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { DocumentsController } from './documents.controller'; +import { DocumentsService } from './documents.service'; +import { PrismaService } from '../prisma/prisma.service'; + +describe('DocumentsController', () => { + let controller: DocumentsController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [DocumentsController], + providers: [DocumentsService, PrismaService], + }).compile(); + + controller = module.get(DocumentsController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/documents/documents.controller.ts b/src/documents/documents.controller.ts new file mode 100644 index 0000000..90c3a50 --- /dev/null +++ b/src/documents/documents.controller.ts @@ -0,0 +1,48 @@ +import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common'; +import { DocumentsService } from './documents.service'; +import { CreateDocumentDto, UpdateDocumentDto } from '../shared/dto/document.dto'; + +@Controller('documents') +export class DocumentsController { + constructor(private readonly documentsService: DocumentsService) {} + + @Post() + create(@Body() createDocumentDto: CreateDocumentDto) { + return this.documentsService.create(createDocumentDto); + } + + @Get() + findAll() { + return this.documentsService.findAll(); + } + + @Get('machine/:machineId') + findByMachine(@Param('machineId') machineId: string) { + return this.documentsService.findByMachine(machineId); + } + + @Get('composant/:composantId') + findByComposant(@Param('composantId') composantId: string) { + return this.documentsService.findByComposant(composantId); + } + + @Get('piece/:pieceId') + findByPiece(@Param('pieceId') pieceId: string) { + return this.documentsService.findByPiece(pieceId); + } + + @Get(':id') + findOne(@Param('id') id: string) { + return this.documentsService.findOne(id); + } + + @Patch(':id') + update(@Param('id') id: string, @Body() updateDocumentDto: UpdateDocumentDto) { + return this.documentsService.update(id, updateDocumentDto); + } + + @Delete(':id') + remove(@Param('id') id: string) { + return this.documentsService.remove(id); + } +} diff --git a/src/documents/documents.module.ts b/src/documents/documents.module.ts new file mode 100644 index 0000000..6b8cc3d --- /dev/null +++ b/src/documents/documents.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { DocumentsController } from './documents.controller'; +import { DocumentsService } from './documents.service'; + +@Module({ + controllers: [DocumentsController], + providers: [DocumentsService] +}) +export class DocumentsModule {} diff --git a/src/documents/documents.service.spec.ts b/src/documents/documents.service.spec.ts new file mode 100644 index 0000000..bb9a88d --- /dev/null +++ b/src/documents/documents.service.spec.ts @@ -0,0 +1,19 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { DocumentsService } from './documents.service'; +import { PrismaService } from '../prisma/prisma.service'; + +describe('DocumentsService', () => { + let service: DocumentsService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [DocumentsService, PrismaService], + }).compile(); + + service = module.get(DocumentsService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/documents/documents.service.ts b/src/documents/documents.service.ts new file mode 100644 index 0000000..82ec34f --- /dev/null +++ b/src/documents/documents.service.ts @@ -0,0 +1,91 @@ +import { Injectable } from '@nestjs/common'; +import { PrismaService } from '../prisma/prisma.service'; +import { CreateDocumentDto, UpdateDocumentDto } from '../shared/dto/document.dto'; + +@Injectable() +export class DocumentsService { + constructor(private prisma: PrismaService) {} + + async create(createDocumentDto: CreateDocumentDto) { + return this.prisma.document.create({ + data: createDocumentDto, + include: { + machine: true, + composant: true, + piece: true, + }, + }); + } + + async findAll() { + return this.prisma.document.findMany({ + include: { + machine: true, + composant: true, + piece: true, + }, + }); + } + + async findOne(id: string) { + return this.prisma.document.findUnique({ + where: { id }, + include: { + machine: true, + composant: true, + piece: true, + }, + }); + } + + async findByMachine(machineId: string) { + return this.prisma.document.findMany({ + where: { machineId }, + include: { + machine: true, + composant: true, + piece: true, + }, + }); + } + + async findByComposant(composantId: string) { + return this.prisma.document.findMany({ + where: { composantId }, + include: { + machine: true, + composant: true, + piece: true, + }, + }); + } + + async findByPiece(pieceId: string) { + return this.prisma.document.findMany({ + where: { pieceId }, + include: { + machine: true, + composant: true, + piece: true, + }, + }); + } + + async update(id: string, updateDocumentDto: UpdateDocumentDto) { + return this.prisma.document.update({ + where: { id }, + data: updateDocumentDto, + include: { + machine: true, + composant: true, + piece: true, + }, + }); + } + + async remove(id: string) { + return this.prisma.document.delete({ + where: { id }, + }); + } +}