From 75596a9e33c4ac5ac6a654a2fa48538774535dd8 Mon Sep 17 00:00:00 2001 From: Felipe Santos Date: Thu, 12 Mar 2020 22:00:48 +0000 Subject: [PATCH] feat(products): create crud for products - NestJS CRUD (https://github.com/nestjsx/crud) to generate the RESTful CRUD for the object. - Swagger (https://docs.nestjs.com/recipes/swagger) to generate API documentation, listening at `/api/docs`. - Typegroose (https://github.com/typegoose/typegoose) to map Typescript objects to MongoDB/Mongoose. - https://www.npmjs.com/package/nest-crud-mongoose Took example from https://github.com/9173860/nest-crud-mongoose-demo. --- apps/api/src/app/app.module.ts | 7 +- apps/api/src/app/products/product.model.ts | 8 + .../app/products/products.controller.spec.ts | 18 + .../src/app/products/products.controller.ts | 16 + apps/api/src/app/products/products.module.ts | 13 + .../src/app/products/products.service.spec.ts | 18 + apps/api/src/app/products/products.service.ts | 14 + apps/api/src/main.ts | 18 +- package-lock.json | 322 +++++++++++++++++- package.json | 24 +- 10 files changed, 446 insertions(+), 12 deletions(-) create mode 100644 apps/api/src/app/products/product.model.ts create mode 100644 apps/api/src/app/products/products.controller.spec.ts create mode 100644 apps/api/src/app/products/products.controller.ts create mode 100644 apps/api/src/app/products/products.module.ts create mode 100644 apps/api/src/app/products/products.service.spec.ts create mode 100644 apps/api/src/app/products/products.service.ts diff --git a/apps/api/src/app/app.module.ts b/apps/api/src/app/app.module.ts index 2cb609a..b20c52b 100644 --- a/apps/api/src/app/app.module.ts +++ b/apps/api/src/app/app.module.ts @@ -2,9 +2,14 @@ import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; +import { ProductsModule } from './products/products.module'; +import { TypegooseModule } from 'nestjs-typegoose'; @Module({ - imports: [], + imports: [ + ProductsModule, + TypegooseModule.forRoot('mongodb://localhost:27017/price-search') + ], controllers: [AppController], providers: [AppService] }) diff --git a/apps/api/src/app/products/product.model.ts b/apps/api/src/app/products/product.model.ts new file mode 100644 index 0000000..7055a8e --- /dev/null +++ b/apps/api/src/app/products/product.model.ts @@ -0,0 +1,8 @@ +import { prop } from '@typegoose/typegoose'; +import { ApiProperty } from '@nestjs/swagger'; + +export class Product { + @ApiProperty() + @prop({ required: true }) + name: string; +} diff --git a/apps/api/src/app/products/products.controller.spec.ts b/apps/api/src/app/products/products.controller.spec.ts new file mode 100644 index 0000000..72a9a73 --- /dev/null +++ b/apps/api/src/app/products/products.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { ProductsController } from './products.controller'; + +describe('Products Controller', () => { + let controller: ProductsController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [ProductsController], + }).compile(); + + controller = module.get(ProductsController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/apps/api/src/app/products/products.controller.ts b/apps/api/src/app/products/products.controller.ts new file mode 100644 index 0000000..cea5e71 --- /dev/null +++ b/apps/api/src/app/products/products.controller.ts @@ -0,0 +1,16 @@ +import { Controller } from '@nestjs/common'; +import { Crud } from '@nestjsx/crud'; +import { ApiTags } from '@nestjs/swagger'; +import { Product } from './product.model'; +import { ProductsService } from './products.service'; + +@Crud({ + model: { + type: Product + } +}) +@ApiTags(Product.name) +@Controller('products') +export class ProductsController { + constructor(private readonly service: ProductsService) {} +} diff --git a/apps/api/src/app/products/products.module.ts b/apps/api/src/app/products/products.module.ts new file mode 100644 index 0000000..8866f3f --- /dev/null +++ b/apps/api/src/app/products/products.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { ProductsController } from './products.controller'; +import { ProductsService } from './products.service'; +import { TypegooseModule } from 'nestjs-typegoose'; +import { Product } from './product.model'; + +@Module({ + imports: [TypegooseModule.forFeature([Product])], + controllers: [ProductsController], + exports: [ProductsService], + providers: [ProductsService] +}) +export class ProductsModule {} diff --git a/apps/api/src/app/products/products.service.spec.ts b/apps/api/src/app/products/products.service.spec.ts new file mode 100644 index 0000000..588e399 --- /dev/null +++ b/apps/api/src/app/products/products.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { ProductsService } from './products.service'; + +describe('ProductsService', () => { + let service: ProductsService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ProductsService], + }).compile(); + + service = module.get(ProductsService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/apps/api/src/app/products/products.service.ts b/apps/api/src/app/products/products.service.ts new file mode 100644 index 0000000..d7c2140 --- /dev/null +++ b/apps/api/src/app/products/products.service.ts @@ -0,0 +1,14 @@ +import { Injectable } from '@nestjs/common'; +import { Product } from './product.model'; +import { ModelType, DocumentType } from '@typegoose/typegoose/lib/types'; +import { MongooseCrudService } from 'nest-crud-mongoose'; +import { InjectModel } from 'nestjs-typegoose'; + +@Injectable() +export class ProductsService extends MongooseCrudService< + DocumentType +> { + constructor(@InjectModel(Product) public repo: ModelType) { + super(repo); + } +} diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts index b7bb3e1..582434c 100644 --- a/apps/api/src/main.ts +++ b/apps/api/src/main.ts @@ -6,14 +6,30 @@ import { NestFactory } from '@nestjs/core'; import { AppModule } from './app/app.module'; +import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; +import { mongoose, setLogLevel, LogLevels } from '@typegoose/typegoose'; async function bootstrap() { const app = await NestFactory.create(AppModule); const globalPrefix = 'api'; app.setGlobalPrefix(globalPrefix); + + const options = new DocumentBuilder() + .setTitle('Price Search') + .setDescription('The Price Search API description') + .setVersion('1.0') + .build(); + const document = SwaggerModule.createDocument(app, options); + SwaggerModule.setup(`${globalPrefix}/docs`, app, document); + + mongoose.set('debug', true); + setLogLevel(LogLevels.DEBUG); + const port = process.env.port || 3333; await app.listen(port, () => { - console.log('Listening at http://localhost:' + port + '/' + globalPrefix); + const baseUrl = `http://localhost:${port}/${globalPrefix}`; + console.log(`Listening at ${baseUrl}`); + console.log(`Swagger UI listening at ${baseUrl}/docs`); }); } diff --git a/package-lock.json b/package-lock.json index 3cbfca5..4a58408 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2397,6 +2397,11 @@ } } }, + "@nestjs/mongoose": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@nestjs/mongoose/-/mongoose-6.3.1.tgz", + "integrity": "sha512-yILdv4ZNXUTNNvLC2qB6F30xsapv4U4xEttoP9S4p6xkK5bh9gbtAXOdnV/U7VH8oLKP29Rr6VRSRd3098+h5w==" + }, "@nestjs/platform-express": { "version": "6.11.11", "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-6.11.11.tgz", @@ -3189,6 +3194,22 @@ } } }, + "@nestjs/swagger": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-4.3.2.tgz", + "integrity": "sha512-KV0LCm9fUjDin/DMcTPaHCRz9SrI4W729YN6FUqd+lVOH7XSoK+0sVblKHUum5YsUv/5E4lI3Q6nhpdtkiZPPA==", + "requires": { + "lodash": "4.17.15", + "path-to-regexp": "3.2.0" + }, + "dependencies": { + "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==" + } + } + }, "@nestjs/testing": { "version": "6.11.11", "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-6.11.11.tgz", @@ -3199,6 +3220,37 @@ "tslib": "1.11.1" } }, + "@nestjsx/crud": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@nestjsx/crud/-/crud-4.4.1.tgz", + "integrity": "sha512-uUOoG5RxHCt1FYBbuYhrSDSkqcRstytfi0II2sGf1zVksgGK+WbFEt7FvTuRpCJJ14IjGzFMblOMat61GISV+g==", + "requires": { + "@nestjsx/crud-request": "^4.4.1", + "@nestjsx/util": "^4.4.1", + "deepmerge": "^3.2.0" + } + }, + "@nestjsx/crud-request": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@nestjsx/crud-request/-/crud-request-4.4.1.tgz", + "integrity": "sha512-Ukzu7xQJKOCGI4BalDL2x/9z6D9r81iGYq0/h3KvIwu25J+2IN5dlXzqqE/4yHYO/0Mdtj15dQiDKWKGwKg8nQ==", + "requires": { + "@nestjsx/util": "^4.4.1", + "qs": "^6.8.0" + }, + "dependencies": { + "qs": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.1.tgz", + "integrity": "sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA==" + } + } + }, + "@nestjsx/util": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@nestjsx/util/-/util-4.4.1.tgz", + "integrity": "sha512-iJSPGgbkOcHZTuXfXhix8n0Nldhbx2aJlU/j/fVAfBu7Et0dQR77Vnnx3kzsUWz63ElQy3GEz/ptJXyN283SPQ==" + }, "@ngtools/webpack": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-9.0.5.tgz", @@ -3809,6 +3861,25 @@ } } }, + "@typegoose/typegoose": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@typegoose/typegoose/-/typegoose-6.4.0.tgz", + "integrity": "sha512-3aJ2MxOIcTQ0gpGuQ3d4UGAUSATfI03Jberr4K6Xp7LnIehhVjBcVzaJETH2BR/H3sDOJXLUnHH+nJP218JFHQ==", + "requires": { + "lodash": "^4.17.15", + "loglevel": "^1.6.7", + "reflect-metadata": "^0.1.13", + "semver": "^7.1.3", + "tslib": "^1.11.0" + }, + "dependencies": { + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==" + } + } + }, "@types/babel__core": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.6.tgz", @@ -3850,6 +3921,14 @@ "@babel/types": "^7.3.0" } }, + "@types/bson": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.1.tgz", + "integrity": "sha512-K6VAEdLVJFBxKp8m5cRTbUfeZpuSvOuLKJLrgw9ANIXo00RiyGzgH4BKWWR4F520gV4tWmxG7q9sKQRVDuzrBw==", + "requires": { + "@types/node": "*" + } + }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -3924,11 +4003,28 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", "dev": true }, + "@types/mongodb": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.5.2.tgz", + "integrity": "sha512-/p4+HjfQqmNtq88rlLJ9XgUROhmbdUEU0yeVPCPIt8/vA1fSO1dSjwsRcGNaGuPMUSDRuRm8tDlXeGpWUVF71w==", + "requires": { + "@types/bson": "*", + "@types/node": "*" + } + }, + "@types/mongoose": { + "version": "5.7.6", + "resolved": "https://registry.npmjs.org/@types/mongoose/-/mongoose-5.7.6.tgz", + "integrity": "sha512-+GMPd3MRem1A7fw97PkE2aQwWoyYMMZ55lyr7slaCnAvz24+c2WQ2zGHafT9toW/gOciN2yDTY1e0xGLeKHgRA==", + "requires": { + "@types/mongodb": "*", + "@types/node": "*" + } + }, "@types/node": { "version": "8.9.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.5.tgz", - "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==", - "dev": true + "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==" }, "@types/parse-json": { "version": "4.0.0", @@ -3960,6 +4056,11 @@ "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", "dev": true }, + "@types/validator": { + "version": "10.11.3", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-10.11.3.tgz", + "integrity": "sha512-GKF2VnEkMmEeEGvoo03ocrP9ySMuX1ypKazIYMlsjfslfBMhOAtC5dmEWKdJioW4lJN7MZRS88kalTsVClyQ9w==" + }, "@types/webpack-sources": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.6.tgz", @@ -4907,6 +5008,15 @@ "file-uri-to-path": "1.0.0" } }, + "bl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.0.tgz", + "integrity": "sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, "bluebird": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz", @@ -5125,6 +5235,11 @@ "node-int64": "^0.4.0" } }, + "bson": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.3.tgz", + "integrity": "sha512-TdiJxMVnodVS7r0BdL42y/pqC9cL2iKynVwA0Ho3qbsQYr428veL3l7BQyuqiw+Q5SqqoT0m4srSY/BlZ9AxXg==" + }, "buffer": { "version": "4.9.2", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", @@ -5443,6 +5558,11 @@ "integrity": "sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw==", "dev": true }, + "class-transformer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.2.3.tgz", + "integrity": "sha512-qsP+0xoavpOlJHuYsQJsN58HXSl8Jvveo+T37rEvCEeRfMWoytAyR0Ua/YsFgpM6AZYZ/og2PJwArwzJl1aXtQ==" + }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -5464,6 +5584,16 @@ } } }, + "class-validator": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.11.0.tgz", + "integrity": "sha512-niAmmSPFku9xsnpYYrddy8NZRrCX3yyoZ/rgPKOilE5BG0Ma1eVCIxpR4X0LasL/6BzbYzsutG+mSbAXlh4zNw==", + "requires": { + "@types/validator": "10.11.3", + "google-libphonenumber": "^3.1.6", + "validator": "12.0.0" + } + }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -6928,6 +7058,11 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "deepmerge": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz", + "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==" + }, "default-gateway": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", @@ -7044,6 +7179,11 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, + "denque": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", + "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==" + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -8706,6 +8846,11 @@ } } }, + "google-libphonenumber": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/google-libphonenumber/-/google-libphonenumber-3.2.7.tgz", + "integrity": "sha512-8Es+gIaGoBddq/tqegG52iuzHOV+VU+de2mvkIOVlDkg/bnJlNdVZcof6iMPChy9Dte+si7BJeDaaueBtFoV6Q==" + }, "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", @@ -9505,6 +9650,11 @@ "ci-info": "^1.5.0" } }, + "is-class": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/is-class/-/is-class-0.0.9.tgz", + "integrity": "sha512-kUfRnejcRC9YLgblxoJ76dp9gZ3vMKTrDS5I6z2UVMOsHHSImNKCJocjQTkZr38PwiSZ9LVklaHEENaVYeFTXg==" + }, "is-color-stop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", @@ -11410,6 +11560,11 @@ "verror": "1.10.0" } }, + "kareem": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz", + "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==" + }, "karma-source-map-support": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", @@ -12065,8 +12220,7 @@ "loglevel": { "version": "1.6.7", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz", - "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==", - "dev": true + "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A==" }, "longest": { "version": "2.0.1", @@ -12251,6 +12405,12 @@ "readable-stream": "^2.0.1" } }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, "memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", @@ -12702,6 +12862,42 @@ "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", "dev": true }, + "mongodb": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.4.tgz", + "integrity": "sha512-xGH41Ig4dkSH5ROGezkgDbsgt/v5zbNUwE3TcFsSbDc6Qn3Qil17dhLsESSDDPTiyFDCPJRpfd4887dtsPgKtA==", + "requires": { + "bl": "^2.2.0", + "bson": "^1.1.1", + "denque": "^1.4.1", + "require_optional": "^1.0.1", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" + } + }, + "mongoose": { + "version": "5.9.4", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.9.4.tgz", + "integrity": "sha512-aUw4hzvJX9UJVN79JcElCwu/YsW1Sl/IDjErwiIX89xz77kmMjQjCmMsXGE1okUEcJGzGnXPqYl9BggXw8Nlvg==", + "requires": { + "bson": "~1.1.1", + "kareem": "2.3.1", + "mongodb": "3.5.4", + "mongoose-legacy-pluralize": "1.0.2", + "mpath": "0.6.0", + "mquery": "3.2.2", + "ms": "2.1.2", + "regexp-clone": "1.0.0", + "safe-buffer": "5.1.2", + "sift": "7.0.1", + "sliced": "1.0.1" + } + }, + "mongoose-legacy-pluralize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", + "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -12727,6 +12923,43 @@ } } }, + "mpath": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.6.0.tgz", + "integrity": "sha512-i75qh79MJ5Xo/sbhxrDrPSEG0H/mr1kcZXJ8dH6URU5jD/knFxCVqVC/gVSW7GIXL/9hHWlT9haLbCXWOll3qw==" + }, + "mquery": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz", + "integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==", + "requires": { + "bluebird": "3.5.1", + "debug": "3.1.0", + "regexp-clone": "^1.0.0", + "safe-buffer": "5.1.2", + "sliced": "1.0.1" + }, + "dependencies": { + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -12811,6 +13044,20 @@ "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, + "nest-crud-mongoose": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/nest-crud-mongoose/-/nest-crud-mongoose-0.0.5.tgz", + "integrity": "sha512-fW0F9/NikYJDiS3MrMevZQQepOLVSXmv1REwAfZDj/++7NBCukOzoH4zyEmfVrVMK82rtGDrtC2tcjrgl/qi1w==" + }, + "nestjs-typegoose": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/nestjs-typegoose/-/nestjs-typegoose-7.1.0.tgz", + "integrity": "sha512-Ah9Qe3jTBzDUmtatvuV5/EZobSxJmkTP+VmKyCCTadfL9iMbevLDcN+SX1L6zhC2F4DEdYbZ08/uy2w3XJW+WA==", + "requires": { + "is-class": "^0.0.9", + "reflect-metadata": "^0.1.13" + } + }, "next-tick": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", @@ -14818,6 +15065,11 @@ "safe-regex": "^1.1.0" } }, + "regexp-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", + "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" + }, "regexp.prototype.flags": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", @@ -14967,6 +15219,22 @@ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "requires": { + "resolve-from": "^2.0.0", + "semver": "^5.1.0" + }, + "dependencies": { + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + } + } + }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -15184,6 +15452,15 @@ } } }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, "sass": { "version": "1.23.3", "resolved": "https://registry.npmjs.org/sass/-/sass-1.23.3.tgz", @@ -15510,6 +15787,11 @@ "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", "dev": true }, + "sift": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", + "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -15563,6 +15845,11 @@ } } }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, "smart-buffer": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", @@ -15829,6 +16116,15 @@ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", @@ -16306,6 +16602,19 @@ "util.promisify": "~1.0.0" } }, + "swagger-ui-dist": { + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-3.25.0.tgz", + "integrity": "sha512-vwvJPPbdooTvDwLGzjIXinOXizDJJ6U1hxnJL3y6U3aL1d2MSXDmKg2139XaLBhsVZdnQJV2bOkX4reB+RXamg==" + }, + "swagger-ui-express": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.1.3.tgz", + "integrity": "sha512-f8SEn4YWkKh/HGK0ZjuA2VqA78i1aY6OIa5cqYNgOkBobfHV6Mz4dphQW/us8HYhEFfbENq329PyfIonWfzFrw==", + "requires": { + "swagger-ui-dist": "^3.18.1" + } + }, "symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", @@ -17105,6 +17414,11 @@ "builtins": "^1.0.3" } }, + "validator": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-12.0.0.tgz", + "integrity": "sha512-r5zA1cQBEOgYlesRmSEwc9LkbfNLTtji+vWyaHzRZUxCTHdsX3bd+sdHfs5tGZ2W6ILGGsxWxCNwT/h3IY/3ng==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/package.json b/package.json index a6ad561..e79f585 100644 --- a/package.json +++ b/package.json @@ -30,8 +30,6 @@ }, "private": true, "dependencies": { - "@angular/service-worker": "9.0.5", - "@nrwl/angular": "9.0.4", "@angular/animations": "9.0.5", "@angular/common": "9.0.5", "@angular/compiler": "9.0.5", @@ -40,13 +38,27 @@ "@angular/platform-browser": "9.0.5", "@angular/platform-browser-dynamic": "9.0.5", "@angular/router": "9.0.5", - "core-js": "^2.5.4", - "rxjs": "~6.5.4", - "zone.js": "^0.10.2", + "@angular/service-worker": "9.0.5", "@nestjs/common": "^6.8.3", "@nestjs/core": "^6.8.3", + "@nestjs/mongoose": "^6.3.1", "@nestjs/platform-express": "^6.8.3", - "reflect-metadata": "^0.1.13" + "@nestjs/swagger": "^4.3.2", + "@nestjsx/crud": "^4.4.1", + "@nestjsx/crud-request": "^4.4.1", + "@nrwl/angular": "9.0.4", + "@typegoose/typegoose": "^6.4.0", + "@types/mongoose": "^5.7.6", + "class-transformer": "^0.2.3", + "class-validator": "^0.11.0", + "core-js": "^2.5.4", + "mongoose": "^5.9.4", + "nest-crud-mongoose": "0.0.5", + "nestjs-typegoose": "^7.1.0", + "reflect-metadata": "^0.1.13", + "rxjs": "~6.5.4", + "swagger-ui-express": "^4.1.3", + "zone.js": "^0.10.2" }, "devDependencies": { "@angular-devkit/build-angular": "0.900.5",