companyService.ts•3.55 kB
import { httpClient } from './httpClient.js';
import { Company, CreateCompanyRequest, CompanyListResponse, CompanySize } from '../types/company.js';
import { API_ENDPOINTS } from '../config/api.js';
/**
* Servicio para manejar operaciones de empresas
*/
export class CompanyService {
/**
* Obtiene la lista de todas las empresas
*/
async getCompanies(): Promise<CompanyListResponse> {
try {
const response = await httpClient.get<CompanyListResponse>(API_ENDPOINTS.companies);
return response.data;
} catch (error) {
console.error('Error al obtener empresas:', error);
throw new Error(`No se pudieron obtener las empresas: ${error.message}`);
}
}
/**
* Obtiene una empresa por ID
*/
async getCompanyById(id: number): Promise<Company> {
try {
const response = await httpClient.get<Company>(`${API_ENDPOINTS.companies}/${id}`);
return response.data;
} catch (error) {
console.error(`Error al obtener empresa ${id}:`, error);
throw new Error(`No se pudo obtener la empresa: ${error.message}`);
}
}
/**
* Crea una nueva empresa
*/
async createCompany(companyData: CreateCompanyRequest): Promise<Company> {
try {
// Validar datos requeridos
this.validateCompanyData(companyData);
const response = await httpClient.post<Company, CreateCompanyRequest>(
API_ENDPOINTS.companies,
companyData
);
return response.data;
} catch (error) {
console.error('Error al crear empresa:', error);
throw new Error(`No se pudo crear la empresa: ${error.message}`);
}
}
/**
* Actualiza una empresa existente
*/
async updateCompany(id: number, companyData: Partial<CreateCompanyRequest>): Promise<Company> {
try {
const response = await httpClient.put<Company, Partial<CreateCompanyRequest>>(
`${API_ENDPOINTS.companies}/${id}`,
companyData
);
return response.data;
} catch (error) {
console.error(`Error al actualizar empresa ${id}:`, error);
throw new Error(`No se pudo actualizar la empresa: ${error.message}`);
}
}
/**
* Elimina una empresa
*/
async deleteCompany(id: number): Promise<void> {
try {
await httpClient.delete(`${API_ENDPOINTS.companies}/${id}`);
} catch (error) {
console.error(`Error al eliminar empresa ${id}:`, error);
throw new Error(`No se pudo eliminar la empresa: ${error.message}`);
}
}
/**
* Valida los datos de la empresa
*/
private validateCompanyData(companyData: CreateCompanyRequest): void {
const requiredFields: (keyof CreateCompanyRequest)[] = [
'name', 'email', 'phone', 'address', 'website', 'industry', 'size'
];
const missingFields = requiredFields.filter(field => !companyData[field]?.toString()?.trim());
if (missingFields.length > 0) {
throw new Error(`Campos requeridos faltantes: ${missingFields.join(', ')}`);
}
// Validar formato de email
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailRegex.test(companyData.email)) {
throw new Error('El formato del email no es válido');
}
// Validar que el tamaño sea uno de los valores permitidos
const validSizes = Object.values(CompanySize) as string[];
if (!validSizes.includes(companyData.size)) {
throw new Error(`El tamaño debe ser uno de: ${validSizes.join(', ')}`);
}
}
}
// Instancia singleton del servicio
export const companyService = new CompanyService();