diff --git a/idp/src/app.controller.ts b/idp/src/app.controller.ts index c29f40c..3935d29 100644 --- a/idp/src/app.controller.ts +++ b/idp/src/app.controller.ts @@ -6,7 +6,6 @@ import { Response } from 'express'; export class AppController { @Get('*') handleClientRoutes(@Res() res: Response) { - console.log("handle") res.sendFile(join(__dirname, '..', 'client', 'index.html')); } } diff --git a/idp/src/app.module.ts b/idp/src/app.module.ts index 041d2cb..27a615a 100644 --- a/idp/src/app.module.ts +++ b/idp/src/app.module.ts @@ -1,24 +1,18 @@ import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common'; -import { AppService } from './app.service'; -import { AuthModule } from './auth/auth.module'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ConfigModule } from '@nestjs/config'; import { ServeStaticModule } from '@nestjs/serve-static'; import { join } from 'path'; -import { LoggerModule } from './core/logger.module'; import { SessionMiddleware } from './core/session.middleware'; -import { ClientModule } from './client/client.module'; import { ApplicationModule } from './application/application.module'; import { MailModule } from './application/mail/mail.module'; +import { IDPModule } from './idp/idp.module'; @Module({ imports: [ - AuthModule, - ClientModule, ConfigModule.forRoot({ envFilePath: ['.env'], isGlobal: true, }), - LoggerModule, ServeStaticModule.forRoot({ rootPath: join(__dirname, '../client'), exclude: ['*/api*'], @@ -39,19 +33,10 @@ import { MailModule } from './application/mail/mail.module'; }), ApplicationModule, MailModule, - // TypeOrmModule.forRoot({ - // type: 'mysql', - // host: '85.215.137.185', // MySQL Hostname - // port: 3306, // MySQL Port (Standard ist 3306) - // username: 'root', // Dein MySQL-Benutzername - // password: 'Battlefield123', // Dein MySQL-Passwort - // database: 'global_users', // Name der Datenbank - // entities: [User, Client, RedirectUri, AuthorizationCode], // Hier werden deine Entitäten aufgelistet - // synchronize: true, // Setze dies auf `false` in der Produktion - // }), + IDPModule, ], controllers: [], - providers: [AppService], + providers: [], exports: [], }) export class AppModule implements NestModule { diff --git a/idp/src/app.service.ts b/idp/src/app.service.ts deleted file mode 100644 index 927d7cc..0000000 --- a/idp/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/idp/src/application/application.controller.spec.ts b/idp/src/application/application.controller.spec.ts deleted file mode 100644 index 2c7cf77..0000000 --- a/idp/src/application/application.controller.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { ApplicationController } from './application.controller'; - -describe('ApplicationController', () => { - let controller: ApplicationController; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - controllers: [ApplicationController], - }).compile(); - - controller = module.get(ApplicationController); - }); - - it('should be defined', () => { - expect(controller).toBeDefined(); - }); -}); diff --git a/idp/src/application/application.controller.ts b/idp/src/application/application.controller.ts index 0fa77ce..b48cc39 100644 --- a/idp/src/application/application.controller.ts +++ b/idp/src/application/application.controller.ts @@ -1,7 +1,7 @@ import { Body, Controller, Get, Post } from '@nestjs/common'; import { User } from 'src/model'; import { LoginUserDto } from 'src/model/dto'; -import { UsersService } from 'src/users/users.service'; +import { UsersService } from 'src/shared/users.service'; @Controller('app') export class ApplicationController { diff --git a/idp/src/application/application.module.ts b/idp/src/application/application.module.ts index 31ef708..a4a6b8b 100644 --- a/idp/src/application/application.module.ts +++ b/idp/src/application/application.module.ts @@ -1,13 +1,13 @@ import { Module } from '@nestjs/common'; import { ApplicationController } from './application.controller'; import { UserModule } from './user/user.module'; -import { LoggerModule } from 'src/core/logger.module'; -import { SecureModule } from 'src/core/secure/secure.module'; import { MailModule } from './mail/mail.module'; +import { SharedModule } from 'src/shared/shared.module'; +import { SecureModule } from 'src/shared/secure/secure.module'; @Module({ controllers: [ApplicationController], providers: [], - imports: [LoggerModule, UserModule, SecureModule, MailModule], + imports: [UserModule, SecureModule, MailModule, SharedModule], }) export class ApplicationModule {} diff --git a/idp/src/application/application.service.ts b/idp/src/application/application.service.ts new file mode 100644 index 0000000..85e4eff --- /dev/null +++ b/idp/src/application/application.service.ts @@ -0,0 +1,60 @@ +import { Injectable } from '@nestjs/common'; +import { ClientRepository, LogRepository, User, Client } from 'src/model'; + +@Injectable() +export class ApplicationService { + constructor( + private clientRepository: ClientRepository, + private logRepository: LogRepository, + ) {} + + getUserClients(user: User): Promise { + return this.clientRepository.find({ + where: { admins: { id: user.id } }, + relations: ['admins'], + order: { createdAt: 'ASC' }, + }); + } + + async getUserLogins() { + const logs = await this.logRepository.find({ + where: [{ type: 'login' }, { type: 'systemlogin' }], + order: { timestamp: 'asc' }, + }); + + const first = new Date(logs[0].timestamp.toISOString()); + const last = logs[logs.length - 1].timestamp.toISOString().substring(0, 10); + + const res = {}; + + res[first.toISOString().substring(0, 10)] = { + logins: 0, + systemLogins: 0, + }; + + if (logs.length > 1) { + const current = first; + + while (current.toISOString().substring(0, 10) <= last) { + res[current.toISOString().substring(0, 10)] = { + logins: 0, + systemLogins: 0, + }; + current.setDate(current.getDate() + 1); + } + + logs.forEach((l) => { + if (l.type == 'login') { + res[l.timestamp.toISOString().substring(0, 10)].logins += 1; + } else if (l.type == 'systemlogin') { + res[l.timestamp.toISOString().substring(0, 10)].systemLogins += 1; + } + }); + } + + return Object.entries(res).map(([date, count]) => ({ + date: new Date(date), + count, + })); + } +} diff --git a/idp/src/application/mail/mail.module.ts b/idp/src/application/mail/mail.module.ts index 611bae1..9488bb6 100644 --- a/idp/src/application/mail/mail.module.ts +++ b/idp/src/application/mail/mail.module.ts @@ -1,14 +1,14 @@ import { Module } from '@nestjs/common'; -import { DatabaseModule } from 'src/core/database/database.module'; import { MailerModule } from '@nestjs-modules/mailer'; import { join } from 'path'; import { ConfigModule, ConfigService } from '@nestjs/config'; import { HandlebarsAdapter } from '@nestjs-modules/mailer/dist/adapters/handlebars.adapter'; import { MailService } from './mail.service'; +import { SharedModule } from 'src/shared/shared.module'; @Module({ imports: [ - DatabaseModule, + SharedModule, MailerModule.forRootAsync({ imports: [ConfigModule], inject: [ConfigService], diff --git a/idp/src/application/mail/mail.service.spec.ts b/idp/src/application/mail/mail.service.spec.ts deleted file mode 100644 index 4297913..0000000 --- a/idp/src/application/mail/mail.service.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { MailService } from './mail.service'; - -describe('MailService', () => { - let service: MailService; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [MailService], - }).compile(); - - service = module.get(MailService); - }); - - it('should be defined', () => { - expect(service).toBeDefined(); - }); -}); diff --git a/idp/src/application/user/user.controller.spec.ts b/idp/src/application/user/user.controller.spec.ts deleted file mode 100644 index 7057a1a..0000000 --- a/idp/src/application/user/user.controller.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { UserController } from './user.controller'; - -describe('UserController', () => { - let controller: UserController; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - controllers: [UserController], - }).compile(); - - controller = module.get(UserController); - }); - - it('should be defined', () => { - expect(controller).toBeDefined(); - }); -}); diff --git a/idp/src/application/user/user.controller.ts b/idp/src/application/user/user.controller.ts index fa5e0ed..18b3bf6 100644 --- a/idp/src/application/user/user.controller.ts +++ b/idp/src/application/user/user.controller.ts @@ -8,17 +8,17 @@ import { Req, UseGuards, } from '@nestjs/common'; -import { UserService } from './user.service'; -import { AuthGuard, Roles, RolesGuard } from 'src/core/secure/guards'; -import { AuthenticatedRequest, Client, RedirectUri } from 'src/model'; +import { APPUserService } from './user.service'; +import { AuthGuard, Roles, RolesGuard } from 'src/shared/secure/guards'; +import { IAuthenticatedRequest, Client, RedirectUri } from 'src/model'; import { CreateClientDto } from 'src/model/dto/create-client.dto'; -import { ClientService } from 'src/client/client.service'; +import { ClientService } from 'src/idp/client/client.service'; @UseGuards(AuthGuard, RolesGuard) @Controller('app/user') export class UserController { constructor( - private userService: UserService, + private userService: APPUserService, private clientService: ClientService, ) {} @@ -29,13 +29,13 @@ export class UserController { @Roles('admin') @Get('clients') - getClients(@Req() req: AuthenticatedRequest): Promise { + getClients(@Req() req: IAuthenticatedRequest): Promise { return this.userService.getUserClients(req.user); } @Roles('admin') @Post('client') - createClient(@Req() req: AuthenticatedRequest, @Body() b: CreateClientDto) { + createClient(@Req() req: IAuthenticatedRequest, @Body() b: CreateClientDto) { return this.clientService.createClient( req.user, b.clientName, @@ -47,13 +47,13 @@ export class UserController { @Roles('admin') @Delete('client/:id') - deleteClient(@Req() req: AuthenticatedRequest, @Param('id') id) { + deleteClient(@Req() req: IAuthenticatedRequest, @Param('id') id) { return this.clientService.deleteClient(req.user, id); } @Post('clients/:id/redirect') saveUris( - @Req() req: AuthenticatedRequest, + @Req() req: IAuthenticatedRequest, @Param('id') id, @Body() uris: RedirectUri[], ): Promise { diff --git a/idp/src/application/user/user.module.ts b/idp/src/application/user/user.module.ts index d9904e4..b9e37cf 100644 --- a/idp/src/application/user/user.module.ts +++ b/idp/src/application/user/user.module.ts @@ -1,13 +1,12 @@ import { Module } from '@nestjs/common'; import { UserController } from './user.controller'; -import { SecureModule } from 'src/core/secure/secure.module'; -import { UserService } from './user.service'; -import { ClientService } from 'src/client/client.service'; -import { DatabaseModule } from 'src/core/database/database.module'; +import { APPUserService } from './user.service'; +import { SharedModule } from 'src/shared/shared.module'; +import { SecureModule } from 'src/shared/secure/secure.module'; @Module({ controllers: [UserController], - imports: [SecureModule, DatabaseModule], - providers: [UserService, ClientService], + imports: [SecureModule, SharedModule], + providers: [APPUserService], }) export class UserModule {} diff --git a/idp/src/application/user/user.service.spec.ts b/idp/src/application/user/user.service.spec.ts deleted file mode 100644 index 873de8a..0000000 --- a/idp/src/application/user/user.service.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { UserService } from './user.service'; - -describe('UserService', () => { - let service: UserService; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [UserService], - }).compile(); - - service = module.get(UserService); - }); - - it('should be defined', () => { - expect(service).toBeDefined(); - }); -}); diff --git a/idp/src/application/user/user.service.ts b/idp/src/application/user/user.service.ts index 96c2fff..92eae66 100644 --- a/idp/src/application/user/user.service.ts +++ b/idp/src/application/user/user.service.ts @@ -2,7 +2,7 @@ import { Injectable } from '@nestjs/common'; import { ClientRepository, LogRepository, User, Client } from 'src/model'; @Injectable() -export class UserService { +export class APPUserService { constructor( private clientRepository: ClientRepository, private logRepository: LogRepository, diff --git a/idp/src/auth/auth.controller.spec.ts b/idp/src/auth/auth.controller.spec.ts deleted file mode 100644 index 27a31e6..0000000 --- a/idp/src/auth/auth.controller.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { AuthController } from './auth.controller'; - -describe('AuthController', () => { - let controller: AuthController; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - controllers: [AuthController], - }).compile(); - - controller = module.get(AuthController); - }); - - it('should be defined', () => { - expect(controller).toBeDefined(); - }); -}); diff --git a/idp/src/auth/auth.module.ts b/idp/src/auth/auth.module.ts deleted file mode 100644 index a3e6c06..0000000 --- a/idp/src/auth/auth.module.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Module } from '@nestjs/common'; -import { AuthController } from './auth.controller'; -import { ClientService } from 'src/client/client.service'; -import { JwtModule } from '@nestjs/jwt'; -import { NestjsFormDataModule } from 'nestjs-form-data'; -import { LoggerModule } from 'src/core/logger.module'; -import { ConfigModule, ConfigService } from '@nestjs/config'; -import { DatabaseModule } from 'src/core/database/database.module'; -import { MailModule } from 'src/application/mail/mail.module'; -import { SecureModule } from 'src/core/secure/secure.module'; - -@Module({ - providers: [ClientService], - controllers: [AuthController], - imports: [ - JwtModule.registerAsync({ - imports: [ConfigModule], - inject: [ConfigService], - useFactory: async (config: ConfigService) => ({ - secret: config.get('JWT_SECRET'), - signOptions: { expiresIn: config.get('JWT_EXPIRES_IN') }, - }), - }), - NestjsFormDataModule, - LoggerModule, - DatabaseModule, - MailModule, - SecureModule, - ], -}) -export class AuthModule {} diff --git a/idp/src/client/client.service.spec.ts b/idp/src/client/client.service.spec.ts deleted file mode 100644 index b9218cf..0000000 --- a/idp/src/client/client.service.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { ClientService } from './client.service'; - -describe('ClientService', () => { - let service: ClientService; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [ClientService], - }).compile(); - - service = module.get(ClientService); - }); - - it('should be defined', () => { - expect(service).toBeDefined(); - }); -}); diff --git a/idp/src/core/secure/secure.module.ts b/idp/src/core/secure/secure.module.ts deleted file mode 100644 index bf190f4..0000000 --- a/idp/src/core/secure/secure.module.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Module } from '@nestjs/common'; -import { ConfigModule, ConfigService } from '@nestjs/config'; -import { JwtModule } from '@nestjs/jwt'; -import { NestjsFormDataModule } from 'nestjs-form-data'; -import { ClientService } from 'src/client/client.service'; -import { UsersService } from 'src/users/users.service'; -import { LoggerModule } from '../logger.module'; -import { AuthGuard } from './guards/auth.guard'; -import { DatabaseModule } from '../database/database.module'; -import { RolesGuard } from './guards/roles.guard'; -import { MailModule } from 'src/application/mail/mail.module'; - -@Module({ - imports: [ - JwtModule.registerAsync({ - imports: [ConfigModule], - inject: [ConfigService], - useFactory: async (config: ConfigService) => ({ - secret: config.get('JWT_SECRET'), - signOptions: { expiresIn: config.get('JWT_EXPIRES_IN') }, - }), - }), - NestjsFormDataModule, - DatabaseModule, - LoggerModule, - MailModule, - ], - providers: [UsersService, ClientService, AuthGuard, RolesGuard], - exports: [JwtModule, UsersService, AuthGuard, RolesGuard], -}) -export class SecureModule {} diff --git a/idp/src/auth/auth.controller.ts b/idp/src/idp/auth/auth.controller.ts similarity index 92% rename from idp/src/auth/auth.controller.ts rename to idp/src/idp/auth/auth.controller.ts index 730c738..462eea1 100644 --- a/idp/src/auth/auth.controller.ts +++ b/idp/src/idp/auth/auth.controller.ts @@ -1,11 +1,11 @@ import { Body, Controller, Get, Post, Query } from '@nestjs/common'; -import { UsersService } from 'src/users/users.service'; -import { ClientService } from 'src/client/client.service'; +import { ClientService } from 'src/idp/client/client.service'; import { FormDataRequest } from 'nestjs-form-data'; -import { CustomLogger } from 'src/core/custom.logger'; import { CreateUserDto } from 'src/model/dto/create-user.dto'; import { RequestResetPwDto, ResetPWDto } from 'src/model/dto'; import { Client } from 'src/model'; +import { UsersService } from 'src/shared/users.service'; +import { CustomLogger } from 'src/shared/logger/custom.logger'; @Controller('auth') export class AuthController { diff --git a/idp/src/idp/auth/auth.module.ts b/idp/src/idp/auth/auth.module.ts new file mode 100644 index 0000000..464fcee --- /dev/null +++ b/idp/src/idp/auth/auth.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common'; +import { AuthController } from './auth.controller'; +import { ClientService } from 'src/idp/client/client.service'; +import { NestjsFormDataModule } from 'nestjs-form-data'; +import { MailModule } from 'src/application/mail/mail.module'; +import { SharedModule } from 'src/shared/shared.module'; +import { SecureModule } from 'src/shared/secure/secure.module'; + +@Module({ + providers: [ClientService], + controllers: [AuthController], + imports: [NestjsFormDataModule, SharedModule, MailModule, SecureModule], +}) +export class AuthModule {} diff --git a/idp/src/client/client.controller.ts b/idp/src/idp/client/client.controller.ts similarity index 100% rename from idp/src/client/client.controller.ts rename to idp/src/idp/client/client.controller.ts diff --git a/idp/src/client/client.module.ts b/idp/src/idp/client/client.module.ts similarity index 56% rename from idp/src/client/client.module.ts rename to idp/src/idp/client/client.module.ts index a219528..a2fdffc 100644 --- a/idp/src/client/client.module.ts +++ b/idp/src/idp/client/client.module.ts @@ -1,12 +1,11 @@ import { Module } from '@nestjs/common'; import { NestjsFormDataModule } from 'nestjs-form-data'; -import { LoggerModule } from 'src/core/logger.module'; import { ClientController } from './client.controller'; -import { DatabaseModule } from 'src/core/database/database.module'; +import { SharedModule } from 'src/shared/shared.module'; @Module({ providers: [], controllers: [ClientController], - imports: [NestjsFormDataModule, DatabaseModule, LoggerModule], + imports: [NestjsFormDataModule, SharedModule], }) export class ClientModule {} diff --git a/idp/src/idp/client/client.service.ts b/idp/src/idp/client/client.service.ts new file mode 100644 index 0000000..c940ed8 --- /dev/null +++ b/idp/src/idp/client/client.service.ts @@ -0,0 +1,40 @@ +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { + ClientRepository, + RedirectRepository, + Client, + RedirectUri, +} from 'src/model'; +import { ClientBaseService } from 'src/shared/client/client.base.service'; + +@Injectable() +export class ClientService extends ClientBaseService { + constructor(clientRepo: ClientRepository, uriRepo: RedirectRepository) { + super(clientRepo, uriRepo); + } + + async getClient( + clientId: string, + responseType: string, + redirectUri: string, + scope: string, + ): Promise { + if (responseType !== 'code') { + throw new HttpException('Invalid client', HttpStatus.BAD_REQUEST); + } + const client = await this.clientRepo.findById(clientId); + // console.log(client); + if (!client) { + throw new HttpException('Invalid client', HttpStatus.BAD_REQUEST); + } + + if (!client.redirectUris.some((u: RedirectUri) => u.uri === redirectUri)) { + throw new HttpException('Invalid client', HttpStatus.BAD_REQUEST); + } + + if (!scope) { + throw new HttpException('Invalid client', HttpStatus.BAD_REQUEST); + } + return client; + } +} diff --git a/idp/src/idp/idp.module.ts b/idp/src/idp/idp.module.ts new file mode 100644 index 0000000..4f14104 --- /dev/null +++ b/idp/src/idp/idp.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { SharedModule } from 'src/shared/shared.module'; +import { AuthModule } from './auth/auth.module'; +import { ClientModule } from './client/client.module'; + +@Module({ + providers: [], + controllers: [], + imports: [SharedModule, AuthModule, ClientModule], +}) +export class IDPModule {} diff --git a/idp/src/model/interface/authenticated.request.ts b/idp/src/model/interface/authenticated.request.ts index 2020e79..d81b4dd 100644 --- a/idp/src/model/interface/authenticated.request.ts +++ b/idp/src/model/interface/authenticated.request.ts @@ -1,5 +1,5 @@ import { User } from '../entity'; -export interface AuthenticatedRequest extends Request { +export interface IAuthenticatedRequest extends Request { user: User; } diff --git a/idp/src/model/interface/index.ts b/idp/src/model/interface/index.ts index 122d018..6e7e43e 100644 --- a/idp/src/model/interface/index.ts +++ b/idp/src/model/interface/index.ts @@ -1 +1,2 @@ export * from './authenticated.request'; +export * from './logger.interface'; diff --git a/idp/src/model/interface/logger.interface.ts b/idp/src/model/interface/logger.interface.ts index 2fe3bf6..e543448 100644 --- a/idp/src/model/interface/logger.interface.ts +++ b/idp/src/model/interface/logger.interface.ts @@ -1,4 +1,4 @@ -export interface CustomLogger { +export interface ICustomLogger { log(message: string, context?: string): void; error(message: string, trace?: string, context?: string): void; warn(message: string, context?: string): void; diff --git a/idp/src/client/client.service.ts b/idp/src/shared/client/client.base.service.ts similarity index 68% rename from idp/src/client/client.service.ts rename to idp/src/shared/client/client.base.service.ts index 8a050e7..60e8a3a 100644 --- a/idp/src/client/client.service.ts +++ b/idp/src/shared/client/client.base.service.ts @@ -1,18 +1,17 @@ -import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { HttpException, HttpStatus } from '@nestjs/common'; import { + Client, ClientRepository, RedirectRepository, - User, - Client, RedirectUri, + User, } from 'src/model'; import { v4 as uuidv4 } from 'uuid'; -@Injectable() -export class ClientService { +export class ClientBaseService { constructor( - private clientRepo: ClientRepository, - private uriRepo: RedirectRepository, + protected clientRepo: ClientRepository, + protected uriRepo: RedirectRepository, ) {} async createClient( @@ -43,31 +42,6 @@ export class ClientService { return client; } - async getClient( - clientId: string, - responseType: string, - redirectUri: string, - scope: string, - ): Promise { - if (responseType !== 'code') { - throw new HttpException('Invalid client', HttpStatus.BAD_REQUEST); - } - const client = await this.clientRepo.findById(clientId); - // console.log(client); - if (!client) { - throw new HttpException('Invalid client', HttpStatus.BAD_REQUEST); - } - - if (!client.redirectUris.some((u: RedirectUri) => u.uri === redirectUri)) { - throw new HttpException('Invalid client', HttpStatus.BAD_REQUEST); - } - - if (!scope) { - throw new HttpException('Invalid client', HttpStatus.BAD_REQUEST); - } - return client; - } - getClientById(clientId: string): Promise { return this.clientRepo.findById(clientId); } diff --git a/idp/src/core/database/database.module.ts b/idp/src/shared/database/database.module.ts similarity index 100% rename from idp/src/core/database/database.module.ts rename to idp/src/shared/database/database.module.ts diff --git a/idp/src/shared/index.ts b/idp/src/shared/index.ts new file mode 100644 index 0000000..f02b10b --- /dev/null +++ b/idp/src/shared/index.ts @@ -0,0 +1,2 @@ +export * from './logger/logger.module'; +export * from './database/database.module'; diff --git a/idp/src/core/custom.logger.ts b/idp/src/shared/logger/custom.logger.ts similarity index 100% rename from idp/src/core/custom.logger.ts rename to idp/src/shared/logger/custom.logger.ts diff --git a/idp/src/core/logger.module.ts b/idp/src/shared/logger/logger.module.ts similarity index 79% rename from idp/src/core/logger.module.ts rename to idp/src/shared/logger/logger.module.ts index 24ff023..16f3c47 100644 --- a/idp/src/core/logger.module.ts +++ b/idp/src/shared/logger/logger.module.ts @@ -1,6 +1,6 @@ import { Module } from '@nestjs/common'; import { CustomLogger } from './custom.logger'; -import { DatabaseModule } from './database/database.module'; +import { DatabaseModule } from '../database/database.module'; @Module({ providers: [CustomLogger], diff --git a/idp/src/core/secure/guards/auth.guard.ts b/idp/src/shared/secure/guards/auth.guard.ts similarity index 95% rename from idp/src/core/secure/guards/auth.guard.ts rename to idp/src/shared/secure/guards/auth.guard.ts index 244eef1..ae93e11 100644 --- a/idp/src/core/secure/guards/auth.guard.ts +++ b/idp/src/shared/secure/guards/auth.guard.ts @@ -6,7 +6,7 @@ import { } from '@nestjs/common'; import { Reflector } from '@nestjs/core'; import { JwtService } from '@nestjs/jwt'; -import { UsersService } from 'src/users/users.service'; +import { UsersService } from 'src/shared/users.service'; @Injectable() export class AuthGuard implements CanActivate { diff --git a/idp/src/core/secure/guards/index.ts b/idp/src/shared/secure/guards/index.ts similarity index 100% rename from idp/src/core/secure/guards/index.ts rename to idp/src/shared/secure/guards/index.ts diff --git a/idp/src/core/secure/guards/role.decorator.ts b/idp/src/shared/secure/guards/role.decorator.ts similarity index 100% rename from idp/src/core/secure/guards/role.decorator.ts rename to idp/src/shared/secure/guards/role.decorator.ts diff --git a/idp/src/core/secure/guards/roles.guard.ts b/idp/src/shared/secure/guards/roles.guard.ts similarity index 100% rename from idp/src/core/secure/guards/roles.guard.ts rename to idp/src/shared/secure/guards/roles.guard.ts diff --git a/idp/src/shared/secure/secure.module.ts b/idp/src/shared/secure/secure.module.ts new file mode 100644 index 0000000..d4c66be --- /dev/null +++ b/idp/src/shared/secure/secure.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common'; +import { NestjsFormDataModule } from 'nestjs-form-data'; +import { ClientService } from 'src/idp/client/client.service'; +import { AuthGuard } from './guards/auth.guard'; +import { RolesGuard } from './guards/roles.guard'; +import { MailModule } from 'src/application/mail/mail.module'; +import { SharedModule } from 'src/shared/shared.module'; + +@Module({ + imports: [NestjsFormDataModule, SharedModule, MailModule, SharedModule], + providers: [ClientService, AuthGuard, RolesGuard], + exports: [AuthGuard, RolesGuard], +}) +export class SecureModule {} diff --git a/idp/src/shared/shared.module.ts b/idp/src/shared/shared.module.ts new file mode 100644 index 0000000..4eea7ce --- /dev/null +++ b/idp/src/shared/shared.module.ts @@ -0,0 +1,29 @@ +import { Module } from '@nestjs/common'; +import { DatabaseModule } from './database/database.module'; +import { UsersService } from './users.service'; +import { MailService } from 'src/application/mail/mail.service'; +import { ClientService } from 'src/idp/client/client.service'; +import { LoggerModule } from './logger/logger.module'; +import { JwtModule } from '@nestjs/jwt'; +import { ConfigModule, ConfigService } from '@nestjs/config'; + +const MODULES = [DatabaseModule, LoggerModule]; +const SERVICES = [UsersService, MailService, ClientService]; + +@Module({ + imports: [ + ...MODULES, + JwtModule.registerAsync({ + imports: [ConfigModule], + inject: [ConfigService], + useFactory: async (config: ConfigService) => ({ + secret: config.get('JWT_SECRET'), + signOptions: { expiresIn: config.get('JWT_EXPIRES_IN') }, + }), + }), + ], + controllers: [], + providers: [...SERVICES], + exports: [...MODULES, ...SERVICES, JwtModule], +}) +export class SharedModule {} diff --git a/idp/src/users/users.service.ts b/idp/src/shared/users.service.ts similarity index 98% rename from idp/src/users/users.service.ts rename to idp/src/shared/users.service.ts index 4b4ec17..16b7ce5 100644 --- a/idp/src/users/users.service.ts +++ b/idp/src/shared/users.service.ts @@ -1,9 +1,8 @@ import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; import { v4 as uuidv4 } from 'uuid'; import * as bcrypt from 'bcrypt'; -import { ClientService } from 'src/client/client.service'; +import { ClientService } from 'src/idp/client/client.service'; import { JwtService } from '@nestjs/jwt'; -import { CustomLogger } from 'src/core/custom.logger'; import { CreateUserDto } from 'src/model/dto/create-user.dto'; import { LoginUserDto, RequestResetPwDto, ResetPWDto } from 'src/model/dto'; import { MailService } from 'src/application/mail/mail.service'; @@ -17,6 +16,7 @@ import { AuthorizationCode, ActivityLogRepository, } from 'src/model'; +import { CustomLogger } from './logger/custom.logger'; @Injectable() export class UsersService { diff --git a/idp/src/users/users.service.spec.ts b/idp/src/users/users.service.spec.ts deleted file mode 100644 index 62815ba..0000000 --- a/idp/src/users/users.service.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { UsersService } from './users.service'; - -describe('UsersService', () => { - let service: UsersService; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [UsersService], - }).compile(); - - service = module.get(UsersService); - }); - - it('should be defined', () => { - expect(service).toBeDefined(); - }); -});