Este repositorio contiene la solución completa para la recolección, almacenamiento y visualización de datos de mercados financieros. La arquitectura está diseñada para ser robusta, escalable y fácil de mantener, separando las responsabilidades en un backend de .NET, un worker de fondo, y un frontend de React basado en widgets.
---
## 🚀 Arquitectura General
El sistema se compone de los siguientes elementos principales:
1.**Backend (`Mercados.Api`):** Una API web de .NET 8 que expone los datos almacenados en la base de datos a través de endpoints RESTful.
2.**Worker Service (`Mercados.Worker`):** Un servicio de fondo de .NET 8 responsable de obtener los datos de fuentes externas (`Finnhub`, `Bolsa de Comercio de Rosario`, `Yahoo Finance` y scraping) de forma programada, procesarlos y guardarlos en la base de datos.
3.**Frontend (`frontend/`):** Una aplicación de React (construida con Vite + TypeScript) que proporciona un conjunto de "widgets" modulares y portátiles para visualizar los datos.
4.**Base de Datos (`Mercados.Database`):** Utiliza SQL Server para la persistencia de los datos. El esquema es gestionado a través de migraciones con **FluentMigrator**.
5.**Documentación (`docs/`):** Un portal de documentación unificado generado con **DocFX**, **TypeDoc** y **Storybook**.
---
## 🛠️ Configuración del Entorno de Desarrollo
Para ejecutar este proyecto en un entorno local, necesitarás tener instalado:
-**.NET 9 SDK**
-**Node.js** (v20 o superior) y npm
-**SQL Server** (Developer o Express Edition)
-**Docker y Docker Compose** (Opcional, para simular el entorno de producción)
# Establecer los valores (reemplaza con tus datos)
dotnet user-secrets set "ConnectionStrings:DefaultConnection" "Server=...;Database=..." --project src/Mercados.Api
dotnet user-secrets set "ApiKeys:Finnhub" "tu_api_key" --project src/Mercados.Api
# ...añadir el resto de las claves para ApiKeys y SmtpSettings
# Repite el proceso para el Worker
dotnet user-secrets set "ConnectionStrings:DefaultConnection" "..." --project src/Mercados.Worker
# ...
```
3.**Instalar Dependencias del Frontend:**
```bash
cd frontend
npm install
cd ..
```
4.**Crear y Migrar la Base de Datos:**
Simplemente ejecuta la API una vez. La primera vez que se inicie, FluentMigrator creará la base de datos `MercadosDb` y aplicará todas las migraciones necesarias.
```bash
dotnet run --project src/Mercados.Api
```
Puedes detenerla con `Ctrl+C` una vez que veas el mensaje "Application started".
---
## 🏃 Cómo Ejecutar el Proyecto
Para trabajar en el proyecto, necesitarás ejecutar los 3 servicios principales en terminales separadas.
1.**Iniciar el Backend API:**
```bash
dotnet run --project src/Mercados.Api
```
*La API estará disponible (por defecto) en `http://localhost:5045`.*
2.**Iniciar el Worker Service:**
```bash
dotnet run --project src/Mercados.Worker
```
*El worker comenzará a obtener datos según los horarios definidos en `appsettings.json`.*
3.**Iniciar el Frontend (Servidor de Desarrollo):**
```bash
cd frontend
npm run dev
```
*La aplicación de React estará disponible en `http://localhost:5173`.*
---
## 📚 Documentación
Este proyecto incluye un portal de documentación unificado que cubre tanto el backend como el frontend.
### Para Generar la Documentación:
1.**Compilar el Backend:**
```bash
# Desde la raíz
dotnet build
```
2.**Generar la documentación TypeScript:**
```bash
# Desde la carpeta /frontend
npm run doc:ts
```
3.**Construir el sitio DocFX:**
```bash
# Desde la raíz, usando el archivo de configuración en /docs
docfx docs/docfx.json
```
4.**Visualizar la documentación:**
```bash
# Desde la raíz
docfx serve docs/_site
```
*Abre tu navegador en `http://localhost:8080`.*
### Para ver la Librería de Componentes Visuales (Storybook):
```bash
# Desde la carpeta /frontend
npm run storybook
```
*Abre tu navegador en `http://localhost:6006`.*
---
## 🐳 Despliegue en Producción (Docker)
El despliegue está diseñado para ser realizado con Docker y Docker Compose.
1.**Construir las imágenes de Docker:**
```bash
# Desde la raíz del proyecto
docker compose build
```
2.**Lanzar el stack de servicios:**
Asegúrate de tener el archivo `.env` configurado en el servidor de producción antes de ejecutar.
```bash
docker compose up -d
```
El `docker-compose.yml` está configurado para conectarse a una red externa `shared-net` para la base de datos y para ser gestionado por un proxy inverso externo como Nginx Proxy Manager.