-
Notifications
You must be signed in to change notification settings - Fork 8
refactor: s3 버전 업그레이드 및 로직 수정 #608
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
8bc53a7
6210cac
4a020d6
e799840
18b9039
a709bdf
1bd38ee
3d01d3b
4c7febc
137f27c
f31bf48
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -27,6 +27,7 @@ | |
| import com.example.solidconnection.mentor.repository.MentorRepository; | ||
| import com.example.solidconnection.siteuser.domain.SiteUser; | ||
| import com.example.solidconnection.siteuser.repository.SiteUserRepository; | ||
| import java.util.Arrays; | ||
| import java.util.Collections; | ||
| import java.util.List; | ||
| import java.util.Map; | ||
|
|
@@ -39,6 +40,7 @@ | |
| import org.springframework.messaging.simp.SimpMessageSendingOperations; | ||
| import org.springframework.stereotype.Service; | ||
| import org.springframework.transaction.annotation.Transactional; | ||
| import org.springframework.util.StringUtils; | ||
|
|
||
| @Service | ||
| public class ChatService { | ||
|
|
@@ -240,16 +242,19 @@ public void sendChatImage(ChatImageSendRequest chatImageSendRequest, long siteUs | |
| ChatRoom chatRoom = chatRoomRepository.findById(roomId) | ||
| .orElseThrow(() -> new CustomException(INVALID_CHAT_ROOM_STATE)); | ||
|
|
||
| ChatMessage chatMessage = new ChatMessage( | ||
| "", | ||
| senderId, | ||
| chatRoom | ||
| ); | ||
| ChatMessage chatMessage = new ChatMessage("", senderId, chatRoom); | ||
|
|
||
| // 이미지 판별을 위한 확장자 리스트 | ||
| List<String> imageExtensions = Arrays.asList("jpg", "jpeg", "png", "webp"); | ||
Hexeong marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
|
||
| for (String imageUrl : chatImageSendRequest.imageUrls()) { | ||
| String thumbnailUrl = generateThumbnailUrl(imageUrl); | ||
| String extension = StringUtils.getFilenameExtension(imageUrl); | ||
|
|
||
| ChatAttachment attachment = new ChatAttachment(true, imageUrl, thumbnailUrl, null); | ||
| boolean isImage = extension != null && imageExtensions.contains(extension.toLowerCase()); | ||
|
|
||
| String thumbnailUrl = isImage ? generateThumbnailUrl(imageUrl) : null; | ||
|
|
||
| ChatAttachment attachment = new ChatAttachment(isImage, imageUrl, thumbnailUrl, null); | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. thumbnailUrl이 null인 경우에 대해 방어 로직이 존재하나요?? 이번 pr 상에서는 안보여서... (개인적으로 gif나 avif 이미지 파일 확장자도 잘 쓰인다고 생각해서 확인 한 번 해주시면 감사드리겠습니다!)
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 제 생각에 해당 부분은 프론트에서 null일 경우 대체 이미지로 보여주는 게 맞는 것 같은데 어떻게 생각하시나요.......?
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 확장자 고정해서 수정했습니다 |
||
| chatMessage.addAttachment(attachment); | ||
| } | ||
|
|
||
|
|
@@ -268,11 +273,9 @@ private String generateThumbnailUrl(String originalUrl) { | |
|
|
||
| String thumbnailFileName = nameWithoutExt + "_thumb" + extension; | ||
|
|
||
| String thumbnailUrl = originalUrl.replace("chat/images/", "chat/thumbnails/") | ||
| return originalUrl.replace("chat/files/", "chat/thumbnails/") | ||
| .replace(fileName, thumbnailFileName); | ||
|
|
||
| return thumbnailUrl; | ||
|
|
||
| } catch (Exception e) { | ||
| return originalUrl; | ||
| } | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,25 @@ | ||
| package com.example.solidconnection.common.constant; | ||
|
|
||
| import java.util.List; | ||
| import java.util.stream.Stream; | ||
|
|
||
| public final class FileConstants { | ||
| private FileConstants() {} | ||
|
|
||
| public static final List<String> IMAGE_EXTENSIONS = List.of( | ||
| "jpg", "jpeg", "png", "webp", "avif", "heic", "heif", "tiff" | ||
| ); | ||
|
|
||
| public static final List<String> DOCUMENT_EXTENSIONS = List.of( | ||
| "doc", "docx", "xls", "xlsx", "ppt", "pptx", "hwp", "hwpx", "pdf", "txt" | ||
| ); | ||
|
|
||
| public static final List<String> ARCHIVE_EXTENSIONS = List.of( | ||
| "zip", "7z", "rar" | ||
| ); | ||
|
|
||
| public static final List<String> ALL_ALLOWED_EXTENSIONS = Stream.of( | ||
| IMAGE_EXTENSIONS, DOCUMENT_EXTENSIONS, ARCHIVE_EXTENSIONS) | ||
| .flatMap(List::stream) | ||
| .toList(); | ||
| } |
This file was deleted.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,46 @@ | ||
| package com.example.solidconnection.s3.domain; | ||
|
|
||
| import com.example.solidconnection.common.constant.FileConstants; | ||
| import com.example.solidconnection.common.exception.CustomException; | ||
| import com.example.solidconnection.common.exception.ErrorCode; | ||
| import lombok.Getter; | ||
|
|
||
| @Getter | ||
| public enum UploadPath { | ||
| PROFILE("profile"), | ||
| GPA("gpa"), | ||
| LANGUAGE_TEST("language"), | ||
| COMMUNITY("community"), | ||
| NEWS("news"), | ||
| CHAT("chat/files"), | ||
whqtker marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| MENTOR_PROOF("mentor-proof"), | ||
| ; | ||
|
|
||
| private final String type; | ||
|
|
||
| UploadPath(String type) { | ||
| this.type = type; | ||
| } | ||
|
|
||
| public boolean isResizable(long fileSize, String extension, long maxSizeBytes) { | ||
| if (!isImage(extension)) return false; | ||
|
|
||
| if (this == CHAT) return false; | ||
|
|
||
| return fileSize >= maxSizeBytes; | ||
| } | ||
| public void validateExtension(String extension) { | ||
| if (extension == null || !FileConstants.ALL_ALLOWED_EXTENSIONS.contains(extension.toLowerCase())) { | ||
| throw new CustomException(ErrorCode.NOT_ALLOWED_FILE_EXTENSIONS, | ||
| "허용된 형식: " + getAllowedExtensionsMessage()); | ||
| } | ||
| } | ||
|
|
||
| public boolean isImage(String extension) { | ||
| return extension != null && FileConstants.IMAGE_EXTENSIONS.contains(extension.toLowerCase()); | ||
| } | ||
|
|
||
| public String getAllowedExtensionsMessage() { | ||
| return String.join(", ", FileConstants.ALL_ALLOWED_EXTENSIONS); | ||
| } | ||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이건 상수로 빼는 건 어떤가요 ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
사용하는 게 여기 밖에 없어서 상수로 빼는 게 나을까요??
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
상수로 빼서 별도 클래스로 관리하도록 수정했습니당