Skip to content

Commit

Permalink
Merge pull request #53 from SWM-M3PRO/feature/M3-235-imagePressToS3
Browse files Browse the repository at this point in the history
M3-235 s3 이미지 압축
  • Loading branch information
koomin1227 authored Aug 3, 2024
2 parents 73ae6e2 + a5822a3 commit eeee29d
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 13 deletions.
9 changes: 4 additions & 5 deletions src/main/java/com/m3pro/groundflip/service/UserService.java
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,8 @@ public UserInfoResponse getUserInfo(Long userId) {

/**
* 유저의 정보를 수정한다
* @Param 유저id
* @Param 유저정보dto (gender, year, nickname)
* @Param userId 유저id
* @Param userInfoRequest 유저정보dto (gender, year, nickname)
* @Param 이미지 multipartFile
* convertToDate() int로 들어온 year을 Date로 변환
* checkNicknameExists() 닉네임 중복 체크를 위해 닉네임이 있는지 확인
Expand All @@ -86,18 +86,17 @@ public void putUserInfo(Long userId, UserInfoRequest userInfoRequest, MultipartF
}

if (multipartFile != null) {
fileS3Url = s3Uploader.uploadFiles(multipartFile);
fileS3Url = s3Uploader.uploadFiles(multipartFile, userId);
} else {
fileS3Url = user.getProfileImage();
}

user.updateGender(userInfoRequest.getGender());
user.updateBirthYear(convertToDate(userInfoRequest.getBirthYear()));
user.updateNickName(userInfoRequest.getNickname());
user.updateProfileImage(fileS3Url);
user.updateStatus(UserStatus.COMPLETE);
user.updateProfileImage(fileS3Url);
userRepository.save(user);

rankingRedisRepository.saveUserInRedis(user.getId());
}

Expand Down
8 changes: 4 additions & 4 deletions src/main/java/com/m3pro/groundflip/util/S3Uploader.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,14 @@ public class S3Uploader {
@Value("${cloud.aws.s3.bucket}")
private String bucket;

public String uploadFiles(MultipartFile multipartFile) throws IOException {
public String uploadFiles(MultipartFile multipartFile, Long userId) throws IOException {
String originalFileName = multipartFile.getOriginalFilename();
String convertedFileName;
String imageUrl = "";
final String path = bucket.concat("/static");

if (originalFileName != null) {
convertedFileName = convertFileNameToUuid(originalFileName);
convertedFileName = convertFileNameToUuid(originalFileName, userId);
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(multipartFile.getSize());
metadata.setContentType(multipartFile.getContentType());
Expand All @@ -40,9 +40,9 @@ public String uploadFiles(MultipartFile multipartFile) throws IOException {
return imageUrl;
}

private String convertFileNameToUuid(String fileName) {
private String convertFileNameToUuid(String fileName, Long userId) {
String fileExtension = fileName.substring(fileName.lastIndexOf("."));
return UUID.randomUUID().toString().concat(fileExtension);
return UUID.randomUUID().toString().concat("###" + userId.toString()).concat(fileExtension);
}

}
5 changes: 5 additions & 0 deletions src/main/resources/application-local.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ spring:
host: ${REDIS_HOST}
port: 6379

servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB

logging:
level:
sql: debug
Expand Down
82 changes: 78 additions & 4 deletions src/test/java/com/m3pro/groundflip/service/UserServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,11 @@
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
Expand All @@ -20,6 +23,7 @@
import org.mockito.junit.jupiter.MockitoExtension;

import com.m3pro.groundflip.domain.dto.user.UserDeleteRequest;
import com.m3pro.groundflip.domain.dto.user.UserInfoRequest;
import com.m3pro.groundflip.domain.dto.user.UserInfoResponse;
import com.m3pro.groundflip.domain.entity.AppleRefreshToken;
import com.m3pro.groundflip.domain.entity.Community;
Expand All @@ -32,15 +36,23 @@
import com.m3pro.groundflip.exception.ErrorCode;
import com.m3pro.groundflip.jwt.JwtProvider;
import com.m3pro.groundflip.repository.AppleRefreshTokenRepository;
import com.m3pro.groundflip.repository.RankingRedisRepository;
import com.m3pro.groundflip.repository.UserCommunityRepository;
import com.m3pro.groundflip.repository.UserRepository;
import com.m3pro.groundflip.service.oauth.AppleApiClient;
import com.m3pro.groundflip.util.S3Uploader;

@ExtendWith(MockitoExtension.class)
class UserServiceTest {
@Mock
private UserRepository userRepository;

@Mock
private RankingRedisRepository rankingRedisRepository;

@Mock
private S3Uploader s3Uploader;

@Mock
private UserCommunityRepository userCommunityRepository;

Expand All @@ -56,6 +68,71 @@ class UserServiceTest {
@InjectMocks
private UserService userService;

@Test
@DisplayName("[PutUserInfo] user정보가 올바르게 업데이트 되는지")
void putUserInfoTest() throws IOException {
//Given
Long userId = 1L;
String exampleNickname = "kim";
Gender gender = Gender.MALE;
int year = 2000;
LocalDate localDate = LocalDate.of(year, 1, 1);
Date birthYear = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

User user = User.builder().id(userId).nickname("before kim").build();

UserInfoRequest userInfoRequest = UserInfoRequest.builder()
.nickname(exampleNickname)
.gender(gender)
.birthYear(year)
.build();

//When
when(userRepository.findById(userId)).thenReturn(Optional.of(user));
userService.putUserInfo(userId, userInfoRequest, null);

//Then
assertThat(user.getNickname()).isEqualTo(exampleNickname);
assertThat(user.getBirthYear()).isEqualTo(birthYear);
assertThat(user.getGender()).isEqualTo(gender);

}

@Test
@DisplayName("[putUserInfo] 중복된 user닉네임을 설정하는 경우")
void putUserInfoDuplicate() {
// Given
Long userId1 = 1L;
Long userId2 = 2L;
String userNickName1 = "kim";
String userNickName2 = "cha";

User user1 = User.builder()
.id(userId1)
.nickname(userNickName1)
.build();

User user2 = User.builder()
.id(userId2)
.nickname(userNickName2)
.build();

UserInfoRequest userInfoRequest = UserInfoRequest.builder()
.nickname(userNickName2)
.profileImage(null).build();

//When
when(userRepository.findById(userId1)).thenReturn(Optional.of(user1));
when(userRepository.findByNickname(userNickName2)).thenReturn(Optional.of(user2));

// Then
AppException exception = assertThrows(AppException.class,
() -> userService.putUserInfo(userId1, userInfoRequest, null));

assertEquals(ErrorCode.DUPLICATED_NICKNAME, exception.getErrorCode());
verify(userRepository, times(1)).findByNickname(userNickName2);
}

@Test
@DisplayName("[getUserInfo] 존재하지 않는 user 를 조회하는 경우")
void getUserInfoNotFoundTest() {
Expand Down Expand Up @@ -97,10 +174,7 @@ void getUserInfoTest() throws ParseException {
Date date = formatter.parse(dateString);
User user = User.builder().id(1L).birthYear(date).build();
Community community = Community.builder().id(1L).name("test").build();
UserCommunity userCommunity = UserCommunity.builder()
.user(user)
.community(community)
.build();
UserCommunity userCommunity = UserCommunity.builder().user(user).community(community).build();
when(userRepository.findById(anyLong())).thenReturn(Optional.of(user));
when(userCommunityRepository.findByUserId(anyLong())).thenReturn(Collections.singletonList(userCommunity));

Expand Down

0 comments on commit eeee29d

Please sign in to comment.