22
33import { createId } from "@/lib/api/create-id" ;
44import { storage } from "@/lib/storage" ;
5+ import { base64ImageSchema } from "@/lib/zod/schemas/misc" ;
56import {
67 programResourceColorSchema ,
78 programResourceFileSchema ,
@@ -19,10 +20,17 @@ const baseResourceSchema = z.object({
1920 name : z . string ( ) . min ( 1 , "Name is required" ) ,
2021} ) ;
2122
22- // Schema for file-based resources (logos and files)
23+ // Schema for logo resources
24+ const logoResourceSchema = baseResourceSchema . extend ( {
25+ resourceType : z . literal ( "logo" ) ,
26+ file : base64ImageSchema ,
27+ extension : z . string ( ) . nullish ( ) ,
28+ } ) ;
29+
30+ // Schema for file resources
2331const fileResourceSchema = baseResourceSchema . extend ( {
24- resourceType : z . enum ( [ "logo" , " file"] ) ,
25- file : z . string ( ) , // Base64 encoded file
32+ resourceType : z . literal ( " file") ,
33+ file : z . string ( ) ,
2634 extension : z . string ( ) . nullish ( ) ,
2735} ) ;
2836
@@ -34,6 +42,7 @@ const colorResourceSchema = baseResourceSchema.extend({
3442
3543// Combined schema that can handle any resource type
3644const addResourceSchema = z . discriminatedUnion ( "resourceType" , [
45+ logoResourceSchema ,
3746 fileResourceSchema ,
3847 colorResourceSchema ,
3948] ) ;
@@ -69,6 +78,10 @@ export const addProgramResourceAction = authActionClient
6978 if ( resourceType === "logo" || resourceType === "file" ) {
7079 const { file, extension } = parsedInput ;
7180
81+ if ( ! file ) {
82+ throw new Error ( "File is required." ) ;
83+ }
84+
7285 // Upload the file to storage
7386 const fileKey = `programs/${ program . id } /${ resourceType } s/${ slugify ( name || resourceType ) } -${ nanoid ( 4 ) } ${ extension ? `.${ extension } ` : "" } ` ;
7487 const uploadResult = await storage . upload (
@@ -136,8 +149,4 @@ export const addProgramResourceAction = authActionClient
136149 resources : updatedResources ,
137150 } ,
138151 } ) ;
139-
140- return {
141- success : true ,
142- } ;
143152 } ) ;
0 commit comments