| 👨💻 Nombre | 📧 Correo | 🏫 Link directo al repositorio | 🐙 Usuario GitHub |
|---|---|---|---|
| Jonathan David Fernandez Vargas | jonathanfdez62@gmail.com | Link | jonathand77 |
Desarrollo completo de la prueba técnica para el cargo de Desarrollador Full Stack - Credit Card App
Esta guía documenta el desarrollo completo de la prueba técnica para el cargo de Desarrollador Full Stack, incluyendo la solución implementada (backend en .NET Core 8 y frontend en React + Vite), los pasos de implementación, arquitectura, y el manual de usuario para el funcionamiento de la aplicación.
Antes de comenzar, asegúrate de contar con:
- Git
- .NET SDK 8+
- Node.js 18+ y npm/pnpm o yarn
- Cliente PostgreSQL: SQL Workbench/J o pgAdmin
- Cuenta en Supabase
- Nota: Los archivos más importantes de este repositorio cuentan con sus comentarios para su interpretación más fácil
Pasos:
git init
gh repo create <tu-usuario>/credit-card-tuya --public --source=. --remote=origincredit-card-tuya/
│
├── backend/
│ ├── CreditCard.Api/
| ├── Controllers/
| ├── DTOs/
| ├── Infrastructure/
| ├── Mapping/
| ├── Middleware/
| ├── Migrations/
| ├── Properties/
| ├── Services/
| ├── Validators/
| ├── CreditCard.Api.csproj/
| ├── Program.cs/
│ ├── CreditCard.Application/
| ├── Interfaces/
| ├── Services/
│ ├── CreditCard.Domain/
| └── Entities/
│
├── frontend/
| ├── src/
| ├── assets/
| ├── components/
| ├── context/
| ├── pages/
| ├── services/
| ├── styles/
| ├── utils/
| ├── App.tsx/
├── CreditCardApp.sln
└── creditcard_migrations.sql
dotnet new sln -n CreditCardApp
mkdir backend && cd backend
dotnet new webapi -n CreditCard.Api
dotnet new classlib -n CreditCard.Domain
dotnet new classlib -n CreditCard.ApplicationAgregar proyectos a la solución y referencias:
dotnet sln ../CreditCardApp.sln add CreditCard.Api/CreditCard.Api.csproj
dotnet sln ../CreditCardApp.sln add CreditCard.Domain/CreditCard.Domain.csproj
dotnet sln ../CreditCardApp.sln add CreditCard.Application/CreditCard.Application.csproj
dotnet add CreditCard.Api/CreditCard.Api.csproj reference ../CreditCard.Application/CreditCard.Application.csproj
dotnet add CreditCard.Application/CreditCard.Application.csproj reference ../CreditCard.Domain/CreditCard.Domain.csprojAgregar migraciones y referencias para llamadas, registros y vinculaciones con la base de datos:
Dentro del archivo creditcard_migrations.sql se encuentra el script completo de referencia.
Entidades principales:
- User: Id, Username, Email, PasswordHash, CreatedAt
- CreditCard: Id, UserId, CardNumberMasked, CardNumberHash, HolderName, Expiry, CvvHash, Limit, Balance, CreatedAt
- Transaction: Id, CardId, UserId, Amount, Type, Timestamp, Description, BalanceAfter
- Añadir paquetes:
dotnet add package Microsoft.EntityFrameworkCore --version 8.0.0
dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL --version 8.0.0
dotnet add package Microsoft.EntityFrameworkCore.Design --version 8.0.0- Crear
AppDbContexty configurarappsettings.Development.jsoncon la conexión a Supabase. - Registrar DbContext en
Program.cs.
- Endpoints:
/api/auth/register,/api/auth/login - Guardar
PasswordHashusando BCrypt - Configurar JwtBearer en
Program.cs - Todas las rutas sensibles protegidas con
[Authorize]
- CardsController: CRUD tarjetas
- PaymentsController: POST /api/payments para registrar pagos
- TransactionsController: GET /api/transactions con filtros por
cardId,userIdy paginación
- Arquitectura hexagonal: Domain, Application, Infrastructure, API
- Repositorios e interfaces
- Servicios de dominio (CardService, PaymentService, TransactionService)
- DTOs y AutoMapper
- Validación con FluentValidation
- Middleware de manejo de errores
npm create vite@latest frontend -- --template react-tsEstructura:
src/pages/: Login.tsx, Dashboard.tsx, Cards.tsx, Payments.tsx, History.tsx, ETCsrc/components/: CardForm.tsx, CardList.tsx, PaymentForm.tsx, ETCsrc/styles/: Estilos para los diferentes componentes y pagessrc/services/api.ts: llamadas HTTP a backend
- Login UI con formulario
- Guardar JWT en localStorage o guardar en Base de Datos (supabase)
- Interceptor para Authorization Bearer en todas las peticiones
- Configurar CORS en backend para dev server
- LoginPage: autenticación
- DashboardPage: Gestion financiera del usuario
- CardsPage: listar y gestionar tarjetas
- PaymentPage: registrar pagos
- HistoryPage: historial de transacciones
- Ejecución para registrar en la base de datos:
cd backend/CreditCard.Api
dotnet run --urls "http://localhost:5000"- Ejecución para registrar de manera local LocalStorage/IN_MEMORY:
cd backend/CreditCard.Api
export USE_INMEMORY=true
dotnet run --urls "http://localhost:5000"cd frontend
npm install
npm run dev- Registrar usuario: POST /api/auth/register
{ "username": "Pepito123",
"email": "Pepito@gmail.com",
"password": "P@ssw0rd!" }- Login: POST /api/auth/login
{ "username": "Pepito123",
"email": "Pepito@gmail.com",
"password": "P@ssw0rd!" }- CRUD tarjetas: GET, POST, PUT, DELETE /api/cards
{ "cardNumber": "41111111111111111",
"holderName": "Pepito Perez",
"expiry": "12/26",
"cvv": "123", "limit": 5000 }- Pagos: POST /api/payments
{ "cardId": "f002063a-f8dc-44b0-847e-4795a725756e",
"amount": 300.50,
"description": "Compra en Burger King" }- Historial: GET /api/transactions
{ "page": 1,
"size": 10,
"items": [
{ "cardId": "f002063a-f8dc-44b0-847e-4795a725756e" }
]
}- No almacena CVV ni PAN completo
- Se usa HTTPS
- Se Guarda JWT secret y claves Supabase en variables de entorno
- Se manejan Toast para las alertas correspondientes a los manejos indebidos o errores de usuario
- Ejecutar Backend en el navegador (http://localhost:xxxx o URL pública de Codespaces)
- Abrir la aplicación en el navegador (
http://localhost:xxxx) - Registrarse o iniciar sesión
- Gestionar tarjetas:
- Crear tarjeta
- Editar tarjeta
- Eliminar tarjeta
- Registrar pagos a las tarjetas
- Consultar historial de transacciones con filtros y paginación
- Consulta todas tus estadísticas en el Dashboard
- Se pueden realizar Unit tests para ver el correcto funcionamiento interno de cada vista o componente.
- Se pueden realizar pruebas E2E tests para validar el flujo correcto de un usuario.
- Se puede implementar el Dark mode, las notificaciones, el rate limiting, caching, ETO





