diff --git a/.env b/.env
new file mode 100644
index 0000000..42adfdf
--- /dev/null
+++ b/.env
@@ -0,0 +1,2 @@
+NODE_ENV=development
+PORT=3000
diff --git a/.gitignore b/.gitignore
index 43cd2ff..c4c70c8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -96,7 +96,6 @@ yarn-error.log*
# local env files
.env*.local
.env.example
-.env
.env.local
.env.development.local
/.env.example
diff --git a/README.md b/README.md
index 81b8a49..e0c44b0 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
Descrição:
-
08/04/2025 Desafio ( Mocking e tratamento de erros ) da Aula 30 ( Otimização ) do curso de Back-end na CoderHouse; Turma #63515 de 2024/25.
+
15/04/2025 Desafio ( Implementação do registrador ) da Aula 34 ( Logging e performance ) do curso de Back-end na CoderHouse; Turma #63515 de 2024/25.
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index c8dd51c..d8245f4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,34 +1,48 @@
{
- "name": "aula-32",
+ "name": "aula-34",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
- "name": "aula-32",
+ "name": "aula-34",
"version": "1.0.0",
"license": "MIT",
"dependencies": {
- "@faker-js/faker": "^9.7.0",
- "express": "^5.1.0"
+ "dotenv": "^16.5.0",
+ "express": "^5.1.0",
+ "winston": "^3.17.0"
+ },
+ "devDependencies": {
+ "cross-env": "^7.0.3"
}
},
- "node_modules/@faker-js/faker": {
- "version": "9.7.0",
- "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-9.7.0.tgz",
- "integrity": "sha512-aozo5vqjCmDoXLNUJarFZx2IN/GgGaogY4TMJ6so/WLZOWpSV7fvj2dmrV6sEAnUm1O7aCrhTibjpzeDFgNqbg==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/fakerjs"
- }
- ],
+ "node_modules/@colors/colors": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz",
+ "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==",
"license": "MIT",
"engines": {
- "node": ">=18.0.0",
- "npm": ">=9.0.0"
+ "node": ">=0.1.90"
}
},
+ "node_modules/@dabh/diagnostics": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz",
+ "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==",
+ "license": "MIT",
+ "dependencies": {
+ "colorspace": "1.1.x",
+ "enabled": "2.0.x",
+ "kuler": "^2.0.0"
+ }
+ },
+ "node_modules/@types/triple-beam": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz",
+ "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==",
+ "license": "MIT"
+ },
"node_modules/accepts": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
@@ -42,6 +56,12 @@
"node": ">= 0.6"
}
},
+ "node_modules/async": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+ "license": "MIT"
+ },
"node_modules/body-parser": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",
@@ -100,6 +120,51 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/color": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
+ "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^1.9.3",
+ "color-string": "^1.6.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "license": "MIT"
+ },
+ "node_modules/color-string": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
+ "node_modules/colorspace": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz",
+ "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==",
+ "license": "MIT",
+ "dependencies": {
+ "color": "^3.1.3",
+ "text-hex": "1.0.x"
+ }
+ },
"node_modules/content-disposition": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz",
@@ -139,6 +204,40 @@
"node": ">=6.6.0"
}
},
+ "node_modules/cross-env": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
+ "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.1"
+ },
+ "bin": {
+ "cross-env": "src/bin/cross-env.js",
+ "cross-env-shell": "src/bin/cross-env-shell.js"
+ },
+ "engines": {
+ "node": ">=10.14",
+ "npm": ">=6",
+ "yarn": ">=1"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/debug": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
@@ -165,6 +264,18 @@
"node": ">= 0.8"
}
},
+ "node_modules/dotenv": {
+ "version": "16.5.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz",
+ "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
@@ -185,6 +296,12 @@
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
"license": "MIT"
},
+ "node_modules/enabled": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz",
+ "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==",
+ "license": "MIT"
+ },
"node_modules/encodeurl": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
@@ -281,6 +398,12 @@
"url": "https://opencollective.com/express"
}
},
+ "node_modules/fecha": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz",
+ "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==",
+ "license": "MIT"
+ },
"node_modules/finalhandler": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
@@ -298,6 +421,12 @@
"node": ">= 0.8"
}
},
+ "node_modules/fn.name": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
+ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==",
+ "license": "MIT"
+ },
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -441,12 +570,60 @@
"node": ">= 0.10"
}
},
+ "node_modules/is-arrayish": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
+ "license": "MIT"
+ },
"node_modules/is-promise": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
"integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
"license": "MIT"
},
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/kuler": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
+ "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==",
+ "license": "MIT"
+ },
+ "node_modules/logform": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz",
+ "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@colors/colors": "1.6.0",
+ "@types/triple-beam": "^1.3.2",
+ "fecha": "^4.2.0",
+ "ms": "^2.1.1",
+ "safe-stable-stringify": "^2.3.1",
+ "triple-beam": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@@ -546,6 +723,15 @@
"wrappy": "1"
}
},
+ "node_modules/one-time": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz",
+ "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==",
+ "license": "MIT",
+ "dependencies": {
+ "fn.name": "1.x.x"
+ }
+ },
"node_modules/parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -555,6 +741,16 @@
"node": ">= 0.8"
}
},
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/path-to-regexp": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz",
@@ -616,6 +812,20 @@
"node": ">= 0.8"
}
},
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/router": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
@@ -652,6 +862,15 @@
],
"license": "MIT"
},
+ "node_modules/safe-stable-stringify": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz",
+ "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
@@ -701,6 +920,29 @@
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
"license": "ISC"
},
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/side-channel": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
@@ -773,6 +1015,24 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/simple-swizzle": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+ "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.3.1"
+ }
+ },
+ "node_modules/stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/statuses": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
@@ -782,6 +1042,21 @@
"node": ">= 0.8"
}
},
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/text-hex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
+ "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==",
+ "license": "MIT"
+ },
"node_modules/toidentifier": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
@@ -791,6 +1066,15 @@
"node": ">=0.6"
}
},
+ "node_modules/triple-beam": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz",
+ "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
"node_modules/type-is": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
@@ -814,6 +1098,12 @@
"node": ">= 0.8"
}
},
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "license": "MIT"
+ },
"node_modules/vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
@@ -823,6 +1113,58 @@
"node": ">= 0.8"
}
},
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/winston": {
+ "version": "3.17.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz",
+ "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==",
+ "license": "MIT",
+ "dependencies": {
+ "@colors/colors": "^1.6.0",
+ "@dabh/diagnostics": "^2.0.2",
+ "async": "^3.2.3",
+ "is-stream": "^2.0.0",
+ "logform": "^2.7.0",
+ "one-time": "^1.0.0",
+ "readable-stream": "^3.4.0",
+ "safe-stable-stringify": "^2.3.1",
+ "stack-trace": "0.0.x",
+ "triple-beam": "^1.3.0",
+ "winston-transport": "^4.9.0"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/winston-transport": {
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz",
+ "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==",
+ "license": "MIT",
+ "dependencies": {
+ "logform": "^2.7.0",
+ "readable-stream": "^3.6.2",
+ "triple-beam": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
diff --git a/package.json b/package.json
index 8ab0626..13a6b7f 100644
--- a/package.json
+++ b/package.json
@@ -1,10 +1,11 @@
{
- "name": "aula-32",
+ "name": "aula-34",
"version": "1.0.0",
- "description": "Aula 32 do curso",
+ "description": "Aula 34 do curso",
"main": "index.js",
"scripts": {
- "test": "echo \"Error: no test specified\" && exit 1"
+ "dev": "cross-env NODE_ENV=development nodemon src/app.js",
+ "start": "cross-env NODE_ENV=production node src/app.js"
},
"repository": {
"type": "git",
@@ -17,7 +18,11 @@
},
"homepage": "https://github.com/AleRzendee/cursoCoderhouseBackEnd#readme",
"dependencies": {
- "@faker-js/faker": "^9.7.0",
- "express": "^5.1.0"
+ "dotenv": "^16.5.0",
+ "express": "^5.1.0",
+ "winston": "^3.17.0"
+ },
+ "devDependencies": {
+ "cross-env": "^7.0.3"
}
}
diff --git a/src/app.js b/src/app.js
index 58dc6cd..912dc08 100644
--- a/src/app.js
+++ b/src/app.js
@@ -1,15 +1,15 @@
import express from 'express';
-import mockingRoutes from './routes/mocking.routes.js';
+import { attachLogger } from './middlewares/logger.middleware.js';
+import loggerRoutes from './routes/logger.routes.js';
import { errorHandler } from './middlewares/errorHandler.js';
const app = express();
app.use(express.json());
+app.use(attachLogger);
+app.use('/api', loggerRoutes);
-app.use('/api', mockingRoutes);
-
-// Teste de rota de erro
-//! app.use('/api/products', productRoutes);
+// outras rotas...
app.use(errorHandler);
diff --git a/src/config/logger.js b/src/config/logger.js
new file mode 100644
index 0000000..ccec2c9
--- /dev/null
+++ b/src/config/logger.js
@@ -0,0 +1,57 @@
+import winston from 'winston';
+
+const customLevels = {
+ levels: {
+ fatal: 0,
+ error: 1,
+ warning: 2,
+ info: 3,
+ http: 4,
+ debug: 5,
+ },
+ colors: {
+ fatal: 'magenta',
+ error: 'red',
+ warning: 'yellow',
+ info: 'green',
+ http: 'cyan',
+ debug: 'blue',
+ }
+};
+
+winston.addColors(customLevels.colors);
+
+const devLogger = winston.createLogger({
+ levels: customLevels.levels,
+ level: 'debug',
+ transports: [
+ new winston.transports.Console({
+ format: winston.format.combine(
+ winston.format.colorize({ all: true }),
+ winston.format.simple()
+ )
+ })
+ ]
+});
+
+const prodLogger = winston.createLogger({
+ levels: customLevels.levels,
+ level: 'info',
+ transports: [
+ new winston.transports.Console({
+ format: winston.format.combine(
+ winston.format.timestamp(),
+ winston.format.json()
+ )
+ }),
+ new winston.transports.File({
+ filename: 'errors.log',
+ level: 'error',
+ format: winston.format.json()
+ })
+ ]
+});
+
+const logger = process.env.NODE_ENV === 'production' ? prodLogger : devLogger;
+
+export default logger;
diff --git a/src/controllers/products.controller.js b/src/controllers/products.controller.js
deleted file mode 100644
index e23d170..0000000
--- a/src/controllers/products.controller.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import CustomError from '../errors/CustomErrors.js';
-import { ERROR_CODES } from '../errors/errorDictionary.js';
-
-export async function createProduct(req, res, next) {
- try {
- const { title, price } = req.body;
-
- if (!title || !price) {
- throw new CustomError(
- 'Título e preço são obrigatórios.',
- ERROR_CODES.INVALID_INPUT,
- { requiredFields: ['title', 'price'] }
- );
- }
-
- // Simulação da lógica de criação
- const newProduct = {
- _id: '123abc',
- title,
- price,
- };
-
- res.status(201).json(newProduct);
- } catch (err) {
- next(err);
- }
-}
diff --git a/src/errors/CustomErrors.js b/src/errors/CustomErrors.js
deleted file mode 100644
index 9c6d15e..0000000
--- a/src/errors/CustomErrors.js
+++ /dev/null
@@ -1,9 +0,0 @@
-export default class CustomError extends Error {
- constructor(message, code, details = {}) {
- super(message);
- this.name = 'CustomError';
- this.code = code;
- this.details = details;
- }
- }
-
\ No newline at end of file
diff --git a/src/errors/errorDictionary.js b/src/errors/errorDictionary.js
deleted file mode 100644
index 8111a76..0000000
--- a/src/errors/errorDictionary.js
+++ /dev/null
@@ -1,6 +0,0 @@
-export const ERROR_CODES = {
- PRODUCT_CREATION_ERROR: 'PRODUCT_CREATION_ERROR',
- PRODUCT_NOT_FOUND: 'PRODUCT_NOT_FOUND',
- CART_OPERATION_ERROR: 'CART_OPERATION_ERROR',
- INVALID_INPUT: 'INVALID_INPUT',
- };
\ No newline at end of file
diff --git a/src/middlewares/errorHandler.js b/src/middlewares/errorHandler.js
deleted file mode 100644
index 156fb82..0000000
--- a/src/middlewares/errorHandler.js
+++ /dev/null
@@ -1,11 +0,0 @@
-export function errorHandler(err, req, res, next) {
- const statusCode = err.code === 'PRODUCT_NOT_FOUND' ? 404 : 400;
-
- res.status(statusCode).json({
- status: 'error',
- message: err.message,
- code: err.code || 'INTERNAL_SERVER_ERROR',
- details: err.details || {},
- });
- }
-
\ No newline at end of file
diff --git a/src/middlewares/loggerTest.middleware.js b/src/middlewares/loggerTest.middleware.js
new file mode 100644
index 0000000..85f9862
--- /dev/null
+++ b/src/middlewares/loggerTest.middleware.js
@@ -0,0 +1,7 @@
+import logger from '../config/logger.js';
+
+export const attachLogger = (req, res, next) => {
+ req.logger = logger;
+ logger.http(`${req.method} ${req.url}`);
+ next();
+};
diff --git a/src/routes/logger.routes.js b/src/routes/logger.routes.js
new file mode 100644
index 0000000..9e5bfde
--- /dev/null
+++ b/src/routes/logger.routes.js
@@ -0,0 +1,15 @@
+import express from 'express';
+const router = express.Router();
+
+router.get('/loggerTest', (req, res) => {
+ req.logger.debug('Este é um log de debug');
+ req.logger.http('Este é um log http');
+ req.logger.info('Este é um log info');
+ req.logger.warning('Este é um log warning');
+ req.logger.error('Este é um log error');
+ req.logger.fatal('Este é um log fatal');
+
+ res.send('Logs testados com sucesso!');
+});
+
+export default router;
diff --git a/src/routes/mocking.routes.js b/src/routes/mocking.routes.js
deleted file mode 100644
index 326f0c0..0000000
--- a/src/routes/mocking.routes.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import express from 'express';
-import { generateMockProducts } from '../utils/mocking.utils.js';
-
-const router = express.Router();
-
-router.get('/mockingproducts', (req, res) => {
- const mockProducts = generateMockProducts(100);
- res.json(mockProducts);
-});
-
-export default router;
diff --git a/src/utils/mocking.utils.js b/src/utils/mocking.utils.js
deleted file mode 100644
index 77f4451..0000000
--- a/src/utils/mocking.utils.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import { faker } from '@faker-js/faker';
-
-export function generateMockProducts(quantity = 100) {
- return Array.from({ length: quantity }, () => ({
- _id: faker.database.mongodbObjectId(),
- title: faker.commerce.productName(),
- description: faker.commerce.productDescription(),
- price: parseFloat(faker.commerce.price()),
- stock: faker.datatype.number({ min: 0, max: 100 }),
- category: faker.commerce.department(),
- thumbnail: faker.image.url(),
- }));
-}