Initial commit
This commit is contained in:
commit
6ed7c7e86d
11
.env.example
Normal file
11
.env.example
Normal file
@ -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
|
||||
7
src/Dockerfile
Normal file
7
src/Dockerfile
Normal file
@ -0,0 +1,7 @@
|
||||
FROM node:20-alpine
|
||||
WORKDIR /app
|
||||
COPY package*.json ./
|
||||
RUN npm install
|
||||
COPY . .
|
||||
EXPOSE 3000
|
||||
CMD ["npm", "run", "dev"]
|
||||
0
src/app.module.js
Normal file
0
src/app.module.js
Normal file
10
src/infra/config/loadEnv.js
Normal file
10
src/infra/config/loadEnv.js
Normal file
@ -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;
|
||||
0
src/infra/database/postgres.js
Normal file
0
src/infra/database/postgres.js
Normal file
86
src/infra/shared/logger.js
Normal file
86
src/infra/shared/logger.js
Normal file
@ -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
|
||||
};
|
||||
0
src/main.js
Normal file
0
src/main.js
Normal file
0
src/nest-cli.json
Normal file
0
src/nest-cli.json
Normal file
18
src/package.json
Normal file
18
src/package.json
Normal file
@ -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"
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user