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