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:
| Grupo | Variables |
|---|---|
| Base de datos | DBENGINE, DB_SQL_DEFAULT_HOST, _PORT, _USER, _PASSWORD, _NAME, y el pool (_POOL_MAX, _POOL_MIN, _POOL_IDLE_TIMEOUT…) |
| Servidor | NODE_ENV, APP_HOST, APP_PORT, APP_DOMAIN, FRONT_URL, RUN_TYPE |
| Auth | AUTH_TYPE, CLERK_SECRET_KEY, CLERK_JWT_KEY, JWT_SECRET, APP_SALT, PUBLIC_ROUTES |
| Redis | REDIS_HOST, REDIS_PORT, REDIS_PASSWORD, REDIS_DURATION_MILLISECONDS |
| Colas | QUEUE_URL, MAX_QUEUE_WORKERS |
| PAMI | PAMI_SII_USERNAME, PAMI_SII_PASSWORD, PAMI_AGREEMENT_ID |
GOOGLE_API_KEY, GOOGLE_API_VISION_KEY, GOOGLE_API_DEFAULT_COUNTRY | |
WHATSAPP_* | |
SMTP_*, RESEND_* | |
| Almacenamiento | R2_ACCOUNT_ID, R2_BUCKET, R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY, R2_PUBLIC_URL |
| Varios | GLOBAL_MAX_RESULTS, LOG_JWT_ERRORS, SWAGGER, EXPO_ACCESS_TOKEN, TEAMS_WEBHOOK_URL |
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á:
| Variable | Para qué |
|---|---|
EXPO_PUBLIC_API_URL | Base del backend (p. ej. https://preoxi.4quinas.com.ar/api) |
EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY | Clave pública de Clerk |
EXPO_PUBLIC_JWT_CLERK_TEMPLATE | El template JWT (jwt-oxitec) |
EXPO_PUBLIC_ENV | Ambiente |
EXPO_IMAGES_BASE_URL | Base de las imágenes de producto |
EXPO_PUBLIC_MOBILE_CONFIG_* | Solo dev: la config móvil se lee del .env en vez del backend |
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
.env elegido a .envLo 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
- Backend (
npm run dev) — verificá que levante contra la base de PRE o local. - Consola web (
npm start) — entrá y confirmá que/v1/access/meresponde. - Mobile, apuntando a PRE si no querés depender de tu backend local.