diff --git a/.env.example b/.env.example index f0f590a..e0cf367 100644 --- a/.env.example +++ b/.env.example @@ -12,4 +12,7 @@ CRYPTO_SECRET= TTL= # CORS -CORS_ORIGIN= \ No newline at end of file +CORS_ORIGIN= + +# SENTRY +SENTRY_DSN= \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 6386833..cb1c18b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.1.0", "license": "ISC", "dependencies": { + "@sentry/node": "^7.27.0", "body-parser": "1.19.2", "compression": "1.7.4", "cors": "2.8.5", @@ -167,6 +168,56 @@ "node": ">= 8" } }, + "node_modules/@sentry/core": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.27.0.tgz", + "integrity": "sha512-9WkHMllGNOr6S55N2HKJYJj/2mog5Kv6mjruqlcHHPSgcKFA8bjwBXJTghy6UzwtGd14cyS/X7h5AVUkvuXTMw==", + "dependencies": { + "@sentry/types": "7.27.0", + "@sentry/utils": "7.27.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/node": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.27.0.tgz", + "integrity": "sha512-wp/nbkl1vi3Lajaf9AMCxyDTJP8V4GEiyg0jaG4p3MSF3/6t0+C5Lqqp3GunQZCyXWqDrtuLvNpirtp2egsBiQ==", + "dependencies": { + "@sentry/core": "7.27.0", + "@sentry/types": "7.27.0", + "@sentry/utils": "7.27.0", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/types": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.27.0.tgz", + "integrity": "sha512-vapN3jchu3/WEMWQkrCOy2XDlOLj0l7IewYXKMr15Q21dlfM1QZMigU/r5rtYj5L8a2ISIHx+cRECxX5UIKH7w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/utils": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.27.0.tgz", + "integrity": "sha512-8e5cmjbeuxETPxPEymyyGEYlBbJO1IMveTlcxkTFySPU6nNz2oAIiqPVHv2QgFJJvRv79/i/4Tyl5gFMOW0+AA==", + "dependencies": { + "@sentry/types": "7.27.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@sideway/address": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", @@ -609,6 +660,17 @@ "node": ">=0.4.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2984,6 +3046,18 @@ "node": ">= 0.6" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/husky": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz", @@ -3646,6 +3720,11 @@ "node": ">=0.10.0" } }, + "node_modules/lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -5949,8 +6028,7 @@ "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -6461,6 +6539,44 @@ "fastq": "^1.6.0" } }, + "@sentry/core": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.27.0.tgz", + "integrity": "sha512-9WkHMllGNOr6S55N2HKJYJj/2mog5Kv6mjruqlcHHPSgcKFA8bjwBXJTghy6UzwtGd14cyS/X7h5AVUkvuXTMw==", + "requires": { + "@sentry/types": "7.27.0", + "@sentry/utils": "7.27.0", + "tslib": "^1.9.3" + } + }, + "@sentry/node": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.27.0.tgz", + "integrity": "sha512-wp/nbkl1vi3Lajaf9AMCxyDTJP8V4GEiyg0jaG4p3MSF3/6t0+C5Lqqp3GunQZCyXWqDrtuLvNpirtp2egsBiQ==", + "requires": { + "@sentry/core": "7.27.0", + "@sentry/types": "7.27.0", + "@sentry/utils": "7.27.0", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + } + }, + "@sentry/types": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.27.0.tgz", + "integrity": "sha512-vapN3jchu3/WEMWQkrCOy2XDlOLj0l7IewYXKMr15Q21dlfM1QZMigU/r5rtYj5L8a2ISIHx+cRECxX5UIKH7w==" + }, + "@sentry/utils": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.27.0.tgz", + "integrity": "sha512-8e5cmjbeuxETPxPEymyyGEYlBbJO1IMveTlcxkTFySPU6nNz2oAIiqPVHv2QgFJJvRv79/i/4Tyl5gFMOW0+AA==", + "requires": { + "@sentry/types": "7.27.0", + "tslib": "^1.9.3" + } + }, "@sideway/address": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", @@ -6794,6 +6910,14 @@ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -8612,6 +8736,15 @@ "toidentifier": "1.0.1" } }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, "husky": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz", @@ -9086,6 +9219,11 @@ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "dev": true }, + "lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -10834,8 +10972,7 @@ "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "tsutils": { "version": "3.21.0", diff --git a/package.json b/package.json index 964c102..ca214d5 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "author": "", "license": "ISC", "dependencies": { + "@sentry/node": "7.27.0", "body-parser": "1.19.2", "compression": "1.7.4", "cors": "2.8.5", diff --git a/src/core/env.ts b/src/core/env.ts index eda0b7d..24d9e79 100644 --- a/src/core/env.ts +++ b/src/core/env.ts @@ -11,6 +11,8 @@ const envSchema = OBJECT.keys({ API_VERSION: STRING_REQUIRED, // DATABASE MONGOOSE_URI: STRING_REQUIRED, + // SENTRY + SENTRY_DSN: STRING_REQUIRED, }).unknown(); try { diff --git a/src/core/loaders/database.ts b/src/core/loaders/database.ts index 8bf0cdc..17d7a78 100644 --- a/src/core/loaders/database.ts +++ b/src/core/loaders/database.ts @@ -14,5 +14,6 @@ export default async function main() { logger.info('✅ Init database success'); } catch (err) { logger.error('❌ Init database failed', err.message); + throw new Error(err.message); } } diff --git a/src/core/loaders/index.ts b/src/core/loaders/index.ts index c922f9e..d021307 100644 --- a/src/core/loaders/index.ts +++ b/src/core/loaders/index.ts @@ -1,4 +1,5 @@ import { Express } from 'express'; +import * as Sentry from '@sentry/node'; import createFolders from '@core/loaders/folder'; import loadMiddlewares from '@core/loaders/middlewares'; @@ -7,12 +8,18 @@ import loadDatabase from '@core/loaders/database'; import error from '@services/internal/middlewares/error'; import notFound from '@services/internal/middlewares/notFound'; +Sentry.init({ + dsn: process.env.SENTRY_DSN, +}); + export default async (app: Express) => { createFolders(); + app.use(Sentry.Handlers.requestHandler()); loadMiddlewares(app); await loadDatabase(); loadProject(app); + app.use(Sentry.Handlers.errorHandler()); app.use(error); app.use(notFound);