feat: Implement multi-tenancy support in middleware and security layers

- Enhanced TenantMiddleware to validate tenant information from JWT tokens.
- Added LicenseValidationMiddleware to check tenant licenses before processing requests.
- Updated security utilities to extract tenant information from tokens and validate company access.
- Introduced CompanyStore to manage active company state and handle company switching in the frontend.
- Modified API routes to include company_id in requests for better resource management.
- Improved logging and error handling throughout the middleware and API layers.
- Updated frontend components to reflect changes in company management and selection.
- Added new API route for fetching user's companies with proper authentication handling.
This commit is contained in:
2025-11-11 14:00:56 -06:00
parent e1eb6bbd01
commit 52b8fcd434
242 changed files with 7067 additions and 3274 deletions

View File

@@ -80,9 +80,10 @@ export const pedimentosApi = {
* @param page - Número de página (por defecto 1)
* @param pageSize - Tamaño de página (por defecto 50)
* @param filters - Filtros opcionales
* @param companyId - ID de la compañía (por defecto 1)
*/
list: (page = 1, pageSize = 50, filters?: PedimentoFilters) => {
let url = `/v1/a76/pedimentos?page=${page}&page_size=${pageSize}`;
list: (page = 1, pageSize = 50, filters?: PedimentoFilters, companyId = 1) => {
let url = `/v1/a76/pedimentos?company_id=${companyId}&page=${page}&page_size=${pageSize}`;
if (filters?.status) {
url += `&status=${encodeURIComponent(filters.status)}`;
@@ -100,27 +101,31 @@ export const pedimentosApi = {
/**
* Obtiene un pedimento por ID
* @param id - ID del pedimento
* @param companyId - ID de la compañía (por defecto 1)
*/
get: (id: number) => api.get<Pedimento>(`/v1/a76/pedimentos/${id}`),
get: (id: number, companyId = 1) => api.get<Pedimento>(`/v1/a76/pedimentos/${id}?company_id=${companyId}`),
/**
* Crea un nuevo pedimento
* @param data - Datos del pedimento a crear
* @param companyId - ID de la compañía (por defecto 1)
*/
create: (data: CreatePedimentoData) =>
api.post<Pedimento>('/v1/a76/pedimentos', data),
create: (data: CreatePedimentoData, companyId = 1) =>
api.post<Pedimento>(`/v1/a76/pedimentos?company_id=${companyId}`, data),
/**
* Actualiza un pedimento existente
* @param id - ID del pedimento a actualizar
* @param data - Datos a actualizar
* @param companyId - ID de la compañía (por defecto 1)
*/
update: (id: number, data: UpdatePedimentoData) =>
api.put<Pedimento>(`/v1/a76/pedimentos/${id}`, data),
update: (id: number, data: UpdatePedimentoData, companyId = 1) =>
api.put<Pedimento>(`/v1/a76/pedimentos/${id}?company_id=${companyId}`, data),
/**
* Elimina un pedimento
* @param id - ID del pedimento a eliminar
* @param companyId - ID de la compañía (por defecto 1)
*/
delete: (id: number) => api.delete(`/v1/a76/pedimentos/${id}`)
delete: (id: number, companyId = 1) => api.delete(`/v1/a76/pedimentos/${id}?company_id=${companyId}`)
};