Skip to content

Commit b4ad410

Browse files
committed
feature: 기본 타입 업데이트
1 parent f139b91 commit b4ad410

File tree

4 files changed

+51
-29
lines changed

4 files changed

+51
-29
lines changed

src/controllers/user.controller.ts

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,26 @@ const THREE_WEEKS_IN_MS = 21 * 24 * 60 * 60 * 1000;
1414
export class UserController {
1515
constructor(private userService: UserService) {}
1616

17-
private cookieOption(): CookieOptions {
17+
/**
18+
* 환경 및 쿠키 삭제 여부에 따라 쿠키 옵션을 생성합니다.
19+
*
20+
* @param isClear - true일 경우 쿠키 삭제용 옵션을 생성합니다. 기본값은 false입니다.
21+
* @returns 현재 환경에 맞게 설정된 CookieOptions 객체를 반환합니다.
22+
*/
23+
private cookieOption(isClear: boolean = false): CookieOptions {
1824
const isProd = process.env.NODE_ENV === 'production';
19-
20-
const baseOptions: CookieOptions = {
25+
const options: CookieOptions = {
2126
httpOnly: isProd,
2227
secure: isProd,
28+
sameSite: isProd ? 'lax' : undefined,
29+
domain: isProd ? 'velog-dashboard.kro.kr' : 'localhost',
2330
};
2431

25-
if (isProd) {
26-
baseOptions.sameSite = 'lax';
27-
baseOptions.domain = 'velog-dashboard.kro.kr';
28-
baseOptions.maxAge = THREE_WEEKS_IN_MS; // 3주
29-
} else {
30-
baseOptions.domain = 'localhost';
32+
if (isProd && !isClear) {
33+
options.maxAge = THREE_WEEKS_IN_MS;
3134
}
3235

33-
return baseOptions;
36+
return options;
3437
}
3538

3639
login: RequestHandler = async (req: Request, res: Response<LoginResponseDto>, next: NextFunction): Promise<void> => {
@@ -43,8 +46,8 @@ export class UserController {
4346
const user = await this.userService.handleUserTokensByVelogUUID(velogUser, accessToken, refreshToken);
4447

4548
// 3. 로그이 완료 후 쿠키 세팅
46-
res.clearCookie('access_token', this.cookieOption());
47-
res.clearCookie('refresh_token', this.cookieOption());
49+
res.clearCookie('access_token', this.cookieOption(true));
50+
res.clearCookie('refresh_token', this.cookieOption(true));
4851

4952
res.cookie('access_token', accessToken, this.cookieOption());
5053
res.cookie('refresh_token', refreshToken, this.cookieOption());
@@ -71,8 +74,8 @@ export class UserController {
7174
try {
7275
const sampleUser = await this.userService.findSampleUser();
7376

74-
res.clearCookie('access_token', this.cookieOption());
75-
res.clearCookie('refresh_token', this.cookieOption());
77+
res.clearCookie('access_token', this.cookieOption(true));
78+
res.clearCookie('refresh_token', this.cookieOption(true));
7679

7780
res.cookie('access_token', sampleUser.decryptedAccessToken, this.cookieOption());
7881
res.cookie('refresh_token', sampleUser.decryptedRefreshToken, this.cookieOption());
@@ -98,8 +101,8 @@ export class UserController {
98101
};
99102

100103
logout: RequestHandler = async (req: Request, res: Response<EmptyResponseDto>) => {
101-
res.clearCookie('access_token', this.cookieOption());
102-
res.clearCookie('refresh_token', this.cookieOption());
104+
res.clearCookie('access_token', this.cookieOption(true));
105+
res.clearCookie('refresh_token', this.cookieOption(true));
103106

104107
const response = new EmptyResponseDto(true, '로그아웃에 성공하였습니다.', {}, null);
105108

@@ -155,8 +158,8 @@ export class UserController {
155158
throw new QRTokenExpiredError();
156159
}
157160

158-
res.clearCookie('access_token', this.cookieOption());
159-
res.clearCookie('refresh_token', this.cookieOption());
161+
res.clearCookie('access_token', this.cookieOption(true));
162+
res.clearCookie('refresh_token', this.cookieOption(true));
160163

161164
res.cookie('access_token', userLoginToken.decryptedAccessToken, this.cookieOption());
162165
res.cookie('refresh_token', userLoginToken.decryptedRefreshToken, this.cookieOption());

src/repositories/user.repository.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { QRLoginToken } from '@/types/models/QRLoginToken.type';
55
import { DBError } from '@/exception';
66

77
export class UserRepository {
8-
constructor(private readonly pool: Pool) {}
8+
constructor(private readonly pool: Pool) { }
99

1010
async findByUserId(id: number): Promise<User> {
1111
try {
@@ -42,15 +42,15 @@ export class UserRepository {
4242
}
4343
}
4444

45-
async updateTokens(uuid: string, encryptedAccessToken: string, encryptedRefreshToken: string): Promise<User> {
45+
async updateTokens(uuid: string, email: string, username: string, thumbnail: string, encryptedAccessToken: string, encryptedRefreshToken: string): Promise<User> {
4646
try {
4747
const query = `
4848
UPDATE "users_user"
49-
SET access_token = $1, refresh_token = $2, updated_at = NOW(), is_active = true
50-
WHERE velog_uuid = $3
49+
SET access_token = $1, refresh_token = $2, email = $3, username = $4, thumbnail = $5, updated_at = NOW(), is_active = true
50+
WHERE velog_uuid = $6
5151
RETURNING *;
5252
`;
53-
const values = [encryptedAccessToken, encryptedRefreshToken, uuid];
53+
const values = [encryptedAccessToken, encryptedRefreshToken, email, username, thumbnail, uuid];
5454

5555
const result = await this.pool.query(query, values);
5656

@@ -67,6 +67,8 @@ export class UserRepository {
6767
async createUser(
6868
uuid: string,
6969
email: string | null,
70+
username: string,
71+
thumbnail: string | null,
7072
encryptedAccessToken: string,
7173
encryptedRefreshToken: string,
7274
groupId: number,
@@ -78,17 +80,19 @@ export class UserRepository {
7880
access_token,
7981
refresh_token,
8082
email,
83+
username,
84+
thumbnail,
8185
group_id,
8286
is_active,
8387
created_at,
8488
updated_at
8589
)
8690
VALUES (
87-
$1, $2, $3, $4, $5, true, NOW(), NOW()
91+
$1, $2, $3, $4, $5, $6, $7, true, NOW(), NOW()
8892
)
8993
RETURNING *;
9094
`;
91-
const values = [uuid, encryptedAccessToken, encryptedRefreshToken, email, groupId];
95+
const values = [uuid, encryptedAccessToken, encryptedRefreshToken, email, username, thumbnail, groupId];
9296

9397
const result = await this.pool.query(query, values);
9498
if (!result.rows[0]) {

src/services/user.service.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { generateRandomToken } from '@/utils/generateRandomToken.util';
1010
import { VelogUserCurrentResponse } from '@/modules/velog/velog.type';
1111

1212
export class UserService {
13-
constructor(private userRepo: UserRepository) {}
13+
constructor(private userRepo: UserRepository) { }
1414

1515
private encryptTokens(groupId: number, accessToken: string, refreshToken: string) {
1616
const key = getKeyByGroup(groupId);
@@ -56,7 +56,7 @@ export class UserService {
5656
refreshToken: string,
5757
): Promise<User> {
5858
// velog response 에서 주는 응답 혼용 방지를 위한 변경 id -> uuid
59-
const { id: uuid, email = null } = userData;
59+
const { id: uuid, email = null, username, profile: { thumbnail } } = userData;
6060
try {
6161
let user = await this.userRepo.findByUserVelogUUID(uuid);
6262

@@ -65,6 +65,8 @@ export class UserService {
6565
user = await this.createUser({
6666
uuid,
6767
email,
68+
username,
69+
thumbnail,
6870
accessToken,
6971
refreshToken,
7072
});
@@ -81,6 +83,8 @@ export class UserService {
8183
return await this.updateUserTokens({
8284
uuid,
8385
email,
86+
username,
87+
thumbnail,
8488
accessToken: encryptedAccessToken,
8589
refreshToken: encryptedRefreshToken,
8690
});
@@ -110,6 +114,8 @@ export class UserService {
110114
const newUser = await this.userRepo.createUser(
111115
userData.uuid,
112116
userData.email,
117+
userData.username,
118+
userData.thumbnail,
113119
userData.accessToken,
114120
userData.refreshToken,
115121
groupId,
@@ -126,7 +132,7 @@ export class UserService {
126132
}
127133

128134
async updateUserTokens(userData: UserWithTokenDto) {
129-
return await this.userRepo.updateTokens(userData.uuid, userData.accessToken, userData.refreshToken);
135+
return await this.userRepo.updateTokens(userData.uuid, userData.email || '', userData.username, userData.thumbnail || '', userData.accessToken, userData.refreshToken);
130136
}
131137

132138
async createUserQRToken(userId: number, ip: string, userAgent: string): Promise<string> {

src/types/dto/userWithToken.type.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@ export class UserWithTokenDto {
99
@IsEmail()
1010
email: string | null = null; // undefined 가능성 없애고 null 로 고정
1111

12+
@IsNotEmpty()
13+
@IsString()
14+
username: string;
15+
16+
@IsOptional()
17+
thumbnail: string | null = null;
18+
1219
@IsNotEmpty()
1320
@IsString()
1421
accessToken: string;
@@ -17,9 +24,11 @@ export class UserWithTokenDto {
1724
@IsString()
1825
refreshToken: string;
1926

20-
constructor(uuid: string, email: string | null, accessToken: string, refreshToken: string) {
27+
constructor(uuid: string, email: string | null, username: string, thumbnail: string | null, accessToken: string, refreshToken: string) {
2128
this.uuid = uuid;
2229
this.email = email;
30+
this.username = username;
31+
this.thumbnail = thumbnail;
2332
this.accessToken = accessToken;
2433
this.refreshToken = refreshToken;
2534
}

0 commit comments

Comments
 (0)