relocate config files

This commit is contained in:
rubikscraft
2022-03-28 12:27:25 +02:00
parent 07ef1b1216
commit d7d44b0147
25 changed files with 98 additions and 98 deletions

View File

@@ -1,9 +1,9 @@
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
import { ServeStaticModule } from '@nestjs/serve-static'; import { ServeStaticModule } from '@nestjs/serve-static';
import { TypeOrmModule } from '@nestjs/typeorm'; import { TypeOrmModule } from '@nestjs/typeorm';
import { PicsurConfigModule } from './config/config.module'; import { EarlyConfigModule } from './config/early/earlyconfig.module';
import { ServeStaticConfigService } from './config/servestatic.config.service'; import { ServeStaticConfigService } from './config/early/servestatic.config.service';
import { TypeOrmConfigService } from './config/typeorm.config.service'; import { TypeOrmConfigService } from './config/early/typeorm.config.service';
import { PicsurLoggerModule } from './logger/logger.module'; import { PicsurLoggerModule } from './logger/logger.module';
import { AuthManagerModule } from './managers/auth/auth.module'; import { AuthManagerModule } from './managers/auth/auth.module';
import { DemoManagerModule } from './managers/demo/demomanager.module'; import { DemoManagerModule } from './managers/demo/demomanager.module';
@@ -13,11 +13,11 @@ import { PicsurRoutesModule } from './routes/routes.module';
imports: [ imports: [
TypeOrmModule.forRootAsync({ TypeOrmModule.forRootAsync({
useExisting: TypeOrmConfigService, useExisting: TypeOrmConfigService,
imports: [PicsurConfigModule], imports: [EarlyConfigModule],
}), }),
ServeStaticModule.forRootAsync({ ServeStaticModule.forRootAsync({
useExisting: ServeStaticConfigService, useExisting: ServeStaticConfigService,
imports: [PicsurConfigModule], imports: [EarlyConfigModule],
}), }),
PicsurLoggerModule, PicsurLoggerModule,
AuthManagerModule, AuthManagerModule,

View File

@@ -1,14 +1,14 @@
import { Logger, Module, OnModuleInit } from '@nestjs/common'; import { Logger, Module, OnModuleInit } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm'; import { TypeOrmModule } from '@nestjs/typeorm';
import { HasFailed } from 'picsur-shared/dist/types'; import { HasFailed } from 'picsur-shared/dist/types';
import { PicsurConfigModule } from '../../config/config.module'; import { EarlyConfigModule } from '../../config/early/earlyconfig.module';
import { HostConfigService } from '../../config/host.config.service'; import { HostConfigService } from '../../config/early/host.config.service';
import { ImmutableRolesList, SystemRoleDefaults, UndeletableRolesList } from '../../models/dto/roles.dto'; import { ImmutableRolesList, SystemRoleDefaults, UndeletableRolesList } from '../../models/dto/roles.dto';
import { ERoleBackend } from '../../models/entities/role.entity'; import { ERoleBackend } from '../../models/entities/role.entity';
import { RolesService } from './roledb.service'; import { RolesService } from './roledb.service';
@Module({ @Module({
imports: [PicsurConfigModule, TypeOrmModule.forFeature([ERoleBackend])], imports: [EarlyConfigModule, TypeOrmModule.forFeature([ERoleBackend])],
providers: [RolesService], providers: [RolesService],
exports: [RolesService], exports: [RolesService],
}) })

View File

@@ -1,15 +1,14 @@
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm'; import { TypeOrmModule } from '@nestjs/typeorm';
import { PicsurConfigModule } from '../../config/config.module'; import { EarlyConfigModule } from '../../config/early/earlyconfig.module';
import { ESysPreferenceBackend } from '../../models/entities/syspreference.entity'; import { ESysPreferenceBackend } from '../../models/entities/syspreference.entity';
import { SysPreferenceService } from './syspreferencedb.service'; import { SysPreferenceService } from './syspreferencedb.service';
import { SysPreferenceDefaultsService } from './syspreferencedefaults.service'; import { SysPreferenceDefaultsService } from './syspreferencedefaults.service';
import { ConfigModule } from '@nestjs/config';
@Module({ @Module({
imports: [ imports: [
TypeOrmModule.forFeature([ESysPreferenceBackend]), TypeOrmModule.forFeature([ESysPreferenceBackend]),
PicsurConfigModule, EarlyConfigModule,
], ],
providers: [SysPreferenceService, SysPreferenceDefaultsService], providers: [SysPreferenceService, SysPreferenceDefaultsService],
exports: [SysPreferenceService], exports: [SysPreferenceService],

View File

@@ -4,7 +4,7 @@ import {
SysPrefValueType SysPrefValueType
} from 'picsur-shared/dist/dto/syspreferences.dto'; } from 'picsur-shared/dist/dto/syspreferences.dto';
import { generateRandomString } from 'picsur-shared/dist/util/random'; import { generateRandomString } from 'picsur-shared/dist/util/random';
import { EnvJwtConfigService } from '../../config/jwt.config.service'; import { EarlyJwtConfigService } from '../../config/early/earlyjwt.config.service';
// This specific service is used to store default values for system preferences // This specific service is used to store default values for system preferences
// It needs to be in a service because the values depend on the environment // It needs to be in a service because the values depend on the environment
@@ -13,7 +13,7 @@ import { EnvJwtConfigService } from '../../config/jwt.config.service';
export class SysPreferenceDefaultsService { export class SysPreferenceDefaultsService {
private readonly logger = new Logger('SysPreferenceDefaultsService'); private readonly logger = new Logger('SysPreferenceDefaultsService');
constructor(private jwtConfigService: EnvJwtConfigService) {} constructor(private jwtConfigService: EarlyJwtConfigService) {}
public readonly defaults: { public readonly defaults: {
[key in SysPreference]: () => SysPrefValueType; [key in SysPreference]: () => SysPrefValueType;

View File

@@ -2,8 +2,8 @@ import { Logger, Module, OnModuleInit } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm'; import { TypeOrmModule } from '@nestjs/typeorm';
import { HasFailed } from 'picsur-shared/dist/types'; import { HasFailed } from 'picsur-shared/dist/types';
import { generateRandomString } from 'picsur-shared/dist/util/random'; import { generateRandomString } from 'picsur-shared/dist/util/random';
import { AuthConfigService } from '../../config/auth.config.service'; import { AuthConfigService } from '../../config/early/auth.config.service';
import { PicsurConfigModule } from '../../config/config.module'; import { EarlyConfigModule } from '../../config/early/earlyconfig.module';
import { EUserBackend } from '../../models/entities/user.entity'; import { EUserBackend } from '../../models/entities/user.entity';
import { RolesModule } from '../roledb/roledb.module'; import { RolesModule } from '../roledb/roledb.module';
import { UsersService } from './userdb.service'; import { UsersService } from './userdb.service';
@@ -11,7 +11,7 @@ import { UserRolesService } from './userrolesdb.service';
@Module({ @Module({
imports: [ imports: [
PicsurConfigModule, EarlyConfigModule,
RolesModule, RolesModule,
TypeOrmModule.forFeature([EUserBackend]), TypeOrmModule.forFeature([EUserBackend]),
], ],

View File

@@ -1,6 +1,6 @@
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { EnvPrefix } from './config.static'; import { EnvPrefix } from '../config.static';
@Injectable() @Injectable()
export class AuthConfigService { export class AuthConfigService {

View File

@@ -1,8 +1,8 @@
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config'; import { ConfigModule } from '@nestjs/config';
import { AuthConfigService } from './auth.config.service'; import { AuthConfigService } from './auth.config.service';
import { EarlyJwtConfigService } from './earlyjwt.config.service';
import { HostConfigService } from './host.config.service'; import { HostConfigService } from './host.config.service';
import { EnvJwtConfigService } from './jwt.config.service';
import { MultipartConfigService } from './multipart.config.service'; import { MultipartConfigService } from './multipart.config.service';
import { ServeStaticConfigService } from './servestatic.config.service'; import { ServeStaticConfigService } from './servestatic.config.service';
import { TypeOrmConfigService } from './typeorm.config.service'; import { TypeOrmConfigService } from './typeorm.config.service';
@@ -15,7 +15,7 @@ import { TypeOrmConfigService } from './typeorm.config.service';
}), }),
], ],
providers: [ providers: [
EnvJwtConfigService, EarlyJwtConfigService,
TypeOrmConfigService, TypeOrmConfigService,
ServeStaticConfigService, ServeStaticConfigService,
HostConfigService, HostConfigService,
@@ -24,7 +24,7 @@ import { TypeOrmConfigService } from './typeorm.config.service';
], ],
exports: [ exports: [
ConfigModule, ConfigModule,
EnvJwtConfigService, EarlyJwtConfigService,
TypeOrmConfigService, TypeOrmConfigService,
ServeStaticConfigService, ServeStaticConfigService,
HostConfigService, HostConfigService,
@@ -32,4 +32,4 @@ import { TypeOrmConfigService } from './typeorm.config.service';
MultipartConfigService, MultipartConfigService,
], ],
}) })
export class PicsurConfigModule {} export class EarlyConfigModule {}

View File

@@ -1,9 +1,9 @@
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { EnvPrefix } from './config.static'; import { EnvPrefix } from '../config.static';
@Injectable() @Injectable()
export class EnvJwtConfigService { export class EarlyJwtConfigService {
constructor(private configService: ConfigService) {} constructor(private configService: ConfigService) {}
public getJwtSecret(): string | undefined { public getJwtSecret(): string | undefined {

View File

@@ -1,6 +1,6 @@
import { Injectable, Logger } from '@nestjs/common'; import { Injectable, Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { EnvPrefix } from './config.static'; import { EnvPrefix } from '../config.static';
@Injectable() @Injectable()
export class HostConfigService { export class HostConfigService {

View File

@@ -1,6 +1,6 @@
import { Injectable, Logger } from '@nestjs/common'; import { Injectable, Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { EnvPrefix } from './config.static'; import { EnvPrefix } from '../config.static';
@Injectable() @Injectable()
export class MultipartConfigService { export class MultipartConfigService {

View File

@@ -5,7 +5,7 @@ import {
ServeStaticModuleOptionsFactory ServeStaticModuleOptionsFactory
} from '@nestjs/serve-static'; } from '@nestjs/serve-static';
import { join } from 'path'; import { join } from 'path';
import { EnvPrefix, PackageRoot } from './config.static'; import { EnvPrefix, PackageRoot } from '../config.static';
@Injectable() @Injectable()
export class ServeStaticConfigService export class ServeStaticConfigService

View File

@@ -1,8 +1,8 @@
import { Injectable, Logger } from '@nestjs/common'; import { Injectable, Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { TypeOrmModuleOptions, TypeOrmOptionsFactory } from '@nestjs/typeorm'; import { TypeOrmModuleOptions, TypeOrmOptionsFactory } from '@nestjs/typeorm';
import { EntityList } from '../models/entities'; import { EntityList } from '../../models/entities';
import { DefaultName, EnvPrefix } from './config.static'; import { DefaultName, EnvPrefix } from '../config.static';
import { HostConfigService } from './host.config.service'; import { HostConfigService } from './host.config.service';
@Injectable() @Injectable()

View File

@@ -1,7 +1,7 @@
import { FactoryProvider, Injectable, Logger } from '@nestjs/common'; import { FactoryProvider, Injectable, Logger } from '@nestjs/common';
import { JwtModuleOptions, JwtOptionsFactory } from '@nestjs/jwt'; import { JwtModuleOptions, JwtOptionsFactory } from '@nestjs/jwt';
import { HasFailed } from 'picsur-shared/dist/types'; import { HasFailed } from 'picsur-shared/dist/types';
import { SysPreferenceService } from '../collections/syspreferencesdb/syspreferencedb.service'; import { SysPreferenceService } from '../../collections/syspreferencesdb/syspreferencedb.service';
@Injectable() @Injectable()
export class JwtConfigService implements JwtOptionsFactory { export class JwtConfigService implements JwtOptionsFactory {

View File

@@ -0,0 +1,44 @@
import { Logger, Module, OnModuleInit } from '@nestjs/common';
import { SysPreferenceModule } from '../../collections/syspreferencesdb/syspreferencedb.module';
import { SysPreferenceService } from '../../collections/syspreferencesdb/syspreferencedb.service';
import { EarlyConfigModule } from '../early/earlyconfig.module';
import { EarlyJwtConfigService } from '../early/earlyjwt.config.service';
import { JwtConfigService } from './jwt.config.service';
// This module contains all configservices that depend on the syspref module
// The syspref module can only be used when connected to the database
// Since the syspref module requires the database config, we need this seperate
// Otherwise we will create a circular depedency
@Module({
imports: [SysPreferenceModule, EarlyConfigModule],
providers: [JwtConfigService],
exports: [JwtConfigService, EarlyConfigModule],
})
export class LateConfigModule implements OnModuleInit {
private readonly logger = new Logger('LateConfigModule');
constructor(
private envJwtConfigService: EarlyJwtConfigService,
private prefService: SysPreferenceService,
) {}
async onModuleInit() {
await this.ensureJwtDefaultsLoaded();
}
async ensureJwtDefaultsLoaded() {
const envSecret = this.envJwtConfigService.getJwtSecret();
const envExpiresIn = this.envJwtConfigService.getJwtExpiresIn();
if (envSecret === undefined) {
await this.prefService.getPreference('jwt_secret');
} else {
await this.prefService.setPreference('jwt_secret', envSecret);
}
if (envExpiresIn !== undefined) {
await this.prefService.setPreference('jwt_expires_in', envExpiresIn);
}
}
}

View File

@@ -1,40 +0,0 @@
import { Logger, Module, OnModuleInit } from '@nestjs/common';
import { SysPreferenceModule } from '../collections/syspreferencesdb/syspreferencedb.module';
import { SysPreferenceService } from '../collections/syspreferencesdb/syspreferencedb.service';
import { PicsurConfigModule } from './config.module';
import { EnvJwtConfigService } from './jwt.config.service';
import { JwtConfigService } from './jwt.lateconfig.service';
// This module contains all configservices that depend on the syspref module
// The syspref module can only be used when connected to the database
// Since the syspref module requires the database config, we need this seperate
// Otherwise we will create a circular depedency
@Module({
imports: [SysPreferenceModule, PicsurConfigModule],
providers: [JwtConfigService],
exports: [JwtConfigService, PicsurConfigModule],
})
export class PicsurLateConfigModule implements OnModuleInit {
private readonly logger = new Logger('PicsurLateConfigModule');
constructor(
private envJwtConfigService: EnvJwtConfigService,
private prefService: SysPreferenceService,
) {}
async onModuleInit() {
const secret = this.envJwtConfigService.getJwtSecret();
const expiresIn = this.envJwtConfigService.getJwtExpiresIn();
if (secret === undefined) {
await this.prefService.getPreference('jwt_secret');
} else {
await this.prefService.setPreference('jwt_secret', secret);
}
if (expiresIn !== undefined) {
await this.prefService.setPreference('jwt_expires_in', expiresIn);
}
}
}

View File

@@ -1,12 +1,12 @@
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
import { PicsurConfigModule } from '../config/config.module'; import { EarlyConfigModule } from '../config/early/earlyconfig.module';
import { MultiPartPipe } from './multipart.pipe'; import { MultiPartPipe } from './multipart.pipe';
import { PostFilePipe } from './postfile.pipe'; import { PostFilePipe } from './postfile.pipe';
@Module({ @Module({
imports: [PicsurConfigModule], imports: [EarlyConfigModule],
providers: [MultiPartPipe, PostFilePipe], providers: [MultiPartPipe, PostFilePipe],
exports: [MultiPartPipe, PostFilePipe, PicsurConfigModule], exports: [MultiPartPipe, PostFilePipe, EarlyConfigModule],
}) })
export class DecoratorsModule { export class DecoratorsModule {
} }

View File

@@ -1,18 +1,18 @@
import { import {
BadRequestException, BadRequestException,
Injectable, Injectable,
Logger, Logger,
PipeTransform, PipeTransform,
Scope Scope
} from '@nestjs/common'; } from '@nestjs/common';
import { FastifyRequest } from 'fastify'; import { FastifyRequest } from 'fastify';
import { MultipartFields, MultipartFile } from 'fastify-multipart'; import { MultipartFields, MultipartFile } from 'fastify-multipart';
import { Newable } from 'picsur-shared/dist/types'; import { Newable } from 'picsur-shared/dist/types';
import { strictValidate } from 'picsur-shared/dist/util/validate'; import { strictValidate } from 'picsur-shared/dist/util/validate';
import { MultipartConfigService } from '../config/multipart.config.service'; import { MultipartConfigService } from '../config/early/multipart.config.service';
import { import {
MultiPartFieldDto, MultiPartFieldDto,
MultiPartFileDto MultiPartFileDto
} from '../models/requests/multipart.dto'; } from '../models/requests/multipart.dto';
@Injectable({ scope: Scope.REQUEST }) @Injectable({ scope: Scope.REQUEST })

View File

@@ -7,7 +7,7 @@ import {
} from '@nestjs/common'; } from '@nestjs/common';
import { FastifyRequest } from 'fastify'; import { FastifyRequest } from 'fastify';
import { Multipart } from 'fastify-multipart'; import { Multipart } from 'fastify-multipart';
import { MultipartConfigService } from '../config/multipart.config.service'; import { MultipartConfigService } from '../config/early/multipart.config.service';
@Injectable({ scope: Scope.REQUEST }) @Injectable({ scope: Scope.REQUEST })
export class PostFilePipe implements PipeTransform { export class PostFilePipe implements PipeTransform {

View File

@@ -1,9 +1,9 @@
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
import { PicsurConfigModule } from '../config/config.module'; import { EarlyConfigModule } from '../config/early/earlyconfig.module';
import { PicsurLoggerService } from './logger.service'; import { PicsurLoggerService } from './logger.service';
@Module({ @Module({
imports: [PicsurConfigModule], imports: [EarlyConfigModule],
providers: [PicsurLoggerService], providers: [PicsurLoggerService],
exports: [PicsurLoggerService], exports: [PicsurLoggerService],
}) })

View File

@@ -1,5 +1,5 @@
import { ConsoleLogger, Injectable, Scope } from '@nestjs/common'; import { ConsoleLogger, Injectable, Scope } from '@nestjs/common';
import { HostConfigService } from '../config/host.config.service'; import { HostConfigService } from '../config/early/host.config.service';
@Injectable({ scope: Scope.DEFAULT }) @Injectable({ scope: Scope.DEFAULT })
export class PicsurLoggerService extends ConsoleLogger { export class PicsurLoggerService extends ConsoleLogger {

View File

@@ -9,7 +9,7 @@ import { ValidateOptions } from 'picsur-shared/dist/util/validate';
import { AppModule } from './app.module'; import { AppModule } from './app.module';
import { UsersService } from './collections/userdb/userdb.service'; import { UsersService } from './collections/userdb/userdb.service';
import { UserRolesService } from './collections/userdb/userrolesdb.service'; import { UserRolesService } from './collections/userdb/userrolesdb.service';
import { HostConfigService } from './config/host.config.service'; import { HostConfigService } from './config/early/host.config.service';
import { MainExceptionFilter } from './layers/httpexception/httpexception.filter'; import { MainExceptionFilter } from './layers/httpexception/httpexception.filter';
import { SuccessInterceptor } from './layers/success/success.interceptor'; import { SuccessInterceptor } from './layers/success/success.interceptor';
import { PicsurLoggerService } from './logger/logger.service'; import { PicsurLoggerService } from './logger/logger.service';

View File

@@ -3,11 +3,8 @@ import { JwtModule } from '@nestjs/jwt';
import { PassportModule } from '@nestjs/passport'; import { PassportModule } from '@nestjs/passport';
import { SysPreferenceModule } from '../../collections/syspreferencesdb/syspreferencedb.module'; import { SysPreferenceModule } from '../../collections/syspreferencesdb/syspreferencedb.module';
import { UsersModule } from '../../collections/userdb/userdb.module'; import { UsersModule } from '../../collections/userdb/userdb.module';
import { import { JwtConfigService, JwtSecretProvider } from '../../config/late/jwt.config.service';
JwtConfigService, import { LateConfigModule } from '../../config/late/lateconfig.module';
JwtSecretProvider
} from '../../config/jwt.lateconfig.service';
import { PicsurLateConfigModule } from '../../config/lateconfig.module';
import { AuthManagerService } from './auth.service'; import { AuthManagerService } from './auth.service';
import { GuestStrategy } from './guards/guest.strategy'; import { GuestStrategy } from './guards/guest.strategy';
import { JwtStrategy } from './guards/jwt.strategy'; import { JwtStrategy } from './guards/jwt.strategy';
@@ -19,10 +16,10 @@ import { GuestService } from './guest.service';
UsersModule, UsersModule,
PassportModule, PassportModule,
SysPreferenceModule, SysPreferenceModule,
PicsurLateConfigModule, LateConfigModule,
JwtModule.registerAsync({ JwtModule.registerAsync({
useExisting: JwtConfigService, useExisting: JwtConfigService,
imports: [PicsurLateConfigModule], imports: [LateConfigModule],
}), }),
], ],
providers: [ providers: [

View File

@@ -1,12 +1,12 @@
import { Logger, Module, OnModuleDestroy, OnModuleInit } from '@nestjs/common'; import { Logger, Module, OnModuleDestroy, OnModuleInit } from '@nestjs/common';
import { ImageDBModule } from '../../collections/imagedb/imagedb.module'; import { ImageDBModule } from '../../collections/imagedb/imagedb.module';
import { RolesModule } from '../../collections/roledb/roledb.module'; import { RolesModule } from '../../collections/roledb/roledb.module';
import { PicsurConfigModule } from '../../config/config.module'; import { EarlyConfigModule } from '../../config/early/earlyconfig.module';
import { HostConfigService } from '../../config/host.config.service'; import { HostConfigService } from '../../config/early/host.config.service';
import { DemoManagerService } from './demomanager.service'; import { DemoManagerService } from './demomanager.service';
@Module({ @Module({
imports: [ImageDBModule, PicsurConfigModule, RolesModule], imports: [ImageDBModule, EarlyConfigModule, RolesModule],
providers: [DemoManagerService], providers: [DemoManagerService],
}) })
export class DemoManagerModule implements OnModuleInit, OnModuleDestroy { export class DemoManagerModule implements OnModuleInit, OnModuleDestroy {

View File

@@ -1,7 +1,7 @@
import { Controller, Get } from '@nestjs/common'; import { Controller, Get } from '@nestjs/common';
import { plainToClass } from 'class-transformer'; import { plainToClass } from 'class-transformer';
import { AllPermissionsResponse, InfoResponse } from 'picsur-shared/dist/dto/api/info.dto'; import { AllPermissionsResponse, InfoResponse } from 'picsur-shared/dist/dto/api/info.dto';
import { HostConfigService } from '../../../config/host.config.service'; import { HostConfigService } from '../../../config/early/host.config.service';
import { NoPermissions } from '../../../decorators/permissions.decorator'; import { NoPermissions } from '../../../decorators/permissions.decorator';
import { PermissionsList } from '../../../models/dto/permissions.dto'; import { PermissionsList } from '../../../models/dto/permissions.dto';

View File

@@ -1,9 +1,9 @@
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
import { PicsurConfigModule } from '../../../config/config.module'; import { EarlyConfigModule } from '../../../config/early/earlyconfig.module';
import { InfoController } from './info.controller'; import { InfoController } from './info.controller';
@Module({ @Module({
imports: [PicsurConfigModule], imports: [EarlyConfigModule],
controllers: [InfoController], controllers: [InfoController],
}) })
export class InfoModule {} export class InfoModule {}