50 lines
1.8 KiB
TypeScript
50 lines
1.8 KiB
TypeScript
"use server";
|
|
|
|
import config from "@payload-config";
|
|
import { getPayload } from "payload";
|
|
import type { StoryBeatState } from "@/payload-types";
|
|
import { isPayloadUser } from "@/utils/access-control/isPayloadUser";
|
|
import { markBeatRead, setBeatReaction, type StoryReaction } from "@/lib/story";
|
|
|
|
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 (!isPayloadUser(user)) throw new Error("Unauthorized");
|
|
return { payload, user };
|
|
}
|
|
|
|
export async function markStoryBeatRead(
|
|
beatId: number,
|
|
): Promise<{ success: boolean; error?: string; data?: StoryBeatState }> {
|
|
try {
|
|
const { payload, user } = await authenticate();
|
|
const state = await markBeatRead(payload, { user, beatId });
|
|
return { success: true, data: state };
|
|
} catch (error) {
|
|
const message = error instanceof Error ? error.message : "Unknown error";
|
|
if (message === "Unauthorized") {
|
|
return { success: false, error: "You must be logged in." };
|
|
}
|
|
return { success: false, error: message };
|
|
}
|
|
}
|
|
|
|
export async function setStoryBeatReaction(
|
|
beatId: number,
|
|
reaction: StoryReaction | null,
|
|
): Promise<{ success: boolean; error?: string; data?: { reaction: StoryReaction | null } }> {
|
|
try {
|
|
const { payload, user } = await authenticate();
|
|
const result = await setBeatReaction(payload, { user, beatId, reaction });
|
|
return { success: true, data: result };
|
|
} catch (error) {
|
|
const message = error instanceof Error ? error.message : "Unknown error";
|
|
if (message === "Unauthorized") {
|
|
return { success: false, error: "You must be logged in." };
|
|
}
|
|
return { success: false, error: message };
|
|
}
|
|
}
|