[RBAC-002] feat: Migrate all routes from requireRoles to requireAccess

Phase 2 of RBAC propagation - migrates 18 route files to use hybrid
requireAccess() middleware for permission-based authorization:

P1 Routes (auth/billing):
- users.routes.ts (11 occurrences)
- roles.routes.ts (11 occurrences)
- permissions.routes.ts (8 occurrences)
- invoices.routes.ts (9 occurrences)
- financial.routes.ts (42 occurrences)

P2 Routes (business):
- partners.routes.ts (16 occurrences)
- sales.routes.ts (32 occurrences)
- purchases.routes.ts (21 occurrences)

P3 Routes (operations):
- inventory.routes.ts (28 occurrences)
- hr.routes.ts (28 occurrences)
- crm.routes.ts (23 occurrences)
- core.routes.ts (21 occurrences)
- tenants.routes.ts (12 occurrences)
- companies.routes.ts (9 occurrences)
- warehouses.routes.ts (6 occurrences)
- products.routes.ts (6 occurrences)
- projects.routes.ts (6 occurrences)
- system.routes.ts (2 occurrences)

Total: ~271 route protections migrated to permission-based access

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Adrian Flores Cortes 2026-01-31 01:43:05 -06:00
parent a9abe0876f
commit 98fc0cf944
18 changed files with 314 additions and 296 deletions

View File

@ -1,6 +1,7 @@
import { Router } from 'express';
import { companiesController } from './companies.controller.js';
import { authenticate, requireRoles } from '../../shared/middleware/auth.middleware.js';
import { authenticate } from '../../shared/middleware/auth.middleware.js';
import { requireAccess } from '../../shared/middleware/rbac.middleware.js';
const router = Router();
@ -8,42 +9,42 @@ const router = Router();
router.use(authenticate);
// List companies (admin, manager)
router.get('/', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.get('/', requireAccess({ roles: ['admin', 'manager'], permission: 'branches:read' }), (req, res, next) =>
companiesController.findAll(req, res, next)
);
// Get company hierarchy tree (must be before /:id to avoid conflict)
router.get('/hierarchy/tree', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.get('/hierarchy/tree', requireAccess({ roles: ['admin', 'manager'], permission: 'branches:read' }), (req, res, next) =>
companiesController.getHierarchy(req, res, next)
);
// Get company by ID
router.get('/:id', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.get('/:id', requireAccess({ roles: ['admin', 'manager'], permission: 'branches:read' }), (req, res, next) =>
companiesController.findById(req, res, next)
);
// Create company (admin only)
router.post('/', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/', requireAccess({ roles: ['admin'], permission: 'branches:create' }), (req, res, next) =>
companiesController.create(req, res, next)
);
// Update company (admin only)
router.put('/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.put('/:id', requireAccess({ roles: ['admin'], permission: 'branches:update' }), (req, res, next) =>
companiesController.update(req, res, next)
);
// Delete company (admin only)
router.delete('/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/:id', requireAccess({ roles: ['admin'], permission: 'branches:delete' }), (req, res, next) =>
companiesController.delete(req, res, next)
);
// Get users assigned to company
router.get('/:id/users', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.get('/:id/users', requireAccess({ roles: ['admin', 'manager'], permission: 'users:read' }), (req, res, next) =>
companiesController.getUsers(req, res, next)
);
// Get subsidiaries (child companies)
router.get('/:id/subsidiaries', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.get('/:id/subsidiaries', requireAccess({ roles: ['admin', 'manager'], permission: 'branches:read' }), (req, res, next) =>
companiesController.getSubsidiaries(req, res, next)
);

View File

@ -1,6 +1,7 @@
import { Router } from 'express';
import { coreController } from './core.controller.js';
import { authenticate, requireRoles } from '../../shared/middleware/auth.middleware.js';
import { authenticate } from '../../shared/middleware/auth.middleware.js';
import { requireAccess } from '../../shared/middleware/rbac.middleware.js';
const router = Router();
@ -10,10 +11,10 @@ router.use(authenticate);
// ========== CURRENCIES ==========
router.get('/currencies', (req, res, next) => coreController.getCurrencies(req, res, next));
router.get('/currencies/:id', (req, res, next) => coreController.getCurrency(req, res, next));
router.post('/currencies', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/currencies', requireAccess({ roles: ['admin'], permission: 'settings:update' }), (req, res, next) =>
coreController.createCurrency(req, res, next)
);
router.put('/currencies/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.put('/currencies/:id', requireAccess({ roles: ['admin'], permission: 'settings:update' }), (req, res, next) =>
coreController.updateCurrency(req, res, next)
);
@ -26,13 +27,13 @@ router.get('/states', (req, res, next) => coreController.getStates(req, res, nex
router.get('/states/:id', (req, res, next) => coreController.getState(req, res, next));
router.get('/countries/:countryId/states', (req, res, next) => coreController.getStatesByCountry(req, res, next));
router.get('/countries/code/:countryCode/states', (req, res, next) => coreController.getStatesByCountryCode(req, res, next));
router.post('/states', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/states', requireAccess({ roles: ['admin'], permission: 'settings:update' }), (req, res, next) =>
coreController.createState(req, res, next)
);
router.put('/states/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.put('/states/:id', requireAccess({ roles: ['admin'], permission: 'settings:update' }), (req, res, next) =>
coreController.updateState(req, res, next)
);
router.delete('/states/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/states/:id', requireAccess({ roles: ['admin'], permission: 'settings:update' }), (req, res, next) =>
coreController.deleteState(req, res, next)
);
@ -42,11 +43,11 @@ router.get('/currency-rates/latest', (req, res, next) => coreController.getLates
router.get('/currency-rates/rate/:from/:to', (req, res, next) => coreController.getLatestRate(req, res, next));
router.get('/currency-rates/history/:from/:to', (req, res, next) => coreController.getCurrencyRateHistory(req, res, next));
router.get('/currency-rates/:id', (req, res, next) => coreController.getCurrencyRate(req, res, next));
router.post('/currency-rates', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/currency-rates', requireAccess({ roles: ['admin', 'manager'], permission: 'settings:update' }), (req, res, next) =>
coreController.createCurrencyRate(req, res, next)
);
router.post('/currency-rates/convert', (req, res, next) => coreController.convertCurrency(req, res, next));
router.delete('/currency-rates/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/currency-rates/:id', requireAccess({ roles: ['admin'], permission: 'settings:update' }), (req, res, next) =>
coreController.deleteCurrencyRate(req, res, next)
);
@ -58,27 +59,27 @@ router.get('/uom-categories/:id', (req, res, next) => coreController.getUomCateg
router.get('/uom', (req, res, next) => coreController.getUoms(req, res, next));
router.get('/uom/by-code/:code', (req, res, next) => coreController.getUomByCode(req, res, next));
router.get('/uom/:id', (req, res, next) => coreController.getUom(req, res, next));
router.post('/uom', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/uom', requireAccess({ roles: ['admin'], permission: 'settings:update' }), (req, res, next) =>
coreController.createUom(req, res, next)
);
router.post('/uom/convert', (req, res, next) => coreController.convertUom(req, res, next));
router.get('/uom-categories/:categoryId/conversions', (req, res, next) =>
coreController.getUomConversions(req, res, next)
);
router.put('/uom/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.put('/uom/:id', requireAccess({ roles: ['admin'], permission: 'settings:update' }), (req, res, next) =>
coreController.updateUom(req, res, next)
);
// ========== PRODUCT CATEGORIES ==========
router.get('/product-categories', (req, res, next) => coreController.getProductCategories(req, res, next));
router.get('/product-categories/:id', (req, res, next) => coreController.getProductCategory(req, res, next));
router.post('/product-categories', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/product-categories', requireAccess({ roles: ['admin', 'manager'], permission: 'categories:create' }), (req, res, next) =>
coreController.createProductCategory(req, res, next)
);
router.put('/product-categories/:id', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.put('/product-categories/:id', requireAccess({ roles: ['admin', 'manager'], permission: 'categories:update' }), (req, res, next) =>
coreController.updateProductCategory(req, res, next)
);
router.delete('/product-categories/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/product-categories/:id', requireAccess({ roles: ['admin'], permission: 'categories:delete' }), (req, res, next) =>
coreController.deleteProductCategory(req, res, next)
);
@ -86,19 +87,19 @@ router.delete('/product-categories/:id', requireRoles('admin', 'super_admin'), (
router.get('/payment-terms', (req, res, next) => coreController.getPaymentTerms(req, res, next));
router.get('/payment-terms/standard', (req, res, next) => coreController.getStandardPaymentTerms(req, res, next));
router.get('/payment-terms/:id', (req, res, next) => coreController.getPaymentTerm(req, res, next));
router.post('/payment-terms', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/payment-terms', requireAccess({ roles: ['admin', 'manager'], permission: 'settings:update' }), (req, res, next) =>
coreController.createPaymentTerm(req, res, next)
);
router.post('/payment-terms/initialize', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/payment-terms/initialize', requireAccess({ roles: ['admin'], permission: 'settings:update' }), (req, res, next) =>
coreController.initializePaymentTerms(req, res, next)
);
router.post('/payment-terms/:id/calculate-due-date', (req, res, next) =>
coreController.calculateDueDate(req, res, next)
);
router.put('/payment-terms/:id', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.put('/payment-terms/:id', requireAccess({ roles: ['admin', 'manager'], permission: 'settings:update' }), (req, res, next) =>
coreController.updatePaymentTerm(req, res, next)
);
router.delete('/payment-terms/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/payment-terms/:id', requireAccess({ roles: ['admin'], permission: 'settings:update' }), (req, res, next) =>
coreController.deletePaymentTerm(req, res, next)
);
@ -111,17 +112,17 @@ router.get('/discount-rules/by-customer/:customerId', (req, res, next) =>
coreController.getDiscountRulesByCustomer(req, res, next)
);
router.get('/discount-rules/:id', (req, res, next) => coreController.getDiscountRule(req, res, next));
router.post('/discount-rules', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/discount-rules', requireAccess({ roles: ['admin', 'manager'], permission: 'price_lists:create' }), (req, res, next) =>
coreController.createDiscountRule(req, res, next)
);
router.post('/discount-rules/apply', (req, res, next) => coreController.applyDiscounts(req, res, next));
router.put('/discount-rules/:id', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.put('/discount-rules/:id', requireAccess({ roles: ['admin', 'manager'], permission: 'price_lists:update' }), (req, res, next) =>
coreController.updateDiscountRule(req, res, next)
);
router.post('/discount-rules/:id/reset-usage', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/discount-rules/:id/reset-usage', requireAccess({ roles: ['admin'], permission: 'price_lists:update' }), (req, res, next) =>
coreController.resetDiscountRuleUsage(req, res, next)
);
router.delete('/discount-rules/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/discount-rules/:id', requireAccess({ roles: ['admin'], permission: 'price_lists:delete' }), (req, res, next) =>
coreController.deleteDiscountRule(req, res, next)
);

View File

@ -1,6 +1,7 @@
import { Router } from 'express';
import { crmController } from './crm.controller.js';
import { authenticate, requireRoles } from '../../shared/middleware/auth.middleware.js';
import { authenticate } from '../../shared/middleware/auth.middleware.js';
import { requireAccess } from '../../shared/middleware/rbac.middleware.js';
const router = Router();
@ -13,27 +14,27 @@ router.get('/leads', (req, res, next) => crmController.getLeads(req, res, next))
router.get('/leads/:id', (req, res, next) => crmController.getLead(req, res, next));
router.post('/leads', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.post('/leads', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'leads:create' }), (req, res, next) =>
crmController.createLead(req, res, next)
);
router.put('/leads/:id', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.put('/leads/:id', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'leads:update' }), (req, res, next) =>
crmController.updateLead(req, res, next)
);
router.post('/leads/:id/move', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.post('/leads/:id/move', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'leads:update' }), (req, res, next) =>
crmController.moveLeadStage(req, res, next)
);
router.post('/leads/:id/convert', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.post('/leads/:id/convert', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'leads:convert' }), (req, res, next) =>
crmController.convertLead(req, res, next)
);
router.post('/leads/:id/lost', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.post('/leads/:id/lost', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'leads:update' }), (req, res, next) =>
crmController.markLeadLost(req, res, next)
);
router.delete('/leads/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/leads/:id', requireAccess({ roles: ['admin'], permission: 'leads:delete' }), (req, res, next) =>
crmController.deleteLead(req, res, next)
);
@ -43,31 +44,31 @@ router.get('/opportunities', (req, res, next) => crmController.getOpportunities(
router.get('/opportunities/:id', (req, res, next) => crmController.getOpportunity(req, res, next));
router.post('/opportunities', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.post('/opportunities', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'opportunities:create' }), (req, res, next) =>
crmController.createOpportunity(req, res, next)
);
router.put('/opportunities/:id', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.put('/opportunities/:id', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'opportunities:update' }), (req, res, next) =>
crmController.updateOpportunity(req, res, next)
);
router.post('/opportunities/:id/move', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.post('/opportunities/:id/move', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'opportunities:update' }), (req, res, next) =>
crmController.moveOpportunityStage(req, res, next)
);
router.post('/opportunities/:id/won', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.post('/opportunities/:id/won', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'opportunities:close' }), (req, res, next) =>
crmController.markOpportunityWon(req, res, next)
);
router.post('/opportunities/:id/lost', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.post('/opportunities/:id/lost', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'opportunities:close' }), (req, res, next) =>
crmController.markOpportunityLost(req, res, next)
);
router.post('/opportunities/:id/quote', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.post('/opportunities/:id/quote', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'quotations:create' }), (req, res, next) =>
crmController.createOpportunityQuotation(req, res, next)
);
router.delete('/opportunities/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/opportunities/:id', requireAccess({ roles: ['admin'], permission: 'opportunities:delete' }), (req, res, next) =>
crmController.deleteOpportunity(req, res, next)
);
@ -79,15 +80,15 @@ router.get('/pipeline', (req, res, next) => crmController.getPipeline(req, res,
router.get('/lead-stages', (req, res, next) => crmController.getLeadStages(req, res, next));
router.post('/lead-stages', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/lead-stages', requireAccess({ roles: ['admin'], permission: 'leads:create' }), (req, res, next) =>
crmController.createLeadStage(req, res, next)
);
router.put('/lead-stages/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.put('/lead-stages/:id', requireAccess({ roles: ['admin'], permission: 'leads:update' }), (req, res, next) =>
crmController.updateLeadStage(req, res, next)
);
router.delete('/lead-stages/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/lead-stages/:id', requireAccess({ roles: ['admin'], permission: 'leads:delete' }), (req, res, next) =>
crmController.deleteLeadStage(req, res, next)
);
@ -95,15 +96,15 @@ router.delete('/lead-stages/:id', requireRoles('admin', 'super_admin'), (req, re
router.get('/opportunity-stages', (req, res, next) => crmController.getOpportunityStages(req, res, next));
router.post('/opportunity-stages', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/opportunity-stages', requireAccess({ roles: ['admin'], permission: 'opportunities:create' }), (req, res, next) =>
crmController.createOpportunityStage(req, res, next)
);
router.put('/opportunity-stages/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.put('/opportunity-stages/:id', requireAccess({ roles: ['admin'], permission: 'opportunities:update' }), (req, res, next) =>
crmController.updateOpportunityStage(req, res, next)
);
router.delete('/opportunity-stages/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/opportunity-stages/:id', requireAccess({ roles: ['admin'], permission: 'opportunities:delete' }), (req, res, next) =>
crmController.deleteOpportunityStage(req, res, next)
);
@ -111,15 +112,15 @@ router.delete('/opportunity-stages/:id', requireRoles('admin', 'super_admin'), (
router.get('/lost-reasons', (req, res, next) => crmController.getLostReasons(req, res, next));
router.post('/lost-reasons', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/lost-reasons', requireAccess({ roles: ['admin'], permission: 'leads:create' }), (req, res, next) =>
crmController.createLostReason(req, res, next)
);
router.put('/lost-reasons/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.put('/lost-reasons/:id', requireAccess({ roles: ['admin'], permission: 'leads:update' }), (req, res, next) =>
crmController.updateLostReason(req, res, next)
);
router.delete('/lost-reasons/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/lost-reasons/:id', requireAccess({ roles: ['admin'], permission: 'leads:delete' }), (req, res, next) =>
crmController.deleteLostReason(req, res, next)
);

View File

@ -1,6 +1,7 @@
import { Router } from 'express';
import { financialController } from './financial.controller.js';
import { authenticate, requireRoles } from '../../shared/middleware/auth.middleware.js';
import { authenticate } from '../../shared/middleware/auth.middleware.js';
import { requireAccess } from '../../shared/middleware/rbac.middleware.js';
const router = Router();
@ -11,139 +12,139 @@ router.use(authenticate);
router.get('/account-types', (req, res, next) => financialController.getAccountTypes(req, res, next));
// ========== ACCOUNTS ==========
router.get('/accounts', requireRoles('admin', 'accountant', 'manager', 'super_admin'), (req, res, next) =>
router.get('/accounts', requireAccess({ roles: ['admin', 'accountant', 'manager'], permission: 'accounts:read' }), (req, res, next) =>
financialController.getAccounts(req, res, next)
);
router.get('/accounts/:id', requireRoles('admin', 'accountant', 'manager', 'super_admin'), (req, res, next) =>
router.get('/accounts/:id', requireAccess({ roles: ['admin', 'accountant', 'manager'], permission: 'accounts:read' }), (req, res, next) =>
financialController.getAccount(req, res, next)
);
router.get('/accounts/:id/balance', requireRoles('admin', 'accountant', 'manager', 'super_admin'), (req, res, next) =>
router.get('/accounts/:id/balance', requireAccess({ roles: ['admin', 'accountant', 'manager'], permission: 'accounts:read' }), (req, res, next) =>
financialController.getAccountBalance(req, res, next)
);
router.post('/accounts', requireRoles('admin', 'accountant', 'super_admin'), (req, res, next) =>
router.post('/accounts', requireAccess({ roles: ['admin', 'accountant'], permission: 'accounts:create' }), (req, res, next) =>
financialController.createAccount(req, res, next)
);
router.put('/accounts/:id', requireRoles('admin', 'accountant', 'super_admin'), (req, res, next) =>
router.put('/accounts/:id', requireAccess({ roles: ['admin', 'accountant'], permission: 'accounts:update' }), (req, res, next) =>
financialController.updateAccount(req, res, next)
);
router.delete('/accounts/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/accounts/:id', requireAccess({ roles: ['admin'], permission: 'accounts:delete' }), (req, res, next) =>
financialController.deleteAccount(req, res, next)
);
// ========== JOURNALS ==========
router.get('/journals', requireRoles('admin', 'accountant', 'manager', 'super_admin'), (req, res, next) =>
router.get('/journals', requireAccess({ roles: ['admin', 'accountant', 'manager'], permission: 'journal_entries:read' }), (req, res, next) =>
financialController.getJournals(req, res, next)
);
router.get('/journals/:id', requireRoles('admin', 'accountant', 'manager', 'super_admin'), (req, res, next) =>
router.get('/journals/:id', requireAccess({ roles: ['admin', 'accountant', 'manager'], permission: 'journal_entries:read' }), (req, res, next) =>
financialController.getJournal(req, res, next)
);
router.post('/journals', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/journals', requireAccess({ roles: ['admin'], permission: 'journal_entries:create' }), (req, res, next) =>
financialController.createJournal(req, res, next)
);
router.put('/journals/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.put('/journals/:id', requireAccess({ roles: ['admin'], permission: 'journal_entries:update' }), (req, res, next) =>
financialController.updateJournal(req, res, next)
);
router.delete('/journals/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/journals/:id', requireAccess({ roles: ['admin'], permission: 'journal_entries:delete' }), (req, res, next) =>
financialController.deleteJournal(req, res, next)
);
// ========== JOURNAL ENTRIES ==========
router.get('/entries', requireRoles('admin', 'accountant', 'manager', 'super_admin'), (req, res, next) =>
router.get('/entries', requireAccess({ roles: ['admin', 'accountant', 'manager'], permission: 'journal_entries:read' }), (req, res, next) =>
financialController.getJournalEntries(req, res, next)
);
router.get('/entries/:id', requireRoles('admin', 'accountant', 'manager', 'super_admin'), (req, res, next) =>
router.get('/entries/:id', requireAccess({ roles: ['admin', 'accountant', 'manager'], permission: 'journal_entries:read' }), (req, res, next) =>
financialController.getJournalEntry(req, res, next)
);
router.post('/entries', requireRoles('admin', 'accountant', 'super_admin'), (req, res, next) =>
router.post('/entries', requireAccess({ roles: ['admin', 'accountant'], permission: 'journal_entries:create' }), (req, res, next) =>
financialController.createJournalEntry(req, res, next)
);
router.put('/entries/:id', requireRoles('admin', 'accountant', 'super_admin'), (req, res, next) =>
router.put('/entries/:id', requireAccess({ roles: ['admin', 'accountant'], permission: 'journal_entries:update' }), (req, res, next) =>
financialController.updateJournalEntry(req, res, next)
);
router.post('/entries/:id/post', requireRoles('admin', 'accountant', 'super_admin'), (req, res, next) =>
router.post('/entries/:id/post', requireAccess({ roles: ['admin', 'accountant'], permission: 'journal_entries:post' }), (req, res, next) =>
financialController.postJournalEntry(req, res, next)
);
router.post('/entries/:id/cancel', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/entries/:id/cancel', requireAccess({ roles: ['admin'], permission: 'journal_entries:reverse' }), (req, res, next) =>
financialController.cancelJournalEntry(req, res, next)
);
router.delete('/entries/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/entries/:id', requireAccess({ roles: ['admin'], permission: 'journal_entries:delete' }), (req, res, next) =>
financialController.deleteJournalEntry(req, res, next)
);
// ========== INVOICES ==========
router.get('/invoices', requireRoles('admin', 'accountant', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.get('/invoices', requireAccess({ roles: ['admin', 'accountant', 'manager', 'sales'], permission: 'invoices:read' }), (req, res, next) =>
financialController.getInvoices(req, res, next)
);
router.get('/invoices/:id', requireRoles('admin', 'accountant', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.get('/invoices/:id', requireAccess({ roles: ['admin', 'accountant', 'manager', 'sales'], permission: 'invoices:read' }), (req, res, next) =>
financialController.getInvoice(req, res, next)
);
router.post('/invoices', requireRoles('admin', 'accountant', 'sales', 'super_admin'), (req, res, next) =>
router.post('/invoices', requireAccess({ roles: ['admin', 'accountant', 'sales'], permission: 'invoices:create' }), (req, res, next) =>
financialController.createInvoice(req, res, next)
);
router.put('/invoices/:id', requireRoles('admin', 'accountant', 'sales', 'super_admin'), (req, res, next) =>
router.put('/invoices/:id', requireAccess({ roles: ['admin', 'accountant', 'sales'], permission: 'invoices:update' }), (req, res, next) =>
financialController.updateInvoice(req, res, next)
);
router.post('/invoices/:id/validate', requireRoles('admin', 'accountant', 'super_admin'), (req, res, next) =>
router.post('/invoices/:id/validate', requireAccess({ roles: ['admin', 'accountant'], permission: 'invoices:validate' }), (req, res, next) =>
financialController.validateInvoice(req, res, next)
);
router.post('/invoices/:id/cancel', requireRoles('admin', 'accountant', 'super_admin'), (req, res, next) =>
router.post('/invoices/:id/cancel', requireAccess({ roles: ['admin', 'accountant'], permission: 'invoices:cancel' }), (req, res, next) =>
financialController.cancelInvoice(req, res, next)
);
router.delete('/invoices/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/invoices/:id', requireAccess({ roles: ['admin'], permission: 'invoices:delete' }), (req, res, next) =>
financialController.deleteInvoice(req, res, next)
);
// Invoice lines
router.post('/invoices/:id/lines', requireRoles('admin', 'accountant', 'sales', 'super_admin'), (req, res, next) =>
router.post('/invoices/:id/lines', requireAccess({ roles: ['admin', 'accountant', 'sales'], permission: 'invoices:update' }), (req, res, next) =>
financialController.addInvoiceLine(req, res, next)
);
router.put('/invoices/:id/lines/:lineId', requireRoles('admin', 'accountant', 'sales', 'super_admin'), (req, res, next) =>
router.put('/invoices/:id/lines/:lineId', requireAccess({ roles: ['admin', 'accountant', 'sales'], permission: 'invoices:update' }), (req, res, next) =>
financialController.updateInvoiceLine(req, res, next)
);
router.delete('/invoices/:id/lines/:lineId', requireRoles('admin', 'accountant', 'sales', 'super_admin'), (req, res, next) =>
router.delete('/invoices/:id/lines/:lineId', requireAccess({ roles: ['admin', 'accountant', 'sales'], permission: 'invoices:update' }), (req, res, next) =>
financialController.removeInvoiceLine(req, res, next)
);
// ========== PAYMENTS ==========
router.get('/payments', requireRoles('admin', 'accountant', 'manager', 'super_admin'), (req, res, next) =>
router.get('/payments', requireAccess({ roles: ['admin', 'accountant', 'manager'], permission: 'payments:read' }), (req, res, next) =>
financialController.getPayments(req, res, next)
);
router.get('/payments/:id', requireRoles('admin', 'accountant', 'manager', 'super_admin'), (req, res, next) =>
router.get('/payments/:id', requireAccess({ roles: ['admin', 'accountant', 'manager'], permission: 'payments:read' }), (req, res, next) =>
financialController.getPayment(req, res, next)
);
router.post('/payments', requireRoles('admin', 'accountant', 'super_admin'), (req, res, next) =>
router.post('/payments', requireAccess({ roles: ['admin', 'accountant'], permission: 'payments:create' }), (req, res, next) =>
financialController.createPayment(req, res, next)
);
router.put('/payments/:id', requireRoles('admin', 'accountant', 'super_admin'), (req, res, next) =>
router.put('/payments/:id', requireAccess({ roles: ['admin', 'accountant'], permission: 'payments:update' }), (req, res, next) =>
financialController.updatePayment(req, res, next)
);
router.post('/payments/:id/post', requireRoles('admin', 'accountant', 'super_admin'), (req, res, next) =>
router.post('/payments/:id/post', requireAccess({ roles: ['admin', 'accountant'], permission: 'payments:apply' }), (req, res, next) =>
financialController.postPayment(req, res, next)
);
router.post('/payments/:id/reconcile', requireRoles('admin', 'accountant', 'super_admin'), (req, res, next) =>
router.post('/payments/:id/reconcile', requireAccess({ roles: ['admin', 'accountant'], permission: 'bank_reconciliation:update' }), (req, res, next) =>
financialController.reconcilePayment(req, res, next)
);
router.post('/payments/:id/cancel', requireRoles('admin', 'accountant', 'super_admin'), (req, res, next) =>
router.post('/payments/:id/cancel', requireAccess({ roles: ['admin', 'accountant'], permission: 'payments:delete' }), (req, res, next) =>
financialController.cancelPayment(req, res, next)
);
router.delete('/payments/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/payments/:id', requireAccess({ roles: ['admin'], permission: 'payments:delete' }), (req, res, next) =>
financialController.deletePayment(req, res, next)
);
// ========== TAXES ==========
router.get('/taxes', requireRoles('admin', 'accountant', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.get('/taxes', requireAccess({ roles: ['admin', 'accountant', 'manager', 'sales'], permission: 'accounts:read' }), (req, res, next) =>
financialController.getTaxes(req, res, next)
);
router.get('/taxes/:id', requireRoles('admin', 'accountant', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.get('/taxes/:id', requireAccess({ roles: ['admin', 'accountant', 'manager', 'sales'], permission: 'accounts:read' }), (req, res, next) =>
financialController.getTax(req, res, next)
);
router.post('/taxes', requireRoles('admin', 'accountant', 'super_admin'), (req, res, next) =>
router.post('/taxes', requireAccess({ roles: ['admin', 'accountant'], permission: 'accounts:create' }), (req, res, next) =>
financialController.createTax(req, res, next)
);
router.put('/taxes/:id', requireRoles('admin', 'accountant', 'super_admin'), (req, res, next) =>
router.put('/taxes/:id', requireAccess({ roles: ['admin', 'accountant'], permission: 'accounts:update' }), (req, res, next) =>
financialController.updateTax(req, res, next)
);
router.delete('/taxes/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/taxes/:id', requireAccess({ roles: ['admin'], permission: 'accounts:delete' }), (req, res, next) =>
financialController.deleteTax(req, res, next)
);

View File

@ -1,6 +1,7 @@
import { Router } from 'express';
import { hrController } from './hr.controller.js';
import { authenticate, requireRoles } from '../../shared/middleware/auth.middleware.js';
import { authenticate } from '../../shared/middleware/auth.middleware.js';
import { requireAccess } from '../../shared/middleware/rbac.middleware.js';
const router = Router();
@ -15,23 +16,23 @@ router.get('/employees/:id', (req, res, next) => hrController.getEmployee(req, r
router.get('/employees/:id/subordinates', (req, res, next) => hrController.getSubordinates(req, res, next));
router.post('/employees', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/employees', requireAccess({ roles: ['admin', 'manager'], permission: 'employees:create' }), (req, res, next) =>
hrController.createEmployee(req, res, next)
);
router.put('/employees/:id', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.put('/employees/:id', requireAccess({ roles: ['admin', 'manager'], permission: 'employees:update' }), (req, res, next) =>
hrController.updateEmployee(req, res, next)
);
router.post('/employees/:id/terminate', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/employees/:id/terminate', requireAccess({ roles: ['admin'], permission: 'employees:delete' }), (req, res, next) =>
hrController.terminateEmployee(req, res, next)
);
router.post('/employees/:id/reactivate', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/employees/:id/reactivate', requireAccess({ roles: ['admin'], permission: 'employees:update' }), (req, res, next) =>
hrController.reactivateEmployee(req, res, next)
);
router.delete('/employees/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/employees/:id', requireAccess({ roles: ['admin'], permission: 'employees:delete' }), (req, res, next) =>
hrController.deleteEmployee(req, res, next)
);
@ -41,15 +42,15 @@ router.get('/departments', (req, res, next) => hrController.getDepartments(req,
router.get('/departments/:id', (req, res, next) => hrController.getDepartment(req, res, next));
router.post('/departments', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/departments', requireAccess({ roles: ['admin'], permission: 'departments:create' }), (req, res, next) =>
hrController.createDepartment(req, res, next)
);
router.put('/departments/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.put('/departments/:id', requireAccess({ roles: ['admin'], permission: 'departments:update' }), (req, res, next) =>
hrController.updateDepartment(req, res, next)
);
router.delete('/departments/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/departments/:id', requireAccess({ roles: ['admin'], permission: 'departments:delete' }), (req, res, next) =>
hrController.deleteDepartment(req, res, next)
);
@ -57,15 +58,15 @@ router.delete('/departments/:id', requireRoles('admin', 'super_admin'), (req, re
router.get('/positions', (req, res, next) => hrController.getJobPositions(req, res, next));
router.post('/positions', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/positions', requireAccess({ roles: ['admin'], permission: 'positions:create' }), (req, res, next) =>
hrController.createJobPosition(req, res, next)
);
router.put('/positions/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.put('/positions/:id', requireAccess({ roles: ['admin'], permission: 'positions:update' }), (req, res, next) =>
hrController.updateJobPosition(req, res, next)
);
router.delete('/positions/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/positions/:id', requireAccess({ roles: ['admin'], permission: 'positions:delete' }), (req, res, next) =>
hrController.deleteJobPosition(req, res, next)
);
@ -75,27 +76,27 @@ router.get('/contracts', (req, res, next) => hrController.getContracts(req, res,
router.get('/contracts/:id', (req, res, next) => hrController.getContract(req, res, next));
router.post('/contracts', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/contracts', requireAccess({ roles: ['admin', 'manager'], permission: 'contracts:create' }), (req, res, next) =>
hrController.createContract(req, res, next)
);
router.put('/contracts/:id', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.put('/contracts/:id', requireAccess({ roles: ['admin', 'manager'], permission: 'contracts:update' }), (req, res, next) =>
hrController.updateContract(req, res, next)
);
router.post('/contracts/:id/activate', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/contracts/:id/activate', requireAccess({ roles: ['admin'], permission: 'contracts:update' }), (req, res, next) =>
hrController.activateContract(req, res, next)
);
router.post('/contracts/:id/terminate', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/contracts/:id/terminate', requireAccess({ roles: ['admin'], permission: 'contracts:update' }), (req, res, next) =>
hrController.terminateContract(req, res, next)
);
router.post('/contracts/:id/cancel', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/contracts/:id/cancel', requireAccess({ roles: ['admin'], permission: 'contracts:update' }), (req, res, next) =>
hrController.cancelContract(req, res, next)
);
router.delete('/contracts/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/contracts/:id', requireAccess({ roles: ['admin'], permission: 'contracts:delete' }), (req, res, next) =>
hrController.deleteContract(req, res, next)
);
@ -103,15 +104,15 @@ router.delete('/contracts/:id', requireRoles('admin', 'super_admin'), (req, res,
router.get('/leave-types', (req, res, next) => hrController.getLeaveTypes(req, res, next));
router.post('/leave-types', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/leave-types', requireAccess({ roles: ['admin'], permission: 'leaves:create' }), (req, res, next) =>
hrController.createLeaveType(req, res, next)
);
router.put('/leave-types/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.put('/leave-types/:id', requireAccess({ roles: ['admin'], permission: 'leaves:update' }), (req, res, next) =>
hrController.updateLeaveType(req, res, next)
);
router.delete('/leave-types/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/leave-types/:id', requireAccess({ roles: ['admin'], permission: 'leaves:delete' }), (req, res, next) =>
hrController.deleteLeaveType(req, res, next)
);
@ -121,31 +122,31 @@ router.get('/leaves', (req, res, next) => hrController.getLeaves(req, res, next)
router.get('/leaves/:id', (req, res, next) => hrController.getLeave(req, res, next));
router.post('/leaves', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/leaves', requireAccess({ roles: ['admin', 'manager'], permission: 'leaves:create' }), (req, res, next) =>
hrController.createLeave(req, res, next)
);
router.put('/leaves/:id', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.put('/leaves/:id', requireAccess({ roles: ['admin', 'manager'], permission: 'leaves:update' }), (req, res, next) =>
hrController.updateLeave(req, res, next)
);
router.post('/leaves/:id/submit', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/leaves/:id/submit', requireAccess({ roles: ['admin', 'manager'], permission: 'leaves:create' }), (req, res, next) =>
hrController.submitLeave(req, res, next)
);
router.post('/leaves/:id/approve', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/leaves/:id/approve', requireAccess({ roles: ['admin', 'manager'], permission: 'leaves:approve' }), (req, res, next) =>
hrController.approveLeave(req, res, next)
);
router.post('/leaves/:id/reject', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/leaves/:id/reject', requireAccess({ roles: ['admin', 'manager'], permission: 'leaves:approve' }), (req, res, next) =>
hrController.rejectLeave(req, res, next)
);
router.post('/leaves/:id/cancel', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/leaves/:id/cancel', requireAccess({ roles: ['admin', 'manager'], permission: 'leaves:update' }), (req, res, next) =>
hrController.cancelLeave(req, res, next)
);
router.delete('/leaves/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/leaves/:id', requireAccess({ roles: ['admin'], permission: 'leaves:delete' }), (req, res, next) =>
hrController.deleteLeave(req, res, next)
);

View File

@ -1,7 +1,8 @@
import { Router } from 'express';
import { inventoryController } from './inventory.controller.js';
import { valuationController } from './valuation.controller.js';
import { authenticate, requireRoles } from '../../shared/middleware/auth.middleware.js';
import { authenticate } from '../../shared/middleware/auth.middleware.js';
import { requireAccess } from '../../shared/middleware/rbac.middleware.js';
const router = Router();
@ -15,15 +16,15 @@ router.get('/products/:id', (req, res, next) => inventoryController.getProduct(r
router.get('/products/:id/stock', (req, res, next) => inventoryController.getProductStock(req, res, next));
router.post('/products', requireRoles('admin', 'manager', 'warehouse', 'super_admin'), (req, res, next) =>
router.post('/products', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'products:create' }), (req, res, next) =>
inventoryController.createProduct(req, res, next)
);
router.put('/products/:id', requireRoles('admin', 'manager', 'warehouse', 'super_admin'), (req, res, next) =>
router.put('/products/:id', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'products:update' }), (req, res, next) =>
inventoryController.updateProduct(req, res, next)
);
router.delete('/products/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/products/:id', requireAccess({ roles: ['admin'], permission: 'products:delete' }), (req, res, next) =>
inventoryController.deleteProduct(req, res, next)
);
@ -36,15 +37,15 @@ router.get('/warehouses/:id/locations', (req, res, next) => inventoryController.
router.get('/warehouses/:id/stock', (req, res, next) => inventoryController.getWarehouseStock(req, res, next));
router.post('/warehouses', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/warehouses', requireAccess({ roles: ['admin'], permission: 'warehouses:create' }), (req, res, next) =>
inventoryController.createWarehouse(req, res, next)
);
router.put('/warehouses/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.put('/warehouses/:id', requireAccess({ roles: ['admin'], permission: 'warehouses:update' }), (req, res, next) =>
inventoryController.updateWarehouse(req, res, next)
);
router.delete('/warehouses/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/warehouses/:id', requireAccess({ roles: ['admin'], permission: 'warehouses:delete' }), (req, res, next) =>
inventoryController.deleteWarehouse(req, res, next)
);
@ -55,11 +56,11 @@ router.get('/locations/:id', (req, res, next) => inventoryController.getLocation
router.get('/locations/:id/stock', (req, res, next) => inventoryController.getLocationStock(req, res, next));
router.post('/locations', requireRoles('admin', 'manager', 'warehouse', 'super_admin'), (req, res, next) =>
router.post('/locations', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'warehouses:update' }), (req, res, next) =>
inventoryController.createLocation(req, res, next)
);
router.put('/locations/:id', requireRoles('admin', 'manager', 'warehouse', 'super_admin'), (req, res, next) =>
router.put('/locations/:id', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'warehouses:update' }), (req, res, next) =>
inventoryController.updateLocation(req, res, next)
);
@ -68,23 +69,23 @@ router.get('/pickings', (req, res, next) => inventoryController.getPickings(req,
router.get('/pickings/:id', (req, res, next) => inventoryController.getPicking(req, res, next));
router.post('/pickings', requireRoles('admin', 'manager', 'warehouse', 'super_admin'), (req, res, next) =>
router.post('/pickings', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'stock_moves:create' }), (req, res, next) =>
inventoryController.createPicking(req, res, next)
);
router.post('/pickings/:id/confirm', requireRoles('admin', 'manager', 'warehouse', 'super_admin'), (req, res, next) =>
router.post('/pickings/:id/confirm', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'stock_moves:validate' }), (req, res, next) =>
inventoryController.confirmPicking(req, res, next)
);
router.post('/pickings/:id/validate', requireRoles('admin', 'manager', 'warehouse', 'super_admin'), (req, res, next) =>
router.post('/pickings/:id/validate', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'stock_moves:validate' }), (req, res, next) =>
inventoryController.validatePicking(req, res, next)
);
router.post('/pickings/:id/cancel', requireRoles('admin', 'manager', 'warehouse', 'super_admin'), (req, res, next) =>
router.post('/pickings/:id/cancel', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'stock_moves:cancel' }), (req, res, next) =>
inventoryController.cancelPicking(req, res, next)
);
router.delete('/pickings/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/pickings/:id', requireAccess({ roles: ['admin'], permission: 'stock_moves:delete' }), (req, res, next) =>
inventoryController.deletePicking(req, res, next)
);
@ -95,15 +96,15 @@ router.get('/lots/:id', (req, res, next) => inventoryController.getLot(req, res,
router.get('/lots/:id/movements', (req, res, next) => inventoryController.getLotMovements(req, res, next));
router.post('/lots', requireRoles('admin', 'manager', 'warehouse', 'super_admin'), (req, res, next) =>
router.post('/lots', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'inventory:update' }), (req, res, next) =>
inventoryController.createLot(req, res, next)
);
router.put('/lots/:id', requireRoles('admin', 'manager', 'warehouse', 'super_admin'), (req, res, next) =>
router.put('/lots/:id', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'inventory:update' }), (req, res, next) =>
inventoryController.updateLot(req, res, next)
);
router.delete('/lots/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/lots/:id', requireAccess({ roles: ['admin'], permission: 'inventory:update' }), (req, res, next) =>
inventoryController.deleteLot(req, res, next)
);
@ -112,41 +113,41 @@ router.get('/adjustments', (req, res, next) => inventoryController.getAdjustment
router.get('/adjustments/:id', (req, res, next) => inventoryController.getAdjustment(req, res, next));
router.post('/adjustments', requireRoles('admin', 'manager', 'warehouse', 'super_admin'), (req, res, next) =>
router.post('/adjustments', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'inventory:adjust' }), (req, res, next) =>
inventoryController.createAdjustment(req, res, next)
);
router.put('/adjustments/:id', requireRoles('admin', 'manager', 'warehouse', 'super_admin'), (req, res, next) =>
router.put('/adjustments/:id', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'inventory:adjust' }), (req, res, next) =>
inventoryController.updateAdjustment(req, res, next)
);
// Adjustment lines
router.post('/adjustments/:id/lines', requireRoles('admin', 'manager', 'warehouse', 'super_admin'), (req, res, next) =>
router.post('/adjustments/:id/lines', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'inventory:adjust' }), (req, res, next) =>
inventoryController.addAdjustmentLine(req, res, next)
);
router.put('/adjustments/:id/lines/:lineId', requireRoles('admin', 'manager', 'warehouse', 'super_admin'), (req, res, next) =>
router.put('/adjustments/:id/lines/:lineId', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'inventory:adjust' }), (req, res, next) =>
inventoryController.updateAdjustmentLine(req, res, next)
);
router.delete('/adjustments/:id/lines/:lineId', requireRoles('admin', 'manager', 'warehouse', 'super_admin'), (req, res, next) =>
router.delete('/adjustments/:id/lines/:lineId', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'inventory:adjust' }), (req, res, next) =>
inventoryController.removeAdjustmentLine(req, res, next)
);
// Adjustment workflow
router.post('/adjustments/:id/confirm', requireRoles('admin', 'manager', 'warehouse', 'super_admin'), (req, res, next) =>
router.post('/adjustments/:id/confirm', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'inventory:adjust' }), (req, res, next) =>
inventoryController.confirmAdjustment(req, res, next)
);
router.post('/adjustments/:id/validate', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/adjustments/:id/validate', requireAccess({ roles: ['admin', 'manager'], permission: 'stock_count:validate' }), (req, res, next) =>
inventoryController.validateAdjustment(req, res, next)
);
router.post('/adjustments/:id/cancel', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/adjustments/:id/cancel', requireAccess({ roles: ['admin', 'manager'], permission: 'inventory:adjust' }), (req, res, next) =>
inventoryController.cancelAdjustment(req, res, next)
);
router.delete('/adjustments/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/adjustments/:id', requireAccess({ roles: ['admin'], permission: 'inventory:adjust' }), (req, res, next) =>
inventoryController.deleteAdjustment(req, res, next)
);
@ -163,11 +164,11 @@ router.get('/valuation/products/:productId/layers', (req, res, next) =>
valuationController.getProductLayers(req, res, next)
);
router.post('/valuation/layers', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/valuation/layers', requireAccess({ roles: ['admin', 'manager'], permission: 'inventory:update' }), (req, res, next) =>
valuationController.createLayer(req, res, next)
);
router.post('/valuation/consume', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/valuation/consume', requireAccess({ roles: ['admin', 'manager'], permission: 'inventory:update' }), (req, res, next) =>
valuationController.consumeFifo(req, res, next)
);

View File

@ -1,6 +1,7 @@
import { Router } from 'express';
import { invoicesController } from './invoices.controller.js';
import { authenticate, requireRoles } from '../../shared/middleware/auth.middleware.js';
import { authenticate } from '../../shared/middleware/auth.middleware.js';
import { requireAccess } from '../../shared/middleware/rbac.middleware.js';
const router = Router();
@ -15,17 +16,17 @@ router.get('/payments', (req, res, next) => invoicesController.findAllPayments(r
router.get('/payments/:id', (req, res, next) => invoicesController.findPaymentById(req, res, next));
// Create payment
router.post('/payments', requireRoles('admin', 'manager', 'accountant', 'super_admin'), (req, res, next) =>
router.post('/payments', requireAccess({ roles: ['admin', 'manager', 'accountant'], permission: 'payments:create' }), (req, res, next) =>
invoicesController.createPayment(req, res, next)
);
// Confirm payment
router.post('/payments/:id/confirm', requireRoles('admin', 'manager', 'accountant', 'super_admin'), (req, res, next) =>
router.post('/payments/:id/confirm', requireAccess({ roles: ['admin', 'manager', 'accountant'], permission: 'payments:apply' }), (req, res, next) =>
invoicesController.confirmPayment(req, res, next)
);
// Cancel payment
router.post('/payments/:id/cancel', requireRoles('admin', 'manager', 'accountant', 'super_admin'), (req, res, next) =>
router.post('/payments/:id/cancel', requireAccess({ roles: ['admin', 'manager', 'accountant'], permission: 'payments:delete' }), (req, res, next) =>
invoicesController.cancelPayment(req, res, next)
);
@ -37,27 +38,27 @@ router.get('/', (req, res, next) => invoicesController.findAll(req, res, next));
router.get('/:id', (req, res, next) => invoicesController.findById(req, res, next));
// Create invoice
router.post('/', requireRoles('admin', 'manager', 'accountant', 'super_admin'), (req, res, next) =>
router.post('/', requireAccess({ roles: ['admin', 'manager', 'accountant'], permission: 'invoices:create' }), (req, res, next) =>
invoicesController.create(req, res, next)
);
// Update invoice
router.patch('/:id', requireRoles('admin', 'manager', 'accountant', 'super_admin'), (req, res, next) =>
router.patch('/:id', requireAccess({ roles: ['admin', 'manager', 'accountant'], permission: 'invoices:update' }), (req, res, next) =>
invoicesController.update(req, res, next)
);
// Delete invoice
router.delete('/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/:id', requireAccess({ roles: ['admin'], permission: 'invoices:delete' }), (req, res, next) =>
invoicesController.delete(req, res, next)
);
// Validate invoice (change status to validated)
router.post('/:id/validate', requireRoles('admin', 'manager', 'accountant', 'super_admin'), (req, res, next) =>
router.post('/:id/validate', requireAccess({ roles: ['admin', 'manager', 'accountant'], permission: 'invoices:validate' }), (req, res, next) =>
invoicesController.validate(req, res, next)
);
// Cancel invoice
router.post('/:id/cancel', requireRoles('admin', 'manager', 'accountant', 'super_admin'), (req, res, next) =>
router.post('/:id/cancel', requireAccess({ roles: ['admin', 'manager', 'accountant'], permission: 'invoices:cancel' }), (req, res, next) =>
invoicesController.cancel(req, res, next)
);

View File

@ -1,7 +1,8 @@
import { Router } from 'express';
import { partnersController } from './partners.controller.js';
import { rankingController } from './ranking.controller.js';
import { authenticate, requireRoles } from '../../shared/middleware/auth.middleware.js';
import { authenticate } from '../../shared/middleware/auth.middleware.js';
import { requireAccess } from '../../shared/middleware/rbac.middleware.js';
const router = Router();
@ -13,44 +14,44 @@ router.use(authenticate);
// ============================================================================
// Calculate rankings (admin, manager)
router.post('/rankings/calculate', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/rankings/calculate', requireAccess({ roles: ['admin', 'manager'], permission: 'partners:update' }), (req, res, next) =>
rankingController.calculateRankings(req, res, next)
);
// Get all rankings
router.get('/rankings', requireRoles('admin', 'manager', 'sales', 'accountant', 'super_admin'), (req, res, next) =>
router.get('/rankings', requireAccess({ roles: ['admin', 'manager', 'sales', 'accountant'], permission: 'partners:read' }), (req, res, next) =>
rankingController.findRankings(req, res, next)
);
// Top partners
router.get('/rankings/top/customers', requireRoles('admin', 'manager', 'sales', 'accountant', 'super_admin'), (req, res, next) =>
router.get('/rankings/top/customers', requireAccess({ roles: ['admin', 'manager', 'sales', 'accountant'], permission: 'customers:read' }), (req, res, next) =>
rankingController.getTopCustomers(req, res, next)
);
router.get('/rankings/top/suppliers', requireRoles('admin', 'manager', 'sales', 'accountant', 'super_admin'), (req, res, next) =>
router.get('/rankings/top/suppliers', requireAccess({ roles: ['admin', 'manager', 'sales', 'accountant'], permission: 'suppliers:read' }), (req, res, next) =>
rankingController.getTopSuppliers(req, res, next)
);
// ABC distribution
router.get('/rankings/abc/customers', requireRoles('admin', 'manager', 'sales', 'accountant', 'super_admin'), (req, res, next) =>
router.get('/rankings/abc/customers', requireAccess({ roles: ['admin', 'manager', 'sales', 'accountant'], permission: 'customers:read' }), (req, res, next) =>
rankingController.getCustomerABCDistribution(req, res, next)
);
router.get('/rankings/abc/suppliers', requireRoles('admin', 'manager', 'sales', 'accountant', 'super_admin'), (req, res, next) =>
router.get('/rankings/abc/suppliers', requireAccess({ roles: ['admin', 'manager', 'sales', 'accountant'], permission: 'suppliers:read' }), (req, res, next) =>
rankingController.getSupplierABCDistribution(req, res, next)
);
// Partners by ABC
router.get('/rankings/abc/customers/:abc', requireRoles('admin', 'manager', 'sales', 'accountant', 'super_admin'), (req, res, next) =>
router.get('/rankings/abc/customers/:abc', requireAccess({ roles: ['admin', 'manager', 'sales', 'accountant'], permission: 'customers:read' }), (req, res, next) =>
rankingController.getCustomersByABC(req, res, next)
);
router.get('/rankings/abc/suppliers/:abc', requireRoles('admin', 'manager', 'sales', 'accountant', 'super_admin'), (req, res, next) =>
router.get('/rankings/abc/suppliers/:abc', requireAccess({ roles: ['admin', 'manager', 'sales', 'accountant'], permission: 'suppliers:read' }), (req, res, next) =>
rankingController.getSuppliersByABC(req, res, next)
);
// Partner-specific ranking
router.get('/rankings/partner/:partnerId', requireRoles('admin', 'manager', 'sales', 'accountant', 'super_admin'), (req, res, next) =>
router.get('/rankings/partner/:partnerId', requireAccess({ roles: ['admin', 'manager', 'sales', 'accountant'], permission: 'partners:read' }), (req, res, next) =>
rankingController.findPartnerRanking(req, res, next)
);
router.get('/rankings/partner/:partnerId/history', requireRoles('admin', 'manager', 'sales', 'accountant', 'super_admin'), (req, res, next) =>
router.get('/rankings/partner/:partnerId/history', requireAccess({ roles: ['admin', 'manager', 'sales', 'accountant'], permission: 'partners:read' }), (req, res, next) =>
rankingController.getPartnerHistory(req, res, next)
);
@ -63,27 +64,27 @@ router.get('/customers', (req, res, next) => partnersController.findCustomers(re
router.get('/suppliers', (req, res, next) => partnersController.findSuppliers(req, res, next));
// List all partners (admin, manager, sales, accountant)
router.get('/', requireRoles('admin', 'manager', 'sales', 'accountant', 'super_admin'), (req, res, next) =>
router.get('/', requireAccess({ roles: ['admin', 'manager', 'sales', 'accountant'], permission: 'partners:read' }), (req, res, next) =>
partnersController.findAll(req, res, next)
);
// Get partner by ID
router.get('/:id', requireRoles('admin', 'manager', 'sales', 'accountant', 'super_admin'), (req, res, next) =>
router.get('/:id', requireAccess({ roles: ['admin', 'manager', 'sales', 'accountant'], permission: 'partners:read' }), (req, res, next) =>
partnersController.findById(req, res, next)
);
// Create partner (admin, manager, sales)
router.post('/', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.post('/', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'partners:create' }), (req, res, next) =>
partnersController.create(req, res, next)
);
// Update partner (admin, manager, sales)
router.put('/:id', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.put('/:id', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'partners:update' }), (req, res, next) =>
partnersController.update(req, res, next)
);
// Delete partner (admin only)
router.delete('/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/:id', requireAccess({ roles: ['admin'], permission: 'partners:delete' }), (req, res, next) =>
partnersController.delete(req, res, next)
);

View File

@ -1,6 +1,7 @@
import { Router } from 'express';
import { productsController } from './products.controller.js';
import { authenticate, requireRoles } from '../../shared/middleware/auth.middleware.js';
import { authenticate } from '../../shared/middleware/auth.middleware.js';
import { requireAccess } from '../../shared/middleware/rbac.middleware.js';
const router = Router();
@ -15,17 +16,17 @@ router.get('/categories', (req, res, next) => productsController.findAllCategori
router.get('/categories/:id', (req, res, next) => productsController.findCategoryById(req, res, next));
// Create category
router.post('/categories', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/categories', requireAccess({ roles: ['admin', 'manager'], permission: 'categories:create' }), (req, res, next) =>
productsController.createCategory(req, res, next)
);
// Update category
router.patch('/categories/:id', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.patch('/categories/:id', requireAccess({ roles: ['admin', 'manager'], permission: 'categories:update' }), (req, res, next) =>
productsController.updateCategory(req, res, next)
);
// Delete category
router.delete('/categories/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/categories/:id', requireAccess({ roles: ['admin'], permission: 'categories:delete' }), (req, res, next) =>
productsController.deleteCategory(req, res, next)
);
@ -50,17 +51,17 @@ router.get('/', (req, res, next) => productsController.findAll(req, res, next));
router.get('/:id', (req, res, next) => productsController.findById(req, res, next));
// Create product
router.post('/', requireRoles('admin', 'manager', 'inventory', 'super_admin'), (req, res, next) =>
router.post('/', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'products:create' }), (req, res, next) =>
productsController.create(req, res, next)
);
// Update product
router.patch('/:id', requireRoles('admin', 'manager', 'inventory', 'super_admin'), (req, res, next) =>
router.patch('/:id', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'products:update' }), (req, res, next) =>
productsController.update(req, res, next)
);
// Delete product
router.delete('/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/:id', requireAccess({ roles: ['admin'], permission: 'products:delete' }), (req, res, next) =>
productsController.delete(req, res, next)
);

View File

@ -1,6 +1,7 @@
import { Router } from 'express';
import { projectsController } from './projects.controller.js';
import { authenticate, requireRoles } from '../../shared/middleware/auth.middleware.js';
import { authenticate } from '../../shared/middleware/auth.middleware.js';
import { requireAccess } from '../../shared/middleware/rbac.middleware.js';
const router = Router();
@ -12,15 +13,15 @@ router.get('/', (req, res, next) => projectsController.getProjects(req, res, nex
router.get('/:id', (req, res, next) => projectsController.getProject(req, res, next));
router.post('/', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/', requireAccess({ roles: ['admin', 'manager'], permission: 'projects:create' }), (req, res, next) =>
projectsController.createProject(req, res, next)
);
router.put('/:id', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.put('/:id', requireAccess({ roles: ['admin', 'manager'], permission: 'projects:update' }), (req, res, next) =>
projectsController.updateProject(req, res, next)
);
router.delete('/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/:id', requireAccess({ roles: ['admin'], permission: 'projects:delete' }), (req, res, next) =>
projectsController.deleteProject(req, res, next)
);
@ -50,7 +51,7 @@ router.get('/timesheets/all', (req, res, next) => projectsController.getTimeshee
router.get('/timesheets/me', (req, res, next) => projectsController.getMyTimesheets(req, res, next));
router.get('/timesheets/pending', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.get('/timesheets/pending', requireAccess({ roles: ['admin', 'manager'], permission: 'timesheets:approve' }), (req, res, next) =>
projectsController.getPendingApprovals(req, res, next)
);
@ -64,11 +65,11 @@ router.delete('/timesheets/:id', (req, res, next) => projectsController.deleteTi
router.post('/timesheets/:id/submit', (req, res, next) => projectsController.submitTimesheet(req, res, next));
router.post('/timesheets/:id/approve', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/timesheets/:id/approve', requireAccess({ roles: ['admin', 'manager'], permission: 'timesheets:approve' }), (req, res, next) =>
projectsController.approveTimesheet(req, res, next)
);
router.post('/timesheets/:id/reject', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/timesheets/:id/reject', requireAccess({ roles: ['admin', 'manager'], permission: 'timesheets:approve' }), (req, res, next) =>
projectsController.rejectTimesheet(req, res, next)
);

View File

@ -1,6 +1,7 @@
import { Router } from 'express';
import { purchasesController } from './purchases.controller.js';
import { authenticate, requireRoles } from '../../shared/middleware/auth.middleware.js';
import { authenticate } from '../../shared/middleware/auth.middleware.js';
import { requireAccess } from '../../shared/middleware/rbac.middleware.js';
const router = Router();
@ -8,82 +9,82 @@ const router = Router();
router.use(authenticate);
// List purchase orders
router.get('/', requireRoles('admin', 'manager', 'warehouse', 'accountant', 'super_admin'), (req, res, next) =>
router.get('/', requireAccess({ roles: ['admin', 'manager', 'warehouse', 'accountant'], permission: 'purchases:read' }), (req, res, next) =>
purchasesController.findAll(req, res, next)
);
// Get purchase order by ID
router.get('/:id', requireRoles('admin', 'manager', 'warehouse', 'accountant', 'super_admin'), (req, res, next) =>
router.get('/:id', requireAccess({ roles: ['admin', 'manager', 'warehouse', 'accountant'], permission: 'purchases:read' }), (req, res, next) =>
purchasesController.findById(req, res, next)
);
// Create purchase order
router.post('/', requireRoles('admin', 'manager', 'warehouse', 'super_admin'), (req, res, next) =>
router.post('/', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'purchases:create' }), (req, res, next) =>
purchasesController.create(req, res, next)
);
// Update purchase order
router.put('/:id', requireRoles('admin', 'manager', 'warehouse', 'super_admin'), (req, res, next) =>
router.put('/:id', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'purchases:update' }), (req, res, next) =>
purchasesController.update(req, res, next)
);
// Confirm purchase order
router.post('/:id/confirm', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/:id/confirm', requireAccess({ roles: ['admin', 'manager'], permission: 'purchases:approve' }), (req, res, next) =>
purchasesController.confirm(req, res, next)
);
// Cancel purchase order
router.post('/:id/cancel', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/:id/cancel', requireAccess({ roles: ['admin', 'manager'], permission: 'purchases:cancel' }), (req, res, next) =>
purchasesController.cancel(req, res, next)
);
// Delete purchase order
router.delete('/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/:id', requireAccess({ roles: ['admin'], permission: 'purchases:delete' }), (req, res, next) =>
purchasesController.delete(req, res, next)
);
// ========== RFQs (Request for Quotation) ==========
router.get('/rfqs', requireRoles('admin', 'manager', 'warehouse', 'super_admin'), (req, res, next) =>
router.get('/rfqs', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'purchase_orders:read' }), (req, res, next) =>
purchasesController.getRfqs(req, res, next)
);
router.get('/rfqs/:id', requireRoles('admin', 'manager', 'warehouse', 'super_admin'), (req, res, next) =>
router.get('/rfqs/:id', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'purchase_orders:read' }), (req, res, next) =>
purchasesController.getRfq(req, res, next)
);
router.post('/rfqs', requireRoles('admin', 'manager', 'warehouse', 'super_admin'), (req, res, next) =>
router.post('/rfqs', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'purchase_orders:create' }), (req, res, next) =>
purchasesController.createRfq(req, res, next)
);
router.put('/rfqs/:id', requireRoles('admin', 'manager', 'warehouse', 'super_admin'), (req, res, next) =>
router.put('/rfqs/:id', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'purchase_orders:update' }), (req, res, next) =>
purchasesController.updateRfq(req, res, next)
);
router.delete('/rfqs/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/rfqs/:id', requireAccess({ roles: ['admin'], permission: 'purchase_orders:delete' }), (req, res, next) =>
purchasesController.deleteRfq(req, res, next)
);
// RFQ Lines
router.post('/rfqs/:id/lines', requireRoles('admin', 'manager', 'warehouse', 'super_admin'), (req, res, next) =>
router.post('/rfqs/:id/lines', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'purchase_orders:update' }), (req, res, next) =>
purchasesController.addRfqLine(req, res, next)
);
router.put('/rfqs/:id/lines/:lineId', requireRoles('admin', 'manager', 'warehouse', 'super_admin'), (req, res, next) =>
router.put('/rfqs/:id/lines/:lineId', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'purchase_orders:update' }), (req, res, next) =>
purchasesController.updateRfqLine(req, res, next)
);
router.delete('/rfqs/:id/lines/:lineId', requireRoles('admin', 'manager', 'warehouse', 'super_admin'), (req, res, next) =>
router.delete('/rfqs/:id/lines/:lineId', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'purchase_orders:update' }), (req, res, next) =>
purchasesController.removeRfqLine(req, res, next)
);
// RFQ Workflow
router.post('/rfqs/:id/send', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/rfqs/:id/send', requireAccess({ roles: ['admin', 'manager'], permission: 'purchase_orders:approve' }), (req, res, next) =>
purchasesController.sendRfq(req, res, next)
);
router.post('/rfqs/:id/responded', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/rfqs/:id/responded', requireAccess({ roles: ['admin', 'manager'], permission: 'purchase_orders:update' }), (req, res, next) =>
purchasesController.markRfqResponded(req, res, next)
);
router.post('/rfqs/:id/accept', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/rfqs/:id/accept', requireAccess({ roles: ['admin', 'manager'], permission: 'purchase_orders:approve' }), (req, res, next) =>
purchasesController.acceptRfq(req, res, next)
);
router.post('/rfqs/:id/reject', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/rfqs/:id/reject', requireAccess({ roles: ['admin', 'manager'], permission: 'purchase_orders:reject' }), (req, res, next) =>
purchasesController.rejectRfq(req, res, next)
);
router.post('/rfqs/:id/cancel', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/rfqs/:id/cancel', requireAccess({ roles: ['admin', 'manager'], permission: 'purchase_orders:delete' }), (req, res, next) =>
purchasesController.cancelRfq(req, res, next)
);

View File

@ -1,6 +1,7 @@
import { Router } from 'express';
import { permissionsController } from './permissions.controller.js';
import { authenticate, requireRoles } from '../../shared/middleware/auth.middleware.js';
import { authenticate } from '../../shared/middleware/auth.middleware.js';
import { requireAccess } from '../../shared/middleware/rbac.middleware.js';
const router = Router();
@ -18,37 +19,37 @@ router.post('/check', (req, res, next) =>
);
// List all permissions (admin, manager)
router.get('/', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.get('/', requireAccess({ roles: ['admin', 'manager'], permission: 'permissions:read' }), (req, res, next) =>
permissionsController.findAll(req, res, next)
);
// Get available modules (admin, manager)
router.get('/modules', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.get('/modules', requireAccess({ roles: ['admin', 'manager'], permission: 'permissions:read' }), (req, res, next) =>
permissionsController.getModules(req, res, next)
);
// Get available resources (admin, manager)
router.get('/resources', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.get('/resources', requireAccess({ roles: ['admin', 'manager'], permission: 'permissions:read' }), (req, res, next) =>
permissionsController.getResources(req, res, next)
);
// Get permissions grouped by module (admin, manager)
router.get('/grouped', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.get('/grouped', requireAccess({ roles: ['admin', 'manager'], permission: 'permissions:read' }), (req, res, next) =>
permissionsController.getGrouped(req, res, next)
);
// Get permissions by module (admin, manager)
router.get('/by-module/:module', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.get('/by-module/:module', requireAccess({ roles: ['admin', 'manager'], permission: 'permissions:read' }), (req, res, next) =>
permissionsController.getByModule(req, res, next)
);
// Get permission matrix for admin UI (admin only)
router.get('/matrix', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.get('/matrix', requireAccess({ roles: ['admin'], permission: 'permissions:read' }), (req, res, next) =>
permissionsController.getMatrix(req, res, next)
);
// Get effective permissions for a specific user (admin only)
router.get('/user/:userId', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.get('/user/:userId', requireAccess({ roles: ['admin'], permission: 'users:read' }), (req, res, next) =>
permissionsController.getUserPermissions(req, res, next)
);

View File

@ -1,6 +1,7 @@
import { Router } from 'express';
import { rolesController } from './roles.controller.js';
import { authenticate, requireRoles } from '../../shared/middleware/auth.middleware.js';
import { authenticate } from '../../shared/middleware/auth.middleware.js';
import { requireAccess } from '../../shared/middleware/rbac.middleware.js';
const router = Router();
@ -8,49 +9,49 @@ const router = Router();
router.use(authenticate);
// List roles (admin, manager)
router.get('/', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.get('/', requireAccess({ roles: ['admin', 'manager'], permission: 'roles:read' }), (req, res, next) =>
rolesController.findAll(req, res, next)
);
// Get system roles (admin)
router.get('/system', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.get('/system', requireAccess({ roles: ['admin'], permission: 'roles:read' }), (req, res, next) =>
rolesController.getSystemRoles(req, res, next)
);
// Get role by ID (admin, manager)
router.get('/:id', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.get('/:id', requireAccess({ roles: ['admin', 'manager'], permission: 'roles:read' }), (req, res, next) =>
rolesController.findById(req, res, next)
);
// Create role (admin only)
router.post('/', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/', requireAccess({ roles: ['admin'], permission: 'roles:create' }), (req, res, next) =>
rolesController.create(req, res, next)
);
// Update role (admin only)
router.put('/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.put('/:id', requireAccess({ roles: ['admin'], permission: 'roles:update' }), (req, res, next) =>
rolesController.update(req, res, next)
);
// Delete role (admin only)
router.delete('/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/:id', requireAccess({ roles: ['admin'], permission: 'roles:delete' }), (req, res, next) =>
rolesController.delete(req, res, next)
);
// Role permissions management
router.get('/:id/permissions', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.get('/:id/permissions', requireAccess({ roles: ['admin', 'manager'], permission: 'permissions:read' }), (req, res, next) =>
rolesController.getPermissions(req, res, next)
);
router.put('/:id/permissions', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.put('/:id/permissions', requireAccess({ roles: ['admin'], permission: 'permissions:update' }), (req, res, next) =>
rolesController.assignPermissions(req, res, next)
);
router.post('/:id/permissions', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/:id/permissions', requireAccess({ roles: ['admin'], permission: 'permissions:update' }), (req, res, next) =>
rolesController.addPermission(req, res, next)
);
router.delete('/:id/permissions/:permissionId', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/:id/permissions/:permissionId', requireAccess({ roles: ['admin'], permission: 'permissions:update' }), (req, res, next) =>
rolesController.removePermission(req, res, next)
);

View File

@ -1,6 +1,7 @@
import { Router } from 'express';
import { salesController } from './sales.controller.js';
import { authenticate, requireRoles } from '../../shared/middleware/auth.middleware.js';
import { authenticate } from '../../shared/middleware/auth.middleware.js';
import { requireAccess } from '../../shared/middleware/rbac.middleware.js';
const router = Router();
@ -12,19 +13,19 @@ router.get('/pricelists', (req, res, next) => salesController.getPricelists(req,
router.get('/pricelists/:id', (req, res, next) => salesController.getPricelist(req, res, next));
router.post('/pricelists', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/pricelists', requireAccess({ roles: ['admin', 'manager'], permission: 'price_lists:create' }), (req, res, next) =>
salesController.createPricelist(req, res, next)
);
router.put('/pricelists/:id', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.put('/pricelists/:id', requireAccess({ roles: ['admin', 'manager'], permission: 'price_lists:update' }), (req, res, next) =>
salesController.updatePricelist(req, res, next)
);
router.post('/pricelists/:id/items', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/pricelists/:id/items', requireAccess({ roles: ['admin', 'manager'], permission: 'price_lists:update' }), (req, res, next) =>
salesController.addPricelistItem(req, res, next)
);
router.delete('/pricelists/:id/items/:itemId', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.delete('/pricelists/:id/items/:itemId', requireAccess({ roles: ['admin', 'manager'], permission: 'price_lists:update' }), (req, res, next) =>
salesController.removePricelistItem(req, res, next)
);
@ -33,19 +34,19 @@ router.get('/teams', (req, res, next) => salesController.getSalesTeams(req, res,
router.get('/teams/:id', (req, res, next) => salesController.getSalesTeam(req, res, next));
router.post('/teams', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/teams', requireAccess({ roles: ['admin', 'manager'], permission: 'sales:create' }), (req, res, next) =>
salesController.createSalesTeam(req, res, next)
);
router.put('/teams/:id', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.put('/teams/:id', requireAccess({ roles: ['admin', 'manager'], permission: 'sales:update' }), (req, res, next) =>
salesController.updateSalesTeam(req, res, next)
);
router.post('/teams/:id/members', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/teams/:id/members', requireAccess({ roles: ['admin', 'manager'], permission: 'sales:update' }), (req, res, next) =>
salesController.addSalesTeamMember(req, res, next)
);
router.delete('/teams/:id/members/:memberId', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.delete('/teams/:id/members/:memberId', requireAccess({ roles: ['admin', 'manager'], permission: 'sales:update' }), (req, res, next) =>
salesController.removeSalesTeamMember(req, res, next)
);
@ -54,23 +55,23 @@ router.get('/customer-groups', (req, res, next) => salesController.getCustomerGr
router.get('/customer-groups/:id', (req, res, next) => salesController.getCustomerGroup(req, res, next));
router.post('/customer-groups', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.post('/customer-groups', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'customers:create' }), (req, res, next) =>
salesController.createCustomerGroup(req, res, next)
);
router.put('/customer-groups/:id', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.put('/customer-groups/:id', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'customers:update' }), (req, res, next) =>
salesController.updateCustomerGroup(req, res, next)
);
router.delete('/customer-groups/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/customer-groups/:id', requireAccess({ roles: ['admin'], permission: 'customers:delete' }), (req, res, next) =>
salesController.deleteCustomerGroup(req, res, next)
);
router.post('/customer-groups/:id/members', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.post('/customer-groups/:id/members', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'customers:update' }), (req, res, next) =>
salesController.addCustomerGroupMember(req, res, next)
);
router.delete('/customer-groups/:id/members/:memberId', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.delete('/customer-groups/:id/members/:memberId', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'customers:update' }), (req, res, next) =>
salesController.removeCustomerGroupMember(req, res, next)
);
@ -79,39 +80,39 @@ router.get('/quotations', (req, res, next) => salesController.getQuotations(req,
router.get('/quotations/:id', (req, res, next) => salesController.getQuotation(req, res, next));
router.post('/quotations', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.post('/quotations', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'quotations:create' }), (req, res, next) =>
salesController.createQuotation(req, res, next)
);
router.put('/quotations/:id', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.put('/quotations/:id', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'quotations:update' }), (req, res, next) =>
salesController.updateQuotation(req, res, next)
);
router.delete('/quotations/:id', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.delete('/quotations/:id', requireAccess({ roles: ['admin', 'manager'], permission: 'quotations:delete' }), (req, res, next) =>
salesController.deleteQuotation(req, res, next)
);
router.post('/quotations/:id/lines', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.post('/quotations/:id/lines', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'quotations:update' }), (req, res, next) =>
salesController.addQuotationLine(req, res, next)
);
router.put('/quotations/:id/lines/:lineId', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.put('/quotations/:id/lines/:lineId', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'quotations:update' }), (req, res, next) =>
salesController.updateQuotationLine(req, res, next)
);
router.delete('/quotations/:id/lines/:lineId', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.delete('/quotations/:id/lines/:lineId', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'quotations:update' }), (req, res, next) =>
salesController.removeQuotationLine(req, res, next)
);
router.post('/quotations/:id/send', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.post('/quotations/:id/send', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'quotations:update' }), (req, res, next) =>
salesController.sendQuotation(req, res, next)
);
router.post('/quotations/:id/confirm', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/quotations/:id/confirm', requireAccess({ roles: ['admin', 'manager'], permission: 'quotations:convert' }), (req, res, next) =>
salesController.confirmQuotation(req, res, next)
);
router.post('/quotations/:id/cancel', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/quotations/:id/cancel', requireAccess({ roles: ['admin', 'manager'], permission: 'quotations:delete' }), (req, res, next) =>
salesController.cancelQuotation(req, res, next)
);
@ -120,39 +121,39 @@ router.get('/orders', (req, res, next) => salesController.getOrders(req, res, ne
router.get('/orders/:id', (req, res, next) => salesController.getOrder(req, res, next));
router.post('/orders', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.post('/orders', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'sales:create' }), (req, res, next) =>
salesController.createOrder(req, res, next)
);
router.put('/orders/:id', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.put('/orders/:id', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'sales:update' }), (req, res, next) =>
salesController.updateOrder(req, res, next)
);
router.delete('/orders/:id', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.delete('/orders/:id', requireAccess({ roles: ['admin', 'manager'], permission: 'sales:delete' }), (req, res, next) =>
salesController.deleteOrder(req, res, next)
);
router.post('/orders/:id/lines', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.post('/orders/:id/lines', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'sales:update' }), (req, res, next) =>
salesController.addOrderLine(req, res, next)
);
router.put('/orders/:id/lines/:lineId', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.put('/orders/:id/lines/:lineId', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'sales:update' }), (req, res, next) =>
salesController.updateOrderLine(req, res, next)
);
router.delete('/orders/:id/lines/:lineId', requireRoles('admin', 'manager', 'sales', 'super_admin'), (req, res, next) =>
router.delete('/orders/:id/lines/:lineId', requireAccess({ roles: ['admin', 'manager', 'sales'], permission: 'sales:update' }), (req, res, next) =>
salesController.removeOrderLine(req, res, next)
);
router.post('/orders/:id/confirm', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/orders/:id/confirm', requireAccess({ roles: ['admin', 'manager'], permission: 'sales:approve' }), (req, res, next) =>
salesController.confirmOrder(req, res, next)
);
router.post('/orders/:id/cancel', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/orders/:id/cancel', requireAccess({ roles: ['admin', 'manager'], permission: 'sales:cancel' }), (req, res, next) =>
salesController.cancelOrder(req, res, next)
);
router.post('/orders/:id/invoice', requireRoles('admin', 'manager', 'accountant', 'super_admin'), (req, res, next) =>
router.post('/orders/:id/invoice', requireAccess({ roles: ['admin', 'manager', 'accountant'], permission: 'invoices:create' }), (req, res, next) =>
salesController.createOrderInvoice(req, res, next)
);

View File

@ -1,6 +1,7 @@
import { Router } from 'express';
import { systemController } from './system.controller.js';
import { authenticate, requireRoles } from '../../shared/middleware/auth.middleware.js';
import { authenticate } from '../../shared/middleware/auth.middleware.js';
import { requireAccess } from '../../shared/middleware/rbac.middleware.js';
const router = Router();
@ -20,13 +21,13 @@ router.post('/followers', (req, res, next) => systemController.addFollower(req,
router.delete('/followers/:model/:recordId', (req, res, next) => systemController.removeFollower(req, res, next));
// ========== NOTIFICATIONS ==========
router.get('/notifications', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.get('/notifications', requireAccess({ roles: ['admin'], permission: 'notifications:read' }), (req, res, next) =>
systemController.getNotifications(req, res, next)
);
router.get('/notifications/me', (req, res, next) => systemController.getMyNotifications(req, res, next));
router.get('/notifications/me/count', (req, res, next) => systemController.getUnreadCount(req, res, next));
router.get('/notifications/:id', (req, res, next) => systemController.getNotification(req, res, next));
router.post('/notifications', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/notifications', requireAccess({ roles: ['admin'], permission: 'notifications:create' }), (req, res, next) =>
systemController.createNotification(req, res, next)
);
router.post('/notifications/:id/read', (req, res, next) => systemController.markNotificationAsRead(req, res, next));

View File

@ -1,6 +1,7 @@
import { Router } from 'express';
import { tenantsController } from './tenants.controller.js';
import { authenticate, requireRoles } from '../../shared/middleware/auth.middleware.js';
import { authenticate } from '../../shared/middleware/auth.middleware.js';
import { requireAccess } from '../../shared/middleware/rbac.middleware.js';
const router = Router();
@ -12,57 +13,57 @@ router.get('/current', (req, res, next) =>
tenantsController.getCurrent(req, res, next)
);
// List all tenants (super_admin only)
router.get('/', requireRoles('super_admin'), (req, res, next) =>
// List all tenants (super_admin only - no permission fallback)
router.get('/', requireAccess({ roles: ['super_admin'], permission: 'system:manage' }), (req, res, next) =>
tenantsController.findAll(req, res, next)
);
// Get tenant by ID (super_admin only)
router.get('/:id', requireRoles('super_admin'), (req, res, next) =>
router.get('/:id', requireAccess({ roles: ['super_admin'], permission: 'system:manage' }), (req, res, next) =>
tenantsController.findById(req, res, next)
);
// Get tenant statistics (super_admin only)
router.get('/:id/stats', requireRoles('super_admin'), (req, res, next) =>
router.get('/:id/stats', requireAccess({ roles: ['super_admin'], permission: 'system:manage' }), (req, res, next) =>
tenantsController.getStats(req, res, next)
);
// Create tenant (super_admin only)
router.post('/', requireRoles('super_admin'), (req, res, next) =>
router.post('/', requireAccess({ roles: ['super_admin'], permission: 'system:manage' }), (req, res, next) =>
tenantsController.create(req, res, next)
);
// Update tenant (super_admin only)
router.put('/:id', requireRoles('super_admin'), (req, res, next) =>
router.put('/:id', requireAccess({ roles: ['super_admin'], permission: 'system:manage' }), (req, res, next) =>
tenantsController.update(req, res, next)
);
// Suspend tenant (super_admin only)
router.post('/:id/suspend', requireRoles('super_admin'), (req, res, next) =>
router.post('/:id/suspend', requireAccess({ roles: ['super_admin'], permission: 'system:manage' }), (req, res, next) =>
tenantsController.suspend(req, res, next)
);
// Activate tenant (super_admin only)
router.post('/:id/activate', requireRoles('super_admin'), (req, res, next) =>
router.post('/:id/activate', requireAccess({ roles: ['super_admin'], permission: 'system:manage' }), (req, res, next) =>
tenantsController.activate(req, res, next)
);
// Delete tenant (super_admin only)
router.delete('/:id', requireRoles('super_admin'), (req, res, next) =>
router.delete('/:id', requireAccess({ roles: ['super_admin'], permission: 'system:manage' }), (req, res, next) =>
tenantsController.delete(req, res, next)
);
// Tenant settings (admin and super_admin)
router.get('/:id/settings', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.get('/:id/settings', requireAccess({ roles: ['admin'], permission: 'tenant_settings:read' }), (req, res, next) =>
tenantsController.getSettings(req, res, next)
);
router.put('/:id/settings', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.put('/:id/settings', requireAccess({ roles: ['admin'], permission: 'tenant_settings:update' }), (req, res, next) =>
tenantsController.updateSettings(req, res, next)
);
// Check user limit (admin and super_admin)
router.get('/:id/can-add-user', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.get('/:id/can-add-user', requireAccess({ roles: ['admin'], permission: 'users:create' }), (req, res, next) =>
tenantsController.canAddUser(req, res, next)
);

View File

@ -1,6 +1,7 @@
import { Router } from 'express';
import { usersController } from './users.controller.js';
import { authenticate, requireRoles } from '../../shared/middleware/auth.middleware.js';
import { authenticate } from '../../shared/middleware/auth.middleware.js';
import { requireAccess } from '../../shared/middleware/rbac.middleware.js';
const router = Router();
@ -11,49 +12,49 @@ router.use(authenticate);
router.get('/me', (req, res, next) => usersController.getMe(req, res, next));
// List users (admin, manager)
router.get('/', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.get('/', requireAccess({ roles: ['admin', 'manager'], permission: 'users:read' }), (req, res, next) =>
usersController.findAll(req, res, next)
);
// Get user by ID
router.get('/:id', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.get('/:id', requireAccess({ roles: ['admin', 'manager'], permission: 'users:read' }), (req, res, next) =>
usersController.findById(req, res, next)
);
// Create user (admin only)
router.post('/', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/', requireAccess({ roles: ['admin'], permission: 'users:create' }), (req, res, next) =>
usersController.create(req, res, next)
);
// Update user (admin only)
router.put('/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.put('/:id', requireAccess({ roles: ['admin'], permission: 'users:update' }), (req, res, next) =>
usersController.update(req, res, next)
);
// Delete user (admin only)
router.delete('/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/:id', requireAccess({ roles: ['admin'], permission: 'users:delete' }), (req, res, next) =>
usersController.delete(req, res, next)
);
// Activate/Deactivate user (admin only)
router.post('/:id/activate', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/:id/activate', requireAccess({ roles: ['admin'], permission: 'users:activate' }), (req, res, next) =>
usersController.activate(req, res, next)
);
router.post('/:id/deactivate', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/:id/deactivate', requireAccess({ roles: ['admin'], permission: 'users:deactivate' }), (req, res, next) =>
usersController.deactivate(req, res, next)
);
// User roles
router.get('/:id/roles', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.get('/:id/roles', requireAccess({ roles: ['admin'], permission: 'roles:read' }), (req, res, next) =>
usersController.getRoles(req, res, next)
);
router.post('/:id/roles', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.post('/:id/roles', requireAccess({ roles: ['admin'], permission: 'roles:update' }), (req, res, next) =>
usersController.assignRole(req, res, next)
);
router.delete('/:id/roles/:roleId', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/:id/roles/:roleId', requireAccess({ roles: ['admin'], permission: 'roles:update' }), (req, res, next) =>
usersController.removeRole(req, res, next)
);

View File

@ -1,6 +1,7 @@
import { Router } from 'express';
import { warehousesController } from './warehouses.controller.js';
import { authenticate, requireRoles } from '../../shared/middleware/auth.middleware.js';
import { authenticate } from '../../shared/middleware/auth.middleware.js';
import { requireAccess } from '../../shared/middleware/rbac.middleware.js';
const router = Router();
@ -15,17 +16,17 @@ router.get('/locations', (req, res, next) => warehousesController.findAllLocatio
router.get('/locations/:id', (req, res, next) => warehousesController.findLocationById(req, res, next));
// Create location
router.post('/locations', requireRoles('admin', 'manager', 'inventory', 'super_admin'), (req, res, next) =>
router.post('/locations', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'locations:create' }), (req, res, next) =>
warehousesController.createLocation(req, res, next)
);
// Update location
router.patch('/locations/:id', requireRoles('admin', 'manager', 'inventory', 'super_admin'), (req, res, next) =>
router.patch('/locations/:id', requireAccess({ roles: ['admin', 'manager', 'warehouse'], permission: 'locations:update' }), (req, res, next) =>
warehousesController.updateLocation(req, res, next)
);
// Delete location
router.delete('/locations/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/locations/:id', requireAccess({ roles: ['admin'], permission: 'locations:delete' }), (req, res, next) =>
warehousesController.deleteLocation(req, res, next)
);
@ -50,17 +51,17 @@ router.get('/', (req, res, next) => warehousesController.findAll(req, res, next)
router.get('/:id', (req, res, next) => warehousesController.findById(req, res, next));
// Create warehouse
router.post('/', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.post('/', requireAccess({ roles: ['admin', 'manager'], permission: 'warehouses:create' }), (req, res, next) =>
warehousesController.create(req, res, next)
);
// Update warehouse
router.patch('/:id', requireRoles('admin', 'manager', 'super_admin'), (req, res, next) =>
router.patch('/:id', requireAccess({ roles: ['admin', 'manager'], permission: 'warehouses:update' }), (req, res, next) =>
warehousesController.update(req, res, next)
);
// Delete warehouse
router.delete('/:id', requireRoles('admin', 'super_admin'), (req, res, next) =>
router.delete('/:id', requireAccess({ roles: ['admin'], permission: 'warehouses:delete' }), (req, res, next) =>
warehousesController.delete(req, res, next)
);