diff --git a/nestjs-BE/server/prisma/migrations/20231206093559_init/migration.sql b/nestjs-BE/server/prisma/migrations/20231212055716_init/migration.sql similarity index 92% rename from nestjs-BE/server/prisma/migrations/20231206093559_init/migration.sql rename to nestjs-BE/server/prisma/migrations/20231212055716_init/migration.sql index 72079c55..b5ba65c6 100644 --- a/nestjs-BE/server/prisma/migrations/20231206093559_init/migration.sql +++ b/nestjs-BE/server/prisma/migrations/20231212055716_init/migration.sql @@ -10,13 +10,11 @@ CREATE TABLE `USER_TB` ( -- CreateTable CREATE TABLE `REFRESH_TOKEN_TB` ( - `uuid` VARCHAR(32) NOT NULL, - `token` VARCHAR(191) NOT NULL, + `token` VARCHAR(32) NOT NULL, `expiry_date` DATETIME(3) NOT NULL, `user_id` VARCHAR(191) NOT NULL, - UNIQUE INDEX `REFRESH_TOKEN_TB_token_key`(`token`), - PRIMARY KEY (`uuid`) + PRIMARY KEY (`token`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable @@ -44,7 +42,7 @@ CREATE TABLE `PROFILE_SPACE_TB` ( `space_uuid` VARCHAR(32) NOT NULL, `profile_uuid` VARCHAR(32) NOT NULL, - PRIMARY KEY (`space_uuid`, `profile_uuid`) + UNIQUE INDEX `PROFILE_SPACE_TB_space_uuid_profile_uuid_key`(`space_uuid`, `profile_uuid`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable diff --git a/nestjs-BE/server/prisma/mysql.schema.prisma b/nestjs-BE/server/prisma/mysql.schema.prisma index 30b53a6e..4f6de20a 100644 --- a/nestjs-BE/server/prisma/mysql.schema.prisma +++ b/nestjs-BE/server/prisma/mysql.schema.prisma @@ -18,8 +18,7 @@ model USER_TB { } model REFRESH_TOKEN_TB { - uuid String @id @db.VarChar(32) - token String @unique + token String @id @db.VarChar(32) expiry_date DateTime user_id String user USER_TB @relation(fields: [user_id], references: [uuid], onDelete: Cascade) diff --git a/nestjs-BE/server/src/auth/auth.service.ts b/nestjs-BE/server/src/auth/auth.service.ts index 87e931fc..13464f60 100644 --- a/nestjs-BE/server/src/auth/auth.service.ts +++ b/nestjs-BE/server/src/auth/auth.service.ts @@ -69,21 +69,21 @@ export class AuthService extends BaseService { return accessToken; } - async createRefreshToken(): Promise { - const refreshTokenPayload = { uuid: generateUuid() }; - const refreshToken = await this.jwtService.signAsync(refreshTokenPayload, { - secret: jwtConstants.refreshSecret, - expiresIn: '14d', - }); - return refreshToken; + async createRefreshToken(): Promise> { + const refreshTokenUuid = generateUuid(); + const refreshToken = await this.jwtService.signAsync( + { uuid: refreshTokenUuid }, + { secret: jwtConstants.refreshSecret, expiresIn: '14d' }, + ); + return { refreshToken, refreshTokenUuid }; } - createRefreshTokenData(refreshToken: string, userUuid: string) { + createRefreshTokenData(refreshTokenUuid: string, userUuid: string) { const currentDate = new Date(); const expiryDate = new Date(currentDate); expiryDate.setDate(currentDate.getDate() + REFRESH_TOKEN_EXPIRY_DAYS); const refreshTokenData: TokenData = { - token: refreshToken, + token: refreshTokenUuid, expiry_date: expiryDate, user_id: userUuid, }; @@ -91,13 +91,13 @@ export class AuthService extends BaseService { } async login(userUuid: string) { - const refreshToken = await this.createRefreshToken(); + const { refreshToken, refreshTokenUuid } = await this.createRefreshToken(); const accessToken = await this.createAccessToken(userUuid); const refreshTokenData = this.createRefreshTokenData( - refreshToken, + refreshTokenUuid, userUuid, ); - super.create(refreshTokenData); + super.create(refreshTokenData, false); const tokenData = { access_token: accessToken, refresh_token: refreshToken, @@ -106,17 +106,19 @@ export class AuthService extends BaseService { } async renewAccessToken(refreshToken: string) { + const decodedToken = this.jwtService.decode(refreshToken); + const uuid = decodedToken?.uuid; try { this.jwtService.verify(refreshToken, { secret: jwtConstants.refreshSecret, }); - const { data: tokenData } = await this.findOne(refreshToken); + const { data: tokenData } = await super.findOne(uuid); const accessToken = await this.createAccessToken(tokenData.user_id); return ResponseUtils.createResponse(HttpStatus.OK, { access_token: accessToken, }); } catch (error) { - super.remove(refreshToken); + super.remove(uuid); throw new UnauthorizedException( 'Refresh token expired. Please log in again.', ); diff --git a/nestjs-BE/server/src/base/base.service.ts b/nestjs-BE/server/src/base/base.service.ts index b0aa14fa..c00772c1 100644 --- a/nestjs-BE/server/src/base/base.service.ts +++ b/nestjs-BE/server/src/base/base.service.ts @@ -113,9 +113,10 @@ export abstract class BaseService { if (insertTemporaryData) { this.temporaryDatabaseService.delete(this.className, key, 'insert'); } else { + const value = key.includes('+') ? this.stringToObject(key) : key; this.temporaryDatabaseService.remove(this.className, key, { field: this.field, - value: key, + value: value, }); } return ResponseUtils.createResponse(HttpStatus.NO_CONTENT); diff --git a/nestjs-BE/server/src/profile-space/profile-space.controller.ts b/nestjs-BE/server/src/profile-space/profile-space.controller.ts index e10e3642..25eb3462 100644 --- a/nestjs-BE/server/src/profile-space/profile-space.controller.ts +++ b/nestjs-BE/server/src/profile-space/profile-space.controller.ts @@ -67,7 +67,7 @@ export class ProfileSpaceController { spaceUuid, profileData, ); - if (isSpaceEmpty) this.spacesService.remove(spaceUuid); + if (isSpaceEmpty) return this.spacesService.remove(spaceUuid); const key = this.profileSpaceService.generateKey(joinData); return this.profileSpaceService.remove(key); } diff --git a/nestjs-BE/server/src/temporary-database/temporary-database.service.ts b/nestjs-BE/server/src/temporary-database/temporary-database.service.ts index 4330e949..c607966d 100644 --- a/nestjs-BE/server/src/temporary-database/temporary-database.service.ts +++ b/nestjs-BE/server/src/temporary-database/temporary-database.service.ts @@ -17,7 +17,7 @@ const { CSV_FOLDER } = costomEnv; type DeleteDataType = { field: string; - value: string; + value: string | Record; }; export type InsertDataType =