From bf6e34fd56ba7f470b5b7bc59eca5e4296593509 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sat, 5 Feb 2022 18:28:53 +0100 Subject: [PATCH] Added database seeder for creating fake users --- backend/package-lock.json | 247 ++++++++++++++++++ backend/package.json | 2 + backend/src/observers/index.ts | 1 + backend/src/observers/user-seeder.observer.ts | 62 +++++ backend/src/repositories/user.repository.ts | 4 +- frontend/docker.sh | 1 + .../table/table.component.html | 2 +- frontend/src/environments/environment.prod.ts | 3 +- 8 files changed, 318 insertions(+), 4 deletions(-) create mode 100644 backend/src/observers/index.ts create mode 100644 backend/src/observers/user-seeder.observer.ts diff --git a/backend/package-lock.json b/backend/package-lock.json index 9c539eb..81b9c15 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -16,6 +16,7 @@ "@loopback/rest": "^10.1.0", "@loopback/rest-explorer": "^3.3.4", "@loopback/service-proxy": "^3.2.4", + "faker": "^5.5.3", "loopback-connector-mysql": "^5.4.4", "tslib": "^2.0.0" }, @@ -25,6 +26,7 @@ "@loopback/testlab": "^3.4.4", "@types/node": "^10.17.60", "eslint": "^7.32.0", + "mockingbird": "^2.1.2", "source-map-support": "^0.5.20", "tsc-watch": "^4.5.0", "typescript": "~4.4.4" @@ -1039,6 +1041,38 @@ "node": "^10.16 || 12 || 14 || 16" } }, + "node_modules/@mockingbird/common": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@mockingbird/common/-/common-2.0.3.tgz", + "integrity": "sha512-HD/wHlbdyL4wq3kM89HzIymgP+hBb17uWvT8ILcBuTTz0s42MaBFwSJgUj7qMc1p62Url4yGox5fEBqrzc1bcg==", + "dev": true, + "dependencies": { + "@types/faker": "^5.5.7", + "faker": "^5.5.3" + } + }, + "node_modules/@mockingbird/parser": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@mockingbird/parser/-/parser-3.0.2.tgz", + "integrity": "sha512-UgwYwquxzOWgzrA3sHq/buaIUwzB+dJHCtaT8ZV244v3FKDRMLfqzHLulh4RV5dyVztGceU2ytMHcRFgASIcSg==", + "dev": true, + "dependencies": { + "@mockingbird/reflect": "^3.0.2", + "randexp": "^0.5.3", + "typedi": "^0.10.0" + } + }, + "node_modules/@mockingbird/reflect": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@mockingbird/reflect/-/reflect-3.0.2.tgz", + "integrity": "sha512-gvkoO6NthV80nyarVNaBRpWEm1mlk/brxbcWT82Z1z84tTtrZev0bTb86oRhU1c29MIKzfh3VCkzIRc/2ooWSA==", + "dev": true, + "dependencies": { + "@plumier/reflect": "^1.0.5", + "reflect-metadata": "^0.1.13", + "tslib": "^2.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", @@ -1082,6 +1116,29 @@ "fast-deep-equal": "^3.1.3" } }, + "node_modules/@plumier/reflect": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@plumier/reflect/-/reflect-1.0.6.tgz", + "integrity": "sha512-T/wkxlrXZ3qJV07YFC67I5HXlI1E2D7Kmq7skZxu7KEoqjMWrTEpvug2mJ7tze0WeDtPerl9C9m55lk+0+Ipyw==", + "dev": true, + "dependencies": { + "@types/acorn": "4.0.6", + "acorn": "8.5.0", + "reflect-metadata": "^0.1.13" + } + }, + "node_modules/@plumier/reflect/node_modules/acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -1117,6 +1174,15 @@ "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", "dev": true }, + "node_modules/@types/acorn": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", + "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, "node_modules/@types/bcryptjs": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz", @@ -1168,6 +1234,12 @@ "@types/ms": "*" } }, + "node_modules/@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "dev": true + }, "node_modules/@types/express": { "version": "4.17.13", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", @@ -1194,6 +1266,12 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz", "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==" }, + "node_modules/@types/faker": { + "version": "5.5.9", + "resolved": "https://registry.npmjs.org/@types/faker/-/faker-5.5.9.tgz", + "integrity": "sha512-uCx6mP3UY5SIO14XlspxsGjgaemrxpssJI0Ol+GfhxtcKpv9pgRZYsS4eeKeHVLje6Qtc8lGszuBI461+gVZBA==", + "dev": true + }, "node_modules/@types/fs-extra": { "version": "9.0.13", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", @@ -2330,6 +2408,15 @@ "tslib": "^2.0.3" } }, + "node_modules/drange": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz", + "integrity": "sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -2965,6 +3052,11 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/faker": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", + "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4727,6 +4819,17 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/mockingbird": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mockingbird/-/mockingbird-2.1.2.tgz", + "integrity": "sha512-FxPChvI9QVY/mq4Mx8b2JWpbBZNunP7ab539uyJvGI4+JxLDJ6S4w4xHEKbqnM7S9RcSmeUShNEKeoa6g8GV8g==", + "dev": true, + "dependencies": { + "@mockingbird/common": "^2.0.3", + "@mockingbird/parser": "^3.0.2", + "@mockingbird/reflect": "^3.0.2" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -5694,6 +5797,19 @@ "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==", "dev": true }, + "node_modules/randexp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz", + "integrity": "sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==", + "dev": true, + "dependencies": { + "drange": "^1.0.2", + "ret": "^0.2.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -5854,6 +5970,15 @@ "node": ">=4" } }, + "node_modules/ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -6729,6 +6854,12 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typedi": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/typedi/-/typedi-0.10.0.tgz", + "integrity": "sha512-v3UJF8xm68BBj6AF4oQML3ikrfK2c9EmZUyLOfShpJuItAqVBHWP/KtpGinkSsIiP6EZyyb6Z3NXyW9dgS9X1w==", + "dev": true + }, "node_modules/typescript": { "version": "4.4.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", @@ -7794,6 +7925,38 @@ "tslib": "^2.3.1" } }, + "@mockingbird/common": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@mockingbird/common/-/common-2.0.3.tgz", + "integrity": "sha512-HD/wHlbdyL4wq3kM89HzIymgP+hBb17uWvT8ILcBuTTz0s42MaBFwSJgUj7qMc1p62Url4yGox5fEBqrzc1bcg==", + "dev": true, + "requires": { + "@types/faker": "^5.5.7", + "faker": "^5.5.3" + } + }, + "@mockingbird/parser": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@mockingbird/parser/-/parser-3.0.2.tgz", + "integrity": "sha512-UgwYwquxzOWgzrA3sHq/buaIUwzB+dJHCtaT8ZV244v3FKDRMLfqzHLulh4RV5dyVztGceU2ytMHcRFgASIcSg==", + "dev": true, + "requires": { + "@mockingbird/reflect": "^3.0.2", + "randexp": "^0.5.3", + "typedi": "^0.10.0" + } + }, + "@mockingbird/reflect": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@mockingbird/reflect/-/reflect-3.0.2.tgz", + "integrity": "sha512-gvkoO6NthV80nyarVNaBRpWEm1mlk/brxbcWT82Z1z84tTtrZev0bTb86oRhU1c29MIKzfh3VCkzIRc/2ooWSA==", + "dev": true, + "requires": { + "@plumier/reflect": "^1.0.5", + "reflect-metadata": "^0.1.13", + "tslib": "^2.3.0" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -7828,6 +7991,25 @@ "fast-deep-equal": "^3.1.3" } }, + "@plumier/reflect": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@plumier/reflect/-/reflect-1.0.6.tgz", + "integrity": "sha512-T/wkxlrXZ3qJV07YFC67I5HXlI1E2D7Kmq7skZxu7KEoqjMWrTEpvug2mJ7tze0WeDtPerl9C9m55lk+0+Ipyw==", + "dev": true, + "requires": { + "@types/acorn": "4.0.6", + "acorn": "8.5.0", + "reflect-metadata": "^0.1.13" + }, + "dependencies": { + "acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true + } + } + }, "@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -7863,6 +8045,15 @@ "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", "dev": true }, + "@types/acorn": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", + "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "dev": true, + "requires": { + "@types/estree": "*" + } + }, "@types/bcryptjs": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz", @@ -7918,6 +8109,12 @@ "@types/ms": "*" } }, + "@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "dev": true + }, "@types/express": { "version": "4.17.13", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", @@ -7946,6 +8143,12 @@ } } }, + "@types/faker": { + "version": "5.5.9", + "resolved": "https://registry.npmjs.org/@types/faker/-/faker-5.5.9.tgz", + "integrity": "sha512-uCx6mP3UY5SIO14XlspxsGjgaemrxpssJI0Ol+GfhxtcKpv9pgRZYsS4eeKeHVLje6Qtc8lGszuBI461+gVZBA==", + "dev": true + }, "@types/fs-extra": { "version": "9.0.13", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", @@ -8847,6 +9050,12 @@ "tslib": "^2.0.3" } }, + "drange": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz", + "integrity": "sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==", + "dev": true + }, "duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -9333,6 +9542,11 @@ } } }, + "faker": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", + "integrity": "sha512-wLTv2a28wjUyWkbnX7u/ABZBkUkIF2fCd73V6P2oFqEGEktDfzWx4UxrSqtPRw0xPRAcjeAOIiJWqZm3pP4u3g==" + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -10681,6 +10895,17 @@ } } }, + "mockingbird": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mockingbird/-/mockingbird-2.1.2.tgz", + "integrity": "sha512-FxPChvI9QVY/mq4Mx8b2JWpbBZNunP7ab539uyJvGI4+JxLDJ6S4w4xHEKbqnM7S9RcSmeUShNEKeoa6g8GV8g==", + "dev": true, + "requires": { + "@mockingbird/common": "^2.0.3", + "@mockingbird/parser": "^3.0.2", + "@mockingbird/reflect": "^3.0.2" + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -11422,6 +11647,16 @@ "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==", "dev": true }, + "randexp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz", + "integrity": "sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==", + "dev": true, + "requires": { + "drange": "^1.0.2", + "ret": "^0.2.0" + } + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -11550,6 +11785,12 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, + "ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", + "dev": true + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -12236,6 +12477,12 @@ "is-typedarray": "^1.0.0" } }, + "typedi": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/typedi/-/typedi-0.10.0.tgz", + "integrity": "sha512-v3UJF8xm68BBj6AF4oQML3ikrfK2c9EmZUyLOfShpJuItAqVBHWP/KtpGinkSsIiP6EZyyb6Z3NXyW9dgS9X1w==", + "dev": true + }, "typescript": { "version": "4.4.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", diff --git a/backend/package.json b/backend/package.json index 6995830..4ea94a6 100644 --- a/backend/package.json +++ b/backend/package.json @@ -58,6 +58,7 @@ "@loopback/rest": "^10.1.0", "@loopback/rest-explorer": "^3.3.4", "@loopback/service-proxy": "^3.2.4", + "faker": "^5.5.3", "loopback-connector-mysql": "^5.4.4", "tslib": "^2.0.0" }, @@ -67,6 +68,7 @@ "@loopback/testlab": "^3.4.4", "@types/node": "^10.17.60", "eslint": "^7.32.0", + "mockingbird": "^2.1.2", "source-map-support": "^0.5.20", "tsc-watch": "^4.5.0", "typescript": "~4.4.4" diff --git a/backend/src/observers/index.ts b/backend/src/observers/index.ts new file mode 100644 index 0000000..e904674 --- /dev/null +++ b/backend/src/observers/index.ts @@ -0,0 +1 @@ +export * from './user-seeder.observer'; diff --git a/backend/src/observers/user-seeder.observer.ts b/backend/src/observers/user-seeder.observer.ts new file mode 100644 index 0000000..3fd7cd1 --- /dev/null +++ b/backend/src/observers/user-seeder.observer.ts @@ -0,0 +1,62 @@ +import { lifeCycleObserver, LifeCycleObserver, } from '@loopback/core'; +import { UserRepository } from '../repositories'; +import { User } from '../models'; +import { Mock, MockFactory } from 'mockingbird'; +import { genSalt, hash } from 'bcryptjs'; +import { repository } from '@loopback/repository'; + +/** + * This class will be bound to the application as a `LifeCycleObserver` during + * `boot` + */ +@lifeCycleObserver('Seeders') +export class UserSeederObserver implements LifeCycleObserver { + constructor( + @repository(UserRepository) private repository: UserRepository + ) { + } + + MAX_USERS = 100; + + /** + * This method will be invoked when the application starts. + */ + async start(): Promise { + if ((await this.repository.count()).count > 0) { + return; + } + console.log('Creating users'); + const transaction = await this.repository.beginTransaction(); + try { + await this.repository.create({ + email: 'admin@inf.u-szeged.hu', + name: 'Teszt Admin', + password: await hash('Jelszó 123', await genSalt()), + isAdmin: true + }); + const users = MockFactory(StudentMock).many(this.MAX_USERS); + let c = 0; + for (const user of users) { + user.password = await hash('Jelszó 123', await genSalt()); + if (c >= this.MAX_USERS / 4) { + user.email = user.name.split(' ')[1].toLowerCase() + '@inf.u-szeged.hu'; + } + await this.repository.create(user); + c++; + } + await transaction.commit(); + } catch (e) { + await transaction.rollback(); + throw e; + } + console.log('Users added'); + } +} + +class StudentMock extends User { + @Mock(faker => faker.name.firstName() + ' ' + faker.name.lastName()) + name: string; + @Mock(faker => 'h' + (880000 + faker.datatype.number(9999)) + '@stud.u-szeged.hu') + email: string; + isAdmin = false; +} diff --git a/backend/src/repositories/user.repository.ts b/backend/src/repositories/user.repository.ts index 16efa5d..d5bf2d9 100644 --- a/backend/src/repositories/user.repository.ts +++ b/backend/src/repositories/user.repository.ts @@ -1,12 +1,12 @@ import {inject, Getter} from '@loopback/core'; -import {DefaultCrudRepository, repository, HasManyThroughRepositoryFactory} from '@loopback/repository'; +import { repository, HasManyThroughRepositoryFactory, DefaultTransactionalRepository } from '@loopback/repository'; import {DatabaseDataSource} from '../datasources'; import {User, UserRelations, Course, CourseUser} from '../models'; import {SubjectRepository} from './subject.repository'; import {CourseUserRepository} from './course-user.repository'; import {CourseRepository} from './course.repository'; -export class UserRepository extends DefaultCrudRepository< +export class UserRepository extends DefaultTransactionalRepository< User, typeof User.prototype.id, UserRelations diff --git a/frontend/docker.sh b/frontend/docker.sh index 1f31955..e82cc57 100644 --- a/frontend/docker.sh +++ b/frontend/docker.sh @@ -1,4 +1,5 @@ #!/usr/bin/env bash +set -e if [ "$COMMAND" == "deploy" ]; then npm run buildProd diff --git a/frontend/src/app/shared-components/table/table.component.html b/frontend/src/app/shared-components/table/table.component.html index 6e18b09..1d760c5 100644 --- a/frontend/src/app/shared-components/table/table.component.html +++ b/frontend/src/app/shared-components/table/table.component.html @@ -11,7 +11,7 @@ {{ col.title }} - + {{ item[col.prop] }} diff --git a/frontend/src/environments/environment.prod.ts b/frontend/src/environments/environment.prod.ts index 3612073..68db1a9 100644 --- a/frontend/src/environments/environment.prod.ts +++ b/frontend/src/environments/environment.prod.ts @@ -1,3 +1,4 @@ export const environment = { - production: true + production: true, + backendUrl: 'https://np-szakdolgozat.herokuapp.com' };