From 70dd8a4c87d94219ab68c700b1b1435ab3c331e5 Mon Sep 17 00:00:00 2001 From: michaelschal <35957947-michaelschal@users.noreply.replit.com> Date: Thu, 2 Oct 2025 06:14:05 +0000 Subject: [PATCH] Improve configuration saving for AI models in settings Update the OpenRouter configuration route to handle updates more gracefully, allowing API keys to remain unchanged if not explicitly provided. Replit-Commit-Author: Agent Replit-Commit-Session-Id: ae4037a0-2a6f-4530-9bac-79b543286bda Replit-Commit-Checkpoint-Type: intermediate_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/397bca8c-984f-43ff-841a-10897aeb8140/ae4037a0-2a6f-4530-9bac-79b543286bda/35Hxx7C --- .replit | 4 ---- server/routes.ts | 26 +++++++++++++++++++------- shared/schema.ts | 4 ++++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/.replit b/.replit index c6bb5a0..55cb6c6 100644 --- a/.replit +++ b/.replit @@ -18,10 +18,6 @@ externalPort = 80 localPort = 43245 externalPort = 3001 -[[ports]] -localPort = 46679 -externalPort = 3000 - [env] PORT = "5000" diff --git a/server/routes.ts b/server/routes.ts index c5bfd81..2a1bc0a 100644 --- a/server/routes.ts +++ b/server/routes.ts @@ -7,7 +7,7 @@ import passport from "./auth"; import { z } from "zod"; import { openRouterService } from "./services/openrouter"; import { cloudinaryService } from "./services/cloudinary"; -import { insertPostSchema, insertScheduledPostSchema, insertSocialPageSchema, insertAiGenerationSchema, insertCloudinaryConfigSchema, insertOpenrouterConfigSchema, insertUserSchema } from "@shared/schema"; +import { insertPostSchema, insertScheduledPostSchema, insertSocialPageSchema, insertAiGenerationSchema, insertCloudinaryConfigSchema, insertOpenrouterConfigSchema, updateOpenrouterConfigSchema, insertUserSchema } from "@shared/schema"; import type { User, InsertUser } from "@shared/schema"; const upload = multer({ storage: multer.memoryStorage() }); @@ -614,18 +614,30 @@ export async function registerRoutes(app: Express): Promise { const user = req.user as User; const userId = user.id; - const configData = insertOpenrouterConfigSchema.parse({ - ...req.body, - userId, - }); - // Check if config already exists const existingConfig = await storage.getOpenrouterConfig(userId); let config; if (existingConfig) { - config = await storage.updateOpenrouterConfig(userId, configData); + // Pour les mises à jour, utiliser le schéma qui rend apiKey optionnel + const updateData = updateOpenrouterConfigSchema.parse({ + ...req.body, + userId, + }); + + // Si apiKey n'est pas fourni, garder l'ancien + const finalData = { + ...updateData, + apiKey: updateData.apiKey || existingConfig.apiKey, + }; + + config = await storage.updateOpenrouterConfig(userId, finalData); } else { + // Pour les créations, exiger tous les champs + const configData = insertOpenrouterConfigSchema.parse({ + ...req.body, + userId, + }); config = await storage.createOpenrouterConfig(configData); } diff --git a/shared/schema.ts b/shared/schema.ts index 3a9e231..144f27d 100644 --- a/shared/schema.ts +++ b/shared/schema.ts @@ -226,6 +226,10 @@ export const insertOpenrouterConfigSchema = createInsertSchema(openrouterConfig) updatedAt: true, }); +export const updateOpenrouterConfigSchema = insertOpenrouterConfigSchema.partial({ + apiKey: true, +}); + // Types export type User = typeof users.$inferSelect; export type InsertUser = z.infer;