add

parent 1bc644dc
......@@ -7,6 +7,7 @@
"license": "UNLICENSED",
"scripts": {
"build": "nest build",
"seed": "ts-node -r tsconfig-paths/register src/db/seed.ts",
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
"start": "nest start",
"start:dev": "nest start --watch",
......@@ -20,22 +21,30 @@
"test:e2e": "jest --config ./test/jest-e2e.json"
},
"dependencies": {
"@faker-js/faker": "^10.0.0",
"@nestjs/common": "^11.0.1",
"@nestjs/config": "^4.0.2",
"@nestjs/core": "^11.0.1",
"@nestjs/jwt": "^11.0.0",
"@nestjs/mapped-types": "*",
"@nestjs/passport": "^11.0.5",
"@nestjs/platform-express": "^11.0.1",
"@nestjs/serve-static": "^5.0.3",
"@nestjs/typeorm": "^11.0.0",
"bcrypt": "^6.0.0",
"class-transformer": "^0.5.1",
"class-validator": "^0.14.2",
"cookie-parser": "^1.4.7",
"dotenv": "^17.2.2",
"lodash": "^4.17.21",
"multer": "^2.0.2",
"passport": "^0.7.0",
"passport-jwt": "^4.0.1",
"pg": "^8.16.3",
"reflect-metadata": "^0.2.2",
"rxjs": "^7.8.1",
"typeorm": "^0.3.26"
"typeorm": "^0.3.26",
"typeorm-extension": "^3.7.1"
},
"devDependencies": {
"@eslint/eslintrc": "^3.2.0",
......@@ -46,11 +55,13 @@
"@swc/cli": "^0.6.0",
"@swc/core": "^1.10.7",
"@types/bcrypt": "^6.0.0",
"@types/cookie-parser": "^1.4.9",
"@types/express": "^5.0.0",
"@types/jest": "^29.5.14",
"@types/lodash": "^4.17.20",
"@types/multer": "^2.0.0",
"@types/node": "^22.10.7",
"@types/passport-jwt": "^4.0.1",
"@types/supertest": "^6.0.2",
"eslint": "^9.18.0",
"eslint-config-prettier": "^10.0.1",
......
......@@ -8,6 +8,9 @@ importers:
.:
dependencies:
'@faker-js/faker':
specifier: ^10.0.0
version: 10.0.0
'@nestjs/common':
specifier: ^11.0.1
version: 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2)
......@@ -17,9 +20,15 @@ importers:
'@nestjs/core':
specifier: ^11.0.1
version: 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.6)(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@nestjs/jwt':
specifier: ^11.0.0
version: 11.0.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))
'@nestjs/mapped-types':
specifier: '*'
version: 2.1.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)
'@nestjs/passport':
specifier: ^11.0.5
version: 11.0.5(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(passport@0.7.0)
'@nestjs/platform-express':
specifier: ^11.0.1
version: 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)
......@@ -38,12 +47,24 @@ importers:
class-validator:
specifier: ^0.14.2
version: 0.14.2
cookie-parser:
specifier: ^1.4.7
version: 1.4.7
dotenv:
specifier: ^17.2.2
version: 17.2.2
lodash:
specifier: ^4.17.21
version: 4.17.21
multer:
specifier: ^2.0.2
version: 2.0.2
passport:
specifier: ^0.7.0
version: 0.7.0
passport-jwt:
specifier: ^4.0.1
version: 4.0.1
pg:
specifier: ^8.16.3
version: 8.16.3
......@@ -56,6 +77,9 @@ importers:
typeorm:
specifier: ^0.3.26
version: 0.3.26(pg@8.16.3)(reflect-metadata@0.2.2)(ts-node@10.9.2(@swc/core@1.13.3)(@types/node@22.17.1)(typescript@5.9.2))
typeorm-extension:
specifier: ^3.7.1
version: 3.7.1(typeorm@0.3.26(pg@8.16.3)(reflect-metadata@0.2.2)(ts-node@10.9.2(@swc/core@1.13.3)(@types/node@22.17.1)(typescript@5.9.2)))
devDependencies:
'@eslint/eslintrc':
specifier: ^3.2.0
......@@ -81,6 +105,9 @@ importers:
'@types/bcrypt':
specifier: ^6.0.0
version: 6.0.0
'@types/cookie-parser':
specifier: ^1.4.9
version: 1.4.9(@types/express@5.0.3)
'@types/express':
specifier: ^5.0.0
version: 5.0.3
......@@ -96,18 +123,21 @@ importers:
'@types/node':
specifier: ^22.10.7
version: 22.17.1
'@types/passport-jwt':
specifier: ^4.0.1
version: 4.0.1
'@types/supertest':
specifier: ^6.0.2
version: 6.0.3
eslint:
specifier: ^9.18.0
version: 9.33.0
version: 9.33.0(jiti@2.6.0)
eslint-config-prettier:
specifier: ^10.0.1
version: 10.1.8(eslint@9.33.0)
version: 10.1.8(eslint@9.33.0(jiti@2.6.0))
eslint-plugin-prettier:
specifier: ^5.2.2
version: 5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.33.0))(eslint@9.33.0)(prettier@3.6.2)
version: 5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.33.0(jiti@2.6.0)))(eslint@9.33.0(jiti@2.6.0))(prettier@3.6.2)
globals:
specifier: ^16.0.0
version: 16.3.0
......@@ -140,7 +170,7 @@ importers:
version: 5.9.2
typescript-eslint:
specifier: ^8.20.0
version: 8.39.1(eslint@9.33.0)(typescript@5.9.2)
version: 8.39.1(eslint@9.33.0(jiti@2.6.0))(typescript@5.9.2)
packages:
......@@ -377,6 +407,14 @@ packages:
resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@faker-js/faker@10.0.0':
resolution: {integrity: sha512-UollFEUkVXutsaP+Vndjxar40Gs5JL2HeLcl8xO1QAjJgOdhc3OmBFWyEylS+RddWaaBiAzH+5/17PLQJwDiLw==}
engines: {node: ^20.19.0 || ^22.13.0 || ^23.5.0 || >=24.0.0, npm: '>=10'}
'@faker-js/faker@8.4.1':
resolution: {integrity: sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13'}
'@humanfs/core@0.19.1':
resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
engines: {node: '>=18.18.0'}
......@@ -795,6 +833,11 @@ packages:
'@nestjs/websockets':
optional: true
'@nestjs/jwt@11.0.0':
resolution: {integrity: sha512-v7YRsW3Xi8HNTsO+jeHSEEqelX37TVWgwt+BcxtkG/OfXJEOs6GZdbdza200d6KqId1pJQZ6UPj1F0M6E+mxaA==}
peerDependencies:
'@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0
'@nestjs/mapped-types@2.1.0':
resolution: {integrity: sha512-W+n+rM69XsFdwORF11UqJahn4J3xi4g/ZEOlJNL6KoW5ygWSmBB2p0S2BZ4FQeS/NDH72e6xIcu35SfJnE8bXw==}
peerDependencies:
......@@ -808,6 +851,12 @@ packages:
class-validator:
optional: true
'@nestjs/passport@11.0.5':
resolution: {integrity: sha512-ulQX6mbjlws92PIM15Naes4F4p2JoxGnIJuUsdXQPT+Oo2sqQmENEZXM7eYuimocfHnKlcfZOuyzbA33LwUlOQ==}
peerDependencies:
'@nestjs/common': ^10.0.0 || ^11.0.0
passport: ^0.5.0 || ^0.6.0 || ^0.7.0
'@nestjs/platform-express@11.1.6':
resolution: {integrity: sha512-HErwPmKnk+loTq8qzu1up+k7FC6Kqa8x6lJ4cDw77KnTxLzsCaPt+jBvOq6UfICmfqcqCCf3dKXg+aObQp+kIQ==}
peerDependencies:
......@@ -1035,6 +1084,11 @@ packages:
'@types/connect@3.4.38':
resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
'@types/cookie-parser@1.4.9':
resolution: {integrity: sha512-tGZiZ2Gtc4m3wIdLkZ8mkj1T6CEHb35+VApbL2T14Dew8HA7c+04dmKqsKRNC+8RJPm16JEK0tFSwdZqubfc4g==}
peerDependencies:
'@types/express': '*'
'@types/cookiejar@2.1.5':
resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==}
......@@ -1077,6 +1131,9 @@ packages:
'@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
'@types/jsonwebtoken@9.0.7':
resolution: {integrity: sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==}
'@types/lodash@4.17.20':
resolution: {integrity: sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==}
......@@ -1092,6 +1149,15 @@ packages:
'@types/node@22.17.1':
resolution: {integrity: sha512-y3tBaz+rjspDTylNjAX37jEC3TETEFGNJL6uQDxwF9/8GLLIjW1rvVHlynyuUKMnMr1Roq8jOv3vkopBjC4/VA==}
'@types/passport-jwt@4.0.1':
resolution: {integrity: sha512-Y0Ykz6nWP4jpxgEUYq8NoVZeCQPo1ZndJLfapI249g1jHChvRfZRO/LS3tqu26YgAS/laI1qx98sYGz0IalRXQ==}
'@types/passport-strategy@0.2.38':
resolution: {integrity: sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==}
'@types/passport@1.0.17':
resolution: {integrity: sha512-aciLyx+wDwT2t2/kJGJR2AEeBz0nJU4WuRX04Wu9Dqc5lSUtwu0WERPHYsLhF9PtseiAMPBGNUOtFjxZ56prsg==}
'@types/qs@6.14.0':
resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==}
......@@ -1481,6 +1547,9 @@ packages:
buffer-crc32@0.2.13:
resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
buffer-equal-constant-time@1.0.1:
resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==}
buffer-from@1.1.2:
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
......@@ -1655,6 +1724,13 @@ packages:
convert-source-map@2.0.0:
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
cookie-parser@1.4.7:
resolution: {integrity: sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==}
engines: {node: '>= 0.8.0'}
cookie-signature@1.0.6:
resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
cookie-signature@1.2.2:
resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==}
engines: {node: '>=6.6.0'}
......@@ -1748,6 +1824,9 @@ packages:
resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
engines: {node: '>= 0.8'}
destr@2.0.5:
resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==}
detect-newline@3.1.0:
resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==}
engines: {node: '>=8'}
......@@ -1771,6 +1850,10 @@ packages:
resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==}
engines: {node: '>=12'}
dotenv@17.2.2:
resolution: {integrity: sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q==}
engines: {node: '>=12'}
dunder-proto@1.0.1:
resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
engines: {node: '>= 0.4'}
......@@ -1778,6 +1861,15 @@ packages:
eastasianwidth@0.2.0:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
ebec@1.1.1:
resolution: {integrity: sha512-JZ1vcvPQtR+8LGbZmbjG21IxLQq/v47iheJqn2F6yB2CgnGfn8ZVg3myHrf3buIZS8UCwQK0jOSIb3oHX7aH8g==}
ebec@2.3.0:
resolution: {integrity: sha512-bt+0tSL7223VU3PSVi0vtNLZ8pO1AfWolcPPMk2a/a5H+o/ZU9ky0n3A0zhrR4qzJTN61uPsGIO4ShhOukdzxA==}
ecdsa-sig-formatter@1.0.11:
resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==}
ee-first@1.1.1:
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
......@@ -1802,6 +1894,10 @@ packages:
resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==}
engines: {node: '>=10.13.0'}
envix@1.5.0:
resolution: {integrity: sha512-IOxTKT+tffjxgvX2O5nq6enbkv6kBQ/QdMy18bZWo0P0rKPvsRp2/EypIPwTvJfnmk3VdOlq/KcRSZCswefM/w==}
engines: {node: '>=18.0.0'}
error-ex@1.3.2:
resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
......@@ -2024,6 +2120,10 @@ packages:
resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
engines: {node: '>=16'}
flat@5.0.2:
resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==}
hasBin: true
flatted@3.3.3:
resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
......@@ -2466,6 +2566,10 @@ packages:
node-notifier:
optional: true
jiti@2.6.0:
resolution: {integrity: sha512-VXe6RjJkBPj0ohtqaO8vSWP3ZhAKo66fKrFNCll4BTcwljPLz03pCbaNKfzGP5MbrCYcbJ7v0nOYYwUzTEIdXQ==}
hasBin: true
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
......@@ -2508,6 +2612,16 @@ packages:
jsonfile@6.2.0:
resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==}
jsonwebtoken@9.0.2:
resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==}
engines: {node: '>=12', npm: '>=6'}
jwa@1.4.2:
resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==}
jws@3.2.2:
resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==}
keyv@4.5.4:
resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
......@@ -2549,12 +2663,37 @@ packages:
resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
engines: {node: '>=10'}
locter@2.2.0:
resolution: {integrity: sha512-EFiq3HbiUSsEWzWKLO8wumlj07KwuBi9qsSpbul26PFklrYNs0pQMEsLlj3o0gv/mbXi81zHq29IedmRM/qX2Q==}
engines: {node: '>=22.0.0'}
lodash.includes@4.3.0:
resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==}
lodash.isboolean@3.0.3:
resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==}
lodash.isinteger@4.0.4:
resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==}
lodash.isnumber@3.0.3:
resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==}
lodash.isplainobject@4.0.6:
resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
lodash.isstring@4.0.1:
resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==}
lodash.memoize@4.1.2:
resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==}
lodash.merge@4.6.2:
resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
lodash.once@4.1.1:
resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==}
lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
......@@ -2562,6 +2701,9 @@ packages:
resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
engines: {node: '>=10'}
lower-case@2.0.2:
resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
lowercase-keys@3.0.0:
resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
......@@ -2700,6 +2842,9 @@ packages:
neo-async@2.6.2:
resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
no-case@3.0.4:
resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
node-abort-controller@3.1.1:
resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==}
......@@ -2798,6 +2943,20 @@ packages:
resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
engines: {node: '>= 0.8'}
pascal-case@3.1.2:
resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==}
passport-jwt@4.0.1:
resolution: {integrity: sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==}
passport-strategy@1.0.0:
resolution: {integrity: sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==}
engines: {node: '>= 0.4.0'}
passport@0.7.0:
resolution: {integrity: sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==}
engines: {node: '>= 0.4.0'}
path-exists@4.0.0:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'}
......@@ -2829,6 +2988,9 @@ packages:
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
engines: {node: '>=8'}
pause@0.0.1:
resolution: {integrity: sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==}
pend@1.2.0:
resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
......@@ -2962,6 +3124,9 @@ packages:
resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
engines: {node: '>= 0.6'}
rapiq@0.9.0:
resolution: {integrity: sha512-k4oT4RarFBrlLMJ49xUTeQpa/us0uU4I70D/UEnK3FWQ4GENzei01rEQAmvPKAIzACo4NMW+YcYJ7EVfSa7EFg==}
raw-body@3.0.0:
resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==}
engines: {node: '>= 0.8'}
......@@ -3137,6 +3302,9 @@ packages:
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
engines: {node: '>=8'}
smob@1.5.0:
resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==}
sort-keys-length@1.0.1:
resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==}
engines: {node: '>=0.10.0'}
......@@ -3186,6 +3354,9 @@ packages:
resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==}
engines: {node: '>= 0.8'}
std-env@3.9.0:
resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==}
streamsearch@1.1.0:
resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
engines: {node: '>=10.0.0'}
......@@ -3424,6 +3595,13 @@ packages:
typedarray@0.0.6:
resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
typeorm-extension@3.7.1:
resolution: {integrity: sha512-SwpLlrMkRLvDSUtDbM4XM0SxhedPFW24i5sDmUV2sLogoMje0lOE5f3t3BKHR4apKUYaAxq+TiL9BhIqXx3bUA==}
engines: {node: '>=14.0.0'}
hasBin: true
peerDependencies:
typeorm: ~0.3.0
typeorm@0.3.26:
resolution: {integrity: sha512-o2RrBNn3lczx1qv4j+JliVMmtkPSqEGpG0UuZkt9tCfWkoXKu8MZnjvp2GjWPll1SehwemQw6xrbVRhmOglj8Q==}
engines: {node: '>=16.13.0'}
......@@ -3536,6 +3714,10 @@ packages:
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
utils-merge@1.0.1:
resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
engines: {node: '>= 0.4.0'}
uuid@11.1.0:
resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==}
hasBin: true
......@@ -3629,6 +3811,11 @@ packages:
yallist@3.1.1:
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
yaml@2.8.1:
resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==}
engines: {node: '>= 14.6'}
hasBin: true
yargs-parser@21.1.1:
resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
engines: {node: '>=12'}
......@@ -3889,9 +4076,9 @@ snapshots:
dependencies:
'@jridgewell/trace-mapping': 0.3.9
'@eslint-community/eslint-utils@4.7.0(eslint@9.33.0)':
'@eslint-community/eslint-utils@4.7.0(eslint@9.33.0(jiti@2.6.0))':
dependencies:
eslint: 9.33.0
eslint: 9.33.0(jiti@2.6.0)
eslint-visitor-keys: 3.4.3
'@eslint-community/regexpp@4.12.1': {}
......@@ -3933,6 +4120,10 @@ snapshots:
'@eslint/core': 0.15.2
levn: 0.4.1
'@faker-js/faker@10.0.0': {}
'@faker-js/faker@8.4.1': {}
'@humanfs/core@0.19.1': {}
'@humanfs/node@0.16.6':
......@@ -4433,6 +4624,12 @@ snapshots:
optionalDependencies:
'@nestjs/platform-express': 11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)
'@nestjs/jwt@11.0.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))':
dependencies:
'@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@types/jsonwebtoken': 9.0.7
jsonwebtoken: 9.0.2
'@nestjs/mapped-types@2.1.0(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)':
dependencies:
'@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2)
......@@ -4441,6 +4638,11 @@ snapshots:
class-transformer: 0.5.1
class-validator: 0.14.2
'@nestjs/passport@11.0.5(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(passport@0.7.0)':
dependencies:
'@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2)
passport: 0.7.0
'@nestjs/platform-express@11.1.6(@nestjs/common@11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.6)':
dependencies:
'@nestjs/common': 11.1.6(class-transformer@0.5.1)(class-validator@0.14.2)(reflect-metadata@0.2.2)(rxjs@7.8.2)
......@@ -4665,6 +4867,10 @@ snapshots:
dependencies:
'@types/node': 22.17.1
'@types/cookie-parser@1.4.9(@types/express@5.0.3)':
dependencies:
'@types/express': 5.0.3
'@types/cookiejar@2.1.5': {}
'@types/eslint-scope@3.7.7':
......@@ -4717,6 +4923,10 @@ snapshots:
'@types/json-schema@7.0.15': {}
'@types/jsonwebtoken@9.0.7':
dependencies:
'@types/node': 22.17.1
'@types/lodash@4.17.20': {}
'@types/methods@1.1.4': {}
......@@ -4731,6 +4941,20 @@ snapshots:
dependencies:
undici-types: 6.21.0
'@types/passport-jwt@4.0.1':
dependencies:
'@types/jsonwebtoken': 9.0.7
'@types/passport-strategy': 0.2.38
'@types/passport-strategy@0.2.38':
dependencies:
'@types/express': 5.0.3
'@types/passport': 1.0.17
'@types/passport@1.0.17':
dependencies:
'@types/express': 5.0.3
'@types/qs@6.14.0': {}
'@types/range-parser@1.2.7': {}
......@@ -4768,15 +4992,15 @@ snapshots:
dependencies:
'@types/yargs-parser': 21.0.3
'@typescript-eslint/eslint-plugin@8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0)(typescript@5.9.2))(eslint@9.33.0)(typescript@5.9.2)':
'@typescript-eslint/eslint-plugin@8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.33.0(jiti@2.6.0))(typescript@5.9.2)':
dependencies:
'@eslint-community/regexpp': 4.12.1
'@typescript-eslint/parser': 8.39.1(eslint@9.33.0)(typescript@5.9.2)
'@typescript-eslint/parser': 8.39.1(eslint@9.33.0(jiti@2.6.0))(typescript@5.9.2)
'@typescript-eslint/scope-manager': 8.39.1
'@typescript-eslint/type-utils': 8.39.1(eslint@9.33.0)(typescript@5.9.2)
'@typescript-eslint/utils': 8.39.1(eslint@9.33.0)(typescript@5.9.2)
'@typescript-eslint/type-utils': 8.39.1(eslint@9.33.0(jiti@2.6.0))(typescript@5.9.2)
'@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.6.0))(typescript@5.9.2)
'@typescript-eslint/visitor-keys': 8.39.1
eslint: 9.33.0
eslint: 9.33.0(jiti@2.6.0)
graphemer: 1.4.0
ignore: 7.0.5
natural-compare: 1.4.0
......@@ -4785,14 +5009,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/parser@8.39.1(eslint@9.33.0)(typescript@5.9.2)':
'@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.6.0))(typescript@5.9.2)':
dependencies:
'@typescript-eslint/scope-manager': 8.39.1
'@typescript-eslint/types': 8.39.1
'@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2)
'@typescript-eslint/visitor-keys': 8.39.1
debug: 4.4.1
eslint: 9.33.0
eslint: 9.33.0(jiti@2.6.0)
typescript: 5.9.2
transitivePeerDependencies:
- supports-color
......@@ -4815,13 +5039,13 @@ snapshots:
dependencies:
typescript: 5.9.2
'@typescript-eslint/type-utils@8.39.1(eslint@9.33.0)(typescript@5.9.2)':
'@typescript-eslint/type-utils@8.39.1(eslint@9.33.0(jiti@2.6.0))(typescript@5.9.2)':
dependencies:
'@typescript-eslint/types': 8.39.1
'@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2)
'@typescript-eslint/utils': 8.39.1(eslint@9.33.0)(typescript@5.9.2)
'@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.6.0))(typescript@5.9.2)
debug: 4.4.1
eslint: 9.33.0
eslint: 9.33.0(jiti@2.6.0)
ts-api-utils: 2.1.0(typescript@5.9.2)
typescript: 5.9.2
transitivePeerDependencies:
......@@ -4845,13 +5069,13 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/utils@8.39.1(eslint@9.33.0)(typescript@5.9.2)':
'@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.6.0))(typescript@5.9.2)':
dependencies:
'@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0)
'@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.6.0))
'@typescript-eslint/scope-manager': 8.39.1
'@typescript-eslint/types': 8.39.1
'@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2)
eslint: 9.33.0
eslint: 9.33.0(jiti@2.6.0)
typescript: 5.9.2
transitivePeerDependencies:
- supports-color
......@@ -5255,6 +5479,8 @@ snapshots:
buffer-crc32@0.2.13: {}
buffer-equal-constant-time@1.0.1: {}
buffer-from@1.1.2: {}
buffer@5.7.1:
......@@ -5414,6 +5640,13 @@ snapshots:
convert-source-map@2.0.0: {}
cookie-parser@1.4.7:
dependencies:
cookie: 0.7.2
cookie-signature: 1.0.6
cookie-signature@1.0.6: {}
cookie-signature@1.2.2: {}
cookie@0.7.2: {}
......@@ -5493,6 +5726,8 @@ snapshots:
depd@2.0.0: {}
destr@2.0.5: {}
detect-newline@3.1.0: {}
dezalgo@1.0.4:
......@@ -5510,6 +5745,8 @@ snapshots:
dotenv@16.4.7: {}
dotenv@17.2.2: {}
dunder-proto@1.0.1:
dependencies:
call-bind-apply-helpers: 1.0.2
......@@ -5518,6 +5755,16 @@ snapshots:
eastasianwidth@0.2.0: {}
ebec@1.1.1:
dependencies:
smob: 1.5.0
ebec@2.3.0: {}
ecdsa-sig-formatter@1.0.11:
dependencies:
safe-buffer: 5.2.1
ee-first@1.1.1: {}
electron-to-chromium@1.5.200: {}
......@@ -5535,6 +5782,10 @@ snapshots:
graceful-fs: 4.2.11
tapable: 2.2.2
envix@1.5.0:
dependencies:
std-env: 3.9.0
error-ex@1.3.2:
dependencies:
is-arrayish: 0.2.1
......@@ -5564,19 +5815,19 @@ snapshots:
escape-string-regexp@4.0.0: {}
eslint-config-prettier@10.1.8(eslint@9.33.0):
eslint-config-prettier@10.1.8(eslint@9.33.0(jiti@2.6.0)):
dependencies:
eslint: 9.33.0
eslint: 9.33.0(jiti@2.6.0)
eslint-plugin-prettier@5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.33.0))(eslint@9.33.0)(prettier@3.6.2):
eslint-plugin-prettier@5.5.4(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@9.33.0(jiti@2.6.0)))(eslint@9.33.0(jiti@2.6.0))(prettier@3.6.2):
dependencies:
eslint: 9.33.0
eslint: 9.33.0(jiti@2.6.0)
prettier: 3.6.2
prettier-linter-helpers: 1.0.0
synckit: 0.11.11
optionalDependencies:
'@types/eslint': 9.6.1
eslint-config-prettier: 10.1.8(eslint@9.33.0)
eslint-config-prettier: 10.1.8(eslint@9.33.0(jiti@2.6.0))
eslint-scope@5.1.1:
dependencies:
......@@ -5592,9 +5843,9 @@ snapshots:
eslint-visitor-keys@4.2.1: {}
eslint@9.33.0:
eslint@9.33.0(jiti@2.6.0):
dependencies:
'@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0)
'@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.6.0))
'@eslint-community/regexpp': 4.12.1
'@eslint/config-array': 0.21.0
'@eslint/config-helpers': 0.3.1
......@@ -5629,6 +5880,8 @@ snapshots:
minimatch: 3.1.2
natural-compare: 1.4.0
optionator: 0.9.4
optionalDependencies:
jiti: 2.6.0
transitivePeerDependencies:
- supports-color
......@@ -5815,6 +6068,8 @@ snapshots:
flatted: 3.3.3
keyv: 4.5.4
flat@5.0.2: {}
flatted@3.3.3: {}
for-each@0.3.5:
......@@ -6452,6 +6707,8 @@ snapshots:
- supports-color
- ts-node
jiti@2.6.0: {}
js-tokens@4.0.0: {}
js-yaml@3.14.1:
......@@ -6485,6 +6742,30 @@ snapshots:
optionalDependencies:
graceful-fs: 4.2.11
jsonwebtoken@9.0.2:
dependencies:
jws: 3.2.2
lodash.includes: 4.3.0
lodash.isboolean: 3.0.3
lodash.isinteger: 4.0.4
lodash.isnumber: 3.0.3
lodash.isplainobject: 4.0.6
lodash.isstring: 4.0.1
lodash.once: 4.1.1
ms: 2.1.3
semver: 7.7.2
jwa@1.4.2:
dependencies:
buffer-equal-constant-time: 1.0.1
ecdsa-sig-formatter: 1.0.11
safe-buffer: 5.2.1
jws@3.2.2:
dependencies:
jwa: 1.4.2
safe-buffer: 5.2.1
keyv@4.5.4:
dependencies:
json-buffer: 3.0.1
......@@ -6516,10 +6797,33 @@ snapshots:
dependencies:
p-locate: 5.0.0
locter@2.2.0:
dependencies:
destr: 2.0.5
ebec: 2.3.0
fast-glob: 3.3.3
flat: 5.0.2
jiti: 2.6.0
yaml: 2.8.1
lodash.includes@4.3.0: {}
lodash.isboolean@3.0.3: {}
lodash.isinteger@4.0.4: {}
lodash.isnumber@3.0.3: {}
lodash.isplainobject@4.0.6: {}
lodash.isstring@4.0.1: {}
lodash.memoize@4.1.2: {}
lodash.merge@4.6.2: {}
lodash.once@4.1.1: {}
lodash@4.17.21: {}
log-symbols@4.1.0:
......@@ -6527,6 +6831,10 @@ snapshots:
chalk: 4.1.2
is-unicode-supported: 0.1.0
lower-case@2.0.2:
dependencies:
tslib: 2.8.1
lowercase-keys@3.0.0: {}
lru-cache@10.4.3: {}
......@@ -6634,6 +6942,11 @@ snapshots:
neo-async@2.6.2: {}
no-case@3.0.4:
dependencies:
lower-case: 2.0.2
tslib: 2.8.1
node-abort-controller@3.1.1: {}
node-addon-api@8.5.0: {}
......@@ -6728,6 +7041,24 @@ snapshots:
parseurl@1.3.3: {}
pascal-case@3.1.2:
dependencies:
no-case: 3.0.4
tslib: 2.8.1
passport-jwt@4.0.1:
dependencies:
jsonwebtoken: 9.0.2
passport-strategy: 1.0.0
passport-strategy@1.0.0: {}
passport@0.7.0:
dependencies:
passport-strategy: 1.0.0
pause: 0.0.1
utils-merge: 1.0.1
path-exists@4.0.0: {}
path-is-absolute@1.0.1: {}
......@@ -6750,6 +7081,8 @@ snapshots:
path-type@4.0.0: {}
pause@0.0.1: {}
pend@1.2.0: {}
pg-cloudflare@1.2.7:
......@@ -6859,6 +7192,11 @@ snapshots:
range-parser@1.2.1: {}
rapiq@0.9.0:
dependencies:
ebec: 1.1.1
smob: 1.5.0
raw-body@3.0.0:
dependencies:
bytes: 3.1.2
......@@ -7054,6 +7392,8 @@ snapshots:
slash@3.0.0: {}
smob@1.5.0: {}
sort-keys-length@1.0.1:
dependencies:
sort-keys: 1.1.2
......@@ -7092,6 +7432,8 @@ snapshots:
statuses@2.0.2: {}
std-env@3.9.0: {}
streamsearch@1.1.0: {}
streamx@2.22.1:
......@@ -7342,6 +7684,19 @@ snapshots:
typedarray@0.0.6: {}
typeorm-extension@3.7.1(typeorm@0.3.26(pg@8.16.3)(reflect-metadata@0.2.2)(ts-node@10.9.2(@swc/core@1.13.3)(@types/node@22.17.1)(typescript@5.9.2))):
dependencies:
'@faker-js/faker': 8.4.1
consola: 3.4.2
envix: 1.5.0
locter: 2.2.0
pascal-case: 3.1.2
rapiq: 0.9.0
reflect-metadata: 0.2.2
smob: 1.5.0
typeorm: 0.3.26(pg@8.16.3)(reflect-metadata@0.2.2)(ts-node@10.9.2(@swc/core@1.13.3)(@types/node@22.17.1)(typescript@5.9.2))
yargs: 17.7.2
typeorm@0.3.26(pg@8.16.3)(reflect-metadata@0.2.2)(ts-node@10.9.2(@swc/core@1.13.3)(@types/node@22.17.1)(typescript@5.9.2)):
dependencies:
'@sqltools/formatter': 1.2.5
......@@ -7366,13 +7721,13 @@ snapshots:
- babel-plugin-macros
- supports-color
typescript-eslint@8.39.1(eslint@9.33.0)(typescript@5.9.2):
typescript-eslint@8.39.1(eslint@9.33.0(jiti@2.6.0))(typescript@5.9.2):
dependencies:
'@typescript-eslint/eslint-plugin': 8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0)(typescript@5.9.2))(eslint@9.33.0)(typescript@5.9.2)
'@typescript-eslint/parser': 8.39.1(eslint@9.33.0)(typescript@5.9.2)
'@typescript-eslint/eslint-plugin': 8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.6.0))(typescript@5.9.2))(eslint@9.33.0(jiti@2.6.0))(typescript@5.9.2)
'@typescript-eslint/parser': 8.39.1(eslint@9.33.0(jiti@2.6.0))(typescript@5.9.2)
'@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2)
'@typescript-eslint/utils': 8.39.1(eslint@9.33.0)(typescript@5.9.2)
eslint: 9.33.0
'@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.6.0))(typescript@5.9.2)
eslint: 9.33.0(jiti@2.6.0)
typescript: 5.9.2
transitivePeerDependencies:
- supports-color
......@@ -7413,6 +7768,8 @@ snapshots:
util-deprecate@1.0.2: {}
utils-merge@1.0.1: {}
uuid@11.1.0: {}
v8-compile-cache-lib@3.0.1: {}
......@@ -7525,6 +7882,8 @@ snapshots:
yallist@3.1.1: {}
yaml@2.8.1: {}
yargs-parser@21.1.1: {}
yargs@17.7.2:
......
import { Injectable, NotFoundException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import * as bcrypt from 'bcrypt';
import { omit } from 'lodash';
import { User } from 'src/user/entities/user.entity';
import { Repository } from 'typeorm';
import { LoginAuthDto } from './dto/login.dto';
import { RegisterAuthDto } from './dto/register.dto';
import { omit } from 'lodash';
const SALT_WORK_FACTOR = 10;
......
import {
CanActivate,
ExecutionContext,
Injectable,
UnauthorizedException,
} from '@nestjs/common';
import { Request } from 'express';
import { appDataSource } from 'src/db/dataSource';
import { User } from 'src/user/entities/user.entity';
@Injectable()
export class AuthGuard implements CanActivate {
async canActivate(context: ExecutionContext): Promise<boolean> {
const userRepo = appDataSource.getRepository(User);
const request: Request = context.switchToHttp().getRequest();
const authHeader = request.headers['authorization'];
if (!authHeader) {
throw new UnauthorizedException('Токена нет');
}
try {
const token = authHeader;
const user = await userRepo.findOneBy({ token });
if (!user) {
throw new UnauthorizedException('Юзера нет');
}
return true;
} catch {
throw new UnauthorizedException('Ошибка авторизации');
}
}
}
import {
CanActivate,
ExecutionContext,
ForbiddenException,
Injectable,
UnauthorizedException,
} from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { Request } from 'express';
import { appDataSource } from 'src/db/dataSource';
import { ROLES_KEY } from 'src/decorators/roles.decorator';
import { User } from 'src/user/entities/user.entity';
@Injectable()
export class RolesGuard implements CanActivate {
constructor(private reflector: Reflector) {}
async canActivate(context: ExecutionContext): Promise<boolean> {
const userRepo = appDataSource.getRepository(User);
const request: Request = context.switchToHttp().getRequest();
const authHeader = request.headers['authorization'];
if (!authHeader) {
throw new UnauthorizedException('Токена нет');
}
const requiredRoles = this.reflector.getAllAndOverride<string[]>(
ROLES_KEY,
[context.getHandler(), context.getClass()],
);
if (!requiredRoles) {
return true; // если роли не указаны — доступ открыт
}
const token = authHeader;
const user = await userRepo.findOneBy({ token });
if (!user) {
throw new UnauthorizedException('Юзера нет');
}
if (!user || !requiredRoles.includes(user?.role || '')) {
throw new ForbiddenException('Permission denied');
}
return true;
}
}
import * as dotenv from 'dotenv';
import * as path from 'path';
import { Category } from 'src/categories/entities/category.entity';
import { Product } from 'src/products/entity/product';
import { User } from 'src/user/entities/user.entity';
import { DataSource, DataSourceOptions } from 'typeorm';
import { SeederOptions } from 'typeorm-extension';
import { categoryFactory } from './factories/category.factory';
import { productFactory } from './factories/product.factory';
import { userFactory } from './factories/user.factory';
import MainSeeder from './seeders/main.seeder';
dotenv.config({ path: path.resolve(process.cwd(), '.env') });
const options: DataSourceOptions & SeederOptions = {
type: 'postgres',
host: process.env.DB_HOST,
port: Number(process.env.DB_PORT),
username: process.env.DB_USER,
password: process.env.DB_PASS,
database: process.env.DB_NAME,
synchronize: true,
logging: true,
entities: [User, Category, Product],
seeds: [MainSeeder],
factories: [userFactory, categoryFactory, productFactory],
};
export const appDataSource = new DataSource(options);
import { faker } from '@faker-js/faker';
import { Category } from 'src/categories/entities/category.entity';
import { setSeederFactory } from 'typeorm-extension';
export const categoryFactory = setSeederFactory(Category, () => {
const category = new Category();
category.title = faker.commerce.department();
category.description = faker.lorem.sentence();
return category;
});
import { faker } from '@faker-js/faker';
import { Product } from 'src/products/entity/product';
import { setSeederFactory } from 'typeorm-extension';
export const productFactory = setSeederFactory(Product, () => {
const product = new Product();
product.title = faker.commerce.productName();
product.price = faker.number.int({ min: 100, max: 2000 });
product.description = faker.lorem.sentence();
product.image = 'testProduct.jpg';
return product;
});
import { faker } from '@faker-js/faker';
import * as bcrypt from 'bcrypt';
import { User } from 'src/user/entities/user.entity';
import { setSeederFactory } from 'typeorm-extension';
const SALT_WORK_FACTOR = 10;
export const userFactory = setSeederFactory(User, async () => {
const user = new User();
user.displayName = faker.person.firstName();
user.userName = faker.internet.username();
const salt = await bcrypt.genSalt(SALT_WORK_FACTOR);
user.password = await bcrypt.hash('password', salt);
return user;
});
import { runSeeders } from 'typeorm-extension';
import { appDataSource } from './dataSource';
async function seed() {
try {
await appDataSource.initialize();
await runSeeders(appDataSource);
} catch (e) {
console.log('Фикстуры не запустились');
console.error(e);
}
}
seed();
import { faker } from '@faker-js/faker';
import { Category } from 'src/categories/entities/category.entity';
import { Product } from 'src/products/entity/product';
import { User } from 'src/user/entities/user.entity';
import { DataSource } from 'typeorm';
import { Seeder, SeederFactoryManager } from 'typeorm-extension';
export default class MainSeeder implements Seeder {
public async run(
_dataSource: DataSource,
factoryManager: SeederFactoryManager,
): Promise<void> {
const userFactory = factoryManager.get(User);
const productFactory = factoryManager.get(Product);
const categoryFactory = factoryManager.get(Category);
await userFactory.saveMany(20);
const categories = await categoryFactory.saveMany(10);
await productFactory.saveMany(10, {
category: faker.helpers.arrayElement(categories),
});
}
}
import { SetMetadata } from '@nestjs/common';
export const ROLES_KEY = 'roles';
export const Roles = (...roles: string[]) => SetMetadata(ROLES_KEY, roles);
......@@ -3,6 +3,7 @@ import { NestFactory } from '@nestjs/core';
import * as express from 'express';
import { join } from 'path';
import { AppModule } from './app.module';
import { appDataSource } from './db/dataSource';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
......@@ -24,6 +25,7 @@ async function bootstrap() {
app.use('/uploads', express.static(join(__dirname, '..', 'uploads')));
await app.listen(process.env.PORT ?? 8000);
await appDataSource.initialize();
console.log('Server started on http://localhost:8000');
}
bootstrap();
......@@ -4,10 +4,14 @@ import {
Get,
Post,
UploadedFile,
UseGuards,
UseInterceptors,
} from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { AuthGuard } from 'src/common/guards/auth.guard';
import { RolesGuard } from 'src/common/guards/roles.guard';
import { storage } from 'src/config';
import { Roles } from 'src/decorators/roles.decorator';
import { CreateProductDto } from './dto/create-product.dto';
import { ProductsService } from './products.service';
......@@ -16,6 +20,8 @@ export class ProductsController {
constructor(private readonly productsService: ProductsService) {}
@Post()
@UseGuards(AuthGuard, RolesGuard)
@Roles('admin')
@UseInterceptors(FileInterceptor('image', storage))
create(
@Body() createProductDto: CreateProductDto,
......@@ -25,6 +31,8 @@ export class ProductsController {
}
@Get()
@UseGuards(AuthGuard, RolesGuard)
@Roles('user', 'admin')
findAll() {
return this.productsService.findAll();
}
......
......@@ -8,6 +8,10 @@ export class CreateUserDto {
@IsString()
displayName: string;
@IsOptional()
@IsString()
role?: 'user' | 'admin';
@IsString()
password: string;
}
......@@ -12,6 +12,9 @@ export class User {
@Column({ nullable: true })
displayName?: string;
@Column({ default: 'user' })
role?: 'user' | 'admin';
@Column()
password: string;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment