49 lines
1.3 KiB
TypeScript
49 lines
1.3 KiB
TypeScript
"use server";
|
|
|
|
import config from "@payload-config";
|
|
import { getPayload } from "payload";
|
|
import type { AttendanceResponse } from "@/lib/attendance";
|
|
import { setMissionAttendance as setAttendance } from "@/lib/attendance";
|
|
|
|
export interface ActionResult<T = undefined> {
|
|
success: boolean;
|
|
error?: string;
|
|
data?: T;
|
|
}
|
|
|
|
async function authenticate() {
|
|
const payloadConfig = await config;
|
|
const payload = await getPayload({ config: payloadConfig });
|
|
const { headers } = await import("next/headers");
|
|
const hdrs = await headers();
|
|
const { user } = await payload.auth({ headers: hdrs, canSetHeaders: false });
|
|
|
|
if (!user) {
|
|
throw new Error("Unauthorized");
|
|
}
|
|
|
|
return { payload, user };
|
|
}
|
|
|
|
export async function setMissionAttendance(input: {
|
|
missionId: number;
|
|
response: AttendanceResponse;
|
|
}): Promise<ActionResult> {
|
|
try {
|
|
const { payload, user } = await authenticate();
|
|
const userId = user.id as number;
|
|
|
|
await setAttendance(payload, {
|
|
missionId: input.missionId,
|
|
userId,
|
|
response: input.response,
|
|
});
|
|
|
|
return { success: true };
|
|
} catch (error) {
|
|
const message = error instanceof Error ? error.message : "Unknown error";
|
|
return message === "Unauthorized"
|
|
? { success: false, error: "You must be logged in." }
|
|
: { success: false, error: message };
|
|
}
|
|
}
|