From 9e9eb7d1bb1849171e8b29f8fbe80abc68885673 Mon Sep 17 00:00:00 2001 From: Michael SCHAL Date: Mon, 2 Mar 2026 12:10:50 +0100 Subject: [PATCH] feat: implement multi-step reel creation flow with video upload, music selection, text generation, and scheduling. --- build_error.txt | Bin 0 -> 2622 bytes client/src/pages/mobile/new-reel.tsx | 2 +- server/routes.ts | 5 +++-- server/routes/reels.ts | 5 +++-- server/storage.ts | 4 ++-- shared/schema.ts | 4 +--- 6 files changed, 10 insertions(+), 10 deletions(-) create mode 100644 build_error.txt diff --git a/build_error.txt b/build_error.txt new file mode 100644 index 0000000000000000000000000000000000000000..d79d64fb1ff2cbc93495fd9e5d1bd037c1f287ac GIT binary patch literal 2622 zcmchZYflqV5QgWoiT`242hj*E1*(FH|&um*0a?5mfJMXGwTlKeS2&bE7^=+iM_XDYulmi zS=2jWo}+VdEwNjS#1RXP1pE}-6Tg?yI|4`6N+9%+pJsGHZ!+Jv4B3t?A(gpYTyI*- zJ|T19_)Cr;20bL3Xa_mj75*VB;Y&mmy0rSBhm{Q39N9J)Oa4?OTh+WNnNQsy-?c7$0l5!-kF6{u?qjT_#3l#1{-+FmP0VWc zf*h@rpPL}I+-BQ--S;XyWhGX@?uZTLeC%lr`kf+Qd?|S)PY%6NOckAkIw@+tWV`sR z%FD2(eiv&|9je1TWXJDWqiBULcC}2Ycz39hA#o21X6iTl*i}EuJ#PwLtFTeWy-q$e zR<#A^voMy=<;W=8YW9qsdPB68J5PyQMvvE-Ab+kWPBV6oZo5d&ogK^T@(#vseVrU+ z`#v1zxR2YbEn=bmAL_m4eOFbX-m6nGtfs{3oUg4h@zE)!vr*ZtQ%v2vPdbANgdA$av&adl>h|a&N@5y);qkE!%1@&H?)~UrFP{&tA=A08S^T??l zcVMdg=^=fD7foMz`%l~hhWbQ6(b-+~TpC|-v9rXpV6>_OMtQ)jKppKv+MzijGf$=@ z_GMVtEqqi(t7lH)m-^f`e+hN=c%9i6&lR5A%$AXu8fvQUJ`)Z7 {videoList.map((media) => ( -
setSelectedVideoId(media.id) || setSelectedVideo(media)} className={`relative aspect-[9/16] bg-black rounded-lg overflow-hidden border-2 transition-all ${selectedVideoId === media.id ? 'border-primary' : 'border-transparent'}`}> +
{ setSelectedVideoId(media.id); setSelectedVideo(media); }} className={`relative aspect-[9/16] bg-black rounded-lg overflow-hidden border-2 transition-all ${selectedVideoId === media.id ? 'border-primary' : 'border-transparent'}`}>
))} diff --git a/server/routes.ts b/server/routes.ts index eecc4fd..c8274fd 100644 --- a/server/routes.ts +++ b/server/routes.ts @@ -1514,11 +1514,12 @@ export async function registerRoutes(app: Express): Promise { return res.status(404).json({ error: "Page non trouvée" }); } - let pageData = insertSocialPageSchema.partial().parse(req.body); + let parsedData = insertSocialPageSchema.partial().parse(req.body); + let pageData: Partial = { ...parsedData }; // If accessToken is being updated, recalculate expiration date (60 days from now) // AND reset the status to valid so the UI updates immediately - if (pageData.accessToken) { + if (parsedData.accessToken) { const tokenExpiresAt = new Date(); tokenExpiresAt.setDate(tokenExpiresAt.getDate() + 60); pageData = { diff --git a/server/routes/reels.ts b/server/routes/reels.ts index 44e6c6e..d29125a 100644 --- a/server/routes/reels.ts +++ b/server/routes/reels.ts @@ -333,7 +333,8 @@ reelsRouter.post('/reels/preview', async (req: Request, res: Response) => { let watermarkUrl: string | undefined = undefined; if (req.user) { - const [userCloudinary] = await db.select().from(cloudinaryConfig).where(eq(cloudinaryConfig.userId, req.user.id)); + const user = req.user as User; + const [userCloudinary] = await db.select().from(cloudinaryConfig).where(eq(cloudinaryConfig.userId, user.id)); if (userCloudinary && userCloudinary.logoPublicId) { watermarkUrl = `https://res.cloudinary.com/${userCloudinary.cloudName}/image/upload/${userCloudinary.logoPublicId}`; } @@ -656,7 +657,7 @@ async function processReelBackground( // Si au moins une réussite, on considère "published" (ou partial), sinon "failed" // Si planifié, reste "scheduled". - let finalStatus = 'failed'; + let finalStatus: 'failed' | 'scheduled' | 'published' = 'failed'; if (scheduledFor) { finalStatus = 'scheduled'; } else if (allSuccess) { diff --git a/server/storage.ts b/server/storage.ts index b947cfb..61924e5 100644 --- a/server/storage.ts +++ b/server/storage.ts @@ -55,7 +55,7 @@ export interface IStorage { getSocialPages(userId: string): Promise; getSocialPage(id: string): Promise; createSocialPage(page: InsertSocialPage): Promise; - updateSocialPage(id: string, page: Partial): Promise; + updateSocialPage(id: string, page: Partial): Promise; deleteSocialPage(id: string): Promise; // Media @@ -190,7 +190,7 @@ export class DatabaseStorage implements IStorage { return newPage; } - async updateSocialPage(id: string, page: Partial): Promise { + async updateSocialPage(id: string, page: Partial): Promise { // Chiffrer le token si présent dans la mise à jour const updateData = page.accessToken ? { ...page, accessToken: encrypt(page.accessToken) } diff --git a/shared/schema.ts b/shared/schema.ts index cb029b8..d388de7 100644 --- a/shared/schema.ts +++ b/shared/schema.ts @@ -456,9 +456,7 @@ export type OpenrouterConfig = typeof openrouterConfig.$inferSelect; export type InsertOpenrouterConfig = z.infer; export type UpdateOpenrouterConfig = z.infer; -export const insertPostMediaSchema = createInsertSchema(postMedia).omit({ - id: true, -}); + export type PostMedia = typeof postMedia.$inferSelect; export type InsertPostMedia = z.infer;