diff --git a/backend/src/app.module.ts b/backend/src/app.module.ts index dc1871d..3f5d90a 100644 --- a/backend/src/app.module.ts +++ b/backend/src/app.module.ts @@ -10,6 +10,7 @@ import { SecurityHeadersMiddleware } from './middleware/security-middleware/secu import { AuthModule } from './modules/auth-module/auth.module'; import { AccessTokenGuard } from './modules/auth-module/common/guards'; import { DatabaseModule } from './modules/database-module/database.module'; +import { UserModule } from './modules/user-module/user.module'; @Module({ imports: [ @@ -18,6 +19,7 @@ import { DatabaseModule } from './modules/database-module/database.module'; }), DatabaseModule, AuthModule, + UserModule, ], controllers: [AppController], providers: [AppService, { provide: 'APP_GUARD', useClass: AccessTokenGuard }], diff --git a/backend/src/entities/user-data.entity.ts b/backend/src/entities/user-data.entity.ts index 9bc93f4..b0ab112 100644 --- a/backend/src/entities/user-data.entity.ts +++ b/backend/src/entities/user-data.entity.ts @@ -13,13 +13,13 @@ import { UserCredentials } from './user-credentials.entity'; @Entity() export class UserData { @PrimaryGeneratedColumn('uuid') - public id: number; + public id: string; @Column({ default: false }) public isEmailConfirmed: boolean; @OneToOne(() => UserCredentials) - @JoinColumn() + @JoinColumn({ name: 'userCredentialsId' }) public user: UserCredentials; @CreateDateColumn() diff --git a/backend/src/modules/auth-module/auth.module.ts b/backend/src/modules/auth-module/auth.module.ts index 4c0bbe8..dab6e0f 100644 --- a/backend/src/modules/auth-module/auth.module.ts +++ b/backend/src/modules/auth-module/auth.module.ts @@ -1,11 +1,12 @@ import { Module } from '@nestjs/common'; import { JwtModule } from '@nestjs/jwt'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { UserData, UserCredentials } from 'src/entities'; +import { UserCredentials } from 'src/entities'; + +import { UserModule } from '../user-module/user.module'; import { AuthController } from './controller/auth.controller'; import { UserCredentialsRepository } from './repositories/user-credentials.repository'; -import { UserDataRepository } from './repositories/user-data.repository'; import { AuthService } from './services/auth.service'; import { EncryptionService } from './services/encryption.service'; import { TokenManagementService } from './services/token-management.service'; @@ -13,15 +14,15 @@ import { AccessTokenStrategy, RefreshTokenStrategy } from './strategies'; @Module({ imports: [ + UserModule, JwtModule.register({}), - TypeOrmModule.forFeature([UserCredentials, UserData]), + TypeOrmModule.forFeature([UserCredentials]), ], providers: [ AuthService, TokenManagementService, EncryptionService, UserCredentialsRepository, - UserDataRepository, AccessTokenStrategy, RefreshTokenStrategy, ], diff --git a/backend/src/modules/auth-module/services/auth.service.ts b/backend/src/modules/auth-module/services/auth.service.ts index f3b4f59..9416bba 100644 --- a/backend/src/modules/auth-module/services/auth.service.ts +++ b/backend/src/modules/auth-module/services/auth.service.ts @@ -1,8 +1,8 @@ import { ForbiddenException, Injectable } from '@nestjs/common'; +import { UserDataRepository } from '../../user-module/repositories/user-data.repository'; import { TokensDto, UserCredentialsDto } from '../models/dto'; import { UserCredentialsRepository } from '../repositories/user-credentials.repository'; -import { UserDataRepository } from '../repositories/user-data.repository'; import { EncryptionService } from './encryption.service'; import { TokenManagementService } from './token-management.service'; @@ -10,8 +10,8 @@ import { TokenManagementService } from './token-management.service'; @Injectable() export class AuthService { public constructor( - private readonly userRepository: UserCredentialsRepository, - private readonly UserDataRepository: UserDataRepository, + private readonly userCredentialsRepository: UserCredentialsRepository, + private readonly userDataRepository: UserDataRepository, private readonly tokenManagementService: TokenManagementService, private readonly encryptionService: EncryptionService ) {} @@ -20,18 +20,18 @@ export class AuthService { const passwordHashed = await this.encryptionService.hashData( userCredentials.password ); - const user = await this.userRepository.createUser( + const user = await this.userCredentialsRepository.createUser( userCredentials.email, passwordHashed ); - await this.UserDataRepository.createInitialUserData(user.id); + await this.userDataRepository.createInitialUserData(user); return this.generateAndPersistTokens(user.id, user.email); } public async signin(userCredentials: UserCredentialsDto): Promise { - const user = await this.userRepository.findUserByEmail( + const user = await this.userCredentialsRepository.findUserByEmail( userCredentials.email ); @@ -55,7 +55,7 @@ export class AuthService { userId: number, refreshToken: string ): Promise { - const user = await this.userRepository.findUserById(userId); + const user = await this.userCredentialsRepository.findUserById(userId); if (!user || !user.hashedRt) { throw new ForbiddenException('Access Denied'); @@ -74,7 +74,7 @@ export class AuthService { } public async logout(userId: number): Promise { - const affected = await this.userRepository.updateUserTokenHash( + const affected = await this.userCredentialsRepository.updateUserTokenHash( userId, null ); @@ -94,7 +94,10 @@ export class AuthService { tokens.refresh_token ); - await this.userRepository.updateUserTokenHash(userId, hashedRefreshToken); + await this.userCredentialsRepository.updateUserTokenHash( + userId, + hashedRefreshToken + ); return tokens; } } diff --git a/backend/src/modules/user-module/repositories/index.ts b/backend/src/modules/user-module/repositories/index.ts new file mode 100644 index 0000000..2248b76 --- /dev/null +++ b/backend/src/modules/user-module/repositories/index.ts @@ -0,0 +1 @@ +export * from './user-data.repository'; diff --git a/backend/src/modules/auth-module/repositories/user-data.repository.ts b/backend/src/modules/user-module/repositories/user-data.repository.ts similarity index 68% rename from backend/src/modules/auth-module/repositories/user-data.repository.ts rename to backend/src/modules/user-module/repositories/user-data.repository.ts index 85c593c..d8a57b1 100644 --- a/backend/src/modules/auth-module/repositories/user-data.repository.ts +++ b/backend/src/modules/user-module/repositories/user-data.repository.ts @@ -1,6 +1,6 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { UserData } from 'src/entities'; +import { UserCredentials, UserData } from 'src/entities'; import { Repository } from 'typeorm'; @Injectable() @@ -10,10 +10,12 @@ export class UserDataRepository { private readonly repository: Repository ) {} - public async createInitialUserData(userid: number): Promise { + public async createInitialUserData( + userCredentials: UserCredentials + ): Promise { const userData = new UserData(); - userData.id = userid; + userData.user = userCredentials; userData.isEmailConfirmed = false; return this.repository.save(userData); diff --git a/backend/src/modules/user-module/user.module.ts b/backend/src/modules/user-module/user.module.ts new file mode 100644 index 0000000..1786b75 --- /dev/null +++ b/backend/src/modules/user-module/user.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { UserData } from 'src/entities'; + +import { UserDataRepository } from './repositories'; + +@Module({ + imports: [TypeOrmModule.forFeature([UserData])], + providers: [UserDataRepository], + controllers: [], + exports: [UserDataRepository], +}) +export class UserModule {}