From e647ad7c3a1ab54e8654b2a6270cd437452c660f Mon Sep 17 00:00:00 2001 From: borja Date: Thu, 9 Oct 2025 15:51:43 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20a=C3=B1adir=20DATA=5FDIR=20para=20DB=20?= =?UTF-8?q?compartida=20y=20configurar=20Bun=20workspaces?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: aider (openrouter/openai/gpt-5) --- DEVTASKS_STAGE0_COMMANDS.txt | 3 +++ README.md | 1 + bunfig.toml | 1 + docs/operations.md | 1 + src/db.ts | 15 ++++++++++----- 5 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 DEVTASKS_STAGE0_COMMANDS.txt create mode 100644 bunfig.toml diff --git a/DEVTASKS_STAGE0_COMMANDS.txt b/DEVTASKS_STAGE0_COMMANDS.txt new file mode 100644 index 0000000..0c6ab6b --- /dev/null +++ b/DEVTASKS_STAGE0_COMMANDS.txt @@ -0,0 +1,3 @@ +bun install +bun create svelte@latest apps/web +cd apps/web && bun add -d @sveltejs/adapter-node diff --git a/README.md b/README.md index 3194a9b..cc7d1f0 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,7 @@ Variables clave: - METRICS_ENABLED, PORT. - Rate limit: RATE_LIMIT_PER_MIN, RATE_LIMIT_BURST. - Intervalos y retención: GROUP_SYNC_INTERVAL_MS, GROUP_MEMBERS_SYNC_INTERVAL_MS, GROUP_MEMBERS_INACTIVE_RETENTION_DAYS. +- DATA_DIR: directorio raíz para la base de datos SQLite compartida (por defecto ./data). Consulta: - docs/operations.md para operación, endpoints y variables de entorno. diff --git a/bunfig.toml b/bunfig.toml new file mode 100644 index 0000000..6b2f890 --- /dev/null +++ b/bunfig.toml @@ -0,0 +1 @@ +workspaces = ["apps/*"] diff --git a/docs/operations.md b/docs/operations.md index c094ef6..f38d810 100644 --- a/docs/operations.md +++ b/docs/operations.md @@ -20,6 +20,7 @@ Variables de entorno (principales) - ADMIN_USERS: lista separada por comas de IDs/JIDs autorizados para /admin (se normalizan a dígitos). Ej.: ADMIN_USERS='34600123456, 5554443333, +34 600 111 222' - ALLOWED_GROUPS: lista separada por comas de group_id@g.us para sembrado inicial en arranque. Ej.: ALLOWED_GROUPS='12345-67890@g.us, 11111-22222@g.us' - NOTIFY_ADMINS_ON_DISCOVERY: 'true'/'false' para avisar por DM a ADMIN_USERS al descubrir un grupo (modo 'discover'). Ej.: NOTIFY_ADMINS_ON_DISCOVERY='true' +- DATA_DIR: directorio base para la base de datos SQLite (por defecto ./data). Endpoints operativos - GET /metrics diff --git a/src/db.ts b/src/db.ts index 2c25bb8..ac63fb0 100644 --- a/src/db.ts +++ b/src/db.ts @@ -1,7 +1,7 @@ import { Database } from 'bun:sqlite'; import { normalizeWhatsAppId } from './utils/whatsapp'; import { mkdirSync } from 'fs'; -import { join } from 'path'; +import { join, resolve } from 'path'; import { Migrator } from './db/migrator'; function applyDefaultPragmas(instance: Database): void { @@ -18,15 +18,20 @@ function applyDefaultPragmas(instance: Database): void { } } -// Function to get a database instance. Defaults to 'data/tasks.db' + // Function to get a database instance. Defaults to 'data/tasks.db' export function getDb(filename: string = 'tasks.db'): Database { + // Determine base directory for the database (env DATA_DIR or default './data'), resolve to absolute + const dataDir = process?.env?.DATA_DIR ? String(process.env.DATA_DIR) : 'data'; + const dirPath = resolve(dataDir); + // Try to create data directory if it doesn't exist (ignore if already exists) try { - mkdirSync('data', { recursive: true }); + mkdirSync(dirPath, { recursive: true }); } catch (err) { - if (err.code !== 'EEXIST') throw err; // Only ignore "already exists" errors + if ((err as any)?.code !== 'EEXIST') throw err; // Only ignore "already exists" errors } - const instance = new Database(join('data', filename)); + + const instance = new Database(join(dirPath, filename)); applyDefaultPragmas(instance); return instance; }