124 lines
3.9 KiB
TypeScript

import api from '@/services/api';
import type {
Company,
CompanyCreateResponse,
CompanyFormData,
CompanyQueryParams,
PaginatedResponse
} from './companies.types';
export class CompanyService {
/**
* Obtener todas las empresas con paginación y filtros opcionales
*/
async getAll(params?: CompanyQueryParams): Promise<PaginatedResponse<Company> | Company[]> {
try {
const response = await api.get('api/catalogs/companies', { params });
// Si la respuesta tiene paginación, devolver el objeto completo
if (response.data.current_page !== undefined) {
return response.data as PaginatedResponse<Company>;
}
// Si no tiene paginación, devolver solo el array de data
return response.data.data as Company[];
} catch (error: any) {
console.error('Error al obtener empresas:', error);
throw error;
}
}
/**
* Obtener una empresa por ID
*/
async getById(id: number): Promise<Company> {
try {
const response = await api.get(`api/catalogs/companies/${id}`);
return response.data;
} catch (error: any) {
console.error(`Error al obtener empresa con ID ${id}:`, error);
throw error;
}
}
/**
* Crear una nueva empresa
*/
async create(data: CompanyFormData): Promise<CompanyCreateResponse> {
try {
const response = await api.post('api/catalogs/companies', data);
return response.data;
} catch (error: any) {
console.error('Error al crear empresa:', error);
// Mejorar el mensaje de error si viene del backend
if (error.response?.data) {
throw {
...error,
message: error.response.data.message || error.response.data.error || 'Error al crear la empresa'
};
}
throw error;
}
}
/**
* Actualizar una empresa existente
*/
async update(id: number, data: Partial<CompanyFormData>): Promise<Company> {
try {
const response = await api.put(`api/catalogs/companies/${id}`, data);
return response.data;
} catch (error: any) {
console.error(`Error al actualizar empresa con ID ${id}:`, error);
// Mejorar el mensaje de error si viene del backend
if (error.response?.data) {
throw {
...error,
message: error.response.data.message || error.response.data.error || 'Error al actualizar la empresa'
};
}
throw error;
}
}
/**
* Eliminar una empresa
*/
async delete(id: number): Promise<void> {
try {
await api.delete(`api/catalogs/companies/${id}`);
} catch (error: any) {
console.error(`Error al eliminar empresa con ID ${id}:`, error);
// Mejorar el mensaje de error si viene del backend
if (error.response?.data) {
throw {
...error,
message: error.response.data.message || error.response.data.error || 'Error al eliminar la empresa'
};
}
throw error;
}
}
/**
* Buscar empresas por múltiples criterios
*/
async search(params: CompanyQueryParams): Promise<Company[]> {
try {
const response = await api.get('api/catalogs/companies', {
params: { ...params, paginate: false }
});
return response.data.data;
} catch (error: any) {
console.error('Error al buscar empresas:', error);
throw error;
}
}
};
// Exportar una instancia única del servicio
export const companyService = new CompanyService();