63 lines
1.7 KiB
TypeScript
63 lines
1.7 KiB
TypeScript
import type { CreateFlowUploadPurpose } from "../../create/createFlowUploadPurpose";
|
|
|
|
export type { CreateFlowUploadPurpose };
|
|
export { CREATE_FLOW_UPLOAD_PURPOSES } from "../../create/createFlowUploadPurpose";
|
|
|
|
/** Max body size for multipart upload (bytes). */
|
|
export const CREATE_FLOW_UPLOAD_MAX_BYTES = 12 * 1024 * 1024;
|
|
|
|
const COMMUNITY_MAX = 5 * 1024 * 1024;
|
|
const CUSTOM_MAX = 10 * 1024 * 1024;
|
|
|
|
const IMAGE_MIMES = new Set([
|
|
"image/jpeg",
|
|
"image/png",
|
|
"image/webp",
|
|
"image/gif",
|
|
]);
|
|
|
|
const CUSTOM_EXTRA_MIMES = new Set(["application/pdf"]);
|
|
|
|
export function maxBytesForPurpose(purpose: CreateFlowUploadPurpose): number {
|
|
return purpose === "communityAvatar" ? COMMUNITY_MAX : CUSTOM_MAX;
|
|
}
|
|
|
|
export function isAllowedMime(
|
|
purpose: CreateFlowUploadPurpose,
|
|
mime: string,
|
|
): boolean {
|
|
const m = mime.toLowerCase().split(";")[0]?.trim() ?? "";
|
|
if (IMAGE_MIMES.has(m)) return true;
|
|
if (purpose === "customMethodAttachment" && CUSTOM_EXTRA_MIMES.has(m)) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/** Extension including dot, from normalized mime (lowercase). */
|
|
export function extensionForMime(mime: string): string {
|
|
const m = mime.toLowerCase().split(";")[0]?.trim() ?? "";
|
|
switch (m) {
|
|
case "image/jpeg":
|
|
return ".jpg";
|
|
case "image/png":
|
|
return ".png";
|
|
case "image/webp":
|
|
return ".webp";
|
|
case "image/gif":
|
|
return ".gif";
|
|
case "application/pdf":
|
|
return ".pdf";
|
|
default:
|
|
return ".bin";
|
|
}
|
|
}
|
|
|
|
/** Strict id: uuid v4 filename stem (no extension in id param for GET). */
|
|
const UPLOAD_ID_RE =
|
|
/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
|
|
export function isValidUploadFileId(id: string): boolean {
|
|
return UPLOAD_ID_RE.test(id);
|
|
}
|