diff --git a/package-lock.json b/package-lock.json index bba8b89..cfad1bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "@nestjs/typeorm": "^10.0.2", "@types/passport-google-oauth20": "^2.0.14", "axios": "^1.6.8", "bcrypt": "^5.1.1", @@ -37,6 +38,7 @@ "passport-facebook": "^3.0.0", "passport-google-oauth": "^2.0.0", "pg": "^8.11.5", + "reflect-metadata": "^0.2.2", "stripe": "^15.8.0", "supertest": "^7.0.0", "swagger-jsdoc": "^6.2.8", @@ -55,8 +57,8 @@ "@types/mailgun-js": "^0.22.18", "@types/mocha": "^10.0.7", "@types/morgan": "^1.9.9", - "@types/node": "^20.14.9", "@types/multer": "^1.4.11", + "@types/node": "^20.14.9", "@types/node-cron": "^3.0.11", "@types/node-fetch": "^2.6.11", "@types/nodemailer": "^6.4.15", @@ -1408,6 +1410,15 @@ "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" }, + "node_modules/@lukeed/csprng": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", + "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", @@ -1427,6 +1438,94 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, + "node_modules/@nestjs/common": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.3.10.tgz", + "integrity": "sha512-H8k0jZtxk1IdtErGDmxFRy0PfcOAUg41Prrqpx76DQusGGJjsaovs1zjXVD1rZWaVYchfT1uczJ6L4Kio10VNg==", + "peer": true, + "dependencies": { + "iterare": "1.2.1", + "tslib": "2.6.3", + "uid": "2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "class-transformer": "*", + "class-validator": "*", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/core": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.3.10.tgz", + "integrity": "sha512-ZbQ4jovQyzHtCGCrzK5NdtW1SYO2fHSsgSY1+/9WdruYCUra+JDkWEXgZ4M3Hv480Dl3OXehAmY1wCOojeMyMQ==", + "hasInstallScript": true, + "peer": true, + "dependencies": { + "@nuxtjs/opencollective": "0.3.2", + "fast-safe-stringify": "2.1.1", + "iterare": "1.2.1", + "path-to-regexp": "3.2.0", + "tslib": "2.6.3", + "uid": "2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^10.0.0", + "@nestjs/microservices": "^10.0.0", + "@nestjs/platform-express": "^10.0.0", + "@nestjs/websockets": "^10.0.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + }, + "@nestjs/websockets": { + "optional": true + } + } + }, + "node_modules/@nestjs/core/node_modules/path-to-regexp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", + "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==", + "peer": true + }, + "node_modules/@nestjs/typeorm": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-10.0.2.tgz", + "integrity": "sha512-H738bJyydK4SQkRCTeh1aFBxoO1E9xdL/HaLGThwrqN95os5mEyAtK7BLADOS+vldP4jDZ2VQPLj4epWwRqCeQ==", + "dependencies": { + "uuid": "9.0.1" + }, + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", + "@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0", + "reflect-metadata": "^0.1.13 || ^0.2.0", + "rxjs": "^7.2.0", + "typeorm": "^0.3.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1462,6 +1561,24 @@ "node": ">= 8" } }, + "node_modules/@nuxtjs/opencollective": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", + "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", + "peer": true, + "dependencies": { + "chalk": "^4.1.0", + "consola": "^2.15.0", + "node-fetch": "^2.6.1" + }, + "bin": { + "opencollective": "bin/opencollective.js" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, "node_modules/@otplib/core": { "version": "12.0.1", "resolved": "https://registry.npmjs.org/@otplib/core/-/core-12.0.1.tgz", @@ -3432,6 +3549,12 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "peer": true + }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -5907,6 +6030,15 @@ "node": ">=8" } }, + "node_modules/iterare": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", + "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==", + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/jackspeak": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", @@ -8431,6 +8563,15 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "peer": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/safe-array-concat": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", @@ -9484,9 +9625,9 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, "node_modules/tsscmp": { "version": "1.0.6", @@ -9792,6 +9933,18 @@ "node": ">=0.8.0" } }, + "node_modules/uid": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", + "integrity": "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==", + "peer": true, + "dependencies": { + "@lukeed/csprng": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/uid2": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz", diff --git a/package.json b/package.json index 87a13dd..4852faf 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "lint": "eslint --config .eslintrc.json .", "format": "prettier --write .", "test": "cross-env NODE_ENV=test jest --runInBand --no-cache --detectOpenHandles", - "test:ci": "cross-env NODE_ENV=test jest --runInBand --coverage --detectOpenHandles" + "test:ci": "cross-env NODE_ENV=test jest --runInBand --coverage --detectOpenHandles", + "typeorm": "ts-node ./node_modules/typeorm/cli.js" }, "repository": { "type": "git", @@ -24,6 +25,7 @@ }, "homepage": "https://github.com/atlp-rwanda/dynamites-ecomm-be#readme", "dependencies": { + "@nestjs/typeorm": "^10.0.2", "@types/passport-google-oauth20": "^2.0.14", "axios": "^1.6.8", "bcrypt": "^5.1.1", @@ -52,6 +54,7 @@ "passport-facebook": "^3.0.0", "passport-google-oauth": "^2.0.0", "pg": "^8.11.5", + "reflect-metadata": "^0.2.2", "stripe": "^15.8.0", "supertest": "^7.0.0", "swagger-jsdoc": "^6.2.8", @@ -93,8 +96,8 @@ "@types/mailgun-js": "^0.22.18", "@types/mocha": "^10.0.7", "@types/morgan": "^1.9.9", - "@types/node": "^20.14.9", "@types/multer": "^1.4.11", + "@types/node": "^20.14.9", "@types/node-cron": "^3.0.11", "@types/node-fetch": "^2.6.11", "@types/nodemailer": "^6.4.15", diff --git a/src/database/models/productEntity.ts b/src/database/models/productEntity.ts index 05dee85..61ec864 100644 --- a/src/database/models/productEntity.ts +++ b/src/database/models/productEntity.ts @@ -51,11 +51,14 @@ export default class Product { @Column({ default: true }) isAvailable: boolean; - - @Column('float',{ default:0}) + + @Column({ default: false }) + isFeatured: boolean; + + @Column('float', { default: 0 }) averageRating: number; - @OneToMany(() => Review, review => review.product) + @OneToMany(() => Review, (review) => review.product) reviews: Review[]; @ManyToOne(() => UserModel, { onDelete: 'CASCADE' }) diff --git a/src/docs/productDoc.ts b/src/docs/productDoc.ts index fdf55db..dc3a693 100644 --- a/src/docs/productDoc.ts +++ b/src/docs/productDoc.ts @@ -113,6 +113,9 @@ * enum: ['Simple', 'Grouped', 'Variable'] * isAvailable: * type: boolean + * isFeatured: + * type: boolean + * default: false * responses: * '201': * description: Product successfully created @@ -277,7 +280,7 @@ * type: object * properties: * availability: - * type: boolean + * type: boolean * description: A boolean indicating the availability of the product * '403': * description: Forbidden - Product not owned by vendor