diff --git a/prisma/migrations/20250930134500_add_requirement_order/migration.sql b/prisma/migrations/20250930134500_add_requirement_order/migration.sql new file mode 100644 index 0000000..f512618 --- /dev/null +++ b/prisma/migrations/20250930134500_add_requirement_order/migration.sql @@ -0,0 +1,27 @@ +ALTER TABLE "type_machine_component_requirements" +ADD COLUMN "orderIndex" INTEGER NOT NULL DEFAULT 0; + +ALTER TABLE "type_machine_piece_requirements" +ADD COLUMN "orderIndex" INTEGER NOT NULL DEFAULT 0; + +WITH ordered_component_requirements AS ( + SELECT + id, + ROW_NUMBER() OVER (PARTITION BY "typeMachineId" ORDER BY "createdAt") - 1 AS idx + FROM "type_machine_component_requirements" +) +UPDATE "type_machine_component_requirements" t +SET "orderIndex" = ordered_component_requirements.idx +FROM ordered_component_requirements +WHERE ordered_component_requirements.id = t.id; + +WITH ordered_piece_requirements AS ( + SELECT + id, + ROW_NUMBER() OVER (PARTITION BY "typeMachineId" ORDER BY "createdAt") - 1 AS idx + FROM "type_machine_piece_requirements" +) +UPDATE "type_machine_piece_requirements" t +SET "orderIndex" = ordered_piece_requirements.idx +FROM ordered_piece_requirements +WHERE ordered_piece_requirements.id = t.id; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 1df3ec1..74898c4 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -296,6 +296,7 @@ model TypeMachineComponentRequirement { maxCount Int? required Boolean @default(true) allowNewModels Boolean @default(true) + orderIndex Int @default(0) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@ -317,6 +318,7 @@ model TypeMachinePieceRequirement { maxCount Int? required Boolean @default(false) allowNewModels Boolean @default(true) + orderIndex Int @default(0) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt diff --git a/src/common/mappers/type-machine.mapper.spec.ts b/src/common/mappers/type-machine.mapper.spec.ts index ba30d5b..3fa3791 100644 --- a/src/common/mappers/type-machine.mapper.spec.ts +++ b/src/common/mappers/type-machine.mapper.spec.ts @@ -39,6 +39,7 @@ describe('TypeMachineMapper', () => { maxCount: 4, required: true, allowNewModels: false, + orderIndex: 0, }); expect(input.pieceRequirements?.create?.[0]).toMatchObject({ label: 'Piece', @@ -46,6 +47,7 @@ describe('TypeMachineMapper', () => { maxCount: 2, required: false, allowNewModels: true, + orderIndex: 0, }); }); @@ -75,11 +77,13 @@ describe('TypeMachineMapper', () => { typeComposantId: 'comp-id', minCount: 2, maxCount: 4, + orderIndex: 0, }); expect(piece[0]).toMatchObject({ typePieceId: 'piece-id', minCount: 0, maxCount: 2, + orderIndex: 0, }); }); }); diff --git a/src/common/mappers/type-machine.mapper.ts b/src/common/mappers/type-machine.mapper.ts index d2cc228..8e2bae0 100644 --- a/src/common/mappers/type-machine.mapper.ts +++ b/src/common/mappers/type-machine.mapper.ts @@ -13,15 +13,18 @@ type RequirementDto = { allowNewModels?: boolean | null; typeComposantId?: string; typePieceId?: string; + orderIndex?: number | null; }; export const TYPE_MACHINE_DEFAULT_INCLUDE: Prisma.TypeMachineInclude = { customFields: { select: CUSTOM_FIELD_SELECT }, componentRequirements: { include: { typeComposant: true }, + orderBy: { orderIndex: 'asc' }, }, pieceRequirements: { include: { typePiece: true }, + orderBy: { orderIndex: 'asc' }, }, }; @@ -110,12 +113,13 @@ export class TypeMachineMapper { } return { - create: requirements.map((requirement) => ({ + create: requirements.map((requirement, index) => ({ label: requirement.label ?? null, minCount: requirement.minCount ?? 1, maxCount: requirement.maxCount ?? null, required: requirement.required ?? true, allowNewModels: requirement.allowNewModels ?? true, + orderIndex: requirement.orderIndex ?? index, typeComposant: requirement.typeComposantId ? { connect: { id: requirement.typeComposantId }, @@ -134,12 +138,13 @@ export class TypeMachineMapper { return []; } - return requirements.map((requirement) => ({ + return requirements.map((requirement, index) => ({ label: requirement.label ?? null, minCount: requirement.minCount ?? 1, maxCount: requirement.maxCount ?? null, required: requirement.required ?? true, allowNewModels: requirement.allowNewModels ?? true, + orderIndex: requirement.orderIndex ?? index, typeComposantId: requirement.typeComposantId!, })); } @@ -154,12 +159,13 @@ export class TypeMachineMapper { } return { - create: requirements.map((requirement) => ({ + create: requirements.map((requirement, index) => ({ label: requirement.label ?? null, minCount: requirement.minCount ?? 0, maxCount: requirement.maxCount ?? null, required: requirement.required ?? false, allowNewModels: requirement.allowNewModels ?? true, + orderIndex: requirement.orderIndex ?? index, typePiece: requirement.typePieceId ? { connect: { id: requirement.typePieceId }, @@ -178,12 +184,13 @@ export class TypeMachineMapper { return []; } - return requirements.map((requirement) => ({ + return requirements.map((requirement, index) => ({ label: requirement.label ?? null, minCount: requirement.minCount ?? 0, maxCount: requirement.maxCount ?? null, required: requirement.required ?? false, allowNewModels: requirement.allowNewModels ?? true, + orderIndex: requirement.orderIndex ?? index, typePieceId: requirement.typePieceId!, })); } diff --git a/src/shared/dto/type.dto.ts b/src/shared/dto/type.dto.ts index eb3ccbb..97895b0 100644 --- a/src/shared/dto/type.dto.ts +++ b/src/shared/dto/type.dto.ts @@ -79,6 +79,10 @@ export class TypeMachineComponentRequirementDto { @IsOptional() @IsBoolean() allowNewModels?: boolean; + + @IsOptional() + @IsInt() + orderIndex?: number; } export class TypeMachinePieceRequirementDto { @@ -104,6 +108,10 @@ export class TypeMachinePieceRequirementDto { @IsOptional() @IsBoolean() allowNewModels?: boolean; + + @IsOptional() + @IsInt() + orderIndex?: number; } export class CreateTypeMachineDto {