Trabajo de ajuste en widgets y db para frontend
This commit is contained in:
97
Elecciones-Web/frontend-admin/src/services/apiService.ts
Normal file
97
Elecciones-Web/frontend-admin/src/services/apiService.ts
Normal file
@@ -0,0 +1,97 @@
|
||||
// src/services/apiService.ts
|
||||
import axios from 'axios';
|
||||
import { triggerLogout } from '../context/authUtils';
|
||||
import type { AgrupacionPolitica, UpdateAgrupacionData, Bancada } from '../types';
|
||||
|
||||
const AUTH_API_URL = 'http://localhost:5217/api/auth';
|
||||
const ADMIN_API_URL = 'http://localhost:5217/api/admin';
|
||||
|
||||
const adminApiClient = axios.create({
|
||||
baseURL: ADMIN_API_URL,
|
||||
});
|
||||
|
||||
// --- INTERCEPTORES (una sola vez) ---
|
||||
|
||||
// Interceptor de Peticiones: Añade el token JWT a cada llamada
|
||||
adminApiClient.interceptors.request.use(
|
||||
(config) => {
|
||||
const token = localStorage.getItem('admin-jwt-token');
|
||||
if (token) {
|
||||
config.headers['Authorization'] = `Bearer ${token}`;
|
||||
}
|
||||
return config;
|
||||
},
|
||||
(error) => Promise.reject(error)
|
||||
);
|
||||
|
||||
// Interceptor de Respuestas: Maneja la expiración del token (error 401)
|
||||
adminApiClient.interceptors.response.use(
|
||||
(response) => response,
|
||||
(error) => {
|
||||
if (axios.isAxiosError(error) && error.response?.status === 401) {
|
||||
console.log("Token expirado o inválido. Deslogueando...");
|
||||
triggerLogout();
|
||||
}
|
||||
return Promise.reject(error);
|
||||
}
|
||||
);
|
||||
|
||||
// --- SERVICIOS DE API ---
|
||||
|
||||
// 1. Autenticación
|
||||
export interface LoginCredentials { username: string; password: string; }
|
||||
|
||||
export const loginUser = async (credentials: LoginCredentials): Promise<string | null> => {
|
||||
try {
|
||||
const response = await axios.post(`${AUTH_API_URL}/login`, credentials);
|
||||
return response.data.token;
|
||||
} catch (error) {
|
||||
console.error("Error during login request:", error);
|
||||
throw error;
|
||||
}
|
||||
};
|
||||
|
||||
// 2. Agrupaciones Políticas
|
||||
export const getAgrupaciones = async (): Promise<AgrupacionPolitica[]> => {
|
||||
const response = await adminApiClient.get('/agrupaciones');
|
||||
return response.data;
|
||||
};
|
||||
|
||||
export const updateAgrupacion = async (id: string, data: UpdateAgrupacionData): Promise<void> => {
|
||||
await adminApiClient.put(`/agrupaciones/${id}`, data);
|
||||
};
|
||||
|
||||
// 3. Ordenamiento de Agrupaciones
|
||||
export const updateOrden = async (camara: 'diputados' | 'senadores', ids: string[]): Promise<void> => {
|
||||
await adminApiClient.put(`/agrupaciones/orden-${camara}`, ids);
|
||||
};
|
||||
|
||||
// 4. Gestión de Bancas y Ocupantes
|
||||
export const getBancadas = async (camara: 'diputados' | 'senadores'): Promise<Bancada[]> => {
|
||||
const camaraId = camara === 'diputados' ? 0 : 1;
|
||||
const response = await adminApiClient.get(`/bancadas/${camaraId}`);
|
||||
return response.data;
|
||||
};
|
||||
|
||||
export interface UpdateBancadaData {
|
||||
agrupacionPoliticaId: string | null;
|
||||
nombreOcupante: string | null;
|
||||
fotoUrl: string | null;
|
||||
periodo: string | null;
|
||||
}
|
||||
|
||||
export const updateBancada = async (bancadaId: number, data: UpdateBancadaData): Promise<void> => {
|
||||
await adminApiClient.put(`/bancadas/${bancadaId}`, data);
|
||||
};
|
||||
|
||||
// 5. Configuración General
|
||||
export type ConfiguracionResponse = Record<string, string>;
|
||||
|
||||
export const getConfiguracion = async (): Promise<ConfiguracionResponse> => {
|
||||
const response = await adminApiClient.get('/configuracion');
|
||||
return response.data;
|
||||
};
|
||||
|
||||
export const updateConfiguracion = async (data: Record<string, string>): Promise<void> => {
|
||||
await adminApiClient.put('/configuracion', data);
|
||||
};
|
||||
Reference in New Issue
Block a user