forked from phenom/healer-man
65 lines
2.5 KiB
TypeScript
65 lines
2.5 KiB
TypeScript
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<Record<string, number>>;
|
|
}
|
|
|
|
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<DungeonReportSnapshot> {
|
|
return requestOnlineJson<DungeonReportSnapshot>("/api/dungeon-reports");
|
|
}
|
|
|
|
export async function submitDungeonReport(session: PlayerSession | null, dungeonId: string, comment: string,
|
|
boss?: { readonly bossKey: string; readonly bossName: string }): Promise<DungeonReport> {
|
|
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<DungeonReport> {
|
|
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;
|
|
}
|