1- import { ConflictException , Injectable } from '@nestjs/common' ;
1+ import {
2+ ConflictException ,
3+ Injectable ,
4+ NotFoundException ,
5+ } from '@nestjs/common' ;
26import { UserRepository } from './user.repository' ;
37import { ImageService } from 'src/image/image.service' ;
48import { UserInfo } from 'src/auth/types/userInfo.type' ;
@@ -28,12 +32,18 @@ export class UserService {
2832 return null ;
2933 }
3034
31- const { profileImage, ...userWithoutProfileImage } = user ;
32- const responseUser : UserInfo = userWithoutProfileImage ;
35+ const responseUser : UserInfo = {
36+ uuid : user . uuid ,
37+ kakaoId : user . kakaoId ,
38+ nickname : user . nickname ,
39+ createdAt : user . createdAt ,
40+ profileImageUrl : null ,
41+ } ;
3342
34- if ( profileImage ) {
35- responseUser . profileImageUrl =
36- await this . imageService . generateSignedUrl ( profileImage ) ;
43+ if ( user . profileImage ) {
44+ responseUser . profileImageUrl = await this . imageService . generateSignedUrl (
45+ user . profileImage ,
46+ ) ;
3747 }
3848
3949 return responseUser ;
@@ -58,10 +68,42 @@ export class UserService {
5868
5969 // 프로필 이미지 업데이트
6070 async updateProfileImage (
61- uuid : string ,
71+ user : User ,
6272 file : Express . Multer . File ,
6373 ) : Promise < User > {
64- const imageKey = await this . imageService . uploadProfileImage ( file ) ;
65- return this . userRepository . updateProfileImage ( uuid , imageKey ) ;
74+ // 기존 프로필 이미지 키를 저장
75+ const oldProfileImageKey = user . profileImage ;
76+
77+ // 새로운 이미지를 먼저 S3에 업로드
78+ const newImageKey = await this . imageService . uploadProfileImage ( file ) ;
79+
80+ // DB에 새로운 이미지 키 업데이트
81+ const updatedUser = await this . userRepository . updateProfileImage (
82+ user . uuid ,
83+ newImageKey ,
84+ ) ;
85+
86+ // 새 이미지 업로드와 DB 업데이트가 성공했을 때만 기존 이미지 삭제
87+ if ( oldProfileImageKey ) {
88+ try {
89+ await this . imageService . deleteProfileImage ( oldProfileImageKey ) ;
90+ } catch ( error ) {
91+ console . error ( '기존 프로필 이미지 삭제 실패:' , error ) ;
92+ }
93+ }
94+
95+ return updatedUser ;
96+ }
97+
98+ // 프로필 이미지 삭제
99+ async deleteProfileImage ( user : User ) : Promise < User > {
100+ // S3에서 기존 프로필 이미지 삭제
101+ if ( user . profileImage ) {
102+ await this . imageService . deleteProfileImage ( user . profileImage ) ;
103+ // DB에서 User의 프로필 이미지 삭제 (null로 설정)
104+ return this . userRepository . deleteProfileImage ( user . uuid ) ;
105+ } else {
106+ throw new NotFoundException ( '프로필 이미지가 없습니다.' ) ;
107+ }
66108 }
67109}
0 commit comments