mirror of
https://github.com/R0m1k3/Regisflow.git
synced 2026-10-11 17:29:48 +02:00
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:
1 parent
58d8c7a449
commit
bf09dcb56b
4 files changed
+21
-14
No files matched your search
@@ -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 |
@@ -331,6 +331,8 @@ Preferred communication style: Simple, everyday language.
|
||||
- ✅ **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
|
||||
- ✅ **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
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user