From cb0ec9a1c33de9b2e3c0fe6b1c695a311b2e8d43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20G=C3=B6ler=20von=20Ravensburg?= Date: Tue, 18 Jun 2019 22:58:16 +0200 Subject: [PATCH] add deals module get endpoint with category, start and limit params GG ez --- .env.example | 1 + .gitignore | 1 + .vscode/launch.json | 17 ++ backend/.prettierrc | 14 +- backend/README.md | 75 -------- backend/package-lock.json | 175 ++++++++++++++++-- backend/package.json | 4 + backend/src/app.controller.spec.ts | 22 --- backend/src/app.controller.ts | 12 -- backend/src/app.module.ts | 23 ++- backend/src/app.service.ts | 8 - backend/src/deals/deals.controller.spec.ts | 18 ++ backend/src/deals/deals.controller.ts | 20 ++ backend/src/deals/deals.module.ts | 13 ++ backend/src/deals/deals.service.spec.ts | 18 ++ backend/src/deals/deals.service.ts | 18 ++ .../src/deals/interfaces/deal.interface.ts | 12 ++ backend/src/deals/schemas/deal.schema.ts | 15 ++ backend/src/main.ts | 8 +- backend/tslint.json | 32 ++-- 20 files changed, 345 insertions(+), 161 deletions(-) create mode 100644 .env.example create mode 100644 .vscode/launch.json delete mode 100644 backend/README.md delete mode 100644 backend/src/app.controller.spec.ts delete mode 100644 backend/src/app.controller.ts delete mode 100644 backend/src/app.service.ts create mode 100644 backend/src/deals/deals.controller.spec.ts create mode 100644 backend/src/deals/deals.controller.ts create mode 100644 backend/src/deals/deals.module.ts create mode 100644 backend/src/deals/deals.service.spec.ts create mode 100644 backend/src/deals/deals.service.ts create mode 100644 backend/src/deals/interfaces/deal.interface.ts create mode 100644 backend/src/deals/schemas/deal.schema.ts diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..e8bfc83 --- /dev/null +++ b/.env.example @@ -0,0 +1 @@ +DATABASE_URI=connectionstring \ No newline at end of file diff --git a/.gitignore b/.gitignore index 826e47b..03c8d45 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ credentials.py +.env __pycache__ \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..6ae94f9 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Launch Program", + "program": "${workspaceFolder}/backend/src/deals/deals.controller.ts", + "outFiles": [ + "${workspaceFolder}/**/*.js" + ] + } + ] +} \ No newline at end of file diff --git a/backend/.prettierrc b/backend/.prettierrc index fe050ed..b4dbb13 100644 --- a/backend/.prettierrc +++ b/backend/.prettierrc @@ -1,9 +1,9 @@ { - "singleQuote": false, - "trailingComma": "all", - "bracketSpacing": true, - "printWidth": 120, - "useTabs": true, - "tabWidth": 4, - "semi": true + "singleQuote": false, + "trailingComma": "all", + "bracketSpacing": true, + "printWidth": 120, + "useTabs": false, + "tabWidth": 4, + "semi": true } diff --git a/backend/README.md b/backend/README.md deleted file mode 100644 index a59ef92..0000000 --- a/backend/README.md +++ /dev/null @@ -1,75 +0,0 @@ -

- Nest Logo -

- -[travis-image]: https://api.travis-ci.org/nestjs/nest.svg?branch=master -[travis-url]: https://travis-ci.org/nestjs/nest -[linux-image]: https://img.shields.io/travis/nestjs/nest/master.svg?label=linux -[linux-url]: https://travis-ci.org/nestjs/nest - -

A progressive Node.js framework for building efficient and scalable server-side applications, heavily inspired by Angular.

-

-NPM Version -Package License -NPM Downloads -Travis -Linux -Coverage -Gitter -Backers on Open Collective -Sponsors on Open Collective - - -

- - -## Description - -[Nest](https://github.com/nestjs/nest) framework TypeScript starter repository. - -## Installation - -```bash -$ npm install -``` - -## Running the app - -```bash -# development -$ npm run start - -# watch mode -$ npm run start:dev - -# production mode -$ npm run start:prod -``` - -## Test - -```bash -# unit tests -$ npm run test - -# e2e tests -$ npm run test:e2e - -# test coverage -$ npm run test:cov -``` - -## Support - -Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/support). - -## Stay in touch - -- Author - [Kamil Myƛliwiec](https://kamilmysliwiec.com) -- Website - [https://nestjs.com](https://nestjs.com/) -- Twitter - [@nestframework](https://twitter.com/nestframework) - -## License - - Nest is [MIT licensed](LICENSE). diff --git a/backend/package-lock.json b/backend/package-lock.json index 80c1194..ffac766 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -55,6 +55,11 @@ "uuid": "3.3.2" } }, + "@nestjs/mongoose": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@nestjs/mongoose/-/mongoose-6.1.2.tgz", + "integrity": "sha512-BkbkguvaPPGbL/41lK6P22DaQodBC9Yv9rUAmNlQVShChtwss7/cGj68AKC3jEoidrx75wCyDO3P8Tp6pggE4w==" + }, "@nestjs/platform-express": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-6.3.1.tgz", @@ -110,6 +115,14 @@ "integrity": "sha512-aRnpPa7ysx3aNW60hTiCtLHlQaIFsXFCgQlpakNgDNVFzbtusSY8PwjAQgRWfSk0ekNoBjO51eQRB6upA9uuyw==", "dev": true }, + "@types/dotenv": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/dotenv/-/dotenv-6.1.1.tgz", + "integrity": "sha512-ftQl3DtBvqHl9L16tpqqzA4YzCSXZfi7g8cQceTz5rOlYtk/IZbFjAv3mLOQlNIgOaylCQWQoBdDQHPgEBJPHg==", + "requires": { + "@types/node": "*" + } + }, "@types/express": { "version": "4.17.0", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.0.tgz", @@ -152,8 +165,7 @@ "@types/node": { "version": "10.14.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.9.tgz", - "integrity": "sha512-NelG/dSahlXYtSoVPErrp06tYFrvzj8XLWmKA+X8x0W//4MqbUyZu++giUG/v0bjAT6/Qxa8IjodrfdACyb0Fg==", - "dev": true + "integrity": "sha512-NelG/dSahlXYtSoVPErrp06tYFrvzj8XLWmKA+X8x0W//4MqbUyZu++giUG/v0bjAT6/Qxa8IjodrfdACyb0Fg==" }, "@types/range-parser": { "version": "1.2.3", @@ -686,7 +698,6 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", - "dev": true, "requires": { "lodash": "^4.17.11" } @@ -1116,6 +1127,11 @@ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -1227,6 +1243,11 @@ "node-int64": "^0.4.0" } }, + "bson": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.1.tgz", + "integrity": "sha512-jCGVYLoYMHDkOsbwJZBCqwMHyH4c+wzgI9hG7Z6SZJRXWr+x58pdIbm2i9a/jFGCkRJqRUr8eoI7lDWa0hTkxg==" + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -1991,6 +2012,11 @@ "is-obj": "^1.0.0" } }, + "dotenv": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.0.0.tgz", + "integrity": "sha512-30xVGqjLjiUOArT4+M5q9sYdvuR4riM6yK9wMcas9Vbp6zZa+ocC9dp6QoftuhTPhFAiLK/0C5Ni2nou/Bk8lg==" + }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", @@ -4665,6 +4691,11 @@ "verror": "1.10.0" } }, + "kareem": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.0.tgz", + "integrity": "sha512-6hHxsp9e6zQU8nXsP+02HGWXwTkOEw6IROhF2ZA28cYbUk4eJ6QbtZvdqZOdD9YPKghG3apk5eOCvs+tLl3lRg==" + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -4771,8 +4802,7 @@ "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" }, "lodash.sortby": { "version": "4.7.0", @@ -4898,6 +4928,12 @@ "timers-ext": "^0.1.5" } }, + "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 + }, "merge": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", @@ -5042,6 +5078,75 @@ "minimist": "0.0.8" } }, + "mongodb": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.2.7.tgz", + "integrity": "sha512-2YdWrdf1PJgxcCrT1tWoL6nHuk6hCxhddAAaEh8QJL231ci4+P9FLyqopbTm2Z2sAU6mhCri+wd9r1hOcHdoMw==", + "requires": { + "mongodb-core": "3.2.7", + "safe-buffer": "^5.1.2" + } + }, + "mongodb-core": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.2.7.tgz", + "integrity": "sha512-WypKdLxFNPOH/Jy6i9z47IjG2wIldA54iDZBmHMINcgKOUcWJh8og+Wix76oGd7EyYkHJKssQ2FAOw5Su/n4XQ==", + "requires": { + "bson": "^1.1.1", + "require_optional": "^1.0.1", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" + } + }, + "mongoose": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.6.0.tgz", + "integrity": "sha512-bhevx8u4NfZf2Un+CcKWRsiNekrLH7dSI8mBC49FcY2SUXQPZf3w+Yby+cgDrpZA46nkqRW9Qaqhs7PT0XCtYQ==", + "requires": { + "async": "2.6.2", + "bson": "~1.1.1", + "kareem": "2.3.0", + "mongodb": "3.2.7", + "mongodb-core": "3.2.7", + "mongoose-legacy-pluralize": "1.0.2", + "mpath": "0.6.0", + "mquery": "3.2.1", + "ms": "2.1.2", + "regexp-clone": "1.0.0", + "safe-buffer": "5.1.2", + "sift": "7.0.1", + "sliced": "1.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "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==" + }, + "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.1", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.1.tgz", + "integrity": "sha512-kY/K8QToZWTTocm0U+r8rqcJCp5PRl6e8tPmoDs5OeSO3DInZE2rAL6AYH+V406JTo8305LdASOQcxRDqHojyw==", + "requires": { + "bluebird": "3.5.1", + "debug": "3.1.0", + "regexp-clone": "^1.0.0", + "safe-buffer": "5.1.2", + "sliced": "1.0.1" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -6255,6 +6360,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==" + }, "registry-auth-token": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", @@ -6385,6 +6495,15 @@ "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" + } + }, "resolve": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", @@ -6401,13 +6520,20 @@ "dev": true, "requires": { "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } } }, "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" }, "resolve-url": { "version": "0.2.1", @@ -6782,6 +6908,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" + } + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -6791,8 +6926,7 @@ "semver": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" }, "semver-diff": { "version": "2.1.0", @@ -6911,6 +7045,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", @@ -6929,6 +7068,11 @@ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -7080,6 +7224,15 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, + "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" + } + }, "spawn-command": { "version": "0.0.2-1", "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", diff --git a/backend/package.json b/backend/package.json index c28b77a..d4893e7 100644 --- a/backend/package.json +++ b/backend/package.json @@ -22,7 +22,11 @@ "dependencies": { "@nestjs/common": "^6.0.0", "@nestjs/core": "^6.0.0", + "@nestjs/mongoose": "^6.1.2", "@nestjs/platform-express": "^6.0.0", + "@types/dotenv": "^6.1.1", + "dotenv": "^8.0.0", + "mongoose": "^5.6.0", "reflect-metadata": "^0.1.12", "rimraf": "^2.6.2", "rxjs": "^6.3.3" diff --git a/backend/src/app.controller.spec.ts b/backend/src/app.controller.spec.ts deleted file mode 100644 index d22f389..0000000 --- a/backend/src/app.controller.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { AppController } from './app.controller'; -import { AppService } from './app.service'; - -describe('AppController', () => { - let appController: AppController; - - beforeEach(async () => { - const app: TestingModule = await Test.createTestingModule({ - controllers: [AppController], - providers: [AppService], - }).compile(); - - appController = app.get(AppController); - }); - - describe('root', () => { - it('should return "Hello World!"', () => { - expect(appController.getHello()).toBe('Hello World!'); - }); - }); -}); diff --git a/backend/src/app.controller.ts b/backend/src/app.controller.ts deleted file mode 100644 index cce879e..0000000 --- a/backend/src/app.controller.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Controller, Get } from '@nestjs/common'; -import { AppService } from './app.service'; - -@Controller() -export class AppController { - constructor(private readonly appService: AppService) {} - - @Get() - getHello(): string { - return this.appService.getHello(); - } -} diff --git a/backend/src/app.module.ts b/backend/src/app.module.ts index 8662803..081d069 100644 --- a/backend/src/app.module.ts +++ b/backend/src/app.module.ts @@ -1,10 +1,21 @@ -import { Module } from '@nestjs/common'; -import { AppController } from './app.controller'; -import { AppService } from './app.service'; +import { Module } from "@nestjs/common"; +import { DealsModule } from "./deals/deals.module"; +import { MongooseModule } from "@nestjs/mongoose"; +import { config } from "dotenv"; +import { resolve } from "path"; +config({ path: resolve(__dirname, "../../.env") }); +const uri = process.env.DATABASE_URI || ""; @Module({ - imports: [], - controllers: [AppController], - providers: [AppService], + imports: [ + DealsModule, + MongooseModule.forRoot( + // tslint:disable-next-line: max-line-length + uri, + { + useNewUrlParser: true, + }, + ), + ], }) export class AppModule {} diff --git a/backend/src/app.service.ts b/backend/src/app.service.ts deleted file mode 100644 index 927d7cc..0000000 --- a/backend/src/app.service.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Injectable } from '@nestjs/common'; - -@Injectable() -export class AppService { - getHello(): string { - return 'Hello World!'; - } -} diff --git a/backend/src/deals/deals.controller.spec.ts b/backend/src/deals/deals.controller.spec.ts new file mode 100644 index 0000000..349b34b --- /dev/null +++ b/backend/src/deals/deals.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { DealsController } from './deals.controller'; + +describe('Deals Controller', () => { + let controller: DealsController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [DealsController], + }).compile(); + + controller = module.get(DealsController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/backend/src/deals/deals.controller.ts b/backend/src/deals/deals.controller.ts new file mode 100644 index 0000000..b4392c6 --- /dev/null +++ b/backend/src/deals/deals.controller.ts @@ -0,0 +1,20 @@ +import { Controller, Get, Param, Query, HttpException } from "@nestjs/common"; +import { DealsService } from "./deals.service"; +import { Deal } from "./interfaces/deal.interface"; + +@Controller("deals") +export class DealsController { + constructor(private readonly dealService: DealsService) {} + + @Get() + async findAll( + @Query("start") start = 0, + @Query("limit") limit = 1, + @Query("category") category: string, + ): Promise { + if (!category) { + throw new HttpException("Category must be defined", 500); + } + return this.dealService.findAll(category, Number(start), Number(limit)); + } +} diff --git a/backend/src/deals/deals.module.ts b/backend/src/deals/deals.module.ts new file mode 100644 index 0000000..379da18 --- /dev/null +++ b/backend/src/deals/deals.module.ts @@ -0,0 +1,13 @@ +import { Module } from "@nestjs/common"; +import { MongooseModule } from "@nestjs/mongoose"; +import { DealsController } from "./deals.controller"; +import { DealsService } from "./deals.service"; +import { DealSchema } from "./schemas/deal.schema"; + +@Module({ + imports: [MongooseModule.forFeature([{ name: "Deal", schema: DealSchema }])], + controllers: [DealsController], + providers: [DealsService], + exports: [DealsService], +}) +export class DealsModule {} diff --git a/backend/src/deals/deals.service.spec.ts b/backend/src/deals/deals.service.spec.ts new file mode 100644 index 0000000..b8b86d0 --- /dev/null +++ b/backend/src/deals/deals.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { DealsService } from './deals.service'; + +describe('DealsService', () => { + let service: DealsService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [DealsService], + }).compile(); + + service = module.get(DealsService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/backend/src/deals/deals.service.ts b/backend/src/deals/deals.service.ts new file mode 100644 index 0000000..64e7656 --- /dev/null +++ b/backend/src/deals/deals.service.ts @@ -0,0 +1,18 @@ +import { Injectable } from "@nestjs/common"; +import { InjectModel } from "@nestjs/mongoose"; +import { Model } from "mongoose"; +import { Deal } from "./interfaces/deal.interface"; + +@Injectable() +export class DealsService { + constructor(@InjectModel("Deal") private readonly dealModel: Model) {} + + async findAll(category: string, start: number, limit: number): Promise { + const deals = await this.dealModel + .find({ category }) + .skip(start) + .limit(limit) + .exec(); + return deals; + } +} diff --git a/backend/src/deals/interfaces/deal.interface.ts b/backend/src/deals/interfaces/deal.interface.ts new file mode 100644 index 0000000..168431a --- /dev/null +++ b/backend/src/deals/interfaces/deal.interface.ts @@ -0,0 +1,12 @@ +import { Document } from "mongoose"; + +export interface Deal extends Document { + readonly name: string; + readonly category: string; + readonly date: string; + readonly percent: string; + readonly link: string; + readonly priceNew: string; + readonly priceOld: string; + readonly seller: string; +} diff --git a/backend/src/deals/schemas/deal.schema.ts b/backend/src/deals/schemas/deal.schema.ts new file mode 100644 index 0000000..5e1d949 --- /dev/null +++ b/backend/src/deals/schemas/deal.schema.ts @@ -0,0 +1,15 @@ +import * as mongoose from "mongoose"; + +export const DealSchema = new mongoose.Schema( + { + name: String, + category: String, + date: String, + percent: String, + link: String, + priceNew: String, + priceOld: String, + seller: String, + }, + { collection: "items" }, +); diff --git a/backend/src/main.ts b/backend/src/main.ts index 13cad38..0a78d77 100644 --- a/backend/src/main.ts +++ b/backend/src/main.ts @@ -1,8 +1,8 @@ -import { NestFactory } from '@nestjs/core'; -import { AppModule } from './app.module'; +import { NestFactory } from "@nestjs/core"; +import { AppModule } from "./app.module"; async function bootstrap() { - const app = await NestFactory.create(AppModule); - await app.listen(3000); + const app = await NestFactory.create(AppModule); + await app.listen(3000); } bootstrap(); diff --git a/backend/tslint.json b/backend/tslint.json index 5651b2f..03406e2 100644 --- a/backend/tslint.json +++ b/backend/tslint.json @@ -1,18 +1,18 @@ { - "defaultSeverity": "error", - "extends": ["tslint:recommended"], - "jsRules": { - "no-unused-expression": true - }, - "rules": { - "quotemark": [true, "single"], - "member-access": [false], - "ordered-imports": [false], - "max-line-length": [true, 150], - "member-ordering": [false], - "interface-name": [false], - "arrow-parens": false, - "object-literal-sort-keys": false - }, - "rulesDirectory": [] + "defaultSeverity": "error", + "extends": ["tslint:recommended"], + "jsRules": { + "no-unused-expression": true + }, + "rules": { + "quotemark": [true, "double"], + "member-access": [false], + "ordered-imports": [false], + "max-line-length": [true, 120], + "member-ordering": [false], + "interface-name": [false], + "arrow-parens": false, + "object-literal-sort-keys": false + }, + "rulesDirectory": [] }