feat : update

This commit is contained in:
2026-09-30 19:34:28 +07:00 Unverified
parent 69a4d34b97
commit da3d7d84ac
30 changed files with 10724 additions and 883 deletions
-21
View File
@@ -7,7 +7,6 @@ import { requireAdmin } from "@/lib/auth/server";
import { auditActor, writeAuditLogBestEffort } from "@/lib/audit-log";
import { STYGIAN_CACHE_TAG } from "@/lib/cache/stygian";
import {
activateStygianSchedule,
saveStygianRecommendations,
syncStygianArchive,
} from "@/lib/stygian/repository";
@@ -51,23 +50,3 @@ export async function saveStygianRecommendationsAction(scheduleId: number, input
return { status: "error" as const, message: message(cause) };
}
}
export async function activateStygianScheduleAction(scheduleId: number, expectedVersion: number) {
const admin = await requireAdmin();
try {
const result = await activateStygianSchedule(
z.number().int().positive().parse(scheduleId),
z.number().int().positive().parse(expectedVersion),
);
await writeAuditLogBestEffort(auditActor(admin.user), {
action: "stygian.activated",
targetType: "stygian_schedule",
targetId: String(scheduleId),
resultingVersion: result.version,
});
updateTag(STYGIAN_CACHE_TAG);
return { status: "saved" as const, version: result.version };
} catch (cause) {
return { status: "error" as const, message: message(cause) };
}
}
+7 -7
View File
@@ -15,20 +15,20 @@ export default async function AdminStygianPage({ searchParams }: { searchParams:
const query = await searchParams;
const schedules = await listStygianSchedules();
const raw = Array.isArray(query.schedule) ? query.schedule[0] : query.schedule;
const selectedId = Number(raw) || schedules.find((entry) => entry.isActive)?.scheduleId || schedules[0]?.scheduleId;
const selectedId = Number(raw) || schedules[0]?.scheduleId;
const [schedule, catalog] = await Promise.all([selectedId ? getStygianSchedule(selectedId) : null, getActiveCatalog()]);
return (
<div className="min-h-svh"><AdminHeader /><main className="mx-auto flex w-full max-w-7xl flex-col gap-8 p-4 sm:p-6 lg:p-8">
<header><p className="text-sm font-medium text-primary">Stygian Onslaught</p><h1 className="font-heading text-3xl font-semibold">Stygian Guide</h1><p className="mt-2 text-muted-foreground">Sync Lunaris schedules, prepare recommendations, and choose the public version.</p></header>
<header><p className="text-sm font-medium text-primary">Stygian Onslaught</p><h1 className="font-heading text-3xl font-semibold">Stygian Guide</h1><p className="mt-2 text-muted-foreground">Sync Lunaris schedules and prepare recommendations.</p></header>
{!schedule || !catalog ? <Alert><AlertTitle>No Stygian schedules yet</AlertTitle><AlertDescription>Use the sync action below after the catalog has been synchronized.</AlertDescription></Alert> : null}
{schedule && catalog ? <StygianEditor
key={`${schedule.scheduleId}-${schedule.version}`}
schedules={schedules.map(({ scheduleId, challengeName, version, isActive }) => ({ scheduleId, challengeName, version, isActive }))}
schedule={{ scheduleId: schedule.scheduleId, challengeName: schedule.challengeName, version: schedule.version, isActive: schedule.isActive }}
key={schedule.scheduleId}
schedules={schedules.map(({ scheduleId, challengeName }) => ({ scheduleId, challengeName }))}
schedule={{ scheduleId: schedule.scheduleId, challengeName: schedule.challengeName, version: schedule.version }}
bosses={schedule.bosses.map(({ level, position, name, imageUrl }) => ({ level, position, name, imageUrl }))}
recommendations={schedule.recommendations}
characters={catalog.characters.map(({ key, name, aliases, imageUrl, rarity, constellations }) => ({ key, name, aliases, imageUrl, rarity, constellations: constellations.map(({ level, name: constellationName, iconUrl }) => ({ level, name: constellationName, iconUrl })) }))}
weapons={catalog.weapons.map(({ key, name, aliases, imageUrl, rarity }) => ({ key, name, aliases, imageUrl, rarity }))}
characters={catalog.characters.map(({ key, name, aliases, imageUrl, rarity, weaponType, element, elementIconUrl }) => ({ key, name, aliases, imageUrl, rarity, weaponType, element, elementIconUrl }))}
weapons={catalog.weapons.map(({ key, name, aliases, imageUrl, rarity, weaponType }) => ({ key, name, aliases, imageUrl, rarity, weaponType }))}
artifacts={catalog.artifacts.map(({ key, name, aliases, imageUrl, rarity }) => ({ key, name, aliases, imageUrl, rarity }))}
/> : schedules.length === 0 && catalog ? <StygianSyncButton /> : null}
</main></div>