11import logger from '@/configs/logger.config' ;
2- import { TokenError } from '@/exception/' ;
2+ import { NotFoundError , TokenError } from '@/exception/' ;
33import { getKeyByGroup } from '@/utils/key.util' ;
44import AESEncryption from '@/modules/token_encryption/aes_encryption' ;
5+ import { sendSlackMessage } from '@/modules/slack/slack.notifier' ;
56import { UserRepository } from '@/repositories/user.repository' ;
6- import { UserWithTokenDto , User } from '@/types' ;
7+ import { UserWithTokenDto , User , SampleUser } from '@/types' ;
78import { generateRandomGroupId } from '@/utils/generateGroupId.util' ;
89
910export class UserService {
10- constructor ( private userRepo : UserRepository ) { }
11+ constructor ( private userRepo : UserRepository ) { }
1112
1213 private encryptTokens ( groupId : number , accessToken : string , refreshToken : string ) {
1314 const key = getKeyByGroup ( groupId ) ;
@@ -28,12 +29,24 @@ export class UserService {
2829 }
2930 }
3031
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+ }
3750
3851 async handleUserTokensByVelogUUID ( userData : UserWithTokenDto ) {
3952 const { id, email, accessToken, refreshToken } = userData ;
@@ -71,16 +84,39 @@ export class UserService {
7184 return await this . userRepo . findByUserVelogUUID ( uuid ) ;
7285 }
7386
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+
74102 async createUser ( userData : UserWithTokenDto ) {
75103 const groupId = generateRandomGroupId ( ) ;
76-
77- return await this . userRepo . createUser (
104+ const newUser = await this . userRepo . createUser (
78105 userData . id ,
79106 userData . email ,
80107 userData . accessToken ,
81108 userData . refreshToken ,
82109 groupId ,
83110 ) ;
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 ;
84120 }
85121
86122 async updateUserTokens ( userData : UserWithTokenDto ) {
0 commit comments