This project is an API that allows obtaining information about user portfolios, searching for assets, and sending orders to the market. The API supports MARKET and LIMIT buy and sell orders.
.env
.gitignore
docker-compose.yml
dockerfile
jest.config.js
package.json
prisma/
schema.prisma
README.md
routes.postman_collection.json
src/
config/
base.entity.ts
base.router.ts
base.service.ts
config.ts
repository.interface.ts
instruments/
controller/
dto/
entities/
interfaces/
repository/
router/
services/
marketdata/
controllers/
dto/
entities/
interfaces/
repositories/
services/
orders/
controller/
dto/
entities/
interfaces/
repositories/
router/
services/
portfolio/
interfaces/
services/
utils/
server.ts
shared/
errors/
instances/
middleware/
response/
tests/
services/
users/
controller/
dto/
entities/
interfaces/
repositories/
router/
services/
tsconfig.json
- Clone the repository:
git clone https://github.com/fermorello/cocos-challenge-backend.git
cd cocos-challenge-backend
- Install the dependencies:
npm install
- Configure the environment variables in the .env file
PORT=
DATABASE_URL=
- Generate the Prisma client:
npx prisma generate
To start the server in development mode:
npx run dev
To build and run the server in production:
npm run build
npm start
To run the project using Docker:
docker-compose up --build
- Portfolio
- GET /api/users/portfolio?userId=1
- Retrieves the portfolio of a user.
- GET /api/users/portfolio?userId=1
- Instruments
- GET /api/instrument/search?q=TECO
- Searches for instruments by name or ticker.
- GET /api/instrument/search?q=TECO
- Orders
- POST /api/orders
- Sends a new order to the market
- Body:
{ "instrumentId": 54, "userId": 1, "side": "BUY", "type": "LIMIT", "size": 1, "price": 150 }
- DELETE /api/orders
- Cancels an order with status "NEW"
- Body:
{ "userId": 1, "orderId": 12 }
- POST /api/orders
To run the tests:
npm test
config/: Base project configuration. instruments/: Instruments module. marketdata/: Market data module. orders/: Orders module. portfolio/: Portfolio module. shared/: Shared code between modules. tests/: Project tests. users/: Users module.
The database schema is located in "schema.prisma".
Asset prices are in pesos. MARKET orders are executed immediately. LIMIT orders are created with status NEW. Only orders with status NEW can be canceled. Transfers are modeled as orders with side CASH_IN or CASH_OUT.
The API is developed with Node.js and Express. Prisma is used as ORM. Data is validated with Zod. Errors are handled with Express middlewares.
- Authentication and Authorization
- Data Caching
- Order Service Scalability
- Parallel Processing with Queues
- Monitoring and Logging
The Postman collection is located in routes.postman_collection.json.
Este proyecto es una API que permite obtener información sobre portafolios de usuarios, buscar activos y enviar órdenes al mercado. La API soporta órdenes de compra y venta de tipo MARKET y LIMIT.
.env
.gitignore
docker-compose.yml
dockerfile
jest.config.js
package.json
prisma/
schema.prisma
README.md
routes.postman_collection.json
src/
config/
base.entity.ts
base.router.ts
base.service.ts
config.ts
repository.interface.ts
instruments/
controller/
dto/
entities/
interfaces/
repository/
router/
services/
marketdata/
controllers/
dto/
entities/
interfaces/
repositories/
services/
orders/
controller/
dto/
entities/
interfaces/
repositories/
router/
services/
portfolio/
interfaces/
services/
utils/
server.ts
shared/
errors/
instances/
middleware/
response/
tests/
services/
users/
controller/
dto/
entities/
interfaces/
repositories/
router/
services/
tsconfig.json
- Clonar el repositorio:
git clone https://github.com/fermorello/cocos-challenge-backend.git
cd cocos-challenge-backend
- Instalar las dependencias:
npm install
- Configurar las variables de entorno del archivo .env
PORT=
DATABASE_URL=
- Generar el cliente de Prisma:
npx prisma generate
Para iniciar el servidor en modo desarrollo:
npx run dev
Para construirr y ejecutar el servidor en producción:
npm run build
npm star
Para ejecutar el proyecto usando Docker:
docker-compose up --build
- Portfolio
- GET /api/users/portfolio?userId=1
- Obtiene el portafolio de un usuario.
- GET /api/users/portfolio?userId=1
- Instrumentos
- GET /api/instrument/search?q=TECO
- Busca instrumentos por nombre o ticker.
- GET /api/instrument/search?q=TECO
- Ordenes
- POST /api/orders
- Envía una nueva orden al mercado
- Body:
{ "instrumentId": 54, "userId": 1, "side": "BUY", "type": "LIMIT", "size": 1, "price": 150 }
- DELETE /api/orders
- Cancela una orden de tipo "NEW"
- Body:
{ "userId": 1, "orderId": 12 }
- POST /api/orders
Para ejecutar los tests:
npm test
config/: Configuración base del proyecto. instruments/: Módulo de instrumentos. marketdata/: Módulo de datos de mercado. orders/: Módulo de órdenes. portfolio/: Módulo de portafolio. shared/: Código compartido entre módulos. tests/: Tests del proyecto. users/: Módulo de usuarios.
El esquema de la base de datos se encuentra en "schema.prisma".
Los precios de los activos están en pesos. Las órdenes MARKET se ejecutan inmediatamente. Las órdenes LIMIT se crean con estado NEW. Solo se pueden cancelar órdenes con estado NEW. Las transferencias se modelan como órdenes con side CASH_IN o CASH_OUT.
La API está desarrollada con Node.js y Express. Se utiliza Prisma como ORM. Los datos se validan con Zod. Los errores se manejan con middlewares de Express.
- Autenticación y Autorización
- Cacheo de Datos
- Escalabilidad del Servicio de Órdenes
- Procesamiento en Paralelo con colas
- Monitoreo y Logs
La colección de Postman se encuentra en routes.postman_collection.json.