- Backend API:
Autenticación y autorización básicas con JWT implementadas.
Cambio de contraseña funcional.
Módulo "Tipos de Pago" (CRUD completo) implementado en el backend (Controlador, Servicio, Repositorio) usando Dapper, transacciones y con lógica de historial.
Se incluyen permisos en el token JWT.
- Frontend React:
Estructura base con Vite, TypeScript, MUI.
Contexto de autenticación (AuthContext) que maneja el estado del usuario y el token.
Página de Login.
Modal de Cambio de Contraseña (forzado y opcional).
Hook usePermissions para verificar permisos.
Página GestionarTiposPagoPage con tabla, paginación, filtro, modal para crear/editar, y menú de acciones, respetando permisos.
Layout principal (MainLayout) con navegación por Tabs (funcionalidad básica de navegación).
Estructura de enrutamiento (AppRoutes) que maneja rutas públicas, protegidas y anidadas para módulos.
This commit is contained in:
2025-05-07 13:41:18 -03:00
parent da7b544372
commit 5c4b961073
49 changed files with 2552 additions and 491 deletions

View File

@@ -0,0 +1,21 @@
import apiClient from './apiClient';
import type { LoginRequestDto } from '../models/dtos/LoginRequestDto';
import type { LoginResponseDto } from '../models/dtos/LoginResponseDto';
import type { ChangePasswordRequestDto } from '../models/dtos/ChangePasswordRequestDto'; // Importar DTO
const login = async (credentials: LoginRequestDto): Promise<LoginResponseDto> => {
const response = await apiClient.post<LoginResponseDto>('/auth/login', credentials);
return response.data;
};
const changePassword = async (data: ChangePasswordRequestDto): Promise<void> => {
// No esperamos datos de vuelta, solo éxito (204) o error
await apiClient.post('/auth/change-password', data);
};
const authService = {
login,
changePassword, // Exportar la nueva función
};
export default authService;

View File

@@ -0,0 +1,43 @@
import apiClient from './apiClient';
import type { TipoPago } from '../models/Entities/TipoPago';
import type { CreateTipoPagoDto } from '../models/dtos/tiposPago/CreateTipoPagoDto';
import type { UpdateTipoPagoDto } from '../models/dtos/tiposPago/UpdateTipoPagoDto';
const getAllTiposPago = async (nombreFilter?: string): Promise<TipoPago[]> => {
const params: Record<string, string> = {};
if (nombreFilter) {
params.nombre = nombreFilter;
}
const response = await apiClient.get<TipoPago[]>('/tipospago', { params });
return response.data;
};
const getTipoPagoById = async (id: number): Promise<TipoPago> => {
const response = await apiClient.get<TipoPago>(`/tipospago/${id}`);
return response.data;
};
const createTipoPago = async (data: CreateTipoPagoDto): Promise<TipoPago> => {
const response = await apiClient.post<TipoPago>('/tipospago', data);
return response.data; // La API devuelve el objeto creado (201 Created)
};
const updateTipoPago = async (id: number, data: UpdateTipoPagoDto): Promise<void> => {
// PUT no suele devolver contenido en éxito (204 No Content)
await apiClient.put(`/tipospago/${id}`, data);
};
const deleteTipoPago = async (id: number): Promise<void> => {
// DELETE no suele devolver contenido en éxito (204 No Content)
await apiClient.delete(`/tipospago/${id}`);
};
const tipoPagoService = {
getAllTiposPago,
getTipoPagoById,
createTipoPago,
updateTipoPago,
deleteTipoPago,
};
export default tipoPagoService;