import type { PlayerSession } from "./types"; import { requestOnlineJson } from "./onlineAccountClient"; import policy from "../../shared/dungeon-report-policy.json"; export type DungeonReportStatus = "Submitted" | "In-Progress" | "Testing Fixes" | "Closed"; export const DUNGEON_REPORT_STATUSES = policy.statuses as readonly DungeonReportStatus[]; export const DUNGEON_REPORT_COMMENT_MAX_LENGTH = policy.commentMaxLength; export interface DungeonReport { readonly id: string; readonly dungeonId: string; readonly comment: string; readonly status: DungeonReportStatus; readonly submittedBy: string; readonly createdAt: number; readonly updatedAt: number; readonly updatedBy: string | null; readonly revision: number; readonly bossKey?: string; readonly bossName?: string; } export interface DungeonReportSnapshot { readonly reports: readonly DungeonReport[]; readonly openCounts: Readonly>; } export function sessionCanManageDungeonReports(session: PlayerSession | null): boolean { return Boolean(session?.kind === "account" && session.accessToken && session.roles?.includes("gm")); } export function filterDungeonReports( reports: readonly DungeonReport[], status: DungeonReportStatus | "all", dungeonId: string, ): readonly DungeonReport[] { return reports.filter((report) => (status === "all" || report.status === status) && (dungeonId === "all" || report.dungeonId === dungeonId)); } export function fetchDungeonReports(): Promise { return requestOnlineJson("/api/dungeon-reports"); } export async function submitDungeonReport(session: PlayerSession | null, dungeonId: string, comment: string, boss?: { readonly bossKey: string; readonly bossName: string }): Promise { const response = await requestOnlineJson<{ report: DungeonReport }>("/api/dungeon-reports", { method: "POST", body: JSON.stringify({ dungeonId, comment, ...boss }), }, session?.kind === "account" ? session.accessToken : undefined); return response.report; } export async function updateDungeonReport( session: PlayerSession, report: DungeonReport, status: DungeonReportStatus, ): Promise { const response = await requestOnlineJson<{ report: DungeonReport }>(`/api/dungeon-reports/${encodeURIComponent(report.id)}`, { method: "PATCH", body: JSON.stringify({ status, expectedRevision: report.revision }), }, session.accessToken); return response.report; }