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? maxCount Int?
required Boolean @default(true) required Boolean @default(true)
allowNewModels Boolean @default(true) allowNewModels Boolean @default(true)
orderIndex Int @default(0)
createdAt DateTime @default(now()) createdAt DateTime @default(now())
updatedAt DateTime @updatedAt updatedAt DateTime @updatedAt
@@ -317,6 +318,7 @@ model TypeMachinePieceRequirement {
maxCount Int? maxCount Int?
required Boolean @default(false) required Boolean @default(false)
allowNewModels Boolean @default(true) allowNewModels Boolean @default(true)
orderIndex Int @default(0)
createdAt DateTime @default(now()) createdAt DateTime @default(now())
updatedAt DateTime @updatedAt updatedAt DateTime @updatedAt

View File

@@ -39,6 +39,7 @@ describe('TypeMachineMapper', () => {
maxCount: 4, maxCount: 4,
required: true, required: true,
allowNewModels: false, allowNewModels: false,
orderIndex: 0,
}); });
expect(input.pieceRequirements?.create?.[0]).toMatchObject({ expect(input.pieceRequirements?.create?.[0]).toMatchObject({
label: 'Piece', label: 'Piece',
@@ -46,6 +47,7 @@ describe('TypeMachineMapper', () => {
maxCount: 2, maxCount: 2,
required: false, required: false,
allowNewModels: true, allowNewModels: true,
orderIndex: 0,
}); });
}); });
@@ -75,11 +77,13 @@ describe('TypeMachineMapper', () => {
typeComposantId: 'comp-id', typeComposantId: 'comp-id',
minCount: 2, minCount: 2,
maxCount: 4, maxCount: 4,
orderIndex: 0,
}); });
expect(piece[0]).toMatchObject({ expect(piece[0]).toMatchObject({
typePieceId: 'piece-id', typePieceId: 'piece-id',
minCount: 0, minCount: 0,
maxCount: 2, maxCount: 2,
orderIndex: 0,
}); });
}); });
}); });

View File

@@ -13,15 +13,18 @@ type RequirementDto = {
allowNewModels?: boolean | null; allowNewModels?: boolean | null;
typeComposantId?: string; typeComposantId?: string;
typePieceId?: string; typePieceId?: string;
orderIndex?: number | null;
}; };
export const TYPE_MACHINE_DEFAULT_INCLUDE: Prisma.TypeMachineInclude = { export const TYPE_MACHINE_DEFAULT_INCLUDE: Prisma.TypeMachineInclude = {
customFields: { select: CUSTOM_FIELD_SELECT }, customFields: { select: CUSTOM_FIELD_SELECT },
componentRequirements: { componentRequirements: {
include: { typeComposant: true }, include: { typeComposant: true },
orderBy: { orderIndex: 'asc' },
}, },
pieceRequirements: { pieceRequirements: {
include: { typePiece: true }, include: { typePiece: true },
orderBy: { orderIndex: 'asc' },
}, },
}; };
@@ -110,12 +113,13 @@ export class TypeMachineMapper {
} }
return { return {
create: requirements.map((requirement) => ({ create: requirements.map((requirement, index) => ({
label: requirement.label ?? null, label: requirement.label ?? null,
minCount: requirement.minCount ?? 1, minCount: requirement.minCount ?? 1,
maxCount: requirement.maxCount ?? null, maxCount: requirement.maxCount ?? null,
required: requirement.required ?? true, required: requirement.required ?? true,
allowNewModels: requirement.allowNewModels ?? true, allowNewModels: requirement.allowNewModels ?? true,
orderIndex: requirement.orderIndex ?? index,
typeComposant: requirement.typeComposantId typeComposant: requirement.typeComposantId
? { ? {
connect: { id: requirement.typeComposantId }, connect: { id: requirement.typeComposantId },
@@ -134,12 +138,13 @@ export class TypeMachineMapper {
return []; return [];
} }
return requirements.map((requirement) => ({ return requirements.map((requirement, index) => ({
label: requirement.label ?? null, label: requirement.label ?? null,
minCount: requirement.minCount ?? 1, minCount: requirement.minCount ?? 1,
maxCount: requirement.maxCount ?? null, maxCount: requirement.maxCount ?? null,
required: requirement.required ?? true, required: requirement.required ?? true,
allowNewModels: requirement.allowNewModels ?? true, allowNewModels: requirement.allowNewModels ?? true,
orderIndex: requirement.orderIndex ?? index,
typeComposantId: requirement.typeComposantId!, typeComposantId: requirement.typeComposantId!,
})); }));
} }
@@ -154,12 +159,13 @@ export class TypeMachineMapper {
} }
return { return {
create: requirements.map((requirement) => ({ create: requirements.map((requirement, index) => ({
label: requirement.label ?? null, label: requirement.label ?? null,
minCount: requirement.minCount ?? 0, minCount: requirement.minCount ?? 0,
maxCount: requirement.maxCount ?? null, maxCount: requirement.maxCount ?? null,
required: requirement.required ?? false, required: requirement.required ?? false,
allowNewModels: requirement.allowNewModels ?? true, allowNewModels: requirement.allowNewModels ?? true,
orderIndex: requirement.orderIndex ?? index,
typePiece: requirement.typePieceId typePiece: requirement.typePieceId
? { ? {
connect: { id: requirement.typePieceId }, connect: { id: requirement.typePieceId },
@@ -178,12 +184,13 @@ export class TypeMachineMapper {
return []; return [];
} }
return requirements.map((requirement) => ({ return requirements.map((requirement, index) => ({
label: requirement.label ?? null, label: requirement.label ?? null,
minCount: requirement.minCount ?? 0, minCount: requirement.minCount ?? 0,
maxCount: requirement.maxCount ?? null, maxCount: requirement.maxCount ?? null,
required: requirement.required ?? false, required: requirement.required ?? false,
allowNewModels: requirement.allowNewModels ?? true, allowNewModels: requirement.allowNewModels ?? true,
orderIndex: requirement.orderIndex ?? index,
typePieceId: requirement.typePieceId!, typePieceId: requirement.typePieceId!,
})); }));
} }

View File

@@ -79,6 +79,10 @@ export class TypeMachineComponentRequirementDto {
@IsOptional() @IsOptional()
@IsBoolean() @IsBoolean()
allowNewModels?: boolean; allowNewModels?: boolean;
@IsOptional()
@IsInt()
orderIndex?: number;
} }
export class TypeMachinePieceRequirementDto { export class TypeMachinePieceRequirementDto {
@@ -104,6 +108,10 @@ export class TypeMachinePieceRequirementDto {
@IsOptional() @IsOptional()
@IsBoolean() @IsBoolean()
allowNewModels?: boolean; allowNewModels?: boolean;
@IsOptional()
@IsInt()
orderIndex?: number;
} }
export class CreateTypeMachineDto { export class CreateTypeMachineDto {