Baseline commit of the existing Maquina Comercial Pessoal project

Tracks the app that was already in place (capture, treatment, outreach,
WhatsApp integration, server, frontend, tests, docs) so future feature
work can branch and use isolated worktrees.
This commit is contained in:
Gustavo
2026-07-31 10:54:07 -03:00
parent 6cd336a41e
commit d330bb5ff0
132 changed files with 29969 additions and 0 deletions
+61
View File
@@ -0,0 +1,61 @@
import fs from 'node:fs/promises';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
// Raiz do projeto resolvida a partir deste arquivo (src/env.mjs -> pasta acima),
// para funcionar igual quando o servidor e iniciado pelo launcher (cwd diferente).
export const projectRoot = path.dirname(fileURLToPath(new URL('.', import.meta.url)));
export const paths = {
root: projectRoot,
data: path.join(projectRoot, 'data'),
db: process.env.APP_DB_PATH || path.join(projectRoot, 'data', 'maquina-pessoal.db'),
whatsappAuth: process.env.APP_WHATSAPP_AUTH_DIR || path.join(projectRoot, 'data', 'runtime', 'whatsapp-auth'),
exports: path.join(projectRoot, 'data', 'exports'),
seeds: path.join(projectRoot, 'data', 'seeds'),
cnpjDir: process.env.CNPJ_BASE_DIR || path.join(projectRoot, 'prospeccao', 'cnpj'),
rfbRaw: path.join(projectRoot, 'prospeccao', 'cnpj', 'rfb-raw'),
config: path.join(projectRoot, 'prospeccao', 'config.json'),
public: path.join(projectRoot, 'public')
};
export let APP_PORT = envNumber('APP_PORT', 3910);
function refreshEnvDerivedValues() {
paths.db = process.env.APP_DB_PATH || path.join(projectRoot, 'data', 'maquina-pessoal.db');
paths.whatsappAuth = process.env.APP_WHATSAPP_AUTH_DIR || path.join(projectRoot, 'data', 'runtime', 'whatsapp-auth');
paths.cnpjDir = process.env.CNPJ_BASE_DIR || path.join(projectRoot, 'prospeccao', 'cnpj');
paths.rfbRaw = path.join(paths.cnpjDir, 'rfb-raw');
APP_PORT = envNumber('APP_PORT', 3910);
}
export async function loadDotEnv(rootDir = projectRoot) {
try {
const content = await fs.readFile(path.join(rootDir, '.env'), 'utf8');
for (const line of content.split(/\r?\n/)) {
const trimmed = line.trim();
if (!trimmed || trimmed.startsWith('#')) continue;
const separator = trimmed.indexOf('=');
if (separator === -1) continue;
const key = trimmed.slice(0, separator).trim();
const value = trimmed.slice(separator + 1).trim();
if (!process.env[key]) process.env[key] = value;
}
refreshEnvDerivedValues();
} catch (error) {
if (error.code !== 'ENOENT') throw error;
}
}
export function envNumber(name, fallback) {
const value = Number(process.env[name]);
return Number.isFinite(value) && value > 0 ? value : fallback;
}
export function envString(name, fallback) {
return process.env[name] || fallback;
}