fix : no limit team in each condition
This commit is contained in:
+27
-3
@@ -351,9 +351,33 @@ export async function saveTeams(guideId: string, input: unknown, context: GuideM
|
||||
await tx.delete(teamConditions).where(eq(teamConditions.guideId, guideId));
|
||||
for (const [groupOrder, group] of data.groups.entries()) {
|
||||
const [condition] = await tx.insert(teamConditions).values({ guideId, name: group.name, note: group.note, iconMediaId: group.iconMediaId, sortOrder: groupOrder }).returning();
|
||||
for (const [sortOrder, team] of group.teams.entries()) {
|
||||
const [created] = await tx.insert(teamCompositions).values({ guideId, conditionId: condition.id, title: team.title, rotationSeconds: team.rotationSeconds.toString(), combo: team.combo, sortOrder }).returning();
|
||||
await tx.insert(teamMembers).values(team.members.map((member, position) => ({ ...member, teamId: created.id, position, damage: member.damage.toString() })));
|
||||
for (let start = 0; start < group.teams.length; start += 500) {
|
||||
const batch = group.teams.slice(start, start + 500);
|
||||
const created = await tx.insert(teamCompositions).values(
|
||||
batch.map((team, index) => ({
|
||||
guideId,
|
||||
conditionId: condition.id,
|
||||
title: team.title,
|
||||
rotationSeconds: team.rotationSeconds.toString(),
|
||||
combo: team.combo,
|
||||
sortOrder: start + index,
|
||||
})),
|
||||
).returning({ id: teamCompositions.id, sortOrder: teamCompositions.sortOrder });
|
||||
const teamIdByOrder = new Map<number, string>();
|
||||
for (const team of created) teamIdByOrder.set(team.sortOrder, team.id);
|
||||
const memberRows = batch.flatMap((team, index) => {
|
||||
const teamId = teamIdByOrder.get(start + index);
|
||||
if (!teamId) throw new Error("บันทึก Team ไม่สำเร็จ");
|
||||
return team.members.map((member, position) => ({
|
||||
...member,
|
||||
teamId,
|
||||
position,
|
||||
damage: member.damage.toString(),
|
||||
}));
|
||||
});
|
||||
for (let memberStart = 0; memberStart < memberRows.length; memberStart += 500) {
|
||||
await tx.insert(teamMembers).values(memberRows.slice(memberStart, memberStart + 500));
|
||||
}
|
||||
}
|
||||
}
|
||||
await auditGuide(tx, context, "guide.team.saved", updated, "team");
|
||||
|
||||
@@ -216,6 +216,17 @@ describe("structured guide validation", () => {
|
||||
expect(teamSectionSchema.safeParse({ ...base, groups: [{ note: null, teams: [{ ...teams[0], members: [{ ...member("1"), artifactKey: null }, ...["2", "3", "4"].map(member)] }] }] }).success).toBe(false);
|
||||
});
|
||||
|
||||
it("accepts more than 30 teams in one condition", () => {
|
||||
const members = ["1", "2", "3", "4"].map((characterKey) => ({
|
||||
characterKey, weaponKey: "weapon-1", artifactKey: "artifact-1", secondArtifactKey: null,
|
||||
constellation: 0, refinement: 1, damage: 100,
|
||||
}));
|
||||
const teams = Array.from({ length: 31 }, (_, index) => ({
|
||||
title: `Team ${index + 1}`, rotationSeconds: 20, combo: "E > Q", members,
|
||||
}));
|
||||
expect(teamSectionSchema.safeParse({ expectedVersion: 1, groups: [{ note: null, teams }] }).success).toBe(true);
|
||||
});
|
||||
|
||||
it("accepts all-level ranges for team constellations and refinements", () => {
|
||||
const member = (characterKey: string) => ({ characterKey, weaponKey: "weapon-1", artifactKey: "artifact-1", secondArtifactKey: null, constellation: "0-6", refinement: "1-5", damage: 100 });
|
||||
const input = { expectedVersion: 1, groups: [{ note: null, teams: [{ title: "Test", rotationSeconds: 20, combo: "E > Q", members: ["1", "2", "3", "4"].map(member) }] }] };
|
||||
|
||||
@@ -175,7 +175,7 @@ export const teamSectionSchema = z.strictObject({
|
||||
}).refine((members) => members.some((member) => member.damage > 0), {
|
||||
message: "ความเสียหายรวมต้องมากกว่า 0",
|
||||
}),
|
||||
})).max(30),
|
||||
})),
|
||||
})).max(20),
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user