feat: persist type requirement order

This commit is contained in:
Matthieu
2025-10-23 09:36:39 +02:00
parent 582a6fd7e1
commit 16a703a4c3
5 changed files with 52 additions and 4 deletions

View File

@@ -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;

View File

@@ -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

View File

@@ -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,
});
});
});

View File

@@ -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!,
}));
}

View File

@@ -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 {