From 6ed7c7e86d6d8ecbe78e5fdbaaf8605e1261de49 Mon Sep 17 00:00:00 2001 From: Rafael Lopes Date: Tue, 31 Mar 2026 18:05:19 -0300 Subject: [PATCH] Initial commit --- .env.example | 11 +++++ src/Dockerfile | 7 +++ src/app.module.js | 0 src/infra/config/loadEnv.js | 10 ++++ src/infra/database/postgres.js | 0 src/infra/shared/logger.js | 86 ++++++++++++++++++++++++++++++++++ src/main.js | 0 src/nest-cli.json | 0 src/package.json | 18 +++++++ 9 files changed, 132 insertions(+) create mode 100644 .env.example create mode 100644 src/Dockerfile create mode 100644 src/app.module.js create mode 100644 src/infra/config/loadEnv.js create mode 100644 src/infra/database/postgres.js create mode 100644 src/infra/shared/logger.js create mode 100644 src/main.js create mode 100644 src/nest-cli.json create mode 100644 src/package.json diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..9018231 --- /dev/null +++ b/.env.example @@ -0,0 +1,11 @@ +# Backend environment variables + +NODE_ENV=development +PORT=3001 + +# Database +DB_HOST=postgres +DB_PORT=5432 +DB_USER=omnichannel +DB_PASSWORD=change-me +DB_NAME=omnichannel diff --git a/src/Dockerfile b/src/Dockerfile new file mode 100644 index 0000000..7fe8c9d --- /dev/null +++ b/src/Dockerfile @@ -0,0 +1,7 @@ +FROM node:20-alpine +WORKDIR /app +COPY package*.json ./ +RUN npm install +COPY . . +EXPOSE 3000 +CMD ["npm", "run", "dev"] \ No newline at end of file diff --git a/src/app.module.js b/src/app.module.js new file mode 100644 index 0000000..e69de29 diff --git a/src/infra/config/loadEnv.js b/src/infra/config/loadEnv.js new file mode 100644 index 0000000..82aeb4b --- /dev/null +++ b/src/infra/config/loadEnv.js @@ -0,0 +1,10 @@ +const path = require('path'); +const dotenv = require('dotenv'); + +function loadEnv() { + const nodeEnv = process.env.NODE_ENV || 'development'; + const envPath = path.resolve(process.cwd(), `.env.${nodeEnv}`); + dotenv.config({ path: envPath }); +} + +module.exports = loadEnv; diff --git a/src/infra/database/postgres.js b/src/infra/database/postgres.js new file mode 100644 index 0000000..e69de29 diff --git a/src/infra/shared/logger.js b/src/infra/shared/logger.js new file mode 100644 index 0000000..a65475c --- /dev/null +++ b/src/infra/shared/logger.js @@ -0,0 +1,86 @@ +const winston = require('winston'); +const path = require('path'); +require('winston-daily-rotate-file'); +const fs = require('fs'); + +// Verifica se a pasta de logs existe; se nao, cria +const logsDir = path.join(__dirname, '../../../logs'); +if (!fs.existsSync(logsDir)) { + fs.mkdirSync(logsDir, { recursive: true }); +} + +// Configuracao do logger com winston +const logger = winston.createLogger({ + level: 'info', + format: winston.format.combine( + winston.format.timestamp({ + format: 'YYYY-MM-DD HH:mm:ss' + }), + winston.format.errors({ stack: true }), + winston.format.json() + ), + transports: [ + // Log geral da aplicacao + new winston.transports.DailyRotateFile({ + filename: path.join(logsDir, 'app-%DATE%.log'), + datePattern: 'YYYY-MM-DD', + zippedArchive: true, + maxSize: '5m', + maxFiles: '10d', + options: { + flags: 'w' + } + }), + // Log de erros + new winston.transports.DailyRotateFile({ + filename: path.join(logsDir, 'error-%DATE%.log'), + level: 'error', + datePattern: 'YYYY-MM-DD', + zippedArchive: true, + maxSize: '5m', + maxFiles: '10d', + options: { + flags: 'w' + } + }) + ] +}); + +// Log no console para todos os ambientes (pm2 logs) +logger.add(new winston.transports.Console({ + format: winston.format.combine( + winston.format.colorize(), + winston.format.printf((info) => { + const { timestamp, level, message, stack, ...meta } = info; + let logMessage = `${timestamp} [${level}]: ${stack || message}`; + if (Object.keys(meta).length) { + logMessage += ` ${JSON.stringify(meta, null, 2)}`; + } + return logMessage; + }) + ) +})); + +// Funcoes utilitarias +const logError = (error, context = '') => { + if (error instanceof Error) { + logger.error(`${context} - ${error.message}`, { stack: error.stack }); + } else { + logger.error(`${context} - ${error}`); + } +}; + +const logInfo = (message, meta = {}) => { + logger.info(message, meta); +}; + +const logWarning = (message, meta = {}) => { + logger.warn(message, meta); +}; + +module.exports = { + logger, + logError, + logInfo, + logWarning +}; diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..e69de29 diff --git a/src/nest-cli.json b/src/nest-cli.json new file mode 100644 index 0000000..e69de29 diff --git a/src/package.json b/src/package.json new file mode 100644 index 0000000..d8abe04 --- /dev/null +++ b/src/package.json @@ -0,0 +1,18 @@ +{ + "name": "omnichannel-backend", + "version": "1.0.0", + "private": true, + "scripts": { + "start": "cross-env NODE_ENV=production node src/infra/http/server.js", + "dev": "cross-env NODE_ENV=development nodemon src/infra/http/server.js" + }, + "dependencies": { + "dotenv": "^16.4.5", + "winston": "^3.13.0", + "winston-daily-rotate-file": "^5.0.0" + }, + "devDependencies": { + "cross-env": "^7.0.3", + "nodemon": "^3.1.0" + } +}