Skip to main content

Entorno local

Los tres repos viven en un mismo workspace, como carpetas hermanas:

Oxitesa/
├── oxitesa-backend/
├── oxitesa-front/
├── oxitec-mobile-app/
└── docs/Obsidian/ # bitácora por issue (ANF-XXX)

Cada uno es un repo git independiente: se clonan por separado.

Backend

cd oxitesa-backend
npm install
npm run dev # nodemon + ts-node, hot reload

Necesitás un .env en la raíz. Pedíselo a alguien del equipo: no está versionado y no hay .env.example. Los grupos de variables que tiene que cubrir:

GrupoVariables
Base de datosDBENGINE, DB_SQL_DEFAULT_HOST, _PORT, _USER, _PASSWORD, _NAME, y el pool (_POOL_MAX, _POOL_MIN, _POOL_IDLE_TIMEOUT…)
ServidorNODE_ENV, APP_HOST, APP_PORT, APP_DOMAIN, FRONT_URL, RUN_TYPE
AuthAUTH_TYPE, CLERK_SECRET_KEY, CLERK_JWT_KEY, JWT_SECRET, APP_SALT, PUBLIC_ROUTES
RedisREDIS_HOST, REDIS_PORT, REDIS_PASSWORD, REDIS_DURATION_MILLISECONDS
ColasQUEUE_URL, MAX_QUEUE_WORKERS
PAMIPAMI_SII_USERNAME, PAMI_SII_PASSWORD, PAMI_AGREEMENT_ID
GoogleGOOGLE_API_KEY, GOOGLE_API_VISION_KEY, GOOGLE_API_DEFAULT_COUNTRY
WhatsAppWHATSAPP_*
EmailSMTP_*, RESEND_*
AlmacenamientoR2_ACCOUNT_ID, R2_BUCKET, R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY, R2_PUBLIC_URL
VariosGLOBAL_MAX_RESULTS, LOG_JWT_ERRORS, SWAGGER, EXPO_ACCESS_TOKEN, TEAMS_WEBHOOK_URL
No necesitás MySQL local para correr los tests

Las conexiones a base de datos y Redis están mockeadas globalmente en la suite de Jest. Ver Testing. Para correr la app, sí necesitás base y Redis.

Para levantar un worker en vez de la API, seteá EXECUTION_MODE — ver Workers y colas.

Swagger

Con SWAGGER habilitado, la spec se genera con routing-controllers-openapi y se sirve en /swagger. Es la forma rápida de ver qué endpoints existen.

Consola web

cd oxitesa-front
pnpm install # pnpm, no npm
npm start # http://localhost:4200

La config de development apunta a http://localhost:3000/v1, así que necesitás el backend corriendo. Para pegarle a PRE, cambiá la configuración del build o el apiUrl del environment.

Mobile (BullStock)

cd oxitec-mobile-app
npm install
npm start # Metro dev server
npm run android # dev build local

Copiá .env.example a .env y completá:

VariablePara qué
EXPO_PUBLIC_API_URLBase del backend (p. ej. https://preoxi.4quinas.com.ar/api)
EXPO_PUBLIC_CLERK_PUBLISHABLE_KEYClave pública de Clerk
EXPO_PUBLIC_JWT_CLERK_TEMPLATEEl template JWT (jwt-oxitec)
EXPO_PUBLIC_ENVAmbiente
EXPO_IMAGES_BASE_URLBase de las imágenes de producto
EXPO_PUBLIC_MOBILE_CONFIG_*Solo dev: la config móvil se lee del .env en vez del backend
Todo lo que se consume en runtime lleva prefijo EXPO_PUBLIC_

Sin ese prefijo, la variable no llega al bundle.

Builds locales de Android

Van por el Makefile, que envuelve expo prebuild + Gradle:

make android-release ENV=dev # APK usando .env.development
make android-release ENV=prod # APK usando .env.prod
make android-bundle ENV=prod # AAB para Play Store
make android-install # adb install en el device conectado
make android-all-prod # clean + release + install
make logs-android-filter # adb logcat filtrado a React Native
El Makefile copia el .env elegido a .env

Lo hace antes de invocar Gradle, para que los valores queden horneados en el build. Consecuencia: cambiar el .env después no cambia nada en un APK ya compilado — hay que recompilar.

Debug en el dispositivo

components/shared/debug/viewDatabase.tsx muestra el contenido de las tablas de SQLite desde la propia app. Es la forma práctica de ver por qué la cola offline no drena o por qué un suministro no aparece en un selector.

Orden recomendado para arrancar

  1. Backend (npm run dev) — verificá que levante contra la base de PRE o local.
  2. Consola web (npm start) — entrá y confirmá que /v1/access/me responde.
  3. Mobile, apuntando a PRE si no querés depender de tu backend local.