feat(editor) : notify peers of draft overwrite
CI / Verify (push) Successful in 1m20s
CI / Build immutable images and deploy (push) Successful in 1m51s

This commit is contained in:
2026-09-15 19:46:40 +07:00 Unverified
parent fb152c12fe
commit c3a2aa88d6
7 changed files with 121 additions and 50 deletions
+25 -17
View File
@@ -43,6 +43,13 @@ type GuideActionResult =
| { status: "error"; message: string };
type CreateGuideActionResult = Exclude<GuideActionResult, { status: "conflict" }>;
type SaveIntent = { overwrite?: boolean };
function overwriteDetails(admin: Awaited<ReturnType<typeof requireAdmin>>, intent?: SaveIntent) {
return intent?.overwrite
? { operation: "overwrite" as const, actorName: (admin.user.name?.trim() || admin.user.email).slice(0, 100) }
: undefined;
}
async function runGuideAction(action: () => Promise<{ version?: number }>): Promise<GuideActionResult> {
try {
@@ -69,29 +76,29 @@ export async function createStructuredGuide(input: unknown): Promise<CreateGuide
}
}
export async function saveWeaponSection(guideId: string, input: unknown) {
await requireAdmin();
return runGuideAction(() => saveWeapons(guideId, input));
export async function saveWeaponSection(guideId: string, input: unknown, intent?: SaveIntent) {
const admin = await requireAdmin();
return runGuideAction(() => saveWeapons(guideId, input, overwriteDetails(admin, intent)));
}
export async function saveGuideOverview(guideId: string, input: unknown) {
await requireAdmin();
return runGuideAction(() => updateGuideBasics(guideId, input));
export async function saveGuideOverview(guideId: string, input: unknown, intent?: SaveIntent) {
const admin = await requireAdmin();
return runGuideAction(() => updateGuideBasics(guideId, input, overwriteDetails(admin, intent)));
}
export async function saveArtifactSection(guideId: string, input: unknown) {
await requireAdmin();
return runGuideAction(() => saveArtifacts(guideId, input));
export async function saveArtifactSection(guideId: string, input: unknown, intent?: SaveIntent) {
const admin = await requireAdmin();
return runGuideAction(() => saveArtifacts(guideId, input, overwriteDetails(admin, intent)));
}
export async function saveConstellationSection(guideId: string, input: unknown) {
await requireAdmin();
return runGuideAction(() => saveConstellations(guideId, input));
export async function saveConstellationSection(guideId: string, input: unknown, intent?: SaveIntent) {
const admin = await requireAdmin();
return runGuideAction(() => saveConstellations(guideId, input, overwriteDetails(admin, intent)));
}
export async function saveTeamSection(guideId: string, input: unknown) {
await requireAdmin();
return runGuideAction(() => saveTeams(guideId, input));
export async function saveTeamSection(guideId: string, input: unknown, intent?: SaveIntent) {
const admin = await requireAdmin();
return runGuideAction(() => saveTeams(guideId, input, overwriteDetails(admin, intent)));
}
export async function listTeamImportGuides(currentGuideId: string) {
@@ -152,12 +159,13 @@ export async function saveGuideExtra(
guideId: string,
sectionId: string,
input: unknown,
intent?: SaveIntent,
) {
await requireAdmin();
const admin = await requireAdmin();
const parsedGuideId = z.string().uuid().parse(guideId);
const parsedSectionId = z.string().uuid().parse(sectionId);
const result = await runGuideAction(() =>
saveExtraSection(parsedGuideId, parsedSectionId, input),
saveExtraSection(parsedGuideId, parsedSectionId, input, overwriteDetails(admin, intent)),
);
if (result.status === "saved") updateTag(pageCacheTag(guideId));
return result;