From f88ccec546e451035e9dd5aaea74dfc5b8e8ed55 Mon Sep 17 00:00:00 2001 From: mahyargdz Date: Sun, 19 Jan 2025 11:55:52 +0330 Subject: [PATCH] fix: change the role refrence in database --- package.json | 1 + pnpm-lock.yaml | 105 +++++++++++++++++++++- src/app.module.ts | 4 +- src/configs/typeorm.config.ts | 2 +- src/main.ts | 2 +- src/modules/tickets/tickets.controller.ts | 6 +- src/modules/users/entities/role.entity.ts | 3 +- src/modules/users/entities/user.entity.ts | 5 +- src/modules/users/users.controller.ts | 2 + src/modules/users/users.module.ts | 3 +- 10 files changed, 119 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 9ee645d..b3ef94c 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "test:e2e": "jest --config ./test/jest-e2e.json" }, "dependencies": { + "@fastify/static": "^7.0.4", "@nestjs/common": "^10.4.15", "@nestjs/config": "^4.0.0", "@nestjs/core": "^10.4.15", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ff15652..66f5bf4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: dependencies: + '@fastify/static': + specifier: ^7.0.4 + version: 7.0.4 '@nestjs/common': specifier: ^10.4.15 version: 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1) @@ -19,10 +22,10 @@ importers: version: 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/platform-fastify': specifier: ^10.4.15 - version: 10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1)) + version: 10.4.15(@fastify/static@7.0.4)(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1)) '@nestjs/swagger': specifier: ^8.1.1 - version: 8.1.1(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2) + version: 8.1.1(@fastify/static@7.0.4)(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2) '@nestjs/typeorm': specifier: ^10.0.2 version: 10.0.2(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1)(typeorm@0.3.20(pg@8.13.1)(ts-node@10.9.2(@types/node@20.17.14)(typescript@5.7.3))) @@ -398,6 +401,10 @@ packages: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@fastify/accept-negotiator@1.1.0': + resolution: {integrity: sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ==} + engines: {node: '>=14'} + '@fastify/ajv-compiler@3.6.0': resolution: {integrity: sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==} @@ -419,6 +426,12 @@ packages: '@fastify/middie@8.3.3': resolution: {integrity: sha512-+WHavMQr9CNTZoy2cjoDxoWp76kZ3JKjAtZj5sXNlxX5XBzHig0TeCPfPc+1+NQmliXtndT3PFwAjrQHE/6wnQ==} + '@fastify/send@2.1.0': + resolution: {integrity: sha512-yNYiY6sDkexoJR0D8IDy3aRP3+L4wdqCpvx5WP+VtEU58sn7USmKynBzDQex5X42Zzvw2gNzzYgP90UfWShLFA==} + + '@fastify/static@7.0.4': + resolution: {integrity: sha512-p2uKtaf8BMOZWLs6wu+Ihg7bWNBdjNgCwDza4MJtTqg+5ovKmcbgbR9Xs5/smZ1YISfzKOCNYmZV8LaCj+eJ1Q==} + '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} @@ -542,6 +555,10 @@ packages: resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} engines: {node: '>=8'} + '@lukeed/ms@2.0.2': + resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} + engines: {node: '>=8'} + '@microsoft/tsdoc@0.15.1': resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} @@ -1295,6 +1312,10 @@ packages: consola@2.15.3: resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + conventional-changelog-angular@7.0.0: resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} engines: {node: '>=16'} @@ -1429,6 +1450,10 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -1541,6 +1566,9 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -1953,6 +1981,10 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -2556,6 +2588,11 @@ packages: engines: {node: '>=4.0.0'} hasBin: true + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -3100,6 +3137,9 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + sha.js@2.4.11: resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} hasBin: true @@ -3178,6 +3218,10 @@ packages: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -3339,6 +3383,10 @@ packages: resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} engines: {node: '>=12'} + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -4045,6 +4093,8 @@ snapshots: '@eslint/js@8.57.1': {} + '@fastify/accept-negotiator@1.1.0': {} + '@fastify/ajv-compiler@3.6.0': dependencies: ajv: 8.17.1 @@ -4078,6 +4128,23 @@ snapshots: path-to-regexp: 6.3.0 reusify: 1.0.4 + '@fastify/send@2.1.0': + dependencies: + '@lukeed/ms': 2.0.2 + escape-html: 1.0.3 + fast-decode-uri-component: 1.0.1 + http-errors: 2.0.0 + mime: 3.0.0 + + '@fastify/static@7.0.4': + dependencies: + '@fastify/accept-negotiator': 1.1.0 + '@fastify/send': 2.1.0 + content-disposition: 0.5.4 + fastify-plugin: 4.5.1 + fastq: 1.18.0 + glob: 10.4.5 + '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -4304,6 +4371,8 @@ snapshots: '@lukeed/csprng@1.1.0': {} + '@lukeed/ms@2.0.2': {} + '@microsoft/tsdoc@0.15.1': {} '@nestjs/cli@10.4.9': @@ -4367,7 +4436,7 @@ snapshots: '@nestjs/common': 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1) reflect-metadata: 0.2.2 - '@nestjs/platform-fastify@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))': + '@nestjs/platform-fastify@10.4.15(@fastify/static@7.0.4)(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))': dependencies: '@fastify/cors': 9.0.1 '@fastify/formbody': 7.4.0 @@ -4378,6 +4447,8 @@ snapshots: light-my-request: 6.3.0 path-to-regexp: 3.3.0 tslib: 2.8.1 + optionalDependencies: + '@fastify/static': 7.0.4 '@nestjs/schematics@10.2.3(chokidar@3.6.0)(typescript@5.7.2)': dependencies: @@ -4401,7 +4472,7 @@ snapshots: transitivePeerDependencies: - chokidar - '@nestjs/swagger@8.1.1(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)': + '@nestjs/swagger@8.1.1(@fastify/static@7.0.4)(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)': dependencies: '@microsoft/tsdoc': 0.15.1 '@nestjs/common': 10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1) @@ -4412,6 +4483,8 @@ snapshots: path-to-regexp: 3.3.0 reflect-metadata: 0.2.2 swagger-ui-dist: 5.18.2 + optionalDependencies: + '@fastify/static': 7.0.4 '@nestjs/testing@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.15(@nestjs/common@10.4.15(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))': dependencies: @@ -5182,6 +5255,10 @@ snapshots: consola@2.15.3: {} + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + conventional-changelog-angular@7.0.0: dependencies: compare-func: 2.0.0 @@ -5309,6 +5386,8 @@ snapshots: delayed-stream@1.0.0: {} + depd@2.0.0: {} + detect-newline@3.1.0: {} dezalgo@1.0.4: @@ -5456,6 +5535,8 @@ snapshots: escalade@3.2.0: {} + escape-html@1.0.3: {} + escape-string-regexp@1.0.5: {} escape-string-regexp@2.0.0: {} @@ -5950,6 +6031,14 @@ snapshots: html-escaper@2.0.2: {} + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + human-signals@2.1.0: {} human-signals@5.0.0: {} @@ -6738,6 +6827,8 @@ snapshots: mime@2.6.0: {} + mime@3.0.0: {} + mimic-fn@2.1.0: {} mimic-fn@4.0.0: {} @@ -7253,6 +7344,8 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 + setprototypeof@1.2.0: {} + sha.js@2.4.11: dependencies: inherits: 2.0.4 @@ -7336,6 +7429,8 @@ snapshots: dependencies: escape-string-regexp: 2.0.0 + statuses@2.0.1: {} + string-argv@0.3.2: {} string-length@4.0.2: @@ -7504,6 +7599,8 @@ snapshots: toad-cache@3.7.0: {} + toidentifier@1.0.1: {} + tr46@0.0.3: {} tree-kill@1.2.2: {} diff --git a/src/app.module.ts b/src/app.module.ts index 650e481..ea46b29 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -3,8 +3,8 @@ import { ConfigModule } from "@nestjs/config"; import { TypeOrmModule } from "@nestjs/typeorm"; import { DatabaseConfigs } from "./configs/typeorm.config"; -import { UsersModule } from './modules/users/users.module'; -import { TicketsModule } from './modules/tickets/tickets.module'; +import { TicketsModule } from "./modules/tickets/tickets.module"; +import { UsersModule } from "./modules/users/users.module"; @Module({ imports: [ diff --git a/src/configs/typeorm.config.ts b/src/configs/typeorm.config.ts index 054f731..f642b8f 100644 --- a/src/configs/typeorm.config.ts +++ b/src/configs/typeorm.config.ts @@ -12,11 +12,11 @@ export function DatabaseConfigs(): TypeOrmModuleAsyncOptions { database: configService.getOrThrow("DB_NAME"), username: configService.getOrThrow("DB_USER"), password: configService.getOrThrow("DB_PASS"), + autoLoadEntities: true, synchronize: true, logging: configService.getOrThrow("NODE_ENV") == "production" ? false : true, migrationsTableName: "typeorm_migrations", migrationsRun: false, - autoLoadEntities: true, }; }, }; diff --git a/src/main.ts b/src/main.ts index dc8983c..26504ea 100644 --- a/src/main.ts +++ b/src/main.ts @@ -14,7 +14,7 @@ async function bootstrap() { getSwaggerDocument(app); const PORT = configService.getOrThrow("PORT"); - await app.listen(PORT, () => { + await app.listen(PORT, "0.0.0.0", () => { logger.log(`Server running on http://localhost:${PORT}`); logger.log(`Swagger running on http://localhost:${PORT}/api-docs`); }); diff --git a/src/modules/tickets/tickets.controller.ts b/src/modules/tickets/tickets.controller.ts index dd62b3f..68c1d9b 100644 --- a/src/modules/tickets/tickets.controller.ts +++ b/src/modules/tickets/tickets.controller.ts @@ -1,4 +1,6 @@ -import { Controller } from '@nestjs/common'; +import { Controller } from "@nestjs/common"; +import { ApiTags } from "@nestjs/swagger"; -@Controller('tickets') +@Controller("tickets") +@ApiTags("users") export class TicketsController {} diff --git a/src/modules/users/entities/role.entity.ts b/src/modules/users/entities/role.entity.ts index 22398d7..e1377c9 100644 --- a/src/modules/users/entities/role.entity.ts +++ b/src/modules/users/entities/role.entity.ts @@ -1,5 +1,6 @@ -import { BaseEntity, Column, Entity } from "typeorm"; +import { Column, Entity } from "typeorm"; +import { BaseEntity } from "../../../common/entities/base.entity"; import { RoleEnum } from "../enums/role.enum"; @Entity() diff --git a/src/modules/users/entities/user.entity.ts b/src/modules/users/entities/user.entity.ts index 01c6c11..1341d21 100644 --- a/src/modules/users/entities/user.entity.ts +++ b/src/modules/users/entities/user.entity.ts @@ -1,4 +1,4 @@ -import { Column, Entity, OneToOne } from "typeorm"; +import { Column, Entity, JoinColumn, OneToOne } from "typeorm"; import { Role } from "./role.entity"; import { BaseEntity } from "../../../common/entities/base.entity"; @@ -26,6 +26,7 @@ export class User extends BaseEntity { @Column({ type: "varchar", length: 100 }) nationalCode: string; - @OneToOne(() => Role, { eager: true, cascade: true, onDelete: "SET NULL" }) + @JoinColumn() + @OneToOne(() => Role, { eager: true, cascade: true, onDelete: "RESTRICT", nullable: false }) role: Role; } diff --git a/src/modules/users/users.controller.ts b/src/modules/users/users.controller.ts index 8ab7fdd..487560e 100644 --- a/src/modules/users/users.controller.ts +++ b/src/modules/users/users.controller.ts @@ -1,4 +1,6 @@ import { Controller } from "@nestjs/common"; +import { ApiTags } from "@nestjs/swagger"; @Controller("users") +@ApiTags("users") export class UsersController {} diff --git a/src/modules/users/users.module.ts b/src/modules/users/users.module.ts index 881a385..7838abc 100644 --- a/src/modules/users/users.module.ts +++ b/src/modules/users/users.module.ts @@ -1,13 +1,14 @@ import { Module } from "@nestjs/common"; import { TypeOrmModule } from "@nestjs/typeorm"; +import { Role } from "./entities/role.entity"; import { User } from "./entities/user.entity"; import { UserRepository } from "./providers/users.repository"; import { UsersService } from "./providers/users.service"; import { UsersController } from "./users.controller"; @Module({ - imports: [TypeOrmModule.forFeature([User])], + imports: [TypeOrmModule.forFeature([User, Role])], providers: [UsersService, UserRepository], controllers: [UsersController], exports: [UsersService, TypeOrmModule],