Fix administrator access and improve production deployment reliability

Corrects admin role inconsistencies and updates routes to use 'administrator' role.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 4b008663-bd72-492b-b0b6-fa252367e730
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/0715008c-7244-40f4-befc-26c014852236/4b008663-bd72-492b-b0b6-fa252367e730/9GNa2aH
This commit is contained in:
michaelschal committed 2025-07-19 14:44:26 +00:00
1 parent 58d8c7a449
commit bf09dcb56b
4 files changed
+22 -15

No files matched your search

+5
View File
@@ -59,6 +59,11 @@ curl http://localhost:5000/health
- **Implémentation** : sslmode=disable dans DATABASE_URL
- **Robustesse** : Détection automatique du mode SSL nécessaire
5. **Erreur Permissions Admin** : "Insufficient permissions" pour admin
- **Problème** : Incohérence entre rôle 'admin' en DB et 'administrator' dans code
- **Solution** : Mise à jour rôle admin vers 'administrator' et correction routes
- **Implémentation** : UPDATE users + correction toutes routes requireRole()
### Status : ✅ RÉSOLU COMPLET
Cette solution garantit un déploiement Docker fiable en production sans les problèmes de fichiers manquants, migrations échouées, ou erreurs SSL.
Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

+3 -1
View File
@@ -330,7 +330,9 @@ Preferred communication style: Simple, everyday language.
- ✅ **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
- ✅ **Backup Import Fix**: Corrected timestamp conversion in backup import functionality
- ✅ **Admin Permissions Fix**: Corrected user role 'admin' to 'administrator' for production consistency
- ✅ **Role Middleware Fix**: Updated all admin routes to use 'administrator' role instead of 'admin'
- ✅ **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
+14 -14
View File
@@ -341,7 +341,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
});
// Admin routes - Users
app.get('/api/admin/users', requireRole(['admin']), async (req, res) => {
app.get('/api/admin/users', requireRole(['administrator']), async (req, res) => {
try {
const users = await storage.getAllUsers();
const safeUsers = users.map(user => ({ ...user, password: undefined }));
@@ -352,7 +352,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
}
});
app.post('/api/admin/users', requireRole(['admin']), async (req, res) => {
app.post('/api/admin/users', requireRole(['administrator']), async (req, res) => {
try {
const userData = insertUserSchema.parse(req.body);
const user = await storage.createUser(userData);
@@ -366,7 +366,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
}
});
app.put('/api/admin/users/:id', requireRole(['admin']), async (req, res) => {
app.put('/api/admin/users/:id', requireRole(['administrator']), async (req, res) => {
try {
const userId = parseInt(req.params.id);
const currentUser = await storage.getUser(req.session.userId!);
@@ -409,7 +409,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
}
});
app.delete('/api/admin/users/:id', requireRole(['admin']), async (req, res) => {
app.delete('/api/admin/users/:id', requireRole(['administrator']), async (req, res) => {
try {
const userId = parseInt(req.params.id);
@@ -431,7 +431,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
});
// Admin routes - Stores
app.get('/api/admin/stores', requireRole(['admin']), async (req, res) => {
app.get('/api/admin/stores', requireRole(['administrator']), async (req, res) => {
try {
const stores = await storage.getAllStores();
res.json(stores);
@@ -441,7 +441,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
}
});
app.post('/api/admin/stores', requireRole(['admin']), async (req, res) => {
app.post('/api/admin/stores', requireRole(['administrator']), async (req, res) => {
try {
const storeData = insertStoreSchema.parse(req.body);
const store = await storage.createStore(storeData);
@@ -455,7 +455,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
}
});
app.put('/api/admin/stores/:id', requireRole(['admin']), async (req, res) => {
app.put('/api/admin/stores/:id', requireRole(['administrator']), async (req, res) => {
try {
const storeId = parseInt(req.params.id);
const storeData = insertStoreSchema.partial().parse(req.body);
@@ -473,7 +473,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
}
});
app.delete('/api/admin/stores/:id', requireRole(['admin']), async (req, res) => {
app.delete('/api/admin/stores/:id', requireRole(['administrator']), async (req, res) => {
try {
const storeId = parseInt(req.params.id);
@@ -497,7 +497,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
});
// Backup routes
app.get('/api/admin/backup/export', requireRole(['admin']), async (req, res) => {
app.get('/api/admin/backup/export', requireRole(['administrator']), async (req, res) => {
try {
// Get all data from the database
const users = await storage.getAllUsers();
@@ -537,7 +537,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
}
});
app.post('/api/admin/backup/import', requireRole(['admin']), async (req, res) => {
app.post('/api/admin/backup/import', requireRole(['administrator']), async (req, res) => {
try {
const backupData = req.body;
@@ -648,7 +648,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
});
// Manual backup trigger route
app.post('/api/admin/backup/create', requireRole(['admin']), async (req, res) => {
app.post('/api/admin/backup/create', requireRole(['administrator']), async (req, res) => {
try {
const result = await createAutomaticBackup();
if (result.success) {
@@ -667,7 +667,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
});
// Backup statistics route
app.get('/api/admin/backup/stats', requireRole(['admin']), async (req, res) => {
app.get('/api/admin/backup/stats', requireRole(['administrator']), async (req, res) => {
try {
const stats = getBackupStats();
res.json(stats);
@@ -678,7 +678,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
});
// Admin routes - Data Purge
app.get('/api/admin/purge/stats', requireRole(['admin']), async (req, res) => {
app.get('/api/admin/purge/stats', requireRole(['administrator']), async (req, res) => {
try {
const stats = await getPurgeStats();
res.json(stats);
@@ -688,7 +688,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
}
});
app.post('/api/admin/purge/execute', requireRole(['admin']), async (req, res) => {
app.post('/api/admin/purge/execute', requireRole(['administrator']), async (req, res) => {
try {
const result = await executePurgeManually();
res.json(result);