feat: add product variant management functionality

- Implemented CreateProductVariantDto and UpdateProductVariantDto for product variant data transfer.
- Developed ProductVariantsController to handle CRUD operations for product variants.
- Created ProductVariantsService to interact with the database using Prisma.
- Added ProductVariantsModule to encapsulate the product variant feature.
- Included response mapping for consistent API responses.
This commit is contained in:
2025-12-06 17:48:10 +03:30
parent 7cb9d7d037
commit a782d61890
68 changed files with 4155 additions and 3334 deletions
+4
View File
@@ -7,6 +7,8 @@
"@nestjs/swagger": "^11.2.3", "@nestjs/swagger": "^11.2.3",
"@prisma/adapter-mariadb": "^7.1.0", "@prisma/adapter-mariadb": "^7.1.0",
"@prisma/client": "^7.1.0", "@prisma/client": "^7.1.0",
"class-transformer": "^0.5.1",
"class-validator": "^0.14.3",
"dotenv": "^17.2.3", "dotenv": "^17.2.3",
"reflect-metadata": "^0.2.2", "reflect-metadata": "^0.2.2",
"rxjs": "^7.8.1" "rxjs": "^7.8.1"
@@ -36,6 +38,7 @@
"ts-loader": "^9.5.2", "ts-loader": "^9.5.2",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"tsconfig-paths": "^4.2.0", "tsconfig-paths": "^4.2.0",
"tsx": "^4.21.0",
"typescript": "^5.7.3", "typescript": "^5.7.3",
"typescript-eslint": "^8.20.0" "typescript-eslint": "^8.20.0"
}, },
@@ -62,6 +65,7 @@
"scripts": { "scripts": {
"build": "nest build", "build": "nest build",
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
"generate:permissions": "tsx scripts/generate-permissions.ts",
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
"start": "nest start", "start": "nest start",
"start:debug": "nest start --debug --watch", "start:debug": "nest start --debug --watch",
+362 -22
View File
@@ -10,22 +10,28 @@ importers:
dependencies: dependencies:
'@nestjs/common': '@nestjs/common':
specifier: ^11.0.1 specifier: ^11.0.1
version: 11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2) version: 11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@nestjs/core': '@nestjs/core':
specifier: ^11.0.1 specifier: ^11.0.1
version: 11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2) version: 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@nestjs/platform-express': '@nestjs/platform-express':
specifier: ^11.0.1 specifier: ^11.0.1
version: 11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9) version: 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)
'@nestjs/swagger': '@nestjs/swagger':
specifier: ^11.2.3 specifier: ^11.2.3
version: 11.2.3(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)(reflect-metadata@0.2.2) version: 11.2.3(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)
'@prisma/adapter-mariadb': '@prisma/adapter-mariadb':
specifier: ^7.1.0 specifier: ^7.1.0
version: 7.1.0 version: 7.1.0
'@prisma/client': '@prisma/client':
specifier: ^7.1.0 specifier: ^7.1.0
version: 7.1.0(prisma@7.1.0(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(typescript@5.9.3))(typescript@5.9.3) version: 7.1.0(prisma@7.1.0(@types/react@19.2.7)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(typescript@5.9.3))(typescript@5.9.3)
class-transformer:
specifier: ^0.5.1
version: 0.5.1
class-validator:
specifier: ^0.14.3
version: 0.14.3
dotenv: dotenv:
specifier: ^17.2.3 specifier: ^17.2.3
version: 17.2.3 version: 17.2.3
@@ -50,7 +56,7 @@ importers:
version: 11.0.9(chokidar@4.0.3)(typescript@5.9.3) version: 11.0.9(chokidar@4.0.3)(typescript@5.9.3)
'@nestjs/testing': '@nestjs/testing':
specifier: ^11.0.1 specifier: ^11.0.1
version: 11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)(@nestjs/platform-express@11.1.9) version: 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)(@nestjs/platform-express@11.1.9)
'@types/express': '@types/express':
specifier: ^5.0.0 specifier: ^5.0.0
version: 5.0.6 version: 5.0.6
@@ -105,6 +111,9 @@ importers:
tsconfig-paths: tsconfig-paths:
specifier: ^4.2.0 specifier: ^4.2.0
version: 4.2.0 version: 4.2.0
tsx:
specifier: ^4.21.0
version: 4.21.0
typescript: typescript:
specifier: ^5.7.3 specifier: ^5.7.3
version: 5.9.3 version: 5.9.3
@@ -356,6 +365,162 @@ packages:
'@emnapi/wasi-threads@1.1.0': '@emnapi/wasi-threads@1.1.0':
resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==}
'@esbuild/aix-ppc64@0.27.1':
resolution: {integrity: sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
'@esbuild/android-arm64@0.27.1':
resolution: {integrity: sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [android]
'@esbuild/android-arm@0.27.1':
resolution: {integrity: sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==}
engines: {node: '>=18'}
cpu: [arm]
os: [android]
'@esbuild/android-x64@0.27.1':
resolution: {integrity: sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [android]
'@esbuild/darwin-arm64@0.27.1':
resolution: {integrity: sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
'@esbuild/darwin-x64@0.27.1':
resolution: {integrity: sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
'@esbuild/freebsd-arm64@0.27.1':
resolution: {integrity: sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
'@esbuild/freebsd-x64@0.27.1':
resolution: {integrity: sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
'@esbuild/linux-arm64@0.27.1':
resolution: {integrity: sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==}
engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
'@esbuild/linux-arm@0.27.1':
resolution: {integrity: sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==}
engines: {node: '>=18'}
cpu: [arm]
os: [linux]
'@esbuild/linux-ia32@0.27.1':
resolution: {integrity: sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==}
engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
'@esbuild/linux-loong64@0.27.1':
resolution: {integrity: sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==}
engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
'@esbuild/linux-mips64el@0.27.1':
resolution: {integrity: sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==}
engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
'@esbuild/linux-ppc64@0.27.1':
resolution: {integrity: sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [linux]
'@esbuild/linux-riscv64@0.27.1':
resolution: {integrity: sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==}
engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
'@esbuild/linux-s390x@0.27.1':
resolution: {integrity: sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==}
engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
'@esbuild/linux-x64@0.27.1':
resolution: {integrity: sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==}
engines: {node: '>=18'}
cpu: [x64]
os: [linux]
'@esbuild/netbsd-arm64@0.27.1':
resolution: {integrity: sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [netbsd]
'@esbuild/netbsd-x64@0.27.1':
resolution: {integrity: sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==}
engines: {node: '>=18'}
cpu: [x64]
os: [netbsd]
'@esbuild/openbsd-arm64@0.27.1':
resolution: {integrity: sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openbsd]
'@esbuild/openbsd-x64@0.27.1':
resolution: {integrity: sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==}
engines: {node: '>=18'}
cpu: [x64]
os: [openbsd]
'@esbuild/openharmony-arm64@0.27.1':
resolution: {integrity: sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openharmony]
'@esbuild/sunos-x64@0.27.1':
resolution: {integrity: sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==}
engines: {node: '>=18'}
cpu: [x64]
os: [sunos]
'@esbuild/win32-arm64@0.27.1':
resolution: {integrity: sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [win32]
'@esbuild/win32-ia32@0.27.1':
resolution: {integrity: sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==}
engines: {node: '>=18'}
cpu: [ia32]
os: [win32]
'@esbuild/win32-x64@0.27.1':
resolution: {integrity: sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==}
engines: {node: '>=18'}
cpu: [x64]
os: [win32]
'@eslint-community/eslint-utils@4.9.0': '@eslint-community/eslint-utils@4.9.0':
resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -1003,6 +1168,9 @@ packages:
'@types/supertest@6.0.3': '@types/supertest@6.0.3':
resolution: {integrity: sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==} resolution: {integrity: sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==}
'@types/validator@13.15.10':
resolution: {integrity: sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==}
'@types/yargs-parser@21.0.3': '@types/yargs-parser@21.0.3':
resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
@@ -1475,6 +1643,12 @@ packages:
cjs-module-lexer@2.1.1: cjs-module-lexer@2.1.1:
resolution: {integrity: sha512-+CmxIZ/L2vNcEfvNtLdU0ZQ6mbq3FZnwAP2PPTiKP+1QOoKwlKlPgb8UKV0Dds7QVaMnHm+FwSft2VB0s/SLjQ==} resolution: {integrity: sha512-+CmxIZ/L2vNcEfvNtLdU0ZQ6mbq3FZnwAP2PPTiKP+1QOoKwlKlPgb8UKV0Dds7QVaMnHm+FwSft2VB0s/SLjQ==}
class-transformer@0.5.1:
resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==}
class-validator@0.14.3:
resolution: {integrity: sha512-rXXekcjofVN1LTOSw+u4u9WXVEUvNBVjORW154q/IdmYWy1nMbOU9aNtZB0t8m+FJQ9q91jlr2f9CwwUFdFMRA==}
cli-cursor@3.1.0: cli-cursor@3.1.0:
resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
engines: {node: '>=8'} engines: {node: '>=8'}
@@ -1721,6 +1895,11 @@ packages:
resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
esbuild@0.27.1:
resolution: {integrity: sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==}
engines: {node: '>=18'}
hasBin: true
escalade@3.2.0: escalade@3.2.0:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'} engines: {node: '>=6'}
@@ -1981,6 +2160,9 @@ packages:
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
engines: {node: '>=10'} engines: {node: '>=10'}
get-tsconfig@4.13.0:
resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==}
giget@2.0.0: giget@2.0.0:
resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==}
hasBin: true hasBin: true
@@ -2367,6 +2549,9 @@ packages:
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
libphonenumber-js@1.12.31:
resolution: {integrity: sha512-Z3IhgVgrqO1S5xPYM3K5XwbkDasU67/Vys4heW+lfSBALcUZjeIIzI8zCLifY+OCzSq+fpDdywMDa7z+4srJPQ==}
lilconfig@2.1.0: lilconfig@2.1.0:
resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
engines: {node: '>=10'} engines: {node: '>=10'}
@@ -2833,6 +3018,9 @@ packages:
resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
engines: {node: '>=8'} engines: {node: '>=8'}
resolve-pkg-maps@1.0.0:
resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
restore-cursor@3.1.0: restore-cursor@3.1.0:
resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
engines: {node: '>=8'} engines: {node: '>=8'}
@@ -3156,6 +3344,11 @@ packages:
tslib@2.8.1: tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
tsx@4.21.0:
resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==}
engines: {node: '>=18.0.0'}
hasBin: true
type-check@0.4.0: type-check@0.4.0:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
@@ -3252,6 +3445,10 @@ packages:
typescript: typescript:
optional: true optional: true
validator@13.15.23:
resolution: {integrity: sha512-4yoz1kEWqUjzi5zsPbAS/903QXSYp0UOtHsPpp7p9rHAw/W+dkInskAE386Fat3oKRROwO98d9ZB0G4cObgUyw==}
engines: {node: '>= 0.10'}
vary@1.1.2: vary@1.1.2:
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
engines: {node: '>= 0.8'} engines: {node: '>= 0.8'}
@@ -3644,6 +3841,84 @@ snapshots:
tslib: 2.8.1 tslib: 2.8.1
optional: true optional: true
'@esbuild/aix-ppc64@0.27.1':
optional: true
'@esbuild/android-arm64@0.27.1':
optional: true
'@esbuild/android-arm@0.27.1':
optional: true
'@esbuild/android-x64@0.27.1':
optional: true
'@esbuild/darwin-arm64@0.27.1':
optional: true
'@esbuild/darwin-x64@0.27.1':
optional: true
'@esbuild/freebsd-arm64@0.27.1':
optional: true
'@esbuild/freebsd-x64@0.27.1':
optional: true
'@esbuild/linux-arm64@0.27.1':
optional: true
'@esbuild/linux-arm@0.27.1':
optional: true
'@esbuild/linux-ia32@0.27.1':
optional: true
'@esbuild/linux-loong64@0.27.1':
optional: true
'@esbuild/linux-mips64el@0.27.1':
optional: true
'@esbuild/linux-ppc64@0.27.1':
optional: true
'@esbuild/linux-riscv64@0.27.1':
optional: true
'@esbuild/linux-s390x@0.27.1':
optional: true
'@esbuild/linux-x64@0.27.1':
optional: true
'@esbuild/netbsd-arm64@0.27.1':
optional: true
'@esbuild/netbsd-x64@0.27.1':
optional: true
'@esbuild/openbsd-arm64@0.27.1':
optional: true
'@esbuild/openbsd-x64@0.27.1':
optional: true
'@esbuild/openharmony-arm64@0.27.1':
optional: true
'@esbuild/sunos-x64@0.27.1':
optional: true
'@esbuild/win32-arm64@0.27.1':
optional: true
'@esbuild/win32-ia32@0.27.1':
optional: true
'@esbuild/win32-x64@0.27.1':
optional: true
'@eslint-community/eslint-utils@4.9.0(eslint@9.39.1(jiti@2.6.1))': '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1(jiti@2.6.1))':
dependencies: dependencies:
eslint: 9.39.1(jiti@2.6.1) eslint: 9.39.1(jiti@2.6.1)
@@ -4120,7 +4395,7 @@ snapshots:
- uglify-js - uglify-js
- webpack-cli - webpack-cli
'@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2)': '@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)':
dependencies: dependencies:
file-type: 21.1.0 file-type: 21.1.0
iterare: 1.2.1 iterare: 1.2.1
@@ -4129,12 +4404,15 @@ snapshots:
rxjs: 7.8.2 rxjs: 7.8.2
tslib: 2.8.1 tslib: 2.8.1
uid: 2.0.2 uid: 2.0.2
optionalDependencies:
class-transformer: 0.5.1
class-validator: 0.14.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@nestjs/core@11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)': '@nestjs/core@11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)':
dependencies: dependencies:
'@nestjs/common': 11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/common': 11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@nuxt/opencollective': 0.4.1 '@nuxt/opencollective': 0.4.1
fast-safe-stringify: 2.1.1 fast-safe-stringify: 2.1.1
iterare: 1.2.1 iterare: 1.2.1
@@ -4144,17 +4422,20 @@ snapshots:
tslib: 2.8.1 tslib: 2.8.1
uid: 2.0.2 uid: 2.0.2
optionalDependencies: optionalDependencies:
'@nestjs/platform-express': 11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9) '@nestjs/platform-express': 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)
'@nestjs/mapped-types@2.1.0(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2)': '@nestjs/mapped-types@2.1.0(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)':
dependencies: dependencies:
'@nestjs/common': 11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/common': 11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
reflect-metadata: 0.2.2 reflect-metadata: 0.2.2
optionalDependencies:
class-transformer: 0.5.1
class-validator: 0.14.3
'@nestjs/platform-express@11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)': '@nestjs/platform-express@11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)':
dependencies: dependencies:
'@nestjs/common': 11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/common': 11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@nestjs/core': 11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/core': 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)
cors: 2.8.5 cors: 2.8.5
express: 5.1.0 express: 5.1.0
multer: 2.0.2 multer: 2.0.2
@@ -4174,25 +4455,28 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- chokidar - chokidar
'@nestjs/swagger@11.2.3(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)(reflect-metadata@0.2.2)': '@nestjs/swagger@11.2.3(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)':
dependencies: dependencies:
'@microsoft/tsdoc': 0.16.0 '@microsoft/tsdoc': 0.16.0
'@nestjs/common': 11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/common': 11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@nestjs/core': 11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/core': 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@nestjs/mapped-types': 2.1.0(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2) '@nestjs/mapped-types': 2.1.0(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)
js-yaml: 4.1.1 js-yaml: 4.1.1
lodash: 4.17.21 lodash: 4.17.21
path-to-regexp: 8.3.0 path-to-regexp: 8.3.0
reflect-metadata: 0.2.2 reflect-metadata: 0.2.2
swagger-ui-dist: 5.30.2 swagger-ui-dist: 5.30.2
optionalDependencies:
class-transformer: 0.5.1
class-validator: 0.14.3
'@nestjs/testing@11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)(@nestjs/platform-express@11.1.9)': '@nestjs/testing@11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)(@nestjs/platform-express@11.1.9)':
dependencies: dependencies:
'@nestjs/common': 11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/common': 11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)
'@nestjs/core': 11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/core': 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.9)(reflect-metadata@0.2.2)(rxjs@7.8.2)
tslib: 2.8.1 tslib: 2.8.1
optionalDependencies: optionalDependencies:
'@nestjs/platform-express': 11.1.9(@nestjs/common@11.1.9(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9) '@nestjs/platform-express': 11.1.9(@nestjs/common@11.1.9(class-transformer@0.5.1)(class-validator@0.14.3)(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.9)
'@noble/hashes@1.8.0': {} '@noble/hashes@1.8.0': {}
@@ -4451,6 +4735,8 @@ snapshots:
'@types/methods': 1.1.4 '@types/methods': 1.1.4
'@types/superagent': 8.1.9 '@types/superagent': 8.1.9
'@types/validator@13.15.10': {}
'@types/yargs-parser@21.0.3': {} '@types/yargs-parser@21.0.3': {}
'@types/yargs@17.0.35': '@types/yargs@17.0.35':
@@ -4968,6 +5254,14 @@ snapshots:
cjs-module-lexer@2.1.1: {} cjs-module-lexer@2.1.1: {}
class-transformer@0.5.1: {}
class-validator@0.14.3:
dependencies:
'@types/validator': 13.15.10
libphonenumber-js: 1.12.31
validator: 13.15.23
cli-cursor@3.1.0: cli-cursor@3.1.0:
dependencies: dependencies:
restore-cursor: 3.1.0 restore-cursor: 3.1.0
@@ -5159,6 +5453,35 @@ snapshots:
has-tostringtag: 1.0.2 has-tostringtag: 1.0.2
hasown: 2.0.2 hasown: 2.0.2
esbuild@0.27.1:
optionalDependencies:
'@esbuild/aix-ppc64': 0.27.1
'@esbuild/android-arm': 0.27.1
'@esbuild/android-arm64': 0.27.1
'@esbuild/android-x64': 0.27.1
'@esbuild/darwin-arm64': 0.27.1
'@esbuild/darwin-x64': 0.27.1
'@esbuild/freebsd-arm64': 0.27.1
'@esbuild/freebsd-x64': 0.27.1
'@esbuild/linux-arm': 0.27.1
'@esbuild/linux-arm64': 0.27.1
'@esbuild/linux-ia32': 0.27.1
'@esbuild/linux-loong64': 0.27.1
'@esbuild/linux-mips64el': 0.27.1
'@esbuild/linux-ppc64': 0.27.1
'@esbuild/linux-riscv64': 0.27.1
'@esbuild/linux-s390x': 0.27.1
'@esbuild/linux-x64': 0.27.1
'@esbuild/netbsd-arm64': 0.27.1
'@esbuild/netbsd-x64': 0.27.1
'@esbuild/openbsd-arm64': 0.27.1
'@esbuild/openbsd-x64': 0.27.1
'@esbuild/openharmony-arm64': 0.27.1
'@esbuild/sunos-x64': 0.27.1
'@esbuild/win32-arm64': 0.27.1
'@esbuild/win32-ia32': 0.27.1
'@esbuild/win32-x64': 0.27.1
escalade@3.2.0: {} escalade@3.2.0: {}
escape-html@1.0.3: {} escape-html@1.0.3: {}
@@ -5477,6 +5800,10 @@ snapshots:
get-stream@6.0.1: {} get-stream@6.0.1: {}
get-tsconfig@4.13.0:
dependencies:
resolve-pkg-maps: 1.0.0
giget@2.0.0: giget@2.0.0:
dependencies: dependencies:
citty: 0.1.6 citty: 0.1.6
@@ -6029,6 +6356,8 @@ snapshots:
prelude-ls: 1.2.1 prelude-ls: 1.2.1
type-check: 0.4.0 type-check: 0.4.0
libphonenumber-js@1.12.31: {}
lilconfig@2.1.0: {} lilconfig@2.1.0: {}
lines-and-columns@1.2.4: {} lines-and-columns@1.2.4: {}
@@ -6444,6 +6773,8 @@ snapshots:
resolve-from@5.0.0: {} resolve-from@5.0.0: {}
resolve-pkg-maps@1.0.0: {}
restore-cursor@3.1.0: restore-cursor@3.1.0:
dependencies: dependencies:
onetime: 5.1.2 onetime: 5.1.2
@@ -6787,6 +7118,13 @@ snapshots:
tslib@2.8.1: {} tslib@2.8.1: {}
tsx@4.21.0:
dependencies:
esbuild: 0.27.1
get-tsconfig: 4.13.0
optionalDependencies:
fsevents: 2.3.3
type-check@0.4.0: type-check@0.4.0:
dependencies: dependencies:
prelude-ls: 1.2.1 prelude-ls: 1.2.1
@@ -6888,6 +7226,8 @@ snapshots:
optionalDependencies: optionalDependencies:
typescript: 5.9.3 typescript: 5.9.3
validator@13.15.23: {}
vary@1.1.2: {} vary@1.1.2: {}
walker@1.0.8: walker@1.0.8:
-13
View File
@@ -1,13 +0,0 @@
// This file was generated by Prisma and assumes you have installed the following:
// npm install --save-dev prisma dotenv
import "dotenv/config";
import { defineConfig, env } from "prisma/config";
export default defineConfig({
schema: "prisma/schema.prisma",
migrations: {
path: "prisma/migrations",
},
datasource: {
url: env("DATABASE_URL"),
},
});
+7 -6
View File
@@ -1,14 +1,15 @@
// This file was generated by Prisma and assumes you have installed the following: // This file was generated by Prisma and assumes you have installed the following:
// npm install --save-dev prisma dotenv // npm install --save-dev prisma dotenv
import "dotenv/config"; import 'dotenv/config'
import { defineConfig, env } from "prisma/config"; import { defineConfig, env } from 'prisma/config'
export default defineConfig({ export default defineConfig({
schema: "prisma/schema.prisma", schema: 'prisma/schema.prisma',
migrations: { migrations: {
path: "prisma/migrations", path: 'prisma/migrations',
seed: 'tsx prisma/seed.ts',
}, },
datasource: { datasource: {
url: env("DATABASE_URL"), url: env('DATABASE_URL'),
}, },
}); })
@@ -0,0 +1,83 @@
/*
Warnings:
- You are about to drop the column `alertQuantity` on the `Products` table. All the data in the column will be lost.
- You are about to drop the column `attachmentId` on the `Products` table. All the data in the column will be lost.
- You are about to drop the column `discount` on the `Products` table. All the data in the column will be lost.
- You are about to drop the column `imageUrl` on the `Products` table. All the data in the column will be lost.
- You are about to drop the column `isActive` on the `Products` table. All the data in the column will be lost.
- You are about to drop the column `isFeatured` on the `Products` table. All the data in the column will be lost.
- You are about to drop the column `productInfoId` on the `Products` table. All the data in the column will be lost.
- You are about to drop the column `quantity` on the `Products` table. All the data in the column will be lost.
- You are about to drop the column `unit` on the `Products` table. All the data in the column will be lost.
- You are about to drop the `Product_info` table. If the table is not empty, all the data it contains will be lost.
- Made the column `createdAt` on table `Products` required. This step will fail if there are existing NULL values in that column.
- Made the column `updatedAt` on table `Products` required. This step will fail if there are existing NULL values in that column.
*/
-- DropForeignKey
ALTER TABLE `Product_info` DROP FOREIGN KEY `Product_info_brandId_fkey`;
-- DropForeignKey
ALTER TABLE `Product_info` DROP FOREIGN KEY `Product_info_categoryId_fkey`;
-- DropForeignKey
ALTER TABLE `Product_info` DROP FOREIGN KEY `Product_info_supplierId_fkey`;
-- DropForeignKey
ALTER TABLE `Products` DROP FOREIGN KEY `Products_productInfoId_fkey`;
-- DropIndex
DROP INDEX `Products_productInfoId_fkey` ON `Products`;
-- AlterTable
ALTER TABLE `Products` DROP COLUMN `alertQuantity`,
DROP COLUMN `attachmentId`,
DROP COLUMN `discount`,
DROP COLUMN `imageUrl`,
DROP COLUMN `isActive`,
DROP COLUMN `isFeatured`,
DROP COLUMN `productInfoId`,
DROP COLUMN `quantity`,
DROP COLUMN `unit`,
ADD COLUMN `brandId` INTEGER NULL,
ADD COLUMN `categoryId` INTEGER NULL,
ADD COLUMN `metaData` JSON NULL,
ADD COLUMN `productType` VARCHAR(50) NULL DEFAULT 'simple',
MODIFY `createdAt` TIMESTAMP(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),
MODIFY `updatedAt` TIMESTAMP(0) NOT NULL;
-- DropTable
DROP TABLE `Product_info`;
-- CreateTable
CREATE TABLE `Product_Variants` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`basePrice` DECIMAL(10, 2) NOT NULL,
`salePrice` DECIMAL(10, 2) NOT NULL,
`description` TEXT NULL,
`barcode` VARCHAR(100) NULL,
`imageUrl` VARCHAR(255) NULL,
`unit` VARCHAR(10) NULL,
`quantity` DECIMAL(10, 2) NULL DEFAULT 0.00,
`alertQuantity` DECIMAL(10, 2) NULL DEFAULT 5.00,
`isActive` BOOLEAN NOT NULL DEFAULT true,
`isFeatured` BOOLEAN NOT NULL DEFAULT false,
`createdAt` TIMESTAMP(0) NULL,
`updatedAt` TIMESTAMP(0) NULL,
`deletedAt` TIMESTAMP(0) NULL,
`productId` INTEGER NOT NULL,
UNIQUE INDEX `products_barcode_unique`(`barcode`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- AddForeignKey
ALTER TABLE `Product_Variants` ADD CONSTRAINT `Product_Variants_productId_fkey` FOREIGN KEY (`productId`) REFERENCES `Products`(`id`) ON DELETE RESTRICT ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE `Products` ADD CONSTRAINT `Products_brandId_fkey` FOREIGN KEY (`brandId`) REFERENCES `Product_brands`(`id`) ON DELETE SET NULL ON UPDATE NO ACTION;
-- AddForeignKey
ALTER TABLE `Products` ADD CONSTRAINT `Products_categoryId_fkey` FOREIGN KEY (`categoryId`) REFERENCES `Product_categories`(`id`) ON DELETE SET NULL ON UPDATE NO ACTION;
@@ -0,0 +1,10 @@
/*
Warnings:
- You are about to drop the column `metaData` on the `Products` table. All the data in the column will be lost.
- You are about to drop the column `productType` on the `Products` table. All the data in the column will be lost.
*/
-- AlterTable
ALTER TABLE `Products` DROP COLUMN `metaData`,
DROP COLUMN `productType`;
+19 -25
View File
@@ -35,26 +35,25 @@ model Role {
@@map("Roles") @@map("Roles")
} }
model Product { model ProductVariant {
id Int @id @default(autoincrement()) id Int @id @default(autoincrement())
name String @db.VarChar(255) name String @db.VarChar(255)
basePrice Decimal @db.Decimal(10, 2)
salePrice Decimal @db.Decimal(10, 2)
description String? @db.Text description String? @db.Text
sku String? @unique(map: "products_sku_unique") @db.VarChar(100)
barcode String? @unique(map: "products_barcode_unique") @db.VarChar(100) barcode String? @unique(map: "products_barcode_unique") @db.VarChar(100)
imageUrl String? @db.VarChar(255) imageUrl String? @db.VarChar(255)
attachmentId BigInt? @db.UnsignedBigInt unit String? @db.VarChar(10)
unit String @db.VarChar(10) quantity Decimal? @default(0.00) @db.Decimal(10, 2)
discount Decimal @default(0.00) @db.Decimal(10, 2) alertQuantity Decimal? @default(5.00) @db.Decimal(10, 2)
quantity Decimal @default(0.00) @db.Decimal(10, 2)
alertQuantity Decimal @default(5.00) @db.Decimal(10, 2)
isActive Boolean @default(true) isActive Boolean @default(true)
isFeatured Boolean @default(false) isFeatured Boolean @default(false)
createdAt DateTime? @db.Timestamp(0) createdAt DateTime? @db.Timestamp(0)
updatedAt DateTime? @db.Timestamp(0) updatedAt DateTime? @db.Timestamp(0)
deletedAt DateTime? @db.Timestamp(0) deletedAt DateTime? @db.Timestamp(0)
productInfo ProductInfo @relation("Product_ProductInfo", fields: [productInfoId], references: [id], onUpdate: NoAction) product Product @relation("Product_Variant", fields: [productId], references: [id], onUpdate: NoAction)
productInfoId Int productId Int
// is_stock_managed Boolean @default(true) // is_stock_managed Boolean @default(true)
// created_by Int? // created_by Int?
// collection_product collection_product[] // collection_product collection_product[]
@@ -64,32 +63,29 @@ model Product {
// purchase_items purchase_items[] // purchase_items purchase_items[]
// sale_items sale_items[] // sale_items sale_items[]
// @@index([attachment_id], map: "products_attachment_id_foreign") @@map("Product_Variants")
@@map("Products")
} }
model ProductInfo { model Product {
id Int @id @default(autoincrement()) id Int @id @default(autoincrement())
name String @db.VarChar(255) name String @db.VarChar(255)
barcode String? @unique(map: "products_barcode_unique") @db.VarChar(100)
sku String? @unique(map: "products_sku_unique") @db.VarChar(100)
description String? @db.Text description String? @db.Text
productType String? @default("simple") @db.VarChar(50) // productType String? @default("simple") @db.VarChar(50)
metaData Json?
createdAt DateTime @default(now()) @db.Timestamp(0) createdAt DateTime @default(now()) @db.Timestamp(0)
updatedAt DateTime @updatedAt @db.Timestamp(0) updatedAt DateTime @updatedAt @db.Timestamp(0)
deletedAt DateTime? @db.Timestamp(0) deletedAt DateTime? @db.Timestamp(0)
products Product[] @relation("Product_ProductInfo") variants ProductVariant[] @relation("Product_Variant")
brand ProductBrand? @relation("ProductInfo_Brand", fields: [brandId], references: [id], onUpdate: NoAction) brand ProductBrand? @relation("Product_Brand", fields: [brandId], references: [id], onUpdate: NoAction)
brandId Int? brandId Int?
category ProductCategory? @relation("ProductInfo_Category", fields: [categoryId], references: [id], onUpdate: NoAction) category ProductCategory? @relation("Product_Category", fields: [categoryId], references: [id], onUpdate: NoAction)
categoryId Int? categoryId Int?
supplier Supplier @relation("ProductInfo_Supplier", fields: [supplierId], references: [id], onUpdate: NoAction) @@map("Products")
supplierId Int
@@map("Product_info")
} }
model ProductBrand { model ProductBrand {
@@ -101,7 +97,7 @@ model ProductBrand {
updatedAt DateTime @updatedAt @db.Timestamp(0) updatedAt DateTime @updatedAt @db.Timestamp(0)
deletedAt DateTime? @db.Timestamp(0) deletedAt DateTime? @db.Timestamp(0)
productInfo ProductInfo[] @relation("ProductInfo_Brand") products Product[] @relation("Product_Brand")
@@map("Product_brands") @@map("Product_brands")
} }
@@ -115,7 +111,7 @@ model ProductCategory {
updatedAt DateTime @updatedAt @db.Timestamp(0) updatedAt DateTime @updatedAt @db.Timestamp(0)
deletedAt DateTime? @db.Timestamp(0) deletedAt DateTime? @db.Timestamp(0)
productInfo ProductInfo[] @relation("ProductInfo_Category") products Product[] @relation("Product_Category")
@@map("Product_categories") @@map("Product_categories")
} }
@@ -135,8 +131,6 @@ model Supplier {
updatedAt DateTime? @db.Timestamp(0) updatedAt DateTime? @db.Timestamp(0)
deletedAt DateTime? @db.Timestamp(0) deletedAt DateTime? @db.Timestamp(0)
productInfo ProductInfo[] @relation("ProductInfo_Supplier")
@@map("Suppliers") @@map("Suppliers")
} }
+22
View File
@@ -0,0 +1,22 @@
import { prisma } from '../src/lib/prisma'
async function main() {
console.log('first')
await prisma.role.upsert({
where: { id: 0, name: 'Admin' },
update: {},
create: {
name: 'Admin',
},
})
}
main()
.then(async () => {
await prisma.$disconnect()
})
.catch(async e => {
console.error(e)
await prisma.$disconnect()
process.exit(1)
})
+66
View File
@@ -0,0 +1,66 @@
#!/usr/bin/env ts-node
import * as fs from 'fs'
import * as path from 'path'
import { prisma } from '../src/lib/prisma'
function findModules(dir: string): string[] {
const results: string[] = []
const entries = fs.readdirSync(dir, { withFileTypes: true })
for (const e of entries) {
const full = path.join(dir, e.name)
if (e.isDirectory()) {
results.push(...findModules(full))
} else if (e.isFile() && e.name.endsWith('.module.ts')) {
results.push(full)
}
}
return results
}
function moduleNameFromFile(filePath: string) {
const name = path.basename(filePath).replace('.module.ts', '')
return name.replace(/-module$|\.module$/i, '')
}
function makePermissionsFor(moduleName: string) {
const base = moduleName.replace(/\W+/g, '_').toLowerCase()
return [`${base}:create`, `${base}:read`, `${base}:update`, `${base}:delete`]
}
async function main() {
const srcDir = path.resolve(__dirname, '..', 'src')
const moduleFiles = findModules(srcDir)
const modules = moduleFiles.map(moduleNameFromFile)
const permsMap: Record<string, boolean> = {}
for (const m of modules) {
for (const p of makePermissionsFor(m)) permsMap[p] = false
}
// Upsert roles: ensure admin has full permissions, others get entries added
const roles = await prisma.role.findMany()
for (const r of roles) {
const current: Record<string, any> = (r.permissions as any) || {}
const merged = { ...permsMap, ...current }
// If role name is admin (case-insensitive), set all permissions to true
if (r.name && r.name.toLowerCase() === 'admin') {
for (const key of Object.keys(merged)) merged[key] = true
} else {
// keep existing truthy values, otherwise false
for (const key of Object.keys(merged)) merged[key] = merged[key] || false
}
await prisma.role.update({ where: { id: r.id }, data: { permissions: merged } })
console.log(
`Updated role ${r.name} (id=${r.id}) with ${Object.keys(merged).length} permissions`,
)
}
await prisma.$disconnect()
}
main().catch(e => {
console.error(e)
process.exit(1)
})
+2 -2
View File
@@ -6,7 +6,7 @@ import { InventoriesModule } from './inventories/inventories.module'
import { PrismaModule } from './prisma/prisma.module' import { PrismaModule } from './prisma/prisma.module'
import { ProductBrandsModule } from './product-brands/product-brands.module' import { ProductBrandsModule } from './product-brands/product-brands.module'
import { ProductCategoriesModule } from './product-categories/product-categories.module' import { ProductCategoriesModule } from './product-categories/product-categories.module'
import { ProductInfoModule } from './product-info/product-info.module' import { ProductVariantsModule } from './product-variants/product-variants.module'
import { ProductsModule } from './products/products.module' import { ProductsModule } from './products/products.module'
import { RolesModule } from './roles/roles.module' import { RolesModule } from './roles/roles.module'
import { StoresModule } from './stores/stores.module' import { StoresModule } from './stores/stores.module'
@@ -19,7 +19,7 @@ import { UsersModule } from './users/users.module'
UsersModule, UsersModule,
RolesModule, RolesModule,
ProductsModule, ProductsModule,
ProductInfoModule, ProductVariantsModule,
ProductBrandsModule, ProductBrandsModule,
ProductCategoriesModule, ProductCategoriesModule,
SuppliersModule, SuppliersModule,
@@ -0,0 +1,145 @@
import {
ArgumentsHost,
Catch,
ExceptionFilter,
HttpException,
HttpStatus,
} from '@nestjs/common'
import type { Request, Response } from 'express'
import { Prisma } from '../../generated/prisma/client'
@Catch()
export class PrismaExceptionFilter implements ExceptionFilter {
catch(exception: any, host: ArgumentsHost) {
const ctx = host.switchToHttp()
const response = ctx.getResponse<Response>()
const request = ctx.getRequest<Request>()
const now = new Date().toISOString()
// Helper: normalize various payload shapes into an array of text errors
const extractErrors = (payload: any): string[] => {
if (!payload) return []
// If payload is already an array of strings
if (Array.isArray(payload) && payload.every(p => typeof p === 'string')) {
return payload
}
// If payload itself is a string
if (typeof payload === 'string') return [payload]
// Common Nest ValidationPipe shape: { message: [...], error: 'Bad Request' }
if (typeof payload === 'object') {
if (Array.isArray(payload.message)) {
return payload.message.map(m => String(m))
}
// Zod/other validation libraries sometimes expose issues array
if (Array.isArray(payload.errors)) return payload.errors.map(e => String(e))
// If payload has a nested 'issues' array (zod)
if (Array.isArray(payload.issues))
return payload.issues.map(i => i.message ?? String(i))
// If payload has a 'message' string
if (typeof payload.message === 'string') return [payload.message]
}
// Fallback to stringifying the payload
return [String(payload)]
}
// If Nest already threw an HttpException, normalize and return
if (exception instanceof HttpException) {
const status = exception.getStatus()
const payload = exception.getResponse()
if (status === HttpStatus.BAD_REQUEST) {
const errors = extractErrors(payload)
return response.status(status).json({
statusCode: status,
timestamp: now,
path: request.url,
errors,
})
}
return response.status(status).json({
statusCode: status,
timestamp: now,
path: request.url,
...(typeof payload === 'object' ? payload : { message: payload }),
})
}
// Default values
let status = HttpStatus.INTERNAL_SERVER_ERROR
let message: any = 'Internal server error'
let errors: string[] | undefined = undefined
// Prisma errors often expose a `code` property (e.g., P2002)
const code = exception?.code
if (code) {
switch (code) {
case 'P2002':
// Unique constraint failed
status = HttpStatus.CONFLICT
message = 'Unique constraint failed'
break
case 'P2025':
// Record not found for update/delete
status = HttpStatus.NOT_FOUND
message = exception?.meta?.cause ?? 'Record not found'
break
default:
// Map other Prisma known errors to 400 Bad Request
status = HttpStatus.BAD_REQUEST
// try to extract readable errors (may contain newlines)
errors = (exception.message || String(exception))
.toString()
.split('\n')
.map(s => s.trim())
.filter(Boolean)
}
} else if (exception instanceof Prisma.PrismaClientValidationError) {
status = HttpStatus.BAD_REQUEST
errors = exception.message
.toString()
.split('\n')
.map(s => s.trim())
.filter(Boolean)
} else if (exception?.name === 'ValidationError' || exception?.name === 'ZodError') {
// Common validation libraries
status = HttpStatus.BAD_REQUEST
// ZodError exposes issues array
if (Array.isArray(exception.issues)) {
errors = exception.issues.map((i: any) => i.message ?? String(i))
} else {
errors = exception.message
? exception.message
.toString()
.split('\n')
.map((s: string) => s.trim())
.filter(Boolean)
: [String(exception)]
}
} else if (exception instanceof Error) {
// Generic JS error
status = HttpStatus.INTERNAL_SERVER_ERROR
message = exception.message
}
const body: any = {
statusCode: status,
timestamp: now,
path: request.url,
}
if (status === HttpStatus.BAD_REQUEST) {
body.errors = errors ?? [String(message)]
} else {
body.message = message
}
response.status(status).json(body)
}
}
@@ -4,6 +4,7 @@ import {
Injectable, Injectable,
NestInterceptor, NestInterceptor,
} from '@nestjs/common' } from '@nestjs/common'
import { Response } from 'express'
import { Observable } from 'rxjs' import { Observable } from 'rxjs'
import { map } from 'rxjs/operators' import { map } from 'rxjs/operators'
@@ -28,13 +29,96 @@ export class ResponseMappingInterceptor implements NestInterceptor {
return next.handle().pipe( return next.handle().pipe(
map(data => { map(data => {
const statusCode = response?.statusCode ?? 200 const statusCode: number = (response as Response)?.statusCode ?? 200
// Normalize list/paginated responses into { data, meta } if (data && typeof data === 'object') {
if (Array.isArray((data as any).errors) && statusCode >= 400) {
return {
statusCode,
timestamp: new Date().toISOString(),
path: request?.url ?? '',
errors: (data as any).errors,
}
}
if ((data as any).error && statusCode >= 400) {
const e = (data as any).error
const errors =
typeof e === 'string' ? [e] : Array.isArray(e) ? e : [String(e)]
return {
statusCode,
timestamp: new Date().toISOString(),
path: request?.url ?? '',
errors,
}
}
}
// Normalize responses produced by ResponseMapper wrappers when present.
let payload = data let payload = data
let meta: any = undefined let meta: any = undefined
let computedStatus = statusCode
// Case: plain array -> treat as list if (data && typeof data === 'object' && (data as any).__mapped) {
const wrapped = data as any
switch (wrapped.__mapped) {
case 'create':
computedStatus = 201
payload = wrapped.data
break
case 'update':
computedStatus = 200
payload = wrapped.data
break
case 'single':
computedStatus = 200
payload = wrapped.data
break
case 'list':
payload = Array.isArray(wrapped.items) ? wrapped.items : []
meta = {
totalRecords: payload.length,
totalPages: 1,
page: 1,
perPage: payload.length,
}
break
case 'paginate': {
const items = Array.isArray(wrapped.items) ? wrapped.items : []
const total =
typeof wrapped.total === 'number' ? wrapped.total : items.length
const perPage = wrapped.perPage ?? wrapped.limit ?? items.length
const page = wrapped.page ?? 1
payload = items
meta = {
totalRecords: total,
totalPages: Math.max(1, Math.ceil(total / perPage)),
page,
perPage,
}
break
}
case 'sequelize': {
const items = Array.isArray(wrapped.rows) ? wrapped.rows : []
const total =
typeof wrapped.count === 'number' ? wrapped.count : items.length
const perPage = wrapped.perPage ?? wrapped.limit ?? items.length
const page = wrapped.page ?? 1
payload = items
meta = {
totalRecords: total,
totalPages: Math.max(1, Math.ceil(total / perPage)),
page,
perPage,
}
break
}
default:
// Unknown wrapper — pass through payload as-is
payload = wrapped
}
} else {
// Fallbacks for common shapes (arrays, items/rows/data shapes)
if (Array.isArray(data)) { if (Array.isArray(data)) {
payload = data payload = data
meta = { meta = {
@@ -45,7 +129,6 @@ export class ResponseMappingInterceptor implements NestInterceptor {
} }
} else if (data && typeof data === 'object') { } else if (data && typeof data === 'object') {
// Common pagination shapes // Common pagination shapes
// 1) { items: [...], total: N, page, perPage }
if ( if (
Array.isArray((data as any).items) && Array.isArray((data as any).items) &&
typeof (data as any).total === 'number' typeof (data as any).total === 'number'
@@ -61,7 +144,6 @@ export class ResponseMappingInterceptor implements NestInterceptor {
page, page,
perPage, perPage,
} }
// 2) Sequelize-like: { rows: [...], count: N }
} else if ( } else if (
Array.isArray((data as any).rows) && Array.isArray((data as any).rows) &&
typeof (data as any).count === 'number' typeof (data as any).count === 'number'
@@ -77,7 +159,6 @@ export class ResponseMappingInterceptor implements NestInterceptor {
page, page,
perPage, perPage,
} }
// 3) { data: [...], total, page, perPage }
} else if ( } else if (
Array.isArray((data as any).data) && Array.isArray((data as any).data) &&
typeof (data as any).total === 'number' typeof (data as any).total === 'number'
@@ -93,11 +174,12 @@ export class ResponseMappingInterceptor implements NestInterceptor {
page, page,
perPage, perPage,
} }
// 4) fallback: object contains items array and optional total
} else if (Array.isArray((data as any).items)) { } else if (Array.isArray((data as any).items)) {
const items = (data as any).items const items = (data as any).items
const total = const total =
typeof (data as any).total === 'number' ? (data as any).total : items.length typeof (data as any).total === 'number'
? (data as any).total
: items.length
const perPage = (data as any).perPage ?? (data as any).limit ?? items.length const perPage = (data as any).perPage ?? (data as any).limit ?? items.length
const page = (data as any).page ?? 1 const page = (data as any).page ?? 1
payload = items payload = items
@@ -109,17 +191,15 @@ export class ResponseMappingInterceptor implements NestInterceptor {
} }
} }
} }
const envelope: any = {
statusCode,
timestamp: new Date().toISOString(),
path: request?.url ?? '',
data: payload,
} }
if (meta) envelope.meta = meta if (meta)
return {
data: data.items,
meta,
}
return envelope return data.data || data.items
}), }),
) )
} }
+39
View File
@@ -0,0 +1,39 @@
/**
* Response mapper helpers
*
* Services should use these helpers to return predictable shapes that
* the global `ResponseMappingInterceptor` understands and normalizes.
*/
export type MapperWrapper<T> =
| { __mapped: 'create' | 'update' | 'single'; data: T }
| { __mapped: 'list'; items: T[] }
| { __mapped: 'paginate'; items: T[]; total: number; page?: number; perPage?: number }
| { __mapped: 'sequelize'; rows: T[]; count: number; page?: number; perPage?: number }
export const ResponseMapper = {
create<T>(item: T): MapperWrapper<T> {
return { __mapped: 'create', data: item }
},
update<T>(item: T): MapperWrapper<T> {
return { __mapped: 'update', data: item }
},
single<T>(item: T): MapperWrapper<T> {
return { __mapped: 'single', data: item }
},
list<T>(items: T[]): MapperWrapper<T> {
return { __mapped: 'list', items }
},
paginate<T>(items: T[], total: number, page = 1, perPage = items.length) {
return { __mapped: 'paginate', items, total, page, perPage }
},
sequelizePaginate<T>(rows: T[], count: number, page = 1, perPage = rows.length) {
return { __mapped: 'sequelize', rows, count, page, perPage }
},
}
export type Paginated<T> = ReturnType<typeof ResponseMapper.paginate>
+17 -11
View File
@@ -1,27 +1,33 @@
import { Injectable } from '@nestjs/common' import { Injectable } from '@nestjs/common'
import { ResponseMapper } from '../common/response/response-mapper'
import { PrismaService } from '../prisma/prisma.service' import { PrismaService } from '../prisma/prisma.service'
@Injectable() @Injectable()
export class CustomersService { export class CustomersService {
constructor(private prisma: PrismaService) {} constructor(private prisma: PrismaService) {}
async create(data: any) {
create(data: any) { const item = await this.prisma.customer.create({ data })
return this.prisma.customer.create({ data }) return ResponseMapper.create(item)
} }
findAll() { async findAll() {
return this.prisma.customer.findMany() const items = await this.prisma.customer.findMany()
return ResponseMapper.list(items)
} }
findOne(id: number) { async findOne(id: number) {
return this.prisma.customer.findUnique({ where: { id } }) const item = await this.prisma.customer.findUnique({ where: { id } })
if (!item) return null
return ResponseMapper.single(item)
} }
update(id: number, data: any) { async update(id: number, data: any) {
return this.prisma.customer.update({ where: { id }, data }) const item = await this.prisma.customer.update({ where: { id }, data })
return ResponseMapper.update(item)
} }
remove(id: number) { async remove(id: number) {
return this.prisma.customer.delete({ where: { id } }) const item = await this.prisma.customer.delete({ where: { id } })
return ResponseMapper.single(item)
} }
} }
+23
View File
@@ -1,10 +1,33 @@
import { IsEmail, IsOptional, IsString } from 'class-validator'
export class CreateCustomerDto { export class CreateCustomerDto {
@IsString()
firstName: string firstName: string
@IsString()
lastName: string lastName: string
@IsOptional()
@IsEmail()
email?: string email?: string
@IsOptional()
@IsString()
mobileNumber?: string mobileNumber?: string
@IsOptional()
@IsString()
address?: string address?: string
@IsOptional()
@IsString()
city?: string city?: string
@IsOptional()
@IsString()
state?: string state?: string
@IsOptional()
@IsString()
country?: string country?: string
} }
+30
View File
@@ -1,11 +1,41 @@
import { Type } from 'class-transformer'
import { IsBoolean, IsEmail, IsOptional, IsString } from 'class-validator'
export class UpdateCustomerDto { export class UpdateCustomerDto {
@IsOptional()
@IsString()
firstName?: string firstName?: string
@IsOptional()
@IsString()
lastName?: string lastName?: string
@IsOptional()
@IsEmail()
email?: string email?: string
@IsOptional()
@IsString()
mobileNumber?: string mobileNumber?: string
@IsOptional()
@IsString()
address?: string address?: string
@IsOptional()
@IsString()
city?: string city?: string
@IsOptional()
@IsString()
state?: string state?: string
@IsOptional()
@IsString()
country?: string country?: string
@IsOptional()
@Type(() => Boolean)
@IsBoolean()
isActive?: boolean isActive?: boolean
} }
+5 -5
View File
@@ -27,16 +27,16 @@ export type User = Prisma.UserModel
* *
*/ */
export type Role = Prisma.RoleModel export type Role = Prisma.RoleModel
/**
* Model ProductVariant
*
*/
export type ProductVariant = Prisma.ProductVariantModel
/** /**
* Model Product * Model Product
* *
*/ */
export type Product = Prisma.ProductModel export type Product = Prisma.ProductModel
/**
* Model ProductInfo
*
*/
export type ProductInfo = Prisma.ProductInfoModel
/** /**
* Model ProductBrand * Model ProductBrand
* *
+5 -5
View File
@@ -47,16 +47,16 @@ export type User = Prisma.UserModel
* *
*/ */
export type Role = Prisma.RoleModel export type Role = Prisma.RoleModel
/**
* Model ProductVariant
*
*/
export type ProductVariant = Prisma.ProductVariantModel
/** /**
* Model Product * Model Product
* *
*/ */
export type Product = Prisma.ProductModel export type Product = Prisma.ProductModel
/**
* Model ProductInfo
*
*/
export type ProductInfo = Prisma.ProductInfoModel
/** /**
* Model ProductBrand * Model ProductBrand
* *
+65 -65
View File
@@ -213,17 +213,6 @@ export type DateTimeNullableWithAggregatesFilter<$PrismaModel = never> = {
_max?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> _max?: Prisma.NestedDateTimeNullableFilter<$PrismaModel>
} }
export type BigIntNullableFilter<$PrismaModel = never> = {
equals?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel> | null
in?: bigint[] | number[] | null
notIn?: bigint[] | number[] | null
lt?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
lte?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
gt?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
gte?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
not?: Prisma.NestedBigIntNullableFilter<$PrismaModel> | bigint | number | null
}
export type DecimalFilter<$PrismaModel = never> = { export type DecimalFilter<$PrismaModel = never> = {
equals?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> equals?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
in?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] in?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[]
@@ -235,27 +224,22 @@ export type DecimalFilter<$PrismaModel = never> = {
not?: Prisma.NestedDecimalFilter<$PrismaModel> | runtime.Decimal | runtime.DecimalJsLike | number | string not?: Prisma.NestedDecimalFilter<$PrismaModel> | runtime.Decimal | runtime.DecimalJsLike | number | string
} }
export type DecimalNullableFilter<$PrismaModel = never> = {
equals?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> | null
in?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | null
notIn?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | null
lt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
lte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
gt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
gte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
not?: Prisma.NestedDecimalNullableFilter<$PrismaModel> | runtime.Decimal | runtime.DecimalJsLike | number | string | null
}
export type BoolFilter<$PrismaModel = never> = { export type BoolFilter<$PrismaModel = never> = {
equals?: boolean | Prisma.BooleanFieldRefInput<$PrismaModel> equals?: boolean | Prisma.BooleanFieldRefInput<$PrismaModel>
not?: Prisma.NestedBoolFilter<$PrismaModel> | boolean not?: Prisma.NestedBoolFilter<$PrismaModel> | boolean
} }
export type BigIntNullableWithAggregatesFilter<$PrismaModel = never> = {
equals?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel> | null
in?: bigint[] | number[] | null
notIn?: bigint[] | number[] | null
lt?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
lte?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
gt?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
gte?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
not?: Prisma.NestedBigIntNullableWithAggregatesFilter<$PrismaModel> | bigint | number | null
_count?: Prisma.NestedIntNullableFilter<$PrismaModel>
_avg?: Prisma.NestedFloatNullableFilter<$PrismaModel>
_sum?: Prisma.NestedBigIntNullableFilter<$PrismaModel>
_min?: Prisma.NestedBigIntNullableFilter<$PrismaModel>
_max?: Prisma.NestedBigIntNullableFilter<$PrismaModel>
}
export type DecimalWithAggregatesFilter<$PrismaModel = never> = { export type DecimalWithAggregatesFilter<$PrismaModel = never> = {
equals?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> equals?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
in?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] in?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[]
@@ -272,6 +256,22 @@ export type DecimalWithAggregatesFilter<$PrismaModel = never> = {
_max?: Prisma.NestedDecimalFilter<$PrismaModel> _max?: Prisma.NestedDecimalFilter<$PrismaModel>
} }
export type DecimalNullableWithAggregatesFilter<$PrismaModel = never> = {
equals?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> | null
in?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | null
notIn?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | null
lt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
lte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
gt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
gte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
not?: Prisma.NestedDecimalNullableWithAggregatesFilter<$PrismaModel> | runtime.Decimal | runtime.DecimalJsLike | number | string | null
_count?: Prisma.NestedIntNullableFilter<$PrismaModel>
_avg?: Prisma.NestedDecimalNullableFilter<$PrismaModel>
_sum?: Prisma.NestedDecimalNullableFilter<$PrismaModel>
_min?: Prisma.NestedDecimalNullableFilter<$PrismaModel>
_max?: Prisma.NestedDecimalNullableFilter<$PrismaModel>
}
export type BoolWithAggregatesFilter<$PrismaModel = never> = { export type BoolWithAggregatesFilter<$PrismaModel = never> = {
equals?: boolean | Prisma.BooleanFieldRefInput<$PrismaModel> equals?: boolean | Prisma.BooleanFieldRefInput<$PrismaModel>
not?: Prisma.NestedBoolWithAggregatesFilter<$PrismaModel> | boolean not?: Prisma.NestedBoolWithAggregatesFilter<$PrismaModel> | boolean
@@ -496,17 +496,6 @@ export type NestedDateTimeNullableWithAggregatesFilter<$PrismaModel = never> = {
_max?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> _max?: Prisma.NestedDateTimeNullableFilter<$PrismaModel>
} }
export type NestedBigIntNullableFilter<$PrismaModel = never> = {
equals?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel> | null
in?: bigint[] | number[] | null
notIn?: bigint[] | number[] | null
lt?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
lte?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
gt?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
gte?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
not?: Prisma.NestedBigIntNullableFilter<$PrismaModel> | bigint | number | null
}
export type NestedDecimalFilter<$PrismaModel = never> = { export type NestedDecimalFilter<$PrismaModel = never> = {
equals?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> equals?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
in?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] in?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[]
@@ -518,38 +507,22 @@ export type NestedDecimalFilter<$PrismaModel = never> = {
not?: Prisma.NestedDecimalFilter<$PrismaModel> | runtime.Decimal | runtime.DecimalJsLike | number | string not?: Prisma.NestedDecimalFilter<$PrismaModel> | runtime.Decimal | runtime.DecimalJsLike | number | string
} }
export type NestedDecimalNullableFilter<$PrismaModel = never> = {
equals?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> | null
in?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | null
notIn?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | null
lt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
lte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
gt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
gte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
not?: Prisma.NestedDecimalNullableFilter<$PrismaModel> | runtime.Decimal | runtime.DecimalJsLike | number | string | null
}
export type NestedBoolFilter<$PrismaModel = never> = { export type NestedBoolFilter<$PrismaModel = never> = {
equals?: boolean | Prisma.BooleanFieldRefInput<$PrismaModel> equals?: boolean | Prisma.BooleanFieldRefInput<$PrismaModel>
not?: Prisma.NestedBoolFilter<$PrismaModel> | boolean not?: Prisma.NestedBoolFilter<$PrismaModel> | boolean
} }
export type NestedBigIntNullableWithAggregatesFilter<$PrismaModel = never> = {
equals?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel> | null
in?: bigint[] | number[] | null
notIn?: bigint[] | number[] | null
lt?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
lte?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
gt?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
gte?: bigint | number | Prisma.BigIntFieldRefInput<$PrismaModel>
not?: Prisma.NestedBigIntNullableWithAggregatesFilter<$PrismaModel> | bigint | number | null
_count?: Prisma.NestedIntNullableFilter<$PrismaModel>
_avg?: Prisma.NestedFloatNullableFilter<$PrismaModel>
_sum?: Prisma.NestedBigIntNullableFilter<$PrismaModel>
_min?: Prisma.NestedBigIntNullableFilter<$PrismaModel>
_max?: Prisma.NestedBigIntNullableFilter<$PrismaModel>
}
export type NestedFloatNullableFilter<$PrismaModel = never> = {
equals?: number | Prisma.FloatFieldRefInput<$PrismaModel> | null
in?: number[] | null
notIn?: number[] | null
lt?: number | Prisma.FloatFieldRefInput<$PrismaModel>
lte?: number | Prisma.FloatFieldRefInput<$PrismaModel>
gt?: number | Prisma.FloatFieldRefInput<$PrismaModel>
gte?: number | Prisma.FloatFieldRefInput<$PrismaModel>
not?: Prisma.NestedFloatNullableFilter<$PrismaModel> | number | null
}
export type NestedDecimalWithAggregatesFilter<$PrismaModel = never> = { export type NestedDecimalWithAggregatesFilter<$PrismaModel = never> = {
equals?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> equals?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
in?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] in?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[]
@@ -566,6 +539,22 @@ export type NestedDecimalWithAggregatesFilter<$PrismaModel = never> = {
_max?: Prisma.NestedDecimalFilter<$PrismaModel> _max?: Prisma.NestedDecimalFilter<$PrismaModel>
} }
export type NestedDecimalNullableWithAggregatesFilter<$PrismaModel = never> = {
equals?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> | null
in?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | null
notIn?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | null
lt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
lte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
gt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
gte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
not?: Prisma.NestedDecimalNullableWithAggregatesFilter<$PrismaModel> | runtime.Decimal | runtime.DecimalJsLike | number | string | null
_count?: Prisma.NestedIntNullableFilter<$PrismaModel>
_avg?: Prisma.NestedDecimalNullableFilter<$PrismaModel>
_sum?: Prisma.NestedDecimalNullableFilter<$PrismaModel>
_min?: Prisma.NestedDecimalNullableFilter<$PrismaModel>
_max?: Prisma.NestedDecimalNullableFilter<$PrismaModel>
}
export type NestedBoolWithAggregatesFilter<$PrismaModel = never> = { export type NestedBoolWithAggregatesFilter<$PrismaModel = never> = {
equals?: boolean | Prisma.BooleanFieldRefInput<$PrismaModel> equals?: boolean | Prisma.BooleanFieldRefInput<$PrismaModel>
not?: Prisma.NestedBoolWithAggregatesFilter<$PrismaModel> | boolean not?: Prisma.NestedBoolWithAggregatesFilter<$PrismaModel> | boolean
@@ -590,4 +579,15 @@ export type NestedIntNullableWithAggregatesFilter<$PrismaModel = never> = {
_max?: Prisma.NestedIntNullableFilter<$PrismaModel> _max?: Prisma.NestedIntNullableFilter<$PrismaModel>
} }
export type NestedFloatNullableFilter<$PrismaModel = never> = {
equals?: number | Prisma.FloatFieldRefInput<$PrismaModel> | null
in?: number[] | null
notIn?: number[] | null
lt?: number | Prisma.FloatFieldRefInput<$PrismaModel>
lte?: number | Prisma.FloatFieldRefInput<$PrismaModel>
gt?: number | Prisma.FloatFieldRefInput<$PrismaModel>
gte?: number | Prisma.FloatFieldRefInput<$PrismaModel>
not?: Prisma.NestedFloatNullableFilter<$PrismaModel> | number | null
}
File diff suppressed because one or more lines are too long
@@ -386,8 +386,8 @@ type FieldRefInputType<Model, FieldType> = Model extends never ? never : FieldRe
export const ModelName = { export const ModelName = {
User: 'User', User: 'User',
Role: 'Role', Role: 'Role',
ProductVariant: 'ProductVariant',
Product: 'Product', Product: 'Product',
ProductInfo: 'ProductInfo',
ProductBrand: 'ProductBrand', ProductBrand: 'ProductBrand',
ProductCategory: 'ProductCategory', ProductCategory: 'ProductCategory',
Supplier: 'Supplier', Supplier: 'Supplier',
@@ -409,7 +409,7 @@ export type TypeMap<ExtArgs extends runtime.Types.Extensions.InternalArgs = runt
omit: GlobalOmitOptions omit: GlobalOmitOptions
} }
meta: { meta: {
modelProps: "user" | "role" | "product" | "productInfo" | "productBrand" | "productCategory" | "supplier" | "customer" | "inventory" | "store" modelProps: "user" | "role" | "productVariant" | "product" | "productBrand" | "productCategory" | "supplier" | "customer" | "inventory" | "store"
txIsolationLevel: TransactionIsolationLevel txIsolationLevel: TransactionIsolationLevel
} }
model: { model: {
@@ -545,6 +545,72 @@ export type TypeMap<ExtArgs extends runtime.Types.Extensions.InternalArgs = runt
} }
} }
} }
ProductVariant: {
payload: Prisma.$ProductVariantPayload<ExtArgs>
fields: Prisma.ProductVariantFieldRefs
operations: {
findUnique: {
args: Prisma.ProductVariantFindUniqueArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$ProductVariantPayload> | null
}
findUniqueOrThrow: {
args: Prisma.ProductVariantFindUniqueOrThrowArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$ProductVariantPayload>
}
findFirst: {
args: Prisma.ProductVariantFindFirstArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$ProductVariantPayload> | null
}
findFirstOrThrow: {
args: Prisma.ProductVariantFindFirstOrThrowArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$ProductVariantPayload>
}
findMany: {
args: Prisma.ProductVariantFindManyArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$ProductVariantPayload>[]
}
create: {
args: Prisma.ProductVariantCreateArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$ProductVariantPayload>
}
createMany: {
args: Prisma.ProductVariantCreateManyArgs<ExtArgs>
result: BatchPayload
}
delete: {
args: Prisma.ProductVariantDeleteArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$ProductVariantPayload>
}
update: {
args: Prisma.ProductVariantUpdateArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$ProductVariantPayload>
}
deleteMany: {
args: Prisma.ProductVariantDeleteManyArgs<ExtArgs>
result: BatchPayload
}
updateMany: {
args: Prisma.ProductVariantUpdateManyArgs<ExtArgs>
result: BatchPayload
}
upsert: {
args: Prisma.ProductVariantUpsertArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$ProductVariantPayload>
}
aggregate: {
args: Prisma.ProductVariantAggregateArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.AggregateProductVariant>
}
groupBy: {
args: Prisma.ProductVariantGroupByArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.ProductVariantGroupByOutputType>[]
}
count: {
args: Prisma.ProductVariantCountArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.ProductVariantCountAggregateOutputType> | number
}
}
}
Product: { Product: {
payload: Prisma.$ProductPayload<ExtArgs> payload: Prisma.$ProductPayload<ExtArgs>
fields: Prisma.ProductFieldRefs fields: Prisma.ProductFieldRefs
@@ -611,72 +677,6 @@ export type TypeMap<ExtArgs extends runtime.Types.Extensions.InternalArgs = runt
} }
} }
} }
ProductInfo: {
payload: Prisma.$ProductInfoPayload<ExtArgs>
fields: Prisma.ProductInfoFieldRefs
operations: {
findUnique: {
args: Prisma.ProductInfoFindUniqueArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$ProductInfoPayload> | null
}
findUniqueOrThrow: {
args: Prisma.ProductInfoFindUniqueOrThrowArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$ProductInfoPayload>
}
findFirst: {
args: Prisma.ProductInfoFindFirstArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$ProductInfoPayload> | null
}
findFirstOrThrow: {
args: Prisma.ProductInfoFindFirstOrThrowArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$ProductInfoPayload>
}
findMany: {
args: Prisma.ProductInfoFindManyArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$ProductInfoPayload>[]
}
create: {
args: Prisma.ProductInfoCreateArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$ProductInfoPayload>
}
createMany: {
args: Prisma.ProductInfoCreateManyArgs<ExtArgs>
result: BatchPayload
}
delete: {
args: Prisma.ProductInfoDeleteArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$ProductInfoPayload>
}
update: {
args: Prisma.ProductInfoUpdateArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$ProductInfoPayload>
}
deleteMany: {
args: Prisma.ProductInfoDeleteManyArgs<ExtArgs>
result: BatchPayload
}
updateMany: {
args: Prisma.ProductInfoUpdateManyArgs<ExtArgs>
result: BatchPayload
}
upsert: {
args: Prisma.ProductInfoUpsertArgs<ExtArgs>
result: runtime.Types.Utils.PayloadToResult<Prisma.$ProductInfoPayload>
}
aggregate: {
args: Prisma.ProductInfoAggregateArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.AggregateProductInfo>
}
groupBy: {
args: Prisma.ProductInfoGroupByArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.ProductInfoGroupByOutputType>[]
}
count: {
args: Prisma.ProductInfoCountArgs<ExtArgs>
result: runtime.Types.Utils.Optional<Prisma.ProductInfoCountAggregateOutputType> | number
}
}
}
ProductBrand: { ProductBrand: {
payload: Prisma.$ProductBrandPayload<ExtArgs> payload: Prisma.$ProductBrandPayload<ExtArgs>
fields: Prisma.ProductBrandFieldRefs fields: Prisma.ProductBrandFieldRefs
@@ -1137,16 +1137,15 @@ export const RoleScalarFieldEnum = {
export type RoleScalarFieldEnum = (typeof RoleScalarFieldEnum)[keyof typeof RoleScalarFieldEnum] export type RoleScalarFieldEnum = (typeof RoleScalarFieldEnum)[keyof typeof RoleScalarFieldEnum]
export const ProductScalarFieldEnum = { export const ProductVariantScalarFieldEnum = {
id: 'id', id: 'id',
name: 'name', name: 'name',
basePrice: 'basePrice',
salePrice: 'salePrice',
description: 'description', description: 'description',
sku: 'sku',
barcode: 'barcode', barcode: 'barcode',
imageUrl: 'imageUrl', imageUrl: 'imageUrl',
attachmentId: 'attachmentId',
unit: 'unit', unit: 'unit',
discount: 'discount',
quantity: 'quantity', quantity: 'quantity',
alertQuantity: 'alertQuantity', alertQuantity: 'alertQuantity',
isActive: 'isActive', isActive: 'isActive',
@@ -1154,27 +1153,26 @@ export const ProductScalarFieldEnum = {
createdAt: 'createdAt', createdAt: 'createdAt',
updatedAt: 'updatedAt', updatedAt: 'updatedAt',
deletedAt: 'deletedAt', deletedAt: 'deletedAt',
productInfoId: 'productInfoId' productId: 'productId'
} as const } as const
export type ProductScalarFieldEnum = (typeof ProductScalarFieldEnum)[keyof typeof ProductScalarFieldEnum] export type ProductVariantScalarFieldEnum = (typeof ProductVariantScalarFieldEnum)[keyof typeof ProductVariantScalarFieldEnum]
export const ProductInfoScalarFieldEnum = { export const ProductScalarFieldEnum = {
id: 'id', id: 'id',
name: 'name', name: 'name',
barcode: 'barcode',
sku: 'sku',
description: 'description', description: 'description',
productType: 'productType',
metaData: 'metaData',
createdAt: 'createdAt', createdAt: 'createdAt',
updatedAt: 'updatedAt', updatedAt: 'updatedAt',
deletedAt: 'deletedAt', deletedAt: 'deletedAt',
brandId: 'brandId', brandId: 'brandId',
categoryId: 'categoryId', categoryId: 'categoryId'
supplierId: 'supplierId'
} as const } as const
export type ProductInfoScalarFieldEnum = (typeof ProductInfoScalarFieldEnum)[keyof typeof ProductInfoScalarFieldEnum] export type ProductScalarFieldEnum = (typeof ProductScalarFieldEnum)[keyof typeof ProductScalarFieldEnum]
export const ProductBrandScalarFieldEnum = { export const ProductBrandScalarFieldEnum = {
@@ -1324,25 +1322,25 @@ export const RoleOrderByRelevanceFieldEnum = {
export type RoleOrderByRelevanceFieldEnum = (typeof RoleOrderByRelevanceFieldEnum)[keyof typeof RoleOrderByRelevanceFieldEnum] export type RoleOrderByRelevanceFieldEnum = (typeof RoleOrderByRelevanceFieldEnum)[keyof typeof RoleOrderByRelevanceFieldEnum]
export const ProductOrderByRelevanceFieldEnum = { export const ProductVariantOrderByRelevanceFieldEnum = {
name: 'name', name: 'name',
description: 'description', description: 'description',
sku: 'sku',
barcode: 'barcode', barcode: 'barcode',
imageUrl: 'imageUrl', imageUrl: 'imageUrl',
unit: 'unit' unit: 'unit'
} as const } as const
export type ProductOrderByRelevanceFieldEnum = (typeof ProductOrderByRelevanceFieldEnum)[keyof typeof ProductOrderByRelevanceFieldEnum] export type ProductVariantOrderByRelevanceFieldEnum = (typeof ProductVariantOrderByRelevanceFieldEnum)[keyof typeof ProductVariantOrderByRelevanceFieldEnum]
export const ProductInfoOrderByRelevanceFieldEnum = { export const ProductOrderByRelevanceFieldEnum = {
name: 'name', name: 'name',
description: 'description', barcode: 'barcode',
productType: 'productType' sku: 'sku',
description: 'description'
} as const } as const
export type ProductInfoOrderByRelevanceFieldEnum = (typeof ProductInfoOrderByRelevanceFieldEnum)[keyof typeof ProductInfoOrderByRelevanceFieldEnum] export type ProductOrderByRelevanceFieldEnum = (typeof ProductOrderByRelevanceFieldEnum)[keyof typeof ProductOrderByRelevanceFieldEnum]
export const ProductBrandOrderByRelevanceFieldEnum = { export const ProductBrandOrderByRelevanceFieldEnum = {
@@ -1448,13 +1446,6 @@ export type DateTimeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel
/**
* Reference to a field of type 'BigInt'
*/
export type BigIntFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'BigInt'>
/** /**
* Reference to a field of type 'Decimal' * Reference to a field of type 'Decimal'
*/ */
@@ -1572,8 +1563,8 @@ export type PrismaClientOptions = ({
export type GlobalOmitConfig = { export type GlobalOmitConfig = {
user?: Prisma.UserOmit user?: Prisma.UserOmit
role?: Prisma.RoleOmit role?: Prisma.RoleOmit
productVariant?: Prisma.ProductVariantOmit
product?: Prisma.ProductOmit product?: Prisma.ProductOmit
productInfo?: Prisma.ProductInfoOmit
productBrand?: Prisma.ProductBrandOmit productBrand?: Prisma.ProductBrandOmit
productCategory?: Prisma.ProductCategoryOmit productCategory?: Prisma.ProductCategoryOmit
supplier?: Prisma.SupplierOmit supplier?: Prisma.SupplierOmit
@@ -53,8 +53,8 @@ export const AnyNull = runtime.AnyNull
export const ModelName = { export const ModelName = {
User: 'User', User: 'User',
Role: 'Role', Role: 'Role',
ProductVariant: 'ProductVariant',
Product: 'Product', Product: 'Product',
ProductInfo: 'ProductInfo',
ProductBrand: 'ProductBrand', ProductBrand: 'ProductBrand',
ProductCategory: 'ProductCategory', ProductCategory: 'ProductCategory',
Supplier: 'Supplier', Supplier: 'Supplier',
@@ -104,16 +104,15 @@ export const RoleScalarFieldEnum = {
export type RoleScalarFieldEnum = (typeof RoleScalarFieldEnum)[keyof typeof RoleScalarFieldEnum] export type RoleScalarFieldEnum = (typeof RoleScalarFieldEnum)[keyof typeof RoleScalarFieldEnum]
export const ProductScalarFieldEnum = { export const ProductVariantScalarFieldEnum = {
id: 'id', id: 'id',
name: 'name', name: 'name',
basePrice: 'basePrice',
salePrice: 'salePrice',
description: 'description', description: 'description',
sku: 'sku',
barcode: 'barcode', barcode: 'barcode',
imageUrl: 'imageUrl', imageUrl: 'imageUrl',
attachmentId: 'attachmentId',
unit: 'unit', unit: 'unit',
discount: 'discount',
quantity: 'quantity', quantity: 'quantity',
alertQuantity: 'alertQuantity', alertQuantity: 'alertQuantity',
isActive: 'isActive', isActive: 'isActive',
@@ -121,27 +120,26 @@ export const ProductScalarFieldEnum = {
createdAt: 'createdAt', createdAt: 'createdAt',
updatedAt: 'updatedAt', updatedAt: 'updatedAt',
deletedAt: 'deletedAt', deletedAt: 'deletedAt',
productInfoId: 'productInfoId' productId: 'productId'
} as const } as const
export type ProductScalarFieldEnum = (typeof ProductScalarFieldEnum)[keyof typeof ProductScalarFieldEnum] export type ProductVariantScalarFieldEnum = (typeof ProductVariantScalarFieldEnum)[keyof typeof ProductVariantScalarFieldEnum]
export const ProductInfoScalarFieldEnum = { export const ProductScalarFieldEnum = {
id: 'id', id: 'id',
name: 'name', name: 'name',
barcode: 'barcode',
sku: 'sku',
description: 'description', description: 'description',
productType: 'productType',
metaData: 'metaData',
createdAt: 'createdAt', createdAt: 'createdAt',
updatedAt: 'updatedAt', updatedAt: 'updatedAt',
deletedAt: 'deletedAt', deletedAt: 'deletedAt',
brandId: 'brandId', brandId: 'brandId',
categoryId: 'categoryId', categoryId: 'categoryId'
supplierId: 'supplierId'
} as const } as const
export type ProductInfoScalarFieldEnum = (typeof ProductInfoScalarFieldEnum)[keyof typeof ProductInfoScalarFieldEnum] export type ProductScalarFieldEnum = (typeof ProductScalarFieldEnum)[keyof typeof ProductScalarFieldEnum]
export const ProductBrandScalarFieldEnum = { export const ProductBrandScalarFieldEnum = {
@@ -291,25 +289,25 @@ export const RoleOrderByRelevanceFieldEnum = {
export type RoleOrderByRelevanceFieldEnum = (typeof RoleOrderByRelevanceFieldEnum)[keyof typeof RoleOrderByRelevanceFieldEnum] export type RoleOrderByRelevanceFieldEnum = (typeof RoleOrderByRelevanceFieldEnum)[keyof typeof RoleOrderByRelevanceFieldEnum]
export const ProductOrderByRelevanceFieldEnum = { export const ProductVariantOrderByRelevanceFieldEnum = {
name: 'name', name: 'name',
description: 'description', description: 'description',
sku: 'sku',
barcode: 'barcode', barcode: 'barcode',
imageUrl: 'imageUrl', imageUrl: 'imageUrl',
unit: 'unit' unit: 'unit'
} as const } as const
export type ProductOrderByRelevanceFieldEnum = (typeof ProductOrderByRelevanceFieldEnum)[keyof typeof ProductOrderByRelevanceFieldEnum] export type ProductVariantOrderByRelevanceFieldEnum = (typeof ProductVariantOrderByRelevanceFieldEnum)[keyof typeof ProductVariantOrderByRelevanceFieldEnum]
export const ProductInfoOrderByRelevanceFieldEnum = { export const ProductOrderByRelevanceFieldEnum = {
name: 'name', name: 'name',
description: 'description', barcode: 'barcode',
productType: 'productType' sku: 'sku',
description: 'description'
} as const } as const
export type ProductInfoOrderByRelevanceFieldEnum = (typeof ProductInfoOrderByRelevanceFieldEnum)[keyof typeof ProductInfoOrderByRelevanceFieldEnum] export type ProductOrderByRelevanceFieldEnum = (typeof ProductOrderByRelevanceFieldEnum)[keyof typeof ProductOrderByRelevanceFieldEnum]
export const ProductBrandOrderByRelevanceFieldEnum = { export const ProductBrandOrderByRelevanceFieldEnum = {
+1 -1
View File
@@ -10,8 +10,8 @@
*/ */
export type * from './models/User.js' export type * from './models/User.js'
export type * from './models/Role.js' export type * from './models/Role.js'
export type * from './models/ProductVariant.js'
export type * from './models/Product.js' export type * from './models/Product.js'
export type * from './models/ProductInfo.js'
export type * from './models/ProductBrand.js' export type * from './models/ProductBrand.js'
export type * from './models/ProductCategory.js' export type * from './models/ProductCategory.js'
export type * from './models/Supplier.js' export type * from './models/Supplier.js'
File diff suppressed because it is too large Load Diff
+45 -45
View File
@@ -232,7 +232,7 @@ export type ProductBrandWhereInput = {
createdAt?: Prisma.DateTimeFilter<"ProductBrand"> | Date | string createdAt?: Prisma.DateTimeFilter<"ProductBrand"> | Date | string
updatedAt?: Prisma.DateTimeFilter<"ProductBrand"> | Date | string updatedAt?: Prisma.DateTimeFilter<"ProductBrand"> | Date | string
deletedAt?: Prisma.DateTimeNullableFilter<"ProductBrand"> | Date | string | null deletedAt?: Prisma.DateTimeNullableFilter<"ProductBrand"> | Date | string | null
productInfo?: Prisma.ProductInfoListRelationFilter products?: Prisma.ProductListRelationFilter
} }
export type ProductBrandOrderByWithRelationInput = { export type ProductBrandOrderByWithRelationInput = {
@@ -243,7 +243,7 @@ export type ProductBrandOrderByWithRelationInput = {
createdAt?: Prisma.SortOrder createdAt?: Prisma.SortOrder
updatedAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder
deletedAt?: Prisma.SortOrderInput | Prisma.SortOrder deletedAt?: Prisma.SortOrderInput | Prisma.SortOrder
productInfo?: Prisma.ProductInfoOrderByRelationAggregateInput products?: Prisma.ProductOrderByRelationAggregateInput
_relevance?: Prisma.ProductBrandOrderByRelevanceInput _relevance?: Prisma.ProductBrandOrderByRelevanceInput
} }
@@ -258,7 +258,7 @@ export type ProductBrandWhereUniqueInput = Prisma.AtLeast<{
createdAt?: Prisma.DateTimeFilter<"ProductBrand"> | Date | string createdAt?: Prisma.DateTimeFilter<"ProductBrand"> | Date | string
updatedAt?: Prisma.DateTimeFilter<"ProductBrand"> | Date | string updatedAt?: Prisma.DateTimeFilter<"ProductBrand"> | Date | string
deletedAt?: Prisma.DateTimeNullableFilter<"ProductBrand"> | Date | string | null deletedAt?: Prisma.DateTimeNullableFilter<"ProductBrand"> | Date | string | null
productInfo?: Prisma.ProductInfoListRelationFilter products?: Prisma.ProductListRelationFilter
}, "id"> }, "id">
export type ProductBrandOrderByWithAggregationInput = { export type ProductBrandOrderByWithAggregationInput = {
@@ -296,7 +296,7 @@ export type ProductBrandCreateInput = {
createdAt?: Date | string createdAt?: Date | string
updatedAt?: Date | string updatedAt?: Date | string
deletedAt?: Date | string | null deletedAt?: Date | string | null
productInfo?: Prisma.ProductInfoCreateNestedManyWithoutBrandInput products?: Prisma.ProductCreateNestedManyWithoutBrandInput
} }
export type ProductBrandUncheckedCreateInput = { export type ProductBrandUncheckedCreateInput = {
@@ -307,7 +307,7 @@ export type ProductBrandUncheckedCreateInput = {
createdAt?: Date | string createdAt?: Date | string
updatedAt?: Date | string updatedAt?: Date | string
deletedAt?: Date | string | null deletedAt?: Date | string | null
productInfo?: Prisma.ProductInfoUncheckedCreateNestedManyWithoutBrandInput products?: Prisma.ProductUncheckedCreateNestedManyWithoutBrandInput
} }
export type ProductBrandUpdateInput = { export type ProductBrandUpdateInput = {
@@ -317,7 +317,7 @@ export type ProductBrandUpdateInput = {
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
deletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null deletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
productInfo?: Prisma.ProductInfoUpdateManyWithoutBrandNestedInput products?: Prisma.ProductUpdateManyWithoutBrandNestedInput
} }
export type ProductBrandUncheckedUpdateInput = { export type ProductBrandUncheckedUpdateInput = {
@@ -328,7 +328,7 @@ export type ProductBrandUncheckedUpdateInput = {
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
deletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null deletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
productInfo?: Prisma.ProductInfoUncheckedUpdateManyWithoutBrandNestedInput products?: Prisma.ProductUncheckedUpdateManyWithoutBrandNestedInput
} }
export type ProductBrandCreateManyInput = { export type ProductBrandCreateManyInput = {
@@ -409,23 +409,23 @@ export type ProductBrandSumOrderByAggregateInput = {
id?: Prisma.SortOrder id?: Prisma.SortOrder
} }
export type ProductBrandCreateNestedOneWithoutProductInfoInput = { export type ProductBrandCreateNestedOneWithoutProductsInput = {
create?: Prisma.XOR<Prisma.ProductBrandCreateWithoutProductInfoInput, Prisma.ProductBrandUncheckedCreateWithoutProductInfoInput> create?: Prisma.XOR<Prisma.ProductBrandCreateWithoutProductsInput, Prisma.ProductBrandUncheckedCreateWithoutProductsInput>
connectOrCreate?: Prisma.ProductBrandCreateOrConnectWithoutProductInfoInput connectOrCreate?: Prisma.ProductBrandCreateOrConnectWithoutProductsInput
connect?: Prisma.ProductBrandWhereUniqueInput connect?: Prisma.ProductBrandWhereUniqueInput
} }
export type ProductBrandUpdateOneWithoutProductInfoNestedInput = { export type ProductBrandUpdateOneWithoutProductsNestedInput = {
create?: Prisma.XOR<Prisma.ProductBrandCreateWithoutProductInfoInput, Prisma.ProductBrandUncheckedCreateWithoutProductInfoInput> create?: Prisma.XOR<Prisma.ProductBrandCreateWithoutProductsInput, Prisma.ProductBrandUncheckedCreateWithoutProductsInput>
connectOrCreate?: Prisma.ProductBrandCreateOrConnectWithoutProductInfoInput connectOrCreate?: Prisma.ProductBrandCreateOrConnectWithoutProductsInput
upsert?: Prisma.ProductBrandUpsertWithoutProductInfoInput upsert?: Prisma.ProductBrandUpsertWithoutProductsInput
disconnect?: Prisma.ProductBrandWhereInput | boolean disconnect?: Prisma.ProductBrandWhereInput | boolean
delete?: Prisma.ProductBrandWhereInput | boolean delete?: Prisma.ProductBrandWhereInput | boolean
connect?: Prisma.ProductBrandWhereUniqueInput connect?: Prisma.ProductBrandWhereUniqueInput
update?: Prisma.XOR<Prisma.XOR<Prisma.ProductBrandUpdateToOneWithWhereWithoutProductInfoInput, Prisma.ProductBrandUpdateWithoutProductInfoInput>, Prisma.ProductBrandUncheckedUpdateWithoutProductInfoInput> update?: Prisma.XOR<Prisma.XOR<Prisma.ProductBrandUpdateToOneWithWhereWithoutProductsInput, Prisma.ProductBrandUpdateWithoutProductsInput>, Prisma.ProductBrandUncheckedUpdateWithoutProductsInput>
} }
export type ProductBrandCreateWithoutProductInfoInput = { export type ProductBrandCreateWithoutProductsInput = {
name: string name: string
description?: string | null description?: string | null
imageUrl?: string | null imageUrl?: string | null
@@ -434,7 +434,7 @@ export type ProductBrandCreateWithoutProductInfoInput = {
deletedAt?: Date | string | null deletedAt?: Date | string | null
} }
export type ProductBrandUncheckedCreateWithoutProductInfoInput = { export type ProductBrandUncheckedCreateWithoutProductsInput = {
id?: number id?: number
name: string name: string
description?: string | null description?: string | null
@@ -444,23 +444,23 @@ export type ProductBrandUncheckedCreateWithoutProductInfoInput = {
deletedAt?: Date | string | null deletedAt?: Date | string | null
} }
export type ProductBrandCreateOrConnectWithoutProductInfoInput = { export type ProductBrandCreateOrConnectWithoutProductsInput = {
where: Prisma.ProductBrandWhereUniqueInput where: Prisma.ProductBrandWhereUniqueInput
create: Prisma.XOR<Prisma.ProductBrandCreateWithoutProductInfoInput, Prisma.ProductBrandUncheckedCreateWithoutProductInfoInput> create: Prisma.XOR<Prisma.ProductBrandCreateWithoutProductsInput, Prisma.ProductBrandUncheckedCreateWithoutProductsInput>
} }
export type ProductBrandUpsertWithoutProductInfoInput = { export type ProductBrandUpsertWithoutProductsInput = {
update: Prisma.XOR<Prisma.ProductBrandUpdateWithoutProductInfoInput, Prisma.ProductBrandUncheckedUpdateWithoutProductInfoInput> update: Prisma.XOR<Prisma.ProductBrandUpdateWithoutProductsInput, Prisma.ProductBrandUncheckedUpdateWithoutProductsInput>
create: Prisma.XOR<Prisma.ProductBrandCreateWithoutProductInfoInput, Prisma.ProductBrandUncheckedCreateWithoutProductInfoInput> create: Prisma.XOR<Prisma.ProductBrandCreateWithoutProductsInput, Prisma.ProductBrandUncheckedCreateWithoutProductsInput>
where?: Prisma.ProductBrandWhereInput where?: Prisma.ProductBrandWhereInput
} }
export type ProductBrandUpdateToOneWithWhereWithoutProductInfoInput = { export type ProductBrandUpdateToOneWithWhereWithoutProductsInput = {
where?: Prisma.ProductBrandWhereInput where?: Prisma.ProductBrandWhereInput
data: Prisma.XOR<Prisma.ProductBrandUpdateWithoutProductInfoInput, Prisma.ProductBrandUncheckedUpdateWithoutProductInfoInput> data: Prisma.XOR<Prisma.ProductBrandUpdateWithoutProductsInput, Prisma.ProductBrandUncheckedUpdateWithoutProductsInput>
} }
export type ProductBrandUpdateWithoutProductInfoInput = { export type ProductBrandUpdateWithoutProductsInput = {
name?: Prisma.StringFieldUpdateOperationsInput | string name?: Prisma.StringFieldUpdateOperationsInput | string
description?: Prisma.NullableStringFieldUpdateOperationsInput | string | null description?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
imageUrl?: Prisma.NullableStringFieldUpdateOperationsInput | string | null imageUrl?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
@@ -469,7 +469,7 @@ export type ProductBrandUpdateWithoutProductInfoInput = {
deletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null deletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
} }
export type ProductBrandUncheckedUpdateWithoutProductInfoInput = { export type ProductBrandUncheckedUpdateWithoutProductsInput = {
id?: Prisma.IntFieldUpdateOperationsInput | number id?: Prisma.IntFieldUpdateOperationsInput | number
name?: Prisma.StringFieldUpdateOperationsInput | string name?: Prisma.StringFieldUpdateOperationsInput | string
description?: Prisma.NullableStringFieldUpdateOperationsInput | string | null description?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
@@ -485,11 +485,11 @@ export type ProductBrandUncheckedUpdateWithoutProductInfoInput = {
*/ */
export type ProductBrandCountOutputType = { export type ProductBrandCountOutputType = {
productInfo: number products: number
} }
export type ProductBrandCountOutputTypeSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { export type ProductBrandCountOutputTypeSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
productInfo?: boolean | ProductBrandCountOutputTypeCountProductInfoArgs products?: boolean | ProductBrandCountOutputTypeCountProductsArgs
} }
/** /**
@@ -505,8 +505,8 @@ export type ProductBrandCountOutputTypeDefaultArgs<ExtArgs extends runtime.Types
/** /**
* ProductBrandCountOutputType without action * ProductBrandCountOutputType without action
*/ */
export type ProductBrandCountOutputTypeCountProductInfoArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { export type ProductBrandCountOutputTypeCountProductsArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
where?: Prisma.ProductInfoWhereInput where?: Prisma.ProductWhereInput
} }
@@ -518,7 +518,7 @@ export type ProductBrandSelect<ExtArgs extends runtime.Types.Extensions.Internal
createdAt?: boolean createdAt?: boolean
updatedAt?: boolean updatedAt?: boolean
deletedAt?: boolean deletedAt?: boolean
productInfo?: boolean | Prisma.ProductBrand$productInfoArgs<ExtArgs> products?: boolean | Prisma.ProductBrand$productsArgs<ExtArgs>
_count?: boolean | Prisma.ProductBrandCountOutputTypeDefaultArgs<ExtArgs> _count?: boolean | Prisma.ProductBrandCountOutputTypeDefaultArgs<ExtArgs>
}, ExtArgs["result"]["productBrand"]> }, ExtArgs["result"]["productBrand"]>
@@ -536,14 +536,14 @@ export type ProductBrandSelectScalar = {
export type ProductBrandOmit<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetOmit<"id" | "name" | "description" | "imageUrl" | "createdAt" | "updatedAt" | "deletedAt", ExtArgs["result"]["productBrand"]> export type ProductBrandOmit<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetOmit<"id" | "name" | "description" | "imageUrl" | "createdAt" | "updatedAt" | "deletedAt", ExtArgs["result"]["productBrand"]>
export type ProductBrandInclude<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { export type ProductBrandInclude<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
productInfo?: boolean | Prisma.ProductBrand$productInfoArgs<ExtArgs> products?: boolean | Prisma.ProductBrand$productsArgs<ExtArgs>
_count?: boolean | Prisma.ProductBrandCountOutputTypeDefaultArgs<ExtArgs> _count?: boolean | Prisma.ProductBrandCountOutputTypeDefaultArgs<ExtArgs>
} }
export type $ProductBrandPayload<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { export type $ProductBrandPayload<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
name: "ProductBrand" name: "ProductBrand"
objects: { objects: {
productInfo: Prisma.$ProductInfoPayload<ExtArgs>[] products: Prisma.$ProductPayload<ExtArgs>[]
} }
scalars: runtime.Types.Extensions.GetPayloadResult<{ scalars: runtime.Types.Extensions.GetPayloadResult<{
id: number id: number
@@ -893,7 +893,7 @@ readonly fields: ProductBrandFieldRefs;
*/ */
export interface Prisma__ProductBrandClient<T, Null = never, ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs, GlobalOmitOptions = {}> extends Prisma.PrismaPromise<T> { export interface Prisma__ProductBrandClient<T, Null = never, ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs, GlobalOmitOptions = {}> extends Prisma.PrismaPromise<T> {
readonly [Symbol.toStringTag]: "PrismaPromise" readonly [Symbol.toStringTag]: "PrismaPromise"
productInfo<T extends Prisma.ProductBrand$productInfoArgs<ExtArgs> = {}>(args?: Prisma.Subset<T, Prisma.ProductBrand$productInfoArgs<ExtArgs>>): Prisma.PrismaPromise<runtime.Types.Result.GetResult<Prisma.$ProductInfoPayload<ExtArgs>, T, "findMany", GlobalOmitOptions> | Null> products<T extends Prisma.ProductBrand$productsArgs<ExtArgs> = {}>(args?: Prisma.Subset<T, Prisma.ProductBrand$productsArgs<ExtArgs>>): Prisma.PrismaPromise<runtime.Types.Result.GetResult<Prisma.$ProductPayload<ExtArgs>, T, "findMany", GlobalOmitOptions> | Null>
/** /**
* Attaches callbacks for the resolution and/or rejection of the Promise. * Attaches callbacks for the resolution and/or rejection of the Promise.
* @param onfulfilled The callback to execute when the Promise is resolved. * @param onfulfilled The callback to execute when the Promise is resolved.
@@ -1273,27 +1273,27 @@ export type ProductBrandDeleteManyArgs<ExtArgs extends runtime.Types.Extensions.
} }
/** /**
* ProductBrand.productInfo * ProductBrand.products
*/ */
export type ProductBrand$productInfoArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { export type ProductBrand$productsArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
/** /**
* Select specific fields to fetch from the ProductInfo * Select specific fields to fetch from the Product
*/ */
select?: Prisma.ProductInfoSelect<ExtArgs> | null select?: Prisma.ProductSelect<ExtArgs> | null
/** /**
* Omit specific fields from the ProductInfo * Omit specific fields from the Product
*/ */
omit?: Prisma.ProductInfoOmit<ExtArgs> | null omit?: Prisma.ProductOmit<ExtArgs> | null
/** /**
* Choose, which related nodes to fetch as well * Choose, which related nodes to fetch as well
*/ */
include?: Prisma.ProductInfoInclude<ExtArgs> | null include?: Prisma.ProductInclude<ExtArgs> | null
where?: Prisma.ProductInfoWhereInput where?: Prisma.ProductWhereInput
orderBy?: Prisma.ProductInfoOrderByWithRelationInput | Prisma.ProductInfoOrderByWithRelationInput[] orderBy?: Prisma.ProductOrderByWithRelationInput | Prisma.ProductOrderByWithRelationInput[]
cursor?: Prisma.ProductInfoWhereUniqueInput cursor?: Prisma.ProductWhereUniqueInput
take?: number take?: number
skip?: number skip?: number
distinct?: Prisma.ProductInfoScalarFieldEnum | Prisma.ProductInfoScalarFieldEnum[] distinct?: Prisma.ProductScalarFieldEnum | Prisma.ProductScalarFieldEnum[]
} }
/** /**
+45 -45
View File
@@ -232,7 +232,7 @@ export type ProductCategoryWhereInput = {
createdAt?: Prisma.DateTimeFilter<"ProductCategory"> | Date | string createdAt?: Prisma.DateTimeFilter<"ProductCategory"> | Date | string
updatedAt?: Prisma.DateTimeFilter<"ProductCategory"> | Date | string updatedAt?: Prisma.DateTimeFilter<"ProductCategory"> | Date | string
deletedAt?: Prisma.DateTimeNullableFilter<"ProductCategory"> | Date | string | null deletedAt?: Prisma.DateTimeNullableFilter<"ProductCategory"> | Date | string | null
productInfo?: Prisma.ProductInfoListRelationFilter products?: Prisma.ProductListRelationFilter
} }
export type ProductCategoryOrderByWithRelationInput = { export type ProductCategoryOrderByWithRelationInput = {
@@ -243,7 +243,7 @@ export type ProductCategoryOrderByWithRelationInput = {
createdAt?: Prisma.SortOrder createdAt?: Prisma.SortOrder
updatedAt?: Prisma.SortOrder updatedAt?: Prisma.SortOrder
deletedAt?: Prisma.SortOrderInput | Prisma.SortOrder deletedAt?: Prisma.SortOrderInput | Prisma.SortOrder
productInfo?: Prisma.ProductInfoOrderByRelationAggregateInput products?: Prisma.ProductOrderByRelationAggregateInput
_relevance?: Prisma.ProductCategoryOrderByRelevanceInput _relevance?: Prisma.ProductCategoryOrderByRelevanceInput
} }
@@ -258,7 +258,7 @@ export type ProductCategoryWhereUniqueInput = Prisma.AtLeast<{
createdAt?: Prisma.DateTimeFilter<"ProductCategory"> | Date | string createdAt?: Prisma.DateTimeFilter<"ProductCategory"> | Date | string
updatedAt?: Prisma.DateTimeFilter<"ProductCategory"> | Date | string updatedAt?: Prisma.DateTimeFilter<"ProductCategory"> | Date | string
deletedAt?: Prisma.DateTimeNullableFilter<"ProductCategory"> | Date | string | null deletedAt?: Prisma.DateTimeNullableFilter<"ProductCategory"> | Date | string | null
productInfo?: Prisma.ProductInfoListRelationFilter products?: Prisma.ProductListRelationFilter
}, "id"> }, "id">
export type ProductCategoryOrderByWithAggregationInput = { export type ProductCategoryOrderByWithAggregationInput = {
@@ -296,7 +296,7 @@ export type ProductCategoryCreateInput = {
createdAt?: Date | string createdAt?: Date | string
updatedAt?: Date | string updatedAt?: Date | string
deletedAt?: Date | string | null deletedAt?: Date | string | null
productInfo?: Prisma.ProductInfoCreateNestedManyWithoutCategoryInput products?: Prisma.ProductCreateNestedManyWithoutCategoryInput
} }
export type ProductCategoryUncheckedCreateInput = { export type ProductCategoryUncheckedCreateInput = {
@@ -307,7 +307,7 @@ export type ProductCategoryUncheckedCreateInput = {
createdAt?: Date | string createdAt?: Date | string
updatedAt?: Date | string updatedAt?: Date | string
deletedAt?: Date | string | null deletedAt?: Date | string | null
productInfo?: Prisma.ProductInfoUncheckedCreateNestedManyWithoutCategoryInput products?: Prisma.ProductUncheckedCreateNestedManyWithoutCategoryInput
} }
export type ProductCategoryUpdateInput = { export type ProductCategoryUpdateInput = {
@@ -317,7 +317,7 @@ export type ProductCategoryUpdateInput = {
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
deletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null deletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
productInfo?: Prisma.ProductInfoUpdateManyWithoutCategoryNestedInput products?: Prisma.ProductUpdateManyWithoutCategoryNestedInput
} }
export type ProductCategoryUncheckedUpdateInput = { export type ProductCategoryUncheckedUpdateInput = {
@@ -328,7 +328,7 @@ export type ProductCategoryUncheckedUpdateInput = {
createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
deletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null deletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
productInfo?: Prisma.ProductInfoUncheckedUpdateManyWithoutCategoryNestedInput products?: Prisma.ProductUncheckedUpdateManyWithoutCategoryNestedInput
} }
export type ProductCategoryCreateManyInput = { export type ProductCategoryCreateManyInput = {
@@ -409,23 +409,23 @@ export type ProductCategorySumOrderByAggregateInput = {
id?: Prisma.SortOrder id?: Prisma.SortOrder
} }
export type ProductCategoryCreateNestedOneWithoutProductInfoInput = { export type ProductCategoryCreateNestedOneWithoutProductsInput = {
create?: Prisma.XOR<Prisma.ProductCategoryCreateWithoutProductInfoInput, Prisma.ProductCategoryUncheckedCreateWithoutProductInfoInput> create?: Prisma.XOR<Prisma.ProductCategoryCreateWithoutProductsInput, Prisma.ProductCategoryUncheckedCreateWithoutProductsInput>
connectOrCreate?: Prisma.ProductCategoryCreateOrConnectWithoutProductInfoInput connectOrCreate?: Prisma.ProductCategoryCreateOrConnectWithoutProductsInput
connect?: Prisma.ProductCategoryWhereUniqueInput connect?: Prisma.ProductCategoryWhereUniqueInput
} }
export type ProductCategoryUpdateOneWithoutProductInfoNestedInput = { export type ProductCategoryUpdateOneWithoutProductsNestedInput = {
create?: Prisma.XOR<Prisma.ProductCategoryCreateWithoutProductInfoInput, Prisma.ProductCategoryUncheckedCreateWithoutProductInfoInput> create?: Prisma.XOR<Prisma.ProductCategoryCreateWithoutProductsInput, Prisma.ProductCategoryUncheckedCreateWithoutProductsInput>
connectOrCreate?: Prisma.ProductCategoryCreateOrConnectWithoutProductInfoInput connectOrCreate?: Prisma.ProductCategoryCreateOrConnectWithoutProductsInput
upsert?: Prisma.ProductCategoryUpsertWithoutProductInfoInput upsert?: Prisma.ProductCategoryUpsertWithoutProductsInput
disconnect?: Prisma.ProductCategoryWhereInput | boolean disconnect?: Prisma.ProductCategoryWhereInput | boolean
delete?: Prisma.ProductCategoryWhereInput | boolean delete?: Prisma.ProductCategoryWhereInput | boolean
connect?: Prisma.ProductCategoryWhereUniqueInput connect?: Prisma.ProductCategoryWhereUniqueInput
update?: Prisma.XOR<Prisma.XOR<Prisma.ProductCategoryUpdateToOneWithWhereWithoutProductInfoInput, Prisma.ProductCategoryUpdateWithoutProductInfoInput>, Prisma.ProductCategoryUncheckedUpdateWithoutProductInfoInput> update?: Prisma.XOR<Prisma.XOR<Prisma.ProductCategoryUpdateToOneWithWhereWithoutProductsInput, Prisma.ProductCategoryUpdateWithoutProductsInput>, Prisma.ProductCategoryUncheckedUpdateWithoutProductsInput>
} }
export type ProductCategoryCreateWithoutProductInfoInput = { export type ProductCategoryCreateWithoutProductsInput = {
name: string name: string
description?: string | null description?: string | null
imageUrl?: string | null imageUrl?: string | null
@@ -434,7 +434,7 @@ export type ProductCategoryCreateWithoutProductInfoInput = {
deletedAt?: Date | string | null deletedAt?: Date | string | null
} }
export type ProductCategoryUncheckedCreateWithoutProductInfoInput = { export type ProductCategoryUncheckedCreateWithoutProductsInput = {
id?: number id?: number
name: string name: string
description?: string | null description?: string | null
@@ -444,23 +444,23 @@ export type ProductCategoryUncheckedCreateWithoutProductInfoInput = {
deletedAt?: Date | string | null deletedAt?: Date | string | null
} }
export type ProductCategoryCreateOrConnectWithoutProductInfoInput = { export type ProductCategoryCreateOrConnectWithoutProductsInput = {
where: Prisma.ProductCategoryWhereUniqueInput where: Prisma.ProductCategoryWhereUniqueInput
create: Prisma.XOR<Prisma.ProductCategoryCreateWithoutProductInfoInput, Prisma.ProductCategoryUncheckedCreateWithoutProductInfoInput> create: Prisma.XOR<Prisma.ProductCategoryCreateWithoutProductsInput, Prisma.ProductCategoryUncheckedCreateWithoutProductsInput>
} }
export type ProductCategoryUpsertWithoutProductInfoInput = { export type ProductCategoryUpsertWithoutProductsInput = {
update: Prisma.XOR<Prisma.ProductCategoryUpdateWithoutProductInfoInput, Prisma.ProductCategoryUncheckedUpdateWithoutProductInfoInput> update: Prisma.XOR<Prisma.ProductCategoryUpdateWithoutProductsInput, Prisma.ProductCategoryUncheckedUpdateWithoutProductsInput>
create: Prisma.XOR<Prisma.ProductCategoryCreateWithoutProductInfoInput, Prisma.ProductCategoryUncheckedCreateWithoutProductInfoInput> create: Prisma.XOR<Prisma.ProductCategoryCreateWithoutProductsInput, Prisma.ProductCategoryUncheckedCreateWithoutProductsInput>
where?: Prisma.ProductCategoryWhereInput where?: Prisma.ProductCategoryWhereInput
} }
export type ProductCategoryUpdateToOneWithWhereWithoutProductInfoInput = { export type ProductCategoryUpdateToOneWithWhereWithoutProductsInput = {
where?: Prisma.ProductCategoryWhereInput where?: Prisma.ProductCategoryWhereInput
data: Prisma.XOR<Prisma.ProductCategoryUpdateWithoutProductInfoInput, Prisma.ProductCategoryUncheckedUpdateWithoutProductInfoInput> data: Prisma.XOR<Prisma.ProductCategoryUpdateWithoutProductsInput, Prisma.ProductCategoryUncheckedUpdateWithoutProductsInput>
} }
export type ProductCategoryUpdateWithoutProductInfoInput = { export type ProductCategoryUpdateWithoutProductsInput = {
name?: Prisma.StringFieldUpdateOperationsInput | string name?: Prisma.StringFieldUpdateOperationsInput | string
description?: Prisma.NullableStringFieldUpdateOperationsInput | string | null description?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
imageUrl?: Prisma.NullableStringFieldUpdateOperationsInput | string | null imageUrl?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
@@ -469,7 +469,7 @@ export type ProductCategoryUpdateWithoutProductInfoInput = {
deletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null deletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
} }
export type ProductCategoryUncheckedUpdateWithoutProductInfoInput = { export type ProductCategoryUncheckedUpdateWithoutProductsInput = {
id?: Prisma.IntFieldUpdateOperationsInput | number id?: Prisma.IntFieldUpdateOperationsInput | number
name?: Prisma.StringFieldUpdateOperationsInput | string name?: Prisma.StringFieldUpdateOperationsInput | string
description?: Prisma.NullableStringFieldUpdateOperationsInput | string | null description?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
@@ -485,11 +485,11 @@ export type ProductCategoryUncheckedUpdateWithoutProductInfoInput = {
*/ */
export type ProductCategoryCountOutputType = { export type ProductCategoryCountOutputType = {
productInfo: number products: number
} }
export type ProductCategoryCountOutputTypeSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { export type ProductCategoryCountOutputTypeSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
productInfo?: boolean | ProductCategoryCountOutputTypeCountProductInfoArgs products?: boolean | ProductCategoryCountOutputTypeCountProductsArgs
} }
/** /**
@@ -505,8 +505,8 @@ export type ProductCategoryCountOutputTypeDefaultArgs<ExtArgs extends runtime.Ty
/** /**
* ProductCategoryCountOutputType without action * ProductCategoryCountOutputType without action
*/ */
export type ProductCategoryCountOutputTypeCountProductInfoArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { export type ProductCategoryCountOutputTypeCountProductsArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
where?: Prisma.ProductInfoWhereInput where?: Prisma.ProductWhereInput
} }
@@ -518,7 +518,7 @@ export type ProductCategorySelect<ExtArgs extends runtime.Types.Extensions.Inter
createdAt?: boolean createdAt?: boolean
updatedAt?: boolean updatedAt?: boolean
deletedAt?: boolean deletedAt?: boolean
productInfo?: boolean | Prisma.ProductCategory$productInfoArgs<ExtArgs> products?: boolean | Prisma.ProductCategory$productsArgs<ExtArgs>
_count?: boolean | Prisma.ProductCategoryCountOutputTypeDefaultArgs<ExtArgs> _count?: boolean | Prisma.ProductCategoryCountOutputTypeDefaultArgs<ExtArgs>
}, ExtArgs["result"]["productCategory"]> }, ExtArgs["result"]["productCategory"]>
@@ -536,14 +536,14 @@ export type ProductCategorySelectScalar = {
export type ProductCategoryOmit<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetOmit<"id" | "name" | "description" | "imageUrl" | "createdAt" | "updatedAt" | "deletedAt", ExtArgs["result"]["productCategory"]> export type ProductCategoryOmit<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetOmit<"id" | "name" | "description" | "imageUrl" | "createdAt" | "updatedAt" | "deletedAt", ExtArgs["result"]["productCategory"]>
export type ProductCategoryInclude<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { export type ProductCategoryInclude<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
productInfo?: boolean | Prisma.ProductCategory$productInfoArgs<ExtArgs> products?: boolean | Prisma.ProductCategory$productsArgs<ExtArgs>
_count?: boolean | Prisma.ProductCategoryCountOutputTypeDefaultArgs<ExtArgs> _count?: boolean | Prisma.ProductCategoryCountOutputTypeDefaultArgs<ExtArgs>
} }
export type $ProductCategoryPayload<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { export type $ProductCategoryPayload<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
name: "ProductCategory" name: "ProductCategory"
objects: { objects: {
productInfo: Prisma.$ProductInfoPayload<ExtArgs>[] products: Prisma.$ProductPayload<ExtArgs>[]
} }
scalars: runtime.Types.Extensions.GetPayloadResult<{ scalars: runtime.Types.Extensions.GetPayloadResult<{
id: number id: number
@@ -893,7 +893,7 @@ readonly fields: ProductCategoryFieldRefs;
*/ */
export interface Prisma__ProductCategoryClient<T, Null = never, ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs, GlobalOmitOptions = {}> extends Prisma.PrismaPromise<T> { export interface Prisma__ProductCategoryClient<T, Null = never, ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs, GlobalOmitOptions = {}> extends Prisma.PrismaPromise<T> {
readonly [Symbol.toStringTag]: "PrismaPromise" readonly [Symbol.toStringTag]: "PrismaPromise"
productInfo<T extends Prisma.ProductCategory$productInfoArgs<ExtArgs> = {}>(args?: Prisma.Subset<T, Prisma.ProductCategory$productInfoArgs<ExtArgs>>): Prisma.PrismaPromise<runtime.Types.Result.GetResult<Prisma.$ProductInfoPayload<ExtArgs>, T, "findMany", GlobalOmitOptions> | Null> products<T extends Prisma.ProductCategory$productsArgs<ExtArgs> = {}>(args?: Prisma.Subset<T, Prisma.ProductCategory$productsArgs<ExtArgs>>): Prisma.PrismaPromise<runtime.Types.Result.GetResult<Prisma.$ProductPayload<ExtArgs>, T, "findMany", GlobalOmitOptions> | Null>
/** /**
* Attaches callbacks for the resolution and/or rejection of the Promise. * Attaches callbacks for the resolution and/or rejection of the Promise.
* @param onfulfilled The callback to execute when the Promise is resolved. * @param onfulfilled The callback to execute when the Promise is resolved.
@@ -1273,27 +1273,27 @@ export type ProductCategoryDeleteManyArgs<ExtArgs extends runtime.Types.Extensio
} }
/** /**
* ProductCategory.productInfo * ProductCategory.products
*/ */
export type ProductCategory$productInfoArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { export type ProductCategory$productsArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
/** /**
* Select specific fields to fetch from the ProductInfo * Select specific fields to fetch from the Product
*/ */
select?: Prisma.ProductInfoSelect<ExtArgs> | null select?: Prisma.ProductSelect<ExtArgs> | null
/** /**
* Omit specific fields from the ProductInfo * Omit specific fields from the Product
*/ */
omit?: Prisma.ProductInfoOmit<ExtArgs> | null omit?: Prisma.ProductOmit<ExtArgs> | null
/** /**
* Choose, which related nodes to fetch as well * Choose, which related nodes to fetch as well
*/ */
include?: Prisma.ProductInfoInclude<ExtArgs> | null include?: Prisma.ProductInclude<ExtArgs> | null
where?: Prisma.ProductInfoWhereInput where?: Prisma.ProductWhereInput
orderBy?: Prisma.ProductInfoOrderByWithRelationInput | Prisma.ProductInfoOrderByWithRelationInput[] orderBy?: Prisma.ProductOrderByWithRelationInput | Prisma.ProductOrderByWithRelationInput[]
cursor?: Prisma.ProductInfoWhereUniqueInput cursor?: Prisma.ProductWhereUniqueInput
take?: number take?: number
skip?: number skip?: number
distinct?: Prisma.ProductInfoScalarFieldEnum | Prisma.ProductInfoScalarFieldEnum[] distinct?: Prisma.ProductScalarFieldEnum | Prisma.ProductScalarFieldEnum[]
} }
/** /**
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+1 -207
View File
@@ -280,7 +280,6 @@ export type SupplierWhereInput = {
createdAt?: Prisma.DateTimeNullableFilter<"Supplier"> | Date | string | null createdAt?: Prisma.DateTimeNullableFilter<"Supplier"> | Date | string | null
updatedAt?: Prisma.DateTimeNullableFilter<"Supplier"> | Date | string | null updatedAt?: Prisma.DateTimeNullableFilter<"Supplier"> | Date | string | null
deletedAt?: Prisma.DateTimeNullableFilter<"Supplier"> | Date | string | null deletedAt?: Prisma.DateTimeNullableFilter<"Supplier"> | Date | string | null
productInfo?: Prisma.ProductInfoListRelationFilter
} }
export type SupplierOrderByWithRelationInput = { export type SupplierOrderByWithRelationInput = {
@@ -297,7 +296,6 @@ export type SupplierOrderByWithRelationInput = {
createdAt?: Prisma.SortOrderInput | Prisma.SortOrder createdAt?: Prisma.SortOrderInput | Prisma.SortOrder
updatedAt?: Prisma.SortOrderInput | Prisma.SortOrder updatedAt?: Prisma.SortOrderInput | Prisma.SortOrder
deletedAt?: Prisma.SortOrderInput | Prisma.SortOrder deletedAt?: Prisma.SortOrderInput | Prisma.SortOrder
productInfo?: Prisma.ProductInfoOrderByRelationAggregateInput
_relevance?: Prisma.SupplierOrderByRelevanceInput _relevance?: Prisma.SupplierOrderByRelevanceInput
} }
@@ -318,7 +316,6 @@ export type SupplierWhereUniqueInput = Prisma.AtLeast<{
createdAt?: Prisma.DateTimeNullableFilter<"Supplier"> | Date | string | null createdAt?: Prisma.DateTimeNullableFilter<"Supplier"> | Date | string | null
updatedAt?: Prisma.DateTimeNullableFilter<"Supplier"> | Date | string | null updatedAt?: Prisma.DateTimeNullableFilter<"Supplier"> | Date | string | null
deletedAt?: Prisma.DateTimeNullableFilter<"Supplier"> | Date | string | null deletedAt?: Prisma.DateTimeNullableFilter<"Supplier"> | Date | string | null
productInfo?: Prisma.ProductInfoListRelationFilter
}, "id" | "mobileNumber"> }, "id" | "mobileNumber">
export type SupplierOrderByWithAggregationInput = { export type SupplierOrderByWithAggregationInput = {
@@ -374,7 +371,6 @@ export type SupplierCreateInput = {
createdAt?: Date | string | null createdAt?: Date | string | null
updatedAt?: Date | string | null updatedAt?: Date | string | null
deletedAt?: Date | string | null deletedAt?: Date | string | null
productInfo?: Prisma.ProductInfoCreateNestedManyWithoutSupplierInput
} }
export type SupplierUncheckedCreateInput = { export type SupplierUncheckedCreateInput = {
@@ -391,7 +387,6 @@ export type SupplierUncheckedCreateInput = {
createdAt?: Date | string | null createdAt?: Date | string | null
updatedAt?: Date | string | null updatedAt?: Date | string | null
deletedAt?: Date | string | null deletedAt?: Date | string | null
productInfo?: Prisma.ProductInfoUncheckedCreateNestedManyWithoutSupplierInput
} }
export type SupplierUpdateInput = { export type SupplierUpdateInput = {
@@ -407,7 +402,6 @@ export type SupplierUpdateInput = {
createdAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
updatedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null updatedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
deletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null deletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
productInfo?: Prisma.ProductInfoUpdateManyWithoutSupplierNestedInput
} }
export type SupplierUncheckedUpdateInput = { export type SupplierUncheckedUpdateInput = {
@@ -424,7 +418,6 @@ export type SupplierUncheckedUpdateInput = {
createdAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null createdAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
updatedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null updatedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
deletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null deletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
productInfo?: Prisma.ProductInfoUncheckedUpdateManyWithoutSupplierNestedInput
} }
export type SupplierCreateManyInput = { export type SupplierCreateManyInput = {
@@ -474,11 +467,6 @@ export type SupplierUncheckedUpdateManyInput = {
deletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null deletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
} }
export type SupplierScalarRelationFilter = {
is?: Prisma.SupplierWhereInput
isNot?: Prisma.SupplierWhereInput
}
export type SupplierOrderByRelevanceInput = { export type SupplierOrderByRelevanceInput = {
fields: Prisma.SupplierOrderByRelevanceFieldEnum | Prisma.SupplierOrderByRelevanceFieldEnum[] fields: Prisma.SupplierOrderByRelevanceFieldEnum | Prisma.SupplierOrderByRelevanceFieldEnum[]
sort: Prisma.SortOrder sort: Prisma.SortOrder
@@ -541,127 +529,6 @@ export type SupplierSumOrderByAggregateInput = {
id?: Prisma.SortOrder id?: Prisma.SortOrder
} }
export type SupplierCreateNestedOneWithoutProductInfoInput = {
create?: Prisma.XOR<Prisma.SupplierCreateWithoutProductInfoInput, Prisma.SupplierUncheckedCreateWithoutProductInfoInput>
connectOrCreate?: Prisma.SupplierCreateOrConnectWithoutProductInfoInput
connect?: Prisma.SupplierWhereUniqueInput
}
export type SupplierUpdateOneRequiredWithoutProductInfoNestedInput = {
create?: Prisma.XOR<Prisma.SupplierCreateWithoutProductInfoInput, Prisma.SupplierUncheckedCreateWithoutProductInfoInput>
connectOrCreate?: Prisma.SupplierCreateOrConnectWithoutProductInfoInput
upsert?: Prisma.SupplierUpsertWithoutProductInfoInput
connect?: Prisma.SupplierWhereUniqueInput
update?: Prisma.XOR<Prisma.XOR<Prisma.SupplierUpdateToOneWithWhereWithoutProductInfoInput, Prisma.SupplierUpdateWithoutProductInfoInput>, Prisma.SupplierUncheckedUpdateWithoutProductInfoInput>
}
export type SupplierCreateWithoutProductInfoInput = {
firstName: string
lastName: string
email?: string | null
mobileNumber: string
address?: string | null
city?: string | null
state?: string | null
country?: string | null
isActive?: boolean
createdAt?: Date | string | null
updatedAt?: Date | string | null
deletedAt?: Date | string | null
}
export type SupplierUncheckedCreateWithoutProductInfoInput = {
id?: number
firstName: string
lastName: string
email?: string | null
mobileNumber: string
address?: string | null
city?: string | null
state?: string | null
country?: string | null
isActive?: boolean
createdAt?: Date | string | null
updatedAt?: Date | string | null
deletedAt?: Date | string | null
}
export type SupplierCreateOrConnectWithoutProductInfoInput = {
where: Prisma.SupplierWhereUniqueInput
create: Prisma.XOR<Prisma.SupplierCreateWithoutProductInfoInput, Prisma.SupplierUncheckedCreateWithoutProductInfoInput>
}
export type SupplierUpsertWithoutProductInfoInput = {
update: Prisma.XOR<Prisma.SupplierUpdateWithoutProductInfoInput, Prisma.SupplierUncheckedUpdateWithoutProductInfoInput>
create: Prisma.XOR<Prisma.SupplierCreateWithoutProductInfoInput, Prisma.SupplierUncheckedCreateWithoutProductInfoInput>
where?: Prisma.SupplierWhereInput
}
export type SupplierUpdateToOneWithWhereWithoutProductInfoInput = {
where?: Prisma.SupplierWhereInput
data: Prisma.XOR<Prisma.SupplierUpdateWithoutProductInfoInput, Prisma.SupplierUncheckedUpdateWithoutProductInfoInput>
}
export type SupplierUpdateWithoutProductInfoInput = {
firstName?: Prisma.StringFieldUpdateOperationsInput | string
lastName?: Prisma.StringFieldUpdateOperationsInput | string
email?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
mobileNumber?: Prisma.StringFieldUpdateOperationsInput | string
address?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
city?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
state?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
country?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
isActive?: Prisma.BoolFieldUpdateOperationsInput | boolean
createdAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
updatedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
deletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
}
export type SupplierUncheckedUpdateWithoutProductInfoInput = {
id?: Prisma.IntFieldUpdateOperationsInput | number
firstName?: Prisma.StringFieldUpdateOperationsInput | string
lastName?: Prisma.StringFieldUpdateOperationsInput | string
email?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
mobileNumber?: Prisma.StringFieldUpdateOperationsInput | string
address?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
city?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
state?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
country?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
isActive?: Prisma.BoolFieldUpdateOperationsInput | boolean
createdAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
updatedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
deletedAt?: Prisma.NullableDateTimeFieldUpdateOperationsInput | Date | string | null
}
/**
* Count Type SupplierCountOutputType
*/
export type SupplierCountOutputType = {
productInfo: number
}
export type SupplierCountOutputTypeSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
productInfo?: boolean | SupplierCountOutputTypeCountProductInfoArgs
}
/**
* SupplierCountOutputType without action
*/
export type SupplierCountOutputTypeDefaultArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
/**
* Select specific fields to fetch from the SupplierCountOutputType
*/
select?: Prisma.SupplierCountOutputTypeSelect<ExtArgs> | null
}
/**
* SupplierCountOutputType without action
*/
export type SupplierCountOutputTypeCountProductInfoArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
where?: Prisma.ProductInfoWhereInput
}
export type SupplierSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetSelect<{ export type SupplierSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetSelect<{
@@ -678,8 +545,6 @@ export type SupplierSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs
createdAt?: boolean createdAt?: boolean
updatedAt?: boolean updatedAt?: boolean
deletedAt?: boolean deletedAt?: boolean
productInfo?: boolean | Prisma.Supplier$productInfoArgs<ExtArgs>
_count?: boolean | Prisma.SupplierCountOutputTypeDefaultArgs<ExtArgs>
}, ExtArgs["result"]["supplier"]> }, ExtArgs["result"]["supplier"]>
@@ -701,16 +566,10 @@ export type SupplierSelectScalar = {
} }
export type SupplierOmit<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetOmit<"id" | "firstName" | "lastName" | "email" | "mobileNumber" | "address" | "city" | "state" | "country" | "isActive" | "createdAt" | "updatedAt" | "deletedAt", ExtArgs["result"]["supplier"]> export type SupplierOmit<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetOmit<"id" | "firstName" | "lastName" | "email" | "mobileNumber" | "address" | "city" | "state" | "country" | "isActive" | "createdAt" | "updatedAt" | "deletedAt", ExtArgs["result"]["supplier"]>
export type SupplierInclude<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
productInfo?: boolean | Prisma.Supplier$productInfoArgs<ExtArgs>
_count?: boolean | Prisma.SupplierCountOutputTypeDefaultArgs<ExtArgs>
}
export type $SupplierPayload<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { export type $SupplierPayload<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
name: "Supplier" name: "Supplier"
objects: { objects: {}
productInfo: Prisma.$ProductInfoPayload<ExtArgs>[]
}
scalars: runtime.Types.Extensions.GetPayloadResult<{ scalars: runtime.Types.Extensions.GetPayloadResult<{
id: number id: number
firstName: string firstName: string
@@ -1065,7 +924,6 @@ readonly fields: SupplierFieldRefs;
*/ */
export interface Prisma__SupplierClient<T, Null = never, ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs, GlobalOmitOptions = {}> extends Prisma.PrismaPromise<T> { export interface Prisma__SupplierClient<T, Null = never, ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs, GlobalOmitOptions = {}> extends Prisma.PrismaPromise<T> {
readonly [Symbol.toStringTag]: "PrismaPromise" readonly [Symbol.toStringTag]: "PrismaPromise"
productInfo<T extends Prisma.Supplier$productInfoArgs<ExtArgs> = {}>(args?: Prisma.Subset<T, Prisma.Supplier$productInfoArgs<ExtArgs>>): Prisma.PrismaPromise<runtime.Types.Result.GetResult<Prisma.$ProductInfoPayload<ExtArgs>, T, "findMany", GlobalOmitOptions> | Null>
/** /**
* Attaches callbacks for the resolution and/or rejection of the Promise. * Attaches callbacks for the resolution and/or rejection of the Promise.
* @param onfulfilled The callback to execute when the Promise is resolved. * @param onfulfilled The callback to execute when the Promise is resolved.
@@ -1124,10 +982,6 @@ export type SupplierFindUniqueArgs<ExtArgs extends runtime.Types.Extensions.Inte
* Omit specific fields from the Supplier * Omit specific fields from the Supplier
*/ */
omit?: Prisma.SupplierOmit<ExtArgs> | null omit?: Prisma.SupplierOmit<ExtArgs> | null
/**
* Choose, which related nodes to fetch as well
*/
include?: Prisma.SupplierInclude<ExtArgs> | null
/** /**
* Filter, which Supplier to fetch. * Filter, which Supplier to fetch.
*/ */
@@ -1146,10 +1000,6 @@ export type SupplierFindUniqueOrThrowArgs<ExtArgs extends runtime.Types.Extensio
* Omit specific fields from the Supplier * Omit specific fields from the Supplier
*/ */
omit?: Prisma.SupplierOmit<ExtArgs> | null omit?: Prisma.SupplierOmit<ExtArgs> | null
/**
* Choose, which related nodes to fetch as well
*/
include?: Prisma.SupplierInclude<ExtArgs> | null
/** /**
* Filter, which Supplier to fetch. * Filter, which Supplier to fetch.
*/ */
@@ -1168,10 +1018,6 @@ export type SupplierFindFirstArgs<ExtArgs extends runtime.Types.Extensions.Inter
* Omit specific fields from the Supplier * Omit specific fields from the Supplier
*/ */
omit?: Prisma.SupplierOmit<ExtArgs> | null omit?: Prisma.SupplierOmit<ExtArgs> | null
/**
* Choose, which related nodes to fetch as well
*/
include?: Prisma.SupplierInclude<ExtArgs> | null
/** /**
* Filter, which Supplier to fetch. * Filter, which Supplier to fetch.
*/ */
@@ -1220,10 +1066,6 @@ export type SupplierFindFirstOrThrowArgs<ExtArgs extends runtime.Types.Extension
* Omit specific fields from the Supplier * Omit specific fields from the Supplier
*/ */
omit?: Prisma.SupplierOmit<ExtArgs> | null omit?: Prisma.SupplierOmit<ExtArgs> | null
/**
* Choose, which related nodes to fetch as well
*/
include?: Prisma.SupplierInclude<ExtArgs> | null
/** /**
* Filter, which Supplier to fetch. * Filter, which Supplier to fetch.
*/ */
@@ -1272,10 +1114,6 @@ export type SupplierFindManyArgs<ExtArgs extends runtime.Types.Extensions.Intern
* Omit specific fields from the Supplier * Omit specific fields from the Supplier
*/ */
omit?: Prisma.SupplierOmit<ExtArgs> | null omit?: Prisma.SupplierOmit<ExtArgs> | null
/**
* Choose, which related nodes to fetch as well
*/
include?: Prisma.SupplierInclude<ExtArgs> | null
/** /**
* Filter, which Suppliers to fetch. * Filter, which Suppliers to fetch.
*/ */
@@ -1319,10 +1157,6 @@ export type SupplierCreateArgs<ExtArgs extends runtime.Types.Extensions.Internal
* Omit specific fields from the Supplier * Omit specific fields from the Supplier
*/ */
omit?: Prisma.SupplierOmit<ExtArgs> | null omit?: Prisma.SupplierOmit<ExtArgs> | null
/**
* Choose, which related nodes to fetch as well
*/
include?: Prisma.SupplierInclude<ExtArgs> | null
/** /**
* The data needed to create a Supplier. * The data needed to create a Supplier.
*/ */
@@ -1352,10 +1186,6 @@ export type SupplierUpdateArgs<ExtArgs extends runtime.Types.Extensions.Internal
* Omit specific fields from the Supplier * Omit specific fields from the Supplier
*/ */
omit?: Prisma.SupplierOmit<ExtArgs> | null omit?: Prisma.SupplierOmit<ExtArgs> | null
/**
* Choose, which related nodes to fetch as well
*/
include?: Prisma.SupplierInclude<ExtArgs> | null
/** /**
* The data needed to update a Supplier. * The data needed to update a Supplier.
*/ */
@@ -1396,10 +1226,6 @@ export type SupplierUpsertArgs<ExtArgs extends runtime.Types.Extensions.Internal
* Omit specific fields from the Supplier * Omit specific fields from the Supplier
*/ */
omit?: Prisma.SupplierOmit<ExtArgs> | null omit?: Prisma.SupplierOmit<ExtArgs> | null
/**
* Choose, which related nodes to fetch as well
*/
include?: Prisma.SupplierInclude<ExtArgs> | null
/** /**
* The filter to search for the Supplier to update in case it exists. * The filter to search for the Supplier to update in case it exists.
*/ */
@@ -1426,10 +1252,6 @@ export type SupplierDeleteArgs<ExtArgs extends runtime.Types.Extensions.Internal
* Omit specific fields from the Supplier * Omit specific fields from the Supplier
*/ */
omit?: Prisma.SupplierOmit<ExtArgs> | null omit?: Prisma.SupplierOmit<ExtArgs> | null
/**
* Choose, which related nodes to fetch as well
*/
include?: Prisma.SupplierInclude<ExtArgs> | null
/** /**
* Filter which Supplier to delete. * Filter which Supplier to delete.
*/ */
@@ -1450,30 +1272,6 @@ export type SupplierDeleteManyArgs<ExtArgs extends runtime.Types.Extensions.Inte
limit?: number limit?: number
} }
/**
* Supplier.productInfo
*/
export type Supplier$productInfoArgs<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
/**
* Select specific fields to fetch from the ProductInfo
*/
select?: Prisma.ProductInfoSelect<ExtArgs> | null
/**
* Omit specific fields from the ProductInfo
*/
omit?: Prisma.ProductInfoOmit<ExtArgs> | null
/**
* Choose, which related nodes to fetch as well
*/
include?: Prisma.ProductInfoInclude<ExtArgs> | null
where?: Prisma.ProductInfoWhereInput
orderBy?: Prisma.ProductInfoOrderByWithRelationInput | Prisma.ProductInfoOrderByWithRelationInput[]
cursor?: Prisma.ProductInfoWhereUniqueInput
take?: number
skip?: number
distinct?: Prisma.ProductInfoScalarFieldEnum | Prisma.ProductInfoScalarFieldEnum[]
}
/** /**
* Supplier without action * Supplier without action
*/ */
@@ -1486,8 +1284,4 @@ export type SupplierDefaultArgs<ExtArgs extends runtime.Types.Extensions.Interna
* Omit specific fields from the Supplier * Omit specific fields from the Supplier
*/ */
omit?: Prisma.SupplierOmit<ExtArgs> | null omit?: Prisma.SupplierOmit<ExtArgs> | null
/**
* Choose, which related nodes to fetch as well
*/
include?: Prisma.SupplierInclude<ExtArgs> | null
} }
@@ -1,4 +1,10 @@
import { IsOptional, IsString } from 'class-validator'
export class CreateInventoryDto { export class CreateInventoryDto {
@IsString()
name: string name: string
@IsOptional()
@IsString()
location?: string location?: string
} }
@@ -1,5 +1,17 @@
import { Type } from 'class-transformer'
import { IsBoolean, IsOptional, IsString } from 'class-validator'
export class UpdateInventoryDto { export class UpdateInventoryDto {
@IsOptional()
@IsString()
name?: string name?: string
@IsOptional()
@IsString()
location?: string location?: string
@IsOptional()
@Type(() => Boolean)
@IsBoolean()
isActive?: boolean isActive?: boolean
} }
+17 -11
View File
@@ -1,27 +1,33 @@
import { Injectable } from '@nestjs/common' import { Injectable } from '@nestjs/common'
import { ResponseMapper } from '../common/response/response-mapper'
import { PrismaService } from '../prisma/prisma.service' import { PrismaService } from '../prisma/prisma.service'
@Injectable() @Injectable()
export class InventoriesService { export class InventoriesService {
constructor(private prisma: PrismaService) {} constructor(private prisma: PrismaService) {}
async create(data: any) {
create(data: any) { const item = await this.prisma.inventory.create({ data })
return this.prisma.inventory.create({ data }) return ResponseMapper.create(item)
} }
findAll() { async findAll() {
return this.prisma.inventory.findMany() const items = await this.prisma.inventory.findMany()
return ResponseMapper.list(items)
} }
findOne(id: number) { async findOne(id: number) {
return this.prisma.inventory.findUnique({ where: { id } }) const item = await this.prisma.inventory.findUnique({ where: { id } })
if (!item) return null
return ResponseMapper.single(item)
} }
update(id: number, data: any) { async update(id: number, data: any) {
return this.prisma.inventory.update({ where: { id }, data }) const item = await this.prisma.inventory.update({ where: { id }, data })
return ResponseMapper.update(item)
} }
remove(id: number) { async remove(id: number) {
return this.prisma.inventory.delete({ where: { id } }) const item = await this.prisma.inventory.delete({ where: { id } })
return ResponseMapper.single(item)
} }
} }
+8 -8
View File
@@ -1,17 +1,17 @@
import { PrismaMariaDb } from '@prisma/adapter-mariadb' import { PrismaMariaDb } from '@prisma/adapter-mariadb'
// import 'dotenv/config' import 'dotenv/config'
import { env } from 'prisma/config'
import { PrismaClient } from '../generated/prisma/client' import { PrismaClient } from '../generated/prisma/client'
console.log('@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@')
console.log(process.env.DATABASE_HOST)
const adapter = new PrismaMariaDb({ const adapter = new PrismaMariaDb({
host: process.env.DATABASE_HOST, host: env('DATABASE_HOST'),
user: process.env.DATABASE_USER, user: env('DATABASE_USER'),
password: process.env.DATABASE_PASSWORD, password: env('DATABASE_PASSWORD'),
database: process.env.DATABASE_NAME, database: env('DATABASE_NAME'),
connectionLimit: 5, connectionLimit: 5,
}) })
const prisma = new PrismaClient({ adapter }) const prisma = new PrismaClient({ adapter })
export { prisma } export { prisma }
+8 -1
View File
@@ -1,7 +1,8 @@
import { VersioningType } from '@nestjs/common' import { ValidationPipe, VersioningType } from '@nestjs/common'
import { NestFactory } from '@nestjs/core' import { NestFactory } from '@nestjs/core'
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger' import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'
import { AppModule } from './app.module' import { AppModule } from './app.module'
import { PrismaExceptionFilter } from './common/filters/prisma-exception.filter'
import { LoggingInterceptor } from './common/interceptors/logging.interceptor' import { LoggingInterceptor } from './common/interceptors/logging.interceptor'
import { ResponseMappingInterceptor } from './common/interceptors/response-mapping.interceptor' import { ResponseMappingInterceptor } from './common/interceptors/response-mapping.interceptor'
@@ -43,6 +44,12 @@ async function bootstrap() {
// Register global logging and response mapping interceptors // Register global logging and response mapping interceptors
app.useGlobalInterceptors(new LoggingInterceptor(), new ResponseMappingInterceptor()) app.useGlobalInterceptors(new LoggingInterceptor(), new ResponseMappingInterceptor())
// Enable request validation and transformation globally
app.useGlobalPipes(new ValidationPipe({ whitelist: true, transform: true }))
// Register global exception filter to map Prisma and validation errors to proper HTTP codes
app.useGlobalFilters(new PrismaExceptionFilter())
await app.listen(process.env.PORT ?? 3000) await app.listen(process.env.PORT ?? 3000)
} }
bootstrap() bootstrap()
@@ -1,5 +1,14 @@
import { IsOptional, IsString } from 'class-validator'
export class CreateProductBrandDto { export class CreateProductBrandDto {
@IsString()
name: string name: string
@IsOptional()
@IsString()
description?: string description?: string
@IsOptional()
@IsString()
imageUrl?: string imageUrl?: string
} }
@@ -1,5 +1,15 @@
import { IsOptional, IsString } from 'class-validator'
export class UpdateProductBrandDto { export class UpdateProductBrandDto {
@IsOptional()
@IsString()
name?: string name?: string
@IsOptional()
@IsString()
description?: string description?: string
@IsOptional()
@IsString()
imageUrl?: string imageUrl?: string
} }
+17 -11
View File
@@ -1,27 +1,33 @@
import { Injectable } from '@nestjs/common' import { Injectable } from '@nestjs/common'
import { ResponseMapper } from '../common/response/response-mapper'
import { PrismaService } from '../prisma/prisma.service' import { PrismaService } from '../prisma/prisma.service'
@Injectable() @Injectable()
export class ProductBrandsService { export class ProductBrandsService {
constructor(private prisma: PrismaService) {} constructor(private prisma: PrismaService) {}
async create(data: any) {
create(data: any) { const item = await this.prisma.productBrand.create({ data })
return this.prisma.productBrand.create({ data }) return ResponseMapper.create(item)
} }
findAll() { async findAll() {
return this.prisma.productBrand.findMany() const items = await this.prisma.productBrand.findMany()
return ResponseMapper.list(items)
} }
findOne(id: number) { async findOne(id: number) {
return this.prisma.productBrand.findUnique({ where: { id } }) const item = await this.prisma.productBrand.findUnique({ where: { id } })
if (!item) return null
return ResponseMapper.single(item)
} }
update(id: number, data: any) { async update(id: number, data: any) {
return this.prisma.productBrand.update({ where: { id }, data }) const item = await this.prisma.productBrand.update({ where: { id }, data })
return ResponseMapper.update(item)
} }
remove(id: number) { async remove(id: number) {
return this.prisma.productBrand.delete({ where: { id } }) const item = await this.prisma.productBrand.delete({ where: { id } })
return ResponseMapper.single(item)
} }
} }
@@ -1,5 +1,14 @@
import { IsOptional, IsString } from 'class-validator'
export class CreateProductCategoryDto { export class CreateProductCategoryDto {
@IsString()
name: string name: string
@IsOptional()
@IsString()
description?: string description?: string
@IsOptional()
@IsString()
imageUrl?: string imageUrl?: string
} }
@@ -1,5 +1,15 @@
import { IsOptional, IsString } from 'class-validator'
export class UpdateProductCategoryDto { export class UpdateProductCategoryDto {
@IsOptional()
@IsString()
name?: string name?: string
@IsOptional()
@IsString()
description?: string description?: string
@IsOptional()
@IsString()
imageUrl?: string imageUrl?: string
} }
@@ -1,27 +1,33 @@
import { Injectable } from '@nestjs/common' import { Injectable } from '@nestjs/common'
import { ResponseMapper } from '../common/response/response-mapper'
import { PrismaService } from '../prisma/prisma.service' import { PrismaService } from '../prisma/prisma.service'
@Injectable() @Injectable()
export class ProductCategoriesService { export class ProductCategoriesService {
constructor(private prisma: PrismaService) {} constructor(private prisma: PrismaService) {}
async create(data: any) {
create(data: any) { const item = await this.prisma.productCategory.create({ data })
return this.prisma.productCategory.create({ data }) return ResponseMapper.create(item)
} }
findAll() { async findAll() {
return this.prisma.productCategory.findMany() const items = await this.prisma.productCategory.findMany()
return ResponseMapper.list(items)
} }
findOne(id: number) { async findOne(id: number) {
return this.prisma.productCategory.findUnique({ where: { id } }) const item = await this.prisma.productCategory.findUnique({ where: { id } })
if (!item) return null
return ResponseMapper.single(item)
} }
update(id: number, data: any) { async update(id: number, data: any) {
return this.prisma.productCategory.update({ where: { id }, data }) const item = await this.prisma.productCategory.update({ where: { id }, data })
return ResponseMapper.update(item)
} }
remove(id: number) { async remove(id: number) {
return this.prisma.productCategory.delete({ where: { id } }) const item = await this.prisma.productCategory.delete({ where: { id } })
return ResponseMapper.single(item)
} }
} }
@@ -1,9 +0,0 @@
export class CreateProductInfoDto {
name: string
description?: string
productType?: string
metaData?: any
brandId?: number
categoryId?: number
vendorId: number
}
@@ -1,9 +0,0 @@
export class UpdateProductInfoDto {
name?: string
description?: string
productType?: string
metaData?: any
brandId?: number
categoryId?: number
vendorId?: number
}
@@ -1,34 +0,0 @@
import { Body, Controller, Delete, Get, Param, Patch, Post } from '@nestjs/common'
import { CreateProductInfoDto } from './dto/create-product-info.dto'
import { UpdateProductInfoDto } from './dto/update-product-info.dto'
import { ProductInfoService } from './product-info.service'
@Controller('product-info')
export class ProductInfoController {
constructor(private readonly productInfoService: ProductInfoService) {}
@Post()
create(@Body() dto: CreateProductInfoDto) {
return this.productInfoService.create(dto)
}
@Get()
findAll() {
return this.productInfoService.findAll()
}
@Get(':id')
findOne(@Param('id') id: string) {
return this.productInfoService.findOne(Number(id))
}
@Patch(':id')
update(@Param('id') id: string, @Body() dto: UpdateProductInfoDto) {
return this.productInfoService.update(Number(id), dto)
}
@Delete(':id')
remove(@Param('id') id: string) {
return this.productInfoService.remove(Number(id))
}
}
-11
View File
@@ -1,11 +0,0 @@
import { Module } from '@nestjs/common'
import { PrismaModule } from '../prisma/prisma.module'
import { ProductInfoController } from './product-info.controller'
import { ProductInfoService } from './product-info.service'
@Module({
imports: [PrismaModule],
controllers: [ProductInfoController],
providers: [ProductInfoService],
})
export class ProductInfoModule {}
-27
View File
@@ -1,27 +0,0 @@
import { Injectable } from '@nestjs/common'
import { PrismaService } from '../prisma/prisma.service'
@Injectable()
export class ProductInfoService {
constructor(private prisma: PrismaService) {}
create(data: any) {
return this.prisma.productInfo.create({ data })
}
findAll() {
return this.prisma.productInfo.findMany()
}
findOne(id: number) {
return this.prisma.productInfo.findUnique({ where: { id } })
}
update(id: number, data: any) {
return this.prisma.productInfo.update({ where: { id }, data })
}
remove(id: number) {
return this.prisma.productInfo.delete({ where: { id } })
}
}
@@ -0,0 +1,50 @@
import { Type } from 'class-transformer'
import { IsBoolean, IsInt, IsOptional, IsString } from 'class-validator'
export class CreateProductVariantDto {
@IsString()
name: string
@IsOptional()
@IsString()
description?: string
@IsOptional()
@IsString()
sku?: string
@IsOptional()
@IsString()
barcode?: string
@IsOptional()
@IsString()
imageUrl?: string
@IsOptional()
@Type(() => Number)
@IsInt()
attachmentId?: number
@IsString()
unit: string
@IsOptional()
@Type(() => Number)
@IsInt()
alertQuantity?: number
@IsOptional()
@Type(() => Boolean)
@IsBoolean()
isActive?: boolean
@IsOptional()
@Type(() => Boolean)
@IsBoolean()
isFeatured?: boolean
@Type(() => Number)
@IsInt()
productId: number
}
@@ -0,0 +1,63 @@
import { Type } from 'class-transformer'
import { IsBoolean, IsInt, IsOptional, IsString } from 'class-validator'
export class UpdateProductVariantDto {
@IsOptional()
@IsString()
name?: string
@IsOptional()
@IsString()
description?: string
@IsOptional()
@IsString()
sku?: string
@IsOptional()
@IsString()
barcode?: string
@IsOptional()
@IsString()
imageUrl?: string
@IsOptional()
@Type(() => Number)
@IsInt()
attachmentId?: number
@IsOptional()
@IsString()
unit?: string
@IsOptional()
@Type(() => Number)
@IsInt()
discount?: number
@IsOptional()
@Type(() => Number)
@IsInt()
quantity?: number
@IsOptional()
@Type(() => Number)
@IsInt()
alertQuantity?: number
@IsOptional()
@Type(() => Boolean)
@IsBoolean()
isActive?: boolean
@IsOptional()
@Type(() => Boolean)
@IsBoolean()
isFeatured?: boolean
@IsOptional()
@Type(() => Number)
@IsInt()
productId?: number
}
@@ -0,0 +1,34 @@
import { Body, Controller, Delete, Get, Param, Patch, Post } from '@nestjs/common'
import { CreateProductVariantDto } from './dto/create-product-variant.dto'
import { UpdateProductVariantDto } from './dto/update-product-variant.dto'
import { ProductVariantsService } from './product-variants.service'
@Controller('product-variants')
export class ProductVariantsController {
constructor(private readonly productVariantsService: ProductVariantsService) {}
@Post()
create(@Body() dto: CreateProductVariantDto) {
return this.productVariantsService.create(dto)
}
@Get()
findAll() {
return this.productVariantsService.findAll()
}
@Get(':id')
findOne(@Param('id') id: string) {
return this.productVariantsService.findOne(Number(id))
}
@Patch(':id')
update(@Param('id') id: string, @Body() dto: UpdateProductVariantDto) {
return this.productVariantsService.update(Number(id), dto)
}
@Delete(':id')
remove(@Param('id') id: string) {
return this.productVariantsService.remove(Number(id))
}
}
@@ -0,0 +1,11 @@
import { Module } from '@nestjs/common'
import { PrismaModule } from '../prisma/prisma.module'
import { ProductVariantsController } from './product-variants.controller'
import { ProductVariantsService } from './product-variants.service'
@Module({
imports: [PrismaModule],
controllers: [ProductVariantsController],
providers: [ProductVariantsService],
})
export class ProductVariantsModule {}
@@ -0,0 +1,43 @@
import { Injectable } from '@nestjs/common'
import { ResponseMapper } from '../common/response/response-mapper'
import { PrismaService } from '../prisma/prisma.service'
@Injectable()
export class ProductVariantsService {
constructor(private prisma: PrismaService) {}
async create(data: any) {
const item = await this.prisma.productVariant.create({ data })
return ResponseMapper.create(item)
}
async findAll() {
const items = await this.prisma.productVariant.findMany({
include: { product: true },
})
const mapped = items.map(p => {
const { productId, ...rest } = p as any
return { ...rest, product: p.product }
})
return ResponseMapper.list(mapped)
}
async findOne(id: number) {
const p = await this.prisma.productVariant.findUnique({
where: { id },
include: { product: true },
})
if (!p) return null
const { productId, ...rest } = p as any
return ResponseMapper.single({ ...rest, product: p.product })
}
async update(id: number, data: any) {
const item = await this.prisma.productVariant.update({ where: { id }, data })
return ResponseMapper.update(item)
}
async remove(id: number) {
const item = await this.prisma.productVariant.delete({ where: { id } })
return ResponseMapper.single(item)
}
}
+24 -10
View File
@@ -1,15 +1,29 @@
import { Type } from 'class-transformer'
import { IsInt, IsOptional, IsString } from 'class-validator'
export class CreateProductDto { export class CreateProductDto {
@IsString()
name: string name: string
description?: string
@IsOptional()
@IsString()
sku?: string sku?: string
@IsOptional()
@IsString()
barcode?: string barcode?: string
imageUrl?: string
attachmentId?: number @IsOptional()
unit: string @IsString()
discount?: number description?: string
quantity?: number
alertQuantity?: number @IsOptional()
isActive?: boolean @Type(() => Number)
isFeatured?: boolean @IsInt()
productInfoId: number brandId?: number
@IsOptional()
@Type(() => Number)
@IsInt()
categoryId?: number
} }
+25 -10
View File
@@ -1,15 +1,30 @@
import { Type } from 'class-transformer'
import { IsInt, IsOptional, IsString } from 'class-validator'
export class UpdateProductDto { export class UpdateProductDto {
@IsOptional()
@IsString()
name?: string name?: string
description?: string
@IsOptional()
@IsString()
sku?: string sku?: string
@IsOptional()
@IsString()
barcode?: string barcode?: string
imageUrl?: string
attachmentId?: number @IsOptional()
unit?: string @IsString()
discount?: number description?: string
quantity?: number
alertQuantity?: number @IsOptional()
isActive?: boolean @Type(() => Number)
isFeatured?: boolean @IsInt()
productInfoId?: number brandId?: number
@IsOptional()
@Type(() => Number)
@IsInt()
categoryId?: number
} }
+1
View File
@@ -9,6 +9,7 @@ export class ProductsController {
@Post() @Post()
create(@Body() dto: CreateProductDto) { create(@Body() dto: CreateProductDto) {
console.log('[ProductController] create called', dto)
return this.productsService.create(dto) return this.productsService.create(dto)
} }
+69 -10
View File
@@ -1,27 +1,86 @@
import { Injectable } from '@nestjs/common' import { Injectable } from '@nestjs/common'
import { ResponseMapper } from '../common/response/response-mapper'
import { PrismaService } from '../prisma/prisma.service' import { PrismaService } from '../prisma/prisma.service'
import { CreateProductDto } from './dto/create-product.dto'
@Injectable() @Injectable()
export class ProductsService { export class ProductsService {
constructor(private prisma: PrismaService) {} constructor(private prisma: PrismaService) {}
create(data: any) { async create(data: CreateProductDto) {
return this.prisma.product.create({ data }) console.log(data)
// Transform incoming DTO so relation ids are passed as `connect` objects
const payload: any = { ...data }
// If the client supplied brandId/categoryId (even null), remove the scalar
// Prisma expects nested relation objects, so only add `connect` when an id is present.
if (Object.prototype.hasOwnProperty.call(payload, 'brandId')) {
if (payload.brandId !== undefined && payload.brandId !== null) {
payload.brand = { connect: { id: Number(payload.brandId) } }
}
delete payload.brandId
} }
findAll() { if (Object.prototype.hasOwnProperty.call(payload, 'categoryId')) {
return this.prisma.product.findMany() if (payload.categoryId !== undefined && payload.categoryId !== null) {
payload.category = { connect: { id: Number(payload.categoryId) } }
}
delete payload.categoryId
} }
findOne(id: number) { const item = await this.prisma.product.create({ data: payload })
return this.prisma.product.findUnique({ where: { id } }) return ResponseMapper.create(item)
} }
update(id: number, data: any) { async findAll() {
return this.prisma.product.update({ where: { id }, data }) const items = await this.prisma.product.findMany({
include: { brand: true, category: true },
})
const mapped = items.map(p => {
const { brandId, categoryId, ...rest } = p as any
return { ...rest, brand: p.brand, category: p.category }
})
return ResponseMapper.list(mapped)
} }
remove(id: number) { async findOne(id: number) {
return this.prisma.product.delete({ where: { id } }) const p = await this.prisma.product.findUnique({
where: { id },
include: { brand: true, category: true },
})
if (!p) return null
console.log('first')
const { brandId, categoryId, ...rest } = p as any
return ResponseMapper.single({ ...rest, brand: p.brand, category: p.category })
}
async update(id: number, data: any) {
const payload: any = { ...data }
if (Object.prototype.hasOwnProperty.call(payload, 'brandId')) {
if (payload.brandId === null) {
payload.brand = { disconnect: true }
} else {
payload.brand = { connect: { id: Number(payload.brandId) } }
}
delete payload.brandId
}
if (Object.prototype.hasOwnProperty.call(payload, 'categoryId')) {
if (payload.categoryId === null) {
payload.category = { disconnect: true }
} else {
payload.category = { connect: { id: Number(payload.categoryId) } }
}
delete payload.categoryId
}
const item = await this.prisma.product.update({ where: { id }, data: payload })
return ResponseMapper.update(item)
}
async remove(id: number) {
const item = await this.prisma.product.delete({ where: { id } })
return ResponseMapper.single(item)
} }
} }
+9
View File
@@ -1,5 +1,14 @@
import { IsObject, IsOptional, IsString } from 'class-validator'
export class CreateRoleDto { export class CreateRoleDto {
@IsString()
name: string name: string
@IsOptional()
@IsString()
description?: string description?: string
@IsOptional()
@IsObject()
permissions?: any permissions?: any
} }
+10
View File
@@ -1,5 +1,15 @@
import { IsObject, IsOptional, IsString } from 'class-validator'
export class UpdateRoleDto { export class UpdateRoleDto {
@IsOptional()
@IsString()
name?: string name?: string
@IsOptional()
@IsString()
description?: string description?: string
@IsOptional()
@IsObject()
permissions?: any permissions?: any
} }
+17 -11
View File
@@ -1,27 +1,33 @@
import { Injectable } from '@nestjs/common' import { Injectable } from '@nestjs/common'
import { ResponseMapper } from '../common/response/response-mapper'
import { PrismaService } from '../prisma/prisma.service' import { PrismaService } from '../prisma/prisma.service'
@Injectable() @Injectable()
export class RolesService { export class RolesService {
constructor(private prisma: PrismaService) {} constructor(private prisma: PrismaService) {}
async create(data: any) {
create(data: any) { const item = await this.prisma.role.create({ data })
return this.prisma.role.create({ data }) return ResponseMapper.create(item)
} }
findAll() { async findAll() {
return this.prisma.role.findMany() const items = await this.prisma.role.findMany()
return ResponseMapper.list(items)
} }
findOne(id: number) { async findOne(id: number) {
return this.prisma.role.findUnique({ where: { id } }) const item = await this.prisma.role.findUnique({ where: { id } })
if (!item) return null
return ResponseMapper.single(item)
} }
update(id: number, data: any) { async update(id: number, data: any) {
return this.prisma.role.update({ where: { id }, data }) const item = await this.prisma.role.update({ where: { id }, data })
return ResponseMapper.update(item)
} }
remove(id: number) { async remove(id: number) {
return this.prisma.role.delete({ where: { id } }) const item = await this.prisma.role.delete({ where: { id } })
return ResponseMapper.single(item)
} }
} }
+6
View File
@@ -1,4 +1,10 @@
import { IsOptional, IsString } from 'class-validator'
export class CreateStoreDto { export class CreateStoreDto {
@IsString()
name: string name: string
@IsOptional()
@IsString()
location?: string location?: string
} }
+12
View File
@@ -1,5 +1,17 @@
import { Type } from 'class-transformer'
import { IsBoolean, IsOptional, IsString } from 'class-validator'
export class UpdateStoreDto { export class UpdateStoreDto {
@IsOptional()
@IsString()
name?: string name?: string
@IsOptional()
@IsString()
location?: string location?: string
@IsOptional()
@Type(() => Boolean)
@IsBoolean()
isActive?: boolean isActive?: boolean
} }
+17 -11
View File
@@ -1,27 +1,33 @@
import { Injectable } from '@nestjs/common' import { Injectable } from '@nestjs/common'
import { ResponseMapper } from '../common/response/response-mapper'
import { PrismaService } from '../prisma/prisma.service' import { PrismaService } from '../prisma/prisma.service'
@Injectable() @Injectable()
export class StoresService { export class StoresService {
constructor(private prisma: PrismaService) {} constructor(private prisma: PrismaService) {}
async create(data: any) {
create(data: any) { const item = await this.prisma.store.create({ data })
return this.prisma.store.create({ data }) return ResponseMapper.create(item)
} }
findAll() { async findAll() {
return this.prisma.store.findMany() const items = await this.prisma.store.findMany()
return ResponseMapper.list(items)
} }
findOne(id: number) { async findOne(id: number) {
return this.prisma.store.findUnique({ where: { id } }) const item = await this.prisma.store.findUnique({ where: { id } })
if (!item) return null
return ResponseMapper.single(item)
} }
update(id: number, data: any) { async update(id: number, data: any) {
return this.prisma.store.update({ where: { id }, data }) const item = await this.prisma.store.update({ where: { id }, data })
return ResponseMapper.update(item)
} }
remove(id: number) { async remove(id: number) {
return this.prisma.store.delete({ where: { id } }) const item = await this.prisma.store.delete({ where: { id } })
return ResponseMapper.single(item)
} }
} }
+23
View File
@@ -1,10 +1,33 @@
import { IsEmail, IsOptional, IsString } from 'class-validator'
export class CreateSupplierDto { export class CreateSupplierDto {
@IsString()
firstName: string firstName: string
@IsString()
lastName: string lastName: string
@IsOptional()
@IsEmail()
email?: string email?: string
@IsOptional()
@IsString()
mobileNumber?: string mobileNumber?: string
@IsOptional()
@IsString()
address?: string address?: string
@IsOptional()
@IsString()
city?: string city?: string
@IsOptional()
@IsString()
state?: string state?: string
@IsOptional()
@IsString()
country?: string country?: string
} }
+30
View File
@@ -1,11 +1,41 @@
import { Type } from 'class-transformer'
import { IsBoolean, IsEmail, IsOptional, IsString } from 'class-validator'
export class UpdateSupplierDto { export class UpdateSupplierDto {
@IsOptional()
@IsString()
firstName?: string firstName?: string
@IsOptional()
@IsString()
lastName?: string lastName?: string
@IsOptional()
@IsEmail()
email?: string email?: string
@IsOptional()
@IsString()
mobileNumber?: string mobileNumber?: string
@IsOptional()
@IsString()
address?: string address?: string
@IsOptional()
@IsString()
city?: string city?: string
@IsOptional()
@IsString()
state?: string state?: string
@IsOptional()
@IsString()
country?: string country?: string
@IsOptional()
@Type(() => Boolean)
@IsBoolean()
isActive?: boolean isActive?: boolean
} }
+17 -11
View File
@@ -1,27 +1,33 @@
import { Injectable } from '@nestjs/common' import { Injectable } from '@nestjs/common'
import { ResponseMapper } from '../common/response/response-mapper'
import { PrismaService } from '../prisma/prisma.service' import { PrismaService } from '../prisma/prisma.service'
@Injectable() @Injectable()
export class SuppliersService { export class SuppliersService {
constructor(private prisma: PrismaService) {} constructor(private prisma: PrismaService) {}
async create(data: any) {
create(data: any) { const item = await this.prisma.supplier.create({ data })
return this.prisma.supplier.create({ data }) return ResponseMapper.create(item)
} }
findAll() { async findAll() {
return this.prisma.supplier.findMany() const items = await this.prisma.supplier.findMany()
return ResponseMapper.list(items)
} }
findOne(id: number) { async findOne(id: number) {
return this.prisma.supplier.findUnique({ where: { id } }) const item = await this.prisma.supplier.findUnique({ where: { id } })
if (!item) return null
return ResponseMapper.single(item)
} }
update(id: number, data: any) { async update(id: number, data: any) {
return this.prisma.supplier.update({ where: { id }, data }) const item = await this.prisma.supplier.update({ where: { id }, data })
return ResponseMapper.update(item)
} }
remove(id: number) { async remove(id: number) {
return this.prisma.supplier.delete({ where: { id } }) const item = await this.prisma.supplier.delete({ where: { id } })
return ResponseMapper.single(item)
} }
} }
View File
View File
+13
View File
@@ -1,7 +1,20 @@
import { Type } from 'class-transformer'
import { IsInt, IsString } from 'class-validator'
export class CreateUserDto { export class CreateUserDto {
@IsString()
mobileNumber: string mobileNumber: string
@IsString()
password: string password: string
@IsString()
firstName: string firstName: string
@IsString()
lastName: string lastName: string
@Type(() => Number)
@IsInt()
roleId: number roleId: number
} }
+22
View File
@@ -1,8 +1,30 @@
import { Type } from 'class-transformer'
import { IsBoolean, IsInt, IsOptional, IsString } from 'class-validator'
export class UpdateUserDto { export class UpdateUserDto {
@IsOptional()
@IsString()
mobileNumber?: string mobileNumber?: string
@IsOptional()
@IsString()
password?: string password?: string
@IsOptional()
@IsString()
firstName?: string firstName?: string
@IsOptional()
@IsString()
lastName?: string lastName?: string
@IsOptional()
@Type(() => Number)
@IsInt()
roleId?: number roleId?: number
@IsOptional()
@Type(() => Boolean)
@IsBoolean()
isActive?: boolean isActive?: boolean
} }
+25 -11
View File
@@ -1,27 +1,41 @@
import { Injectable } from '@nestjs/common' import { Injectable } from '@nestjs/common'
import { ResponseMapper } from '../common/response/response-mapper'
import { PrismaService } from '../prisma/prisma.service' import { PrismaService } from '../prisma/prisma.service'
@Injectable() @Injectable()
export class UsersService { export class UsersService {
constructor(private prisma: PrismaService) {} constructor(private prisma: PrismaService) {}
async create(data: any) {
create(data: any) { const item = await this.prisma.user.create({ data })
return this.prisma.user.create({ data }) return ResponseMapper.create(item)
} }
findAll() { async findAll() {
return this.prisma.user.findMany() const users = await this.prisma.user.findMany({ include: { role: true } })
const mapped = users.map(u => {
const { roleId, ...rest } = u as any
return { ...rest, role: u.role }
})
return ResponseMapper.list(mapped)
} }
findOne(id: number) { async findOne(id: number) {
return this.prisma.user.findUnique({ where: { id } }) const user = await this.prisma.user.findUnique({
where: { id },
include: { role: true },
})
if (!user) return null
const { roleId, ...rest } = user as any
return ResponseMapper.single({ ...rest, role: user.role })
} }
update(id: number, data: any) { async update(id: number, data: any) {
return this.prisma.user.update({ where: { id }, data }) const item = await this.prisma.user.update({ where: { id }, data })
return ResponseMapper.update(item)
} }
remove(id: number) { async remove(id: number) {
return this.prisma.user.delete({ where: { id } }) const item = await this.prisma.user.delete({ where: { id } })
return ResponseMapper.single(item)
} }
} }