55 lines
1.3 KiB
TypeScript
55 lines
1.3 KiB
TypeScript
import { CollectionConfig } from "payload";
|
|
import { isDeveloper } from "@/utils/access-control/isRole";
|
|
|
|
export const MissionFiles: CollectionConfig = {
|
|
slug: "mission-files",
|
|
access: {
|
|
create: isDeveloper,
|
|
update: isDeveloper,
|
|
delete: isDeveloper,
|
|
read: isDeveloper,
|
|
},
|
|
admin: {
|
|
group: "Server",
|
|
},
|
|
fields: [
|
|
{
|
|
name: "missionFileName",
|
|
type: "text",
|
|
required: true,
|
|
},
|
|
{
|
|
name: "author",
|
|
type: "relationship",
|
|
relationTo: "users",
|
|
required: true,
|
|
},
|
|
],
|
|
upload: {
|
|
mimeTypes: ["application/octet-stream"],
|
|
},
|
|
hooks: {
|
|
beforeValidate: [
|
|
async ({ data, req }) => {
|
|
// Enforce .pbo extension on uploaded filename
|
|
// For direct file uploads, req.files?.file?.name is typically present
|
|
const file = (req as any)?.files?.file;
|
|
const name: string | undefined =
|
|
file?.name ??
|
|
(typeof data?.filename === "string" ? data.filename : undefined) ??
|
|
(typeof data?.file === "string" ? data.file : undefined);
|
|
|
|
if (!name || !name.toLowerCase().endsWith(".pbo")) {
|
|
throw new Error("Only .pbo files are allowed.");
|
|
}
|
|
|
|
// Optional: store clean filename (without path)
|
|
if (data) {
|
|
data.missionFileName = name;
|
|
}
|
|
|
|
return data;
|
|
},
|
|
],
|
|
},
|
|
};
|