72 lines
1.6 KiB
TypeScript
72 lines
1.6 KiB
TypeScript
"use server";
|
|
|
|
import config from "@payload-config";
|
|
import { getPayload } from "payload";
|
|
import { isPayloadUser } from "@/utils/access-control/isPayloadUser";
|
|
|
|
interface CreateCampaignData {
|
|
name: string;
|
|
summary: string;
|
|
status: "concept" | "inProgress" | "completed";
|
|
startDate?: string;
|
|
endDate?: string;
|
|
description?: string;
|
|
}
|
|
|
|
async function authenticate() {
|
|
const payload = await getPayload({ config });
|
|
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 createCampaign(data: CreateCampaignData) {
|
|
try {
|
|
const { payload, user } = await authenticate();
|
|
|
|
// Filter out undefined dates
|
|
const campaignData: Record<string, any> = {
|
|
name: data.name,
|
|
summary: data.summary,
|
|
status: data.status,
|
|
owner: user.id,
|
|
};
|
|
|
|
// Only add date fields if they have values
|
|
if (data.startDate) {
|
|
campaignData.startDate = data.startDate;
|
|
}
|
|
if (data.endDate) {
|
|
campaignData.endDate = data.endDate;
|
|
}
|
|
|
|
if (data.description) {
|
|
campaignData.description = data.description;
|
|
}
|
|
|
|
const campaign = await payload.create({
|
|
collection: "campaigns",
|
|
data: campaignData as any,
|
|
depth: 1,
|
|
});
|
|
|
|
return {
|
|
success: true,
|
|
data: campaign,
|
|
};
|
|
} catch (error) {
|
|
return {
|
|
success: false,
|
|
error: error instanceof Error ? error.message : "Failed to create campaign",
|
|
};
|
|
}
|
|
}
|