Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
A
ajs_22_shop_api
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Нұрасыл Қайратұлы
ajs_22_shop_api
Commits
68ad7168
Commit
68ad7168
authored
Oct 01, 2025
by
Нұрасыл Қайратұлы
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add
parent
1bc644dc
Hide whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
625 additions
and
33 deletions
+625
-33
package.json
server/package.json
+12
-1
pnpm-lock.yaml
server/pnpm-lock.yaml
+390
-31
auth.service.ts
server/src/auth/auth.service.ts
+1
-1
auth.guard.ts
server/src/common/guards/auth.guard.ts
+37
-0
roles.guard.ts
server/src/common/guards/roles.guard.ts
+51
-0
dataSource.ts
server/src/db/dataSource.ts
+29
-0
category.factory.ts
server/src/db/factories/category.factory.ts
+12
-0
product.factory.ts
server/src/db/factories/product.factory.ts
+14
-0
user.factory.ts
server/src/db/factories/user.factory.ts
+18
-0
seed.ts
server/src/db/seed.ts
+15
-0
main.seeder.ts
server/src/db/seeders/main.seeder.ts
+25
-0
roles.decorator.ts
server/src/decorators/roles.decorator.ts
+4
-0
main.ts
server/src/main.ts
+2
-0
products.controller.ts
server/src/products/products.controller.ts
+8
-0
create-user.dto.ts
server/src/user/dto/create-user.dto.ts
+4
-0
user.entity.ts
server/src/user/entities/user.entity.ts
+3
-0
testProduct.jpg
server/uploads/testProduct.jpg
+0
-0
No files found.
server/package.json
View file @
68ad7168
...
...
@@ -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"
,
...
...
server/pnpm-lock.yaml
View file @
68ad7168
...
...
@@ -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
:
...
...
server/src/auth/auth.service.ts
View file @
68ad7168
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
;
...
...
server/src/common/guards/auth.guard.ts
0 → 100644
View file @
68ad7168
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
(
'Ошибка авторизации'
);
}
}
}
server/src/common/guards/roles.guard.ts
0 → 100644
View file @
68ad7168
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
;
}
}
server/src/db/dataSource.ts
0 → 100644
View file @
68ad7168
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
);
server/src/db/factories/category.factory.ts
0 → 100644
View file @
68ad7168
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
;
});
server/src/db/factories/product.factory.ts
0 → 100644
View file @
68ad7168
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
;
});
server/src/db/factories/user.factory.ts
0 → 100644
View file @
68ad7168
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
;
});
server/src/db/seed.ts
0 → 100644
View file @
68ad7168
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
();
server/src/db/seeders/main.seeder.ts
0 → 100644
View file @
68ad7168
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
),
});
}
}
server/src/decorators/roles.decorator.ts
0 → 100644
View file @
68ad7168
import
{
SetMetadata
}
from
'@nestjs/common'
;
export
const
ROLES_KEY
=
'roles'
;
export
const
Roles
=
(...
roles
:
string
[])
=>
SetMetadata
(
ROLES_KEY
,
roles
);
server/src/main.ts
View file @
68ad7168
...
...
@@ -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
();
server/src/products/products.controller.ts
View file @
68ad7168
...
...
@@ -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
();
}
...
...
server/src/user/dto/create-user.dto.ts
View file @
68ad7168
...
...
@@ -8,6 +8,10 @@ export class CreateUserDto {
@
IsString
()
displayName
:
string
;
@
IsOptional
()
@
IsString
()
role
?:
'user'
|
'admin'
;
@
IsString
()
password
:
string
;
}
server/src/user/entities/user.entity.ts
View file @
68ad7168
...
...
@@ -12,6 +12,9 @@ export class User {
@
Column
({
nullable
:
true
})
displayName
?:
string
;
@
Column
({
default
:
'user'
})
role
?:
'user'
|
'admin'
;
@
Column
()
password
:
string
;
...
...
server/uploads/
7e665a0e-d357-436c-8514-def8eb42b542
.jpg
→
server/uploads/
testProduct
.jpg
View file @
68ad7168
File moved
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment