Skip to content

Commit

Permalink
refactor(#10): user-image.service 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
NicoDora committed Oct 4, 2023
1 parent 87ebcfe commit 5f62e17
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 35 deletions.
3 changes: 2 additions & 1 deletion src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import { FriendModule } from './friend/friend.module';
import { NoticeModule } from './notice/notice.module';

import * as mongoose from 'mongoose';
import { UserImageRepository } from './users/repositories/user-image.repository';

@Module({
imports: [
Expand All @@ -39,7 +40,7 @@ import * as mongoose from 'mongoose';
NoticeModule,
],
controllers: [],
providers: [UserImageService, S3Service],
providers: [UserImageService, UserImageRepository, S3Service],
})
export class AppModule implements NestModule {
private readonly isDev: boolean =
Expand Down
36 changes: 4 additions & 32 deletions src/users/controllers/user-image.controller.ts
Original file line number Diff line number Diff line change
@@ -1,42 +1,14 @@
import { UserRepository } from 'src/users/repositories/user.repository';
import { Controller, InternalServerErrorException, Param, Patch, UploadedFile, UseInterceptors } from '@nestjs/common';
import { Controller, Param, Patch, UploadedFile, UseInterceptors } from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { S3Service } from 'src/common/s3/s3.service';
import { UserImageRepository } from '../repositories/user-image.repository';
import { UserImageService } from '../services/user-image.service';

@Controller('user/image')
export class UserImageController {
constructor(
private readonly s3Service: S3Service,
private readonly userRepository: UserRepository,
private readonly userImageRepository : UserImageRepository
) {}
constructor(private readonly userImageService: UserImageService) {}

@Patch(':userId')
@UseInterceptors(FileInterceptor('file'))
async uploadImage(@Param('userId') userId: number, @UploadedFile() file: Express.Multer.File) {

const res = await this.s3Service.imgUpload(file, userId); // S3에 이미지 업로드
if (!res) { // S3에 이미지 업로드 실패
throw new InternalServerErrorException('S3 이미지 업로드에 실패했습니다.');
} else { // S3에 이미지 업로드 성공
const imageUrl = res.url; // S3에 업로드된 이미지 URL

const checkUserImage = (await this.userImageRepository.checkUserImage(userId)).imageUrl; // DB에 이미지가 있는지 확인
const imageUrlParts = checkUserImage.split('/');
const imageKey = imageUrlParts[imageUrlParts.length - 1]; // S3에 업로드된 이미지의 키
const dbImageUrl = imageUrlParts[imageUrlParts.length - 2]; // 이미지 제공자 이름

if (dbImageUrl == 'ma6-main.s3.ap-northeast-2.amazonaws.com' && imageKey !== 'default_user_image.png') { // S3에 업로드된 이미지이고, 기본 이미지가 아닌 경우
await this.s3Service.deleteImage(imageKey); // S3에 업로드된 기존 이미지 삭제
}

const updateUserImage = await this.userImageRepository.updateUserImage(userId, imageUrl); // DB에 이미지 URL 업데이트
if (!updateUserImage) {
throw new InternalServerErrorException('사용자 이미지 업데이트에 실패했습니다.');
} else {
return { status: 'success', message: '이미지 업데이트에 성공했습니다.'};
}
}
return this.userImageService.uploadImage(userId, file);
}
}
39 changes: 38 additions & 1 deletion src/users/services/user-image.service.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,41 @@
import { Injectable } from '@nestjs/common';
import { S3Service } from 'src/common/s3/s3.service';
import { UserImageRepository } from '../repositories/user-image.repository';
import { InternalServerErrorException } from '@nestjs/common';

@Injectable()
export class UserImageService {}
export class UserImageService {
constructor(
private readonly s3Service: S3Service,
private readonly userImageRepository: UserImageRepository,
) {}

async uploadImage(userId: number, file: Express.Multer.File): Promise<{ status: string; message: string }> {
try {
const res = await this.s3Service.imgUpload(file, userId); // S3에 이미지 업로드
if (!res) {
throw new InternalServerErrorException('S3 이미지 업로드에 실패했습니다.');
}

const imageUrl = res.url; // S3에 업로드된 이미지 URL
const checkUserImage = (await this.userImageRepository.checkUserImage(userId)).imageUrl; // DB에 이미지가 있는지 확인
const imageUrlParts = checkUserImage.split('/');
const imageKey = imageUrlParts[imageUrlParts.length - 1]; // S3에 업로드된 이미지의 키
const dbImageUrl = imageUrlParts[imageUrlParts.length - 2]; // 이미지 제공자 이름

if (dbImageUrl == 'ma6-main.s3.ap-northeast-2.amazonaws.com' && imageKey !== 'default_user_image.png') {
// S3에 업로드된 이미지이고, 기본 이미지가 아닌 경우
await this.s3Service.deleteImage(imageKey); // S3에 업로드된 기존 이미지 삭제
}

const updateUserImage = await this.userImageRepository.updateUserImage(userId, imageUrl); // DB에 이미지 URL 업데이트
if (!updateUserImage) {
throw new InternalServerErrorException('사용자 이미지 업데이트에 실패했습니다.');
} else {
return { status: 'success', message: '이미지 업데이트에 성공했습니다.' };
}
} catch (error) {
throw new InternalServerErrorException('이미지 업로드 및 처리 중 오류가 발생했습니다.');
}
}
}
3 changes: 2 additions & 1 deletion src/users/user.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@ import { UserImageController } from './controllers/user-image.controller';
import { S3Service } from 'src/common/s3/s3.service';
import { UserRepository } from './repositories/user.repository';
import { UserImageRepository } from './repositories/user-image.repository';
import { UserImageService } from './services/user-image.service';

@Module({
imports: [TypeOrmModule.forFeature([User])],
controllers: [UserImageController],
providers: [
S3Service, UserImageController, UserRepository, UserImageRepository],
S3Service, UserImageController, UserRepository, UserImageRepository, UserImageService],
})
export class UserModule {}

0 comments on commit 5f62e17

Please sign in to comment.