diff --git a/attached_assets/Pasted-4-35-13-PM-express-GET-api-auth-me-401-in-2ms-error-Authentication-required-4-35-13-P-1752935851263_1752935851264.txt b/attached_assets/Pasted-4-35-13-PM-express-GET-api-auth-me-401-in-2ms-error-Authentication-required-4-35-13-P-1752935851263_1752935851264.txt new file mode 100644 index 0000000..f6e44e3 --- /dev/null +++ b/attached_assets/Pasted-4-35-13-PM-express-GET-api-auth-me-401-in-2ms-error-Authentication-required-4-35-13-P-1752935851263_1752935851264.txt @@ -0,0 +1,53 @@ +4:35:13 PM [express] GET /api/auth/me 401 in 2ms :: {"error":"Authentication required"} + +4:35:13 PM [express] GET /api/auth/default-credentials-status 200 in 311ms :: {"showDefaultCredentia… + +4:35:34 PM [express] POST /api/auth/login 200 in 327ms :: {"user":{"id":1,"username":"admin","email"… + +4:35:35 PM [express] GET /api/auth/me 200 in 5ms :: {"id":1,"username":"admin","email":"admin@exampl… + +4:35:35 PM [express] GET /api/auth/me 304 in 4ms :: {"id":1,"username":"admin","email":"admin@exampl… + +4:35:35 PM [express] GET /api/auth/me 304 in 3ms :: {"id":1,"username":"admin","email":"admin@exampl… + +4:35:35 PM [express] GET /api/auth/me 304 in 4ms :: {"id":1,"username":"admin","email":"admin@exampl… + +4:35:35 PM [express] GET /api/admin/stores 200 in 5ms :: [{"id":1,"name":"Magasin Principal","addres… + +4:36:29 PM [express] POST /api/sales 201 in 181ms :: {"id":1,"storeId":1,"userId":1,"timestamp":"202… + +4:36:32 PM [express] GET /api/auth/me 304 in 4ms :: {"id":1,"username":"admin","email":"admin@exampl… + +4:36:32 PM [express] GET /api/sales 200 in 62ms :: [{"id":1,"storeId":1,"userId":1,"timestamp":"2025… + +4:37:01 PM [express] GET /api/auth/me 304 in 30ms :: {"id":1,"username":"admin","email":"admin@examp… + +4:37:01 PM [express] GET /api/admin/users 200 in 7ms :: [{"id":1,"username":"admin","email":"admin@e… + +4:37:01 PM [express] GET /api/admin/purge/stats 200 in 11ms :: {"totalSales":1,"oldSales":0,"cutoffD… + +4:37:01 PM [express] GET /api/admin/backup/stats 304 in 28ms :: {"totalBackups":10,"backupDirectory"… + +Import backup error: TypeError: value.toISOString is not a function + + at PgTimestamp.mapToDriverValue (file:///app/node_modules/drizzle-orm/pg-core/columns/timestamp.js:34:18) + + at file:///app/node_modules/drizzle-orm/sql/sql.js:131:73 + + at Array.map () + + at SQL.buildQueryFromSourceParams (file:///app/node_modules/drizzle-orm/sql/sql.js:73:32) + + at file:///app/node_modules/drizzle-orm/sql/sql.js:92:21 + + at Array.map () + + at SQL.buildQueryFromSourceParams (file:///app/node_modules/drizzle-orm/sql/sql.js:73:32) + + at file:///app/node_modules/drizzle-orm/sql/sql.js:95:21 + + at Array.map () + + at SQL.buildQueryFromSourceParams (file:///app/node_modules/drizzle-orm/sql/sql.js:73:32) + +4:37:16 PM [express] POST /api/admin/backup/import 500 in 70ms :: {"error":"Failed to import backup"… \ No newline at end of file diff --git a/replit.md b/replit.md index 0647bd8..a20cf71 100644 --- a/replit.md +++ b/replit.md @@ -329,6 +329,8 @@ Preferred communication style: Simple, everyday language. - ✅ **Migration Robustness**: Fixed drizzle-kit dependency and error handling - ✅ **Graceful Degradation**: Application starts even if migrations fail - ✅ **Auto-Creation**: Database tables created automatically on first connection +- ✅ **SSL Configuration**: Fixed PostgreSQL SSL errors with sslmode=disable for Docker +- ✅ **Backup Import Fix**: Corrected timestamp conversion in backup import functionality - ✅ **Production Guide**: Created comprehensive DEPLOYMENT_GUIDE.md with troubleshooting - ✅ **Environment Templates**: Updated .env.production.example with security defaults - ✅ **Health Diagnostics**: Added production-ready health checks and monitoring diff --git a/server/routes.ts b/server/routes.ts index 8c29d3f..bdfc531 100644 --- a/server/routes.ts +++ b/server/routes.ts @@ -615,6 +615,21 @@ export async function registerRoutes(app: Express): Promise { saleWithoutId.userId = userIdMapping.get(saleData.userId); } + // Convert timestamp string to Date object + if (saleWithoutId.timestamp && typeof saleWithoutId.timestamp === 'string') { + saleWithoutId.timestamp = new Date(saleWithoutId.timestamp); + } + + // Convert date strings to Date objects - fix for backup import + if (saleWithoutId.dateNaissance && typeof saleWithoutId.dateNaissance === 'string') { + // Handle date format YYYY-MM-DD + saleWithoutId.dateNaissance = saleWithoutId.dateNaissance; + } + if (saleWithoutId.dateDelivrance && typeof saleWithoutId.dateDelivrance === 'string') { + // Handle date format YYYY-MM-DD + saleWithoutId.dateDelivrance = saleWithoutId.dateDelivrance; + } + await storage.createSale(saleWithoutId); }