1
1
import logger from '@/configs/logger.config' ;
2
- import { TokenError } from '@/exception/' ;
2
+ import { NotFoundError , TokenError } from '@/exception/' ;
3
3
import { getKeyByGroup } from '@/utils/key.util' ;
4
4
import AESEncryption from '@/modules/token_encryption/aes_encryption' ;
5
+ import { sendSlackMessage } from '@/modules/slack/slack.notifier' ;
5
6
import { UserRepository } from '@/repositories/user.repository' ;
6
- import { UserWithTokenDto , User } from '@/types' ;
7
+ import { UserWithTokenDto , User , SampleUser } from '@/types' ;
7
8
import { generateRandomGroupId } from '@/utils/generateGroupId.util' ;
8
9
9
10
export class UserService {
10
- constructor ( private userRepo : UserRepository ) { }
11
+ constructor ( private userRepo : UserRepository ) { }
11
12
12
13
private encryptTokens ( groupId : number , accessToken : string , refreshToken : string ) {
13
14
const key = getKeyByGroup ( groupId ) ;
@@ -28,12 +29,24 @@ export class UserService {
28
29
}
29
30
}
30
31
31
- // 토큰 복호화 처리
32
- // private decryptTokens(refreshToken: string) {
33
- // return {
34
- // decryptedRefreshToken: this.aesEncryption.decrypt(refreshToken),
35
- // };
36
- // }
32
+ private decryptTokens ( groupId : number , accessToken : string , refreshToken : string ) {
33
+ const key = getKeyByGroup ( groupId ) ;
34
+ if ( ! key ) {
35
+ logger . error ( '그룹 키 조회 중 실패' ) ;
36
+ throw new TokenError ( '올바르지 않은 그룹 ID로 인해 암호화 키를 찾을 수 없습니다.' ) ;
37
+ }
38
+ try {
39
+ const aes = new AESEncryption ( key ) ;
40
+
41
+ return {
42
+ decryptedAccessToken : aes . decrypt ( accessToken ) ,
43
+ decryptedRefreshToken : aes . decrypt ( refreshToken ) ,
44
+ } ;
45
+ } catch ( error ) {
46
+ logger . error ( 'User Service decryptTokens error : ' , error ) ;
47
+ throw new TokenError ( '토큰 복호화 처리에 실패하였습니다.' ) ;
48
+ }
49
+ }
37
50
38
51
async handleUserTokensByVelogUUID ( userData : UserWithTokenDto ) {
39
52
const { id, email, accessToken, refreshToken } = userData ;
@@ -71,16 +84,39 @@ export class UserService {
71
84
return await this . userRepo . findByUserVelogUUID ( uuid ) ;
72
85
}
73
86
87
+ async findSampleUser ( ) : Promise < SampleUser > {
88
+ const user = await this . userRepo . findSampleUser ( ) ;
89
+ if ( ! user ) {
90
+ throw new NotFoundError ( '샘플 유저 정보를 찾을 수 없습니다.' ) ;
91
+ }
92
+
93
+ const { decryptedAccessToken, decryptedRefreshToken } = this . decryptTokens (
94
+ user . group_id ,
95
+ user . access_token ,
96
+ user . refresh_token
97
+ ) ;
98
+
99
+ return { user, decryptedAccessToken, decryptedRefreshToken } ;
100
+ }
101
+
74
102
async createUser ( userData : UserWithTokenDto ) {
75
103
const groupId = generateRandomGroupId ( ) ;
76
-
77
- return await this . userRepo . createUser (
104
+ const newUser = await this . userRepo . createUser (
78
105
userData . id ,
79
106
userData . email ,
80
107
userData . accessToken ,
81
108
userData . refreshToken ,
82
109
groupId ,
83
110
) ;
111
+
112
+ // 신규 유저 웹훅 알림
113
+ try {
114
+ await sendSlackMessage ( `새로운 유저 등록: ${ userData . id } , ${ userData . email } ` ) ;
115
+ } catch ( error ) {
116
+ // Slack 알림 실패는 사용자 생성에 영향을 주지 않도록
117
+ logger . error ( 'Slack 알림 전송 실패:' , error ) ;
118
+ }
119
+ return newUser ;
84
120
}
85
121
86
122
async updateUserTokens ( userData : UserWithTokenDto ) {
0 commit comments