mirror of
https://github.com/linsa-io/linsa.git
synced 2026-03-11 21:05:28 +01:00
47 lines
1.1 KiB
TypeScript
47 lines
1.1 KiB
TypeScript
import { getAuth } from "@clerk/tanstack-start/server"
|
|
import { createServerFn } from "@tanstack/start"
|
|
import { create } from "ronin"
|
|
import { z } from "zod"
|
|
|
|
const MAX_FILE_SIZE = 1 * 1024 * 1024
|
|
const ALLOWED_FILE_TYPES = [
|
|
"image/jpeg",
|
|
"image/png",
|
|
"image/gif",
|
|
"image/webp",
|
|
]
|
|
|
|
const ImageRuleSchema = z.object({
|
|
file: z
|
|
.instanceof(File)
|
|
.refine((file) => ALLOWED_FILE_TYPES.includes(file.type), {
|
|
message:
|
|
"Invalid file type. Only JPEG, PNG, GIF, and WebP images are allowed.",
|
|
})
|
|
.refine((file) => file.size <= MAX_FILE_SIZE, {
|
|
message: "File size exceeds the maximum limit of 1 MB.",
|
|
}),
|
|
})
|
|
|
|
export const storeImageFn = createServerFn(
|
|
"POST",
|
|
async (data: FormData, { request }) => {
|
|
const auth = await getAuth(request)
|
|
|
|
if (!auth.userId) {
|
|
throw new Error("Unauthorized")
|
|
}
|
|
|
|
const { file } = ImageRuleSchema.parse({ file: data.get("file") })
|
|
|
|
const fileModel = await create.image.with({
|
|
content: file,
|
|
name: file.name,
|
|
type: file.type,
|
|
size: file.size,
|
|
})
|
|
|
|
return { fileModel }
|
|
},
|
|
)
|