fix : no limit team in each condition

This commit is contained in:
2026-10-06 03:11:12 +07:00 Unverified
parent c851693854
commit d13f3f93e4
4 changed files with 43 additions and 18 deletions
+27 -3
View File
@@ -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");
+11
View File
@@ -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) }] }] };
+1 -1
View File
@@ -175,7 +175,7 @@ export const teamSectionSchema = z.strictObject({
}).refine((members) => members.some((member) => member.damage > 0), {
message: "ความเสียหายรวมต้องมากกว่า 0",
}),
})).max(30),
})),
})).max(20),
});