Skip to main content

Guía de Desarrollo

Introducción al ecosistema Vibra

El proyecto Vibra se organiza en cuatro repositorios independientes:

RepositorioDescripciónStack
vibra-apiBackend REST — módulos de negocio, auth, notificacionesNestJS, Mongoose, Redis
vibra-webFrontend web — panel de administración y landingNext.js, Tailwind CSS, shadcn
vibra-web-mbVersión web tipo PWA para navegadores móvilesNext.js, Tailwind CSS, PWA
vibra-web-wikiDocumentación técnica del ecosistemaMarkdown, VitePress

Cada repositorio se versiona de forma independiente pero comparten convenciones de código, tooling y estándares de calidad.


Setup local

1. Clonar los repositorios

git clone https://github.com/cdsmaya/vibra-api.git
git clone https://github.com/cdsmaya/vibra-web.git
git clone https://github.com/cdsmaya/vibra-web-mb.git
git clone https://github.com/cdsmaya/vibra-web-wiki.git

2. Instalar dependencias

cd vibra-api && npm install
cd ../vibra-web && npm install
cd ../vibra-web-mb && npm install
cd ../vibra-web-wiki && npm install

3. Configurar variables de entorno

vibra-api — crear vibra-api/.env:

PORT=3000
NODE_ENV=development
DATABASE_URL=mongodb://localhost:27017/vibra-dev
JWT_SECRET=dev-secret-key-no-uses-en-produccion
JWT_EXPIRES_IN=7d
RESEND_API_KEY=
CORS_ORIGINS=http://localhost:3001,http://localhost:5173

vibra-web — crear vibra-web/.env.local:

NEXT_PUBLIC_API_URL=http://localhost:3000

vibra-web-mb — crear vibra-web-mb/.env.local:

NEXT_PUBLIC_API_URL=http://localhost:3000

4. Iniciar MongoDB local

Opción A — Instalación local

Descargar e instalar MongoDB Community Edition desde mongodb.com. Luego iniciar el servicio:

mongod --dbpath /data/db

Opción B — MongoDB Compass + Atlas

Usar MongoDB Compass como GUI y conectarse a un cluster gratuito de MongoDB Atlas:

mongodb+srv://usuario:password@cluster0.xxxxx.mongodb.net/vibra-dev

Opción C — Docker

docker run -d --name mongo-local -p 27017:27017 mongo:7

5. Ejecutar en modo desarrollo

ProyectoComandoPuertoURL
vibra-apinpm run start:dev3000http://localhost:3000
vibra-webnpm run dev3001http://localhost:3001
vibra-web-mbnpm run dev3002http://localhost:3002
vibra-web-wikinpm run dev5173http://localhost:5173

Para Vibra Mobile (si se trabaja desde el monorepo o repositorio aparte):

npx expo start

Escanea el código QR con Expo Go en tu dispositivo físico o presiona a para abrir el emulador Android.


Estándares de código

TypeScript estricto

Todos los proyectos usan TypeScript en modo estricto. El archivo tsconfig.json debe incluir:

{
"compilerOptions": {
"strict": true,
"noUncheckedIndexedAccess": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"exactOptionalPropertyTypes": false
}
}

ESLint + Prettier

# Verificar lint
npm run lint

# Formatear código
npm run format

Las reglas están definidas en eslint.config.js (formato flat config para ESLint 9) y prettier.config.js. Los conflictos entre ESLint y Prettier se resuelven mediante eslint-config-prettier.

Conventional commits

Todos los mensajes de commit deben seguir el formato Conventional Commits:

<tipo>(<alcance>): <descripción>

[body opcional]
TipoUso
featNueva funcionalidad
fixCorrección de error
refactorCambio interno sin cambio funcional
styleCambios de formato (espacios, commas)
docsDocumentación
testPruebas
choreTareas de mantenimiento (build, CI, etc.)

Ejemplos:

feat(api): agregar endpoint de recuperación de contraseña
fix(web): corregir validación de formulario en registro
docs(wiki): actualizar guía de despliegue

Husky pre-commit hooks

El proyecto usa Husky para ejecutar validaciones antes de cada commit:

# .husky/pre-commit
npx lint-staged

lint-staged ejecuta ESLint y Prettier únicamente sobre los archivos modificados:

{
"*.ts": ["eslint --fix", "prettier --write"],
"*.tsx": ["eslint --fix", "prettier --write"],
"*.json": ["prettier --write"]
}

Estructura de proyecto

Vibra API — Modular monolith

vibra-api/
├── src/
│ ├── domains/ # Módulos de negocio
│ │ ├── auth/
│ │ │ ├── auth.module.ts
│ │ │ ├── auth.controller.ts
│ │ │ ├── auth.service.ts
│ │ │ ├── dto/
│ │ │ │ ├── login.dto.ts
│ │ │ │ └── register.dto.ts
│ │ │ ├── schemas/
│ │ │ │ └── user.schema.ts
│ │ │ └── strategies/
│ │ │ └── jwt.strategy.ts
│ │ ├── shipping/
│ │ │ ├── shipping.module.ts
│ │ │ ├── shipping.controller.ts
│ │ │ ├── shipping.service.ts
│ │ │ ├── dto/
│ │ │ │ └── create-shipment.dto.ts
│ │ │ └── schemas/
│ │ │ └── shipment.schema.ts
│ │ └── notifications/
│ │ ├── notifications.module.ts
│ │ ├── notifications.service.ts
│ │ └── providers/
│ │ ├── email.provider.ts
│ │ └── push.provider.ts
│ ├── common/ # Utilidades compartidas
│ │ ├── filters/
│ │ ├── guards/
│ │ ├── interceptors/
│ │ └── pipes/
│ ├── config/ # Configuración centralizada
│ │ └── env.config.ts
│ └── main.ts
├── test/
├── .env
├── Dockerfile
├── nest-cli.json
├── tsconfig.json
└── package.json

Vibra Web — Next.js híbrido (App Router + Pages Router)

vibra-web/
├── app/ # App Router
│ ├── layout.tsx
│ ├── page.tsx
│ ├── login/
│ │ └── page.tsx
│ ├── dashboard/
│ │ ├── layout.tsx
│ │ ├── page.tsx
│ │ └── envios/
│ │ └── page.tsx
│ └── api/ # API Routes
│ └── auth/
│ └── [...nextauth].ts
├── pages/ # Pages Router (para páginas existentes)
│ └── landing/
│ └── index.tsx
├── components/
│ ├── ui/ # shadcn/ui components
│ ├── layout/
│ └── forms/
├── lib/
│ ├── api.ts # Cliente HTTP tipado
│ └── utils.ts
├── hooks/
├── public/
├── next.config.ts
├── tailwind.config.ts
└── package.json

Vibra Mobile — Expo Router

vibra-mobile/
├── app/ # Expo Router (file-based routing)
│ ├── _layout.tsx
│ ├── index.tsx
│ ├── login.tsx
│ ├── (tabs)/
│ │ ├── _layout.tsx
│ │ ├── envios.tsx
│ │ └── perfil.tsx
│ └── envio/
│ └── [id].tsx
├── src/
│ ├── features/ # Funcionalidades agrupadas por dominio
│ │ ├── auth/
│ │ ├── shipping/
│ │ └── notifications/
│ ├── shared/ # Código compartido
│ │ ├── components/
│ │ ├── hooks/
│ │ ├── api/
│ │ └── utils/
│ └── providers/
├── app.json
├── eas.json
└── package.json

Convenciones de nomenclatura

ElementoConvenciónEjemplo
Schemas / MongoosePascalCaseUser, Shipment, Rate
DTOsPascalCaseCreateUserDto, LoginDto
ServiciosPascalCaseAuthService, ShippingService
ControladoresPascalCaseAuthController
Módulos NestJSPascalCaseAuthModule, ShippingModule
Componentes ReactPascalCaseLoginForm, ShipmentCard
Hooks ReactcamelCaseuseAuth, useShipments
Archivos fuentekebab-caselogin-form.tsx, auth.service.ts
Archivos de esquemakebab-caseuser.schema.ts
Directorioskebab-caseauth/, shipping/, login-form/
Interfaces TypeScriptPascalCaseIUser, IShipmentPayload
Tipos TypeScriptPascalCaseUserRole, ShipmentStatus
VariablescamelCaseuserName, shipmentList
FuncionescamelCasegetUser(), createShipment()
ConstantesUPPER_SNAKEMAX_RETRIES, DEFAULT_PAGE

Pull Requests y contribución

Flujo de trabajo

  1. Crear un branch desde main con el formato <tipo>/<descripcion-breve>:
git checkout -b feat/agregar-login-biometrico
git checkout -b fix/corregir-validacion-rut
git checkout -b docs/actualizar-readme
  1. Desarrollar la funcionalidad haciendo commits atómicos con mensajes convencionales.

  2. Mantener el branch actualizado con main:

git fetch origin
git rebase origin/main
  1. Abrir un Pull Request en GitHub con la siguiente plantilla:
## Descripción

[Descripción clara de qué hace este PR y por qué]

## Cambios

- [x] Nueva funcionalidad X
- [x] Pruebas unitarias para X
- [ ] Documentación actualizada

## Screenshots (si aplica)

[Capturas de pantalla o video]

## Tips de revisión

- [ ] Revisar archivo `src/domains/auth/auth.service.ts` línea 42
- [ ] Probar flujo de login con usuario inválido

Reglas de revisión

  • Todo PR requiere al menos una aprobación de otro miembro del equipo
  • No se puede mergear sin que pase CI (lint + tests + build)
  • Los cambios de schema MongoDB deben incluir el script de migración correspondiente
  • Los cambios en la API deben mantener o actualizar la documentación Swagger
  • Los cambios visuales deben incluir capturas (web) o video (mobile)

Checklist previo al PR

  • Ejecuté npm run lint y no hay errores
  • Ejecuté npm run format (Prettier)
  • Agregué pruebas para los nuevos cambios
  • Todas las pruebas existentes siguen pasando (npm test)
  • Actualicé la documentación si es necesario
  • Verifiqué que no hay secretos ni credenciales en el código
  • El mensaje del PR sigue el formato convencional