Skip to content

Commit 183f588

Browse files
authored
Merge pull request #109 from CommitField/Feature/89
Feature/89
2 parents bae50bc + 67ee3e9 commit 183f588

File tree

12 files changed

+110
-13
lines changed

12 files changed

+110
-13
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package cmf.commitField.domain.File.service;
2+
3+
import org.springframework.boot.context.properties.ConfigurationProperties;
4+
import org.springframework.stereotype.Component;
5+
6+
//@Configuration
7+
@Component
8+
@ConfigurationProperties(prefix = "custom.file")
9+
public class FileProperties {
10+
private String uploadDir;
11+
12+
public String getUploadDir() {
13+
return uploadDir;
14+
}
15+
16+
public void setUploadDir(String uploadDir) {
17+
this.uploadDir = uploadDir;
18+
}
19+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package cmf.commitField.domain.File.service;
2+
3+
import org.springframework.stereotype.Service;
4+
import org.springframework.web.multipart.MultipartFile;
5+
6+
import java.io.IOException;
7+
import java.nio.file.Files;
8+
import java.nio.file.Path;
9+
import java.nio.file.Paths;
10+
import java.nio.file.StandardCopyOption;
11+
12+
@Service
13+
public class FileService {
14+
15+
// resources/static/uploads ํด๋” ๊ฒฝ๋กœ
16+
private final String UPLOAD_DIR = "src/main/resources/static/uploads"; // ์ƒ๋Œ€ ๊ฒฝ๋กœ
17+
18+
// ํŒŒ์ผ ์ €์žฅ ๋ฉ”์†Œ๋“œ
19+
public String saveFile(MultipartFile file) throws IOException {
20+
// ํŒŒ์ผ ์ด๋ฆ„์„ ์œ ๋‹ˆํฌํ•˜๊ฒŒ ์ƒ์„ฑ
21+
String filename = System.currentTimeMillis() + "_" + file.getOriginalFilename();
22+
23+
// ํŒŒ์ผ ๊ฒฝ๋กœ ์ƒ์„ฑ
24+
Path path = Paths.get(UPLOAD_DIR, filename); // static/uploads ํด๋”์— ์ €์žฅ
25+
26+
// ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒ์„ฑ
27+
Files.createDirectories(path.getParent());
28+
29+
// ํŒŒ์ผ ์ €์žฅ
30+
Files.copy(file.getInputStream(), path, StandardCopyOption.REPLACE_EXISTING);
31+
32+
// ์ €์žฅ๋œ ํŒŒ์ผ์˜ URL ๋ฐ˜ํ™˜ (์›น์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ)
33+
return "/uploads/" + filename; // ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” URL ๋ฐ˜ํ™˜
34+
}
35+
}
36+

โ€Žsrc/main/java/cmf/commitField/domain/chat/chatMessage/service/ChatMessageServiceImpl.javaโ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public class ChatMessageServiceImpl implements ChatMessageService {
3434
private final UserChatRoomRepository userChatRoomRepository;
3535

3636
@Override
37-
// @Transactional
37+
@Transactional
3838
public ChatMsgResponse sendMessage(ChatMsgRequest message, Long userId, Long roomId) {
3939
User findUser = userRepository.findById(userId)
4040
.orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_USER));

โ€Žsrc/main/java/cmf/commitField/domain/chat/chatRoom/controller/ChatRoomController.javaโ€Ž

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package cmf.commitField.domain.chat.chatRoom.controller;
22

3+
import cmf.commitField.domain.File.service.FileService;
34
import cmf.commitField.domain.chat.chatRoom.controller.request.ChatRoomRequest;
45
import cmf.commitField.domain.chat.chatRoom.controller.request.ChatRoomUpdateRequest;
56
import cmf.commitField.domain.chat.chatRoom.dto.ChatRoomDto;
@@ -12,30 +13,45 @@
1213
import jakarta.validation.Valid;
1314
import lombok.RequiredArgsConstructor;
1415
import org.springframework.data.domain.Pageable;
16+
import org.springframework.http.MediaType;
1517
import org.springframework.security.core.Authentication;
1618
import org.springframework.security.core.annotation.AuthenticationPrincipal;
1719
import org.springframework.security.core.context.SecurityContextHolder;
1820
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
1921
import org.springframework.web.bind.annotation.*;
2022

23+
import java.io.IOException;
2124
import java.util.List;
2225

2326
@RestController
2427
@RequiredArgsConstructor
2528
@RequestMapping("/chat")
2629
public class ChatRoomController {
2730
private final ChatRoomService chatRoomService;
31+
private final FileService fileService;
2832

29-
//์ฑ„ํŒ…๋ฐฉ ์ƒ์„ฑ
30-
@PostMapping("/room")
33+
// ์ฑ„ํŒ…๋ฐฉ ์ƒ์„ฑ (ํŒŒ์ผ ์—…๋กœ๋“œ ํฌํ•จ)
34+
@PostMapping(value = "/room", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
3135
public GlobalResponse<Object> createRoom(
32-
@RequestBody @Valid ChatRoomRequest chatRoomRequest) {
36+
@ModelAttribute @Valid ChatRoomRequest chatRoomRequest) throws IOException {
37+
38+
39+
// ์ธ์ฆ ํ™•์ธ
3340
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
3441

3542
if (authentication instanceof OAuth2AuthenticationToken) {
3643
CustomOAuth2User principal = (CustomOAuth2User) authentication.getPrincipal();
3744
Long userId = principal.getId(); // getId()๋ฅผ ํ†ตํ•ด userId๋ฅผ ์ถ”์ถœ
38-
chatRoomService.createRoom(chatRoomRequest, userId); // userId๋ฅผ ์ „๋‹ฌ
45+
46+
// ํŒŒ์ผ ์—…๋กœ๋“œ ์ฒ˜๋ฆฌ
47+
String imageUrl = null;
48+
if (chatRoomRequest.getFile() != null && !chatRoomRequest.getFile().isEmpty()) {
49+
imageUrl = fileService.saveFile(chatRoomRequest.getFile()); // ํŒŒ์ผ ์ €์žฅ
50+
}
51+
52+
// ์ฑ„ํŒ…๋ฐฉ ์ƒ์„ฑ ์„œ๋น„์Šค ํ˜ธ์ถœ (์ด๋ฏธ์ง€ URL ํฌํ•จ)
53+
chatRoomService.createRoom(chatRoomRequest, userId, imageUrl);
54+
3955
return GlobalResponse.success("์ฑ„ํŒ…๋ฐฉ์„ ์ƒ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.");
4056
} else {
4157
throw new IllegalArgumentException("๋กœ๊ทธ์ธ ํ›„์— ์ด์šฉํ•ด ์ฃผ์„ธ์š”.");

โ€Žsrc/main/java/cmf/commitField/domain/chat/chatRoom/controller/request/ChatRoomRequest.javaโ€Ž

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
package cmf.commitField.domain.chat.chatRoom.controller.request;
22

33
import jakarta.validation.constraints.Max;
4-
import jakarta.validation.constraints.NotEmpty;
54
import jakarta.validation.constraints.NotNull;
65
import lombok.AllArgsConstructor;
76
import lombok.Getter;
87
import lombok.NoArgsConstructor;
8+
import lombok.Setter;
99
import org.hibernate.validator.constraints.Length;
10+
import org.springframework.web.multipart.MultipartFile;
1011

12+
@Setter
1113
@Getter
1214
@AllArgsConstructor
1315
@NoArgsConstructor
1416
public class ChatRoomRequest {
1517

16-
@NotEmpty
18+
@NotNull
1719
@Length(min = 2, max = 20)
1820
private String title;
1921

@@ -24,4 +26,10 @@ public class ChatRoomRequest {
2426
@Length(min = 4, max = 20)
2527
private String password;
2628

29+
private MultipartFile file; // ํŒŒ์ผ์„ ๋ฐ›๊ธฐ ์œ„ํ•œ ํ•„๋“œ
30+
31+
public boolean isFileSizeValid() {
32+
return file == null || file.getSize() <= 5 * 1024 * 1024; // 5MB
33+
}
34+
2735
}

โ€Žsrc/main/java/cmf/commitField/domain/chat/chatRoom/dto/ChatRoomDto.javaโ€Ž

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,17 @@ public class ChatRoomDto {
1919

2020
private Integer heartCount;
2121

22+
// ์ด๋ฏธ์ง€ URL ํ•„๋“œ ์ถ”๊ฐ€
23+
private String imageUrl;
24+
2225
public static ChatRoomDto of(ChatRoom chatRoom) {
2326
return ChatRoomDto.builder()
2427
.id(chatRoom.getId())
2528
.title(chatRoom.getTitle())
2629
.currentUserCount((long) chatRoom.getUserChatRooms().size())
2730
.userCountMax(chatRoom.getUserCountMax())
2831
.heartCount(chatRoom.getHearts().size())
32+
.imageUrl(chatRoom.getImageUrl()) // ChatRoom์—์„œ imageUrl์„ ๊ฐ€์ ธ์˜ค๊ธฐ
2933
.build();
3034
}
3135
}

โ€Žsrc/main/java/cmf/commitField/domain/chat/chatRoom/entity/ChatRoom.javaโ€Ž

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ public class ChatRoom extends BaseEntity {
4545

4646
private Boolean isPrivate;
4747

48+
//์ฑ„ํŒ…๋ฐฉ ์ด๋ฏธ์ง€ URL
49+
private String imageUrl;
50+
4851
@Override
4952
public String toString() {
5053
return "ChatRoom{" +

โ€Žsrc/main/java/cmf/commitField/domain/chat/chatRoom/service/ChatRoomService.javaโ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
public interface ChatRoomService {
1212

13-
void createRoom(ChatRoomRequest chatRoomRequest, Long userId); // userId๋ฅผ ๋ฐ›๋„๋ก ์ˆ˜์ •
13+
void createRoom(ChatRoomRequest chatRoomRequest, Long userId, String imageUrl); // userId๋ฅผ ๋ฐ›๋„๋ก ์ˆ˜์ •
1414

1515
void joinRoom(Long roomId, Long userId); // userId๋ฅผ ๋ฐ›๋„๋ก ์ˆ˜์ •
1616

โ€Žsrc/main/java/cmf/commitField/domain/chat/chatRoom/service/ChatRoomServiceImpl.javaโ€Ž

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public class ChatRoomServiceImpl implements ChatRoomService {
5050

5151
@Override
5252
@Transactional
53-
public void createRoom(ChatRoomRequest chatRoomRequest, Long userId) {
53+
public void createRoom(ChatRoomRequest chatRoomRequest, Long userId, String imageUrl) {
5454
// ์œ ์ €์ •๋ณด ์กฐํšŒ
5555
User findUser = userRepository.findById(userId)
5656
.orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_USER));
@@ -69,6 +69,7 @@ public void createRoom(ChatRoomRequest chatRoomRequest, Long userId) {
6969
.createdAt(now())
7070
.modifiedAt(now())
7171
.isPrivate(false)
72+
.imageUrl(imageUrl) // ์ด๋ฏธ์ง€ URL ์ถ”๊ฐ€
7273
.build();
7374
if (password != null) {
7475
chatRoom.setPassword(password);

โ€Žsrc/main/java/cmf/commitField/global/error/ErrorCode.javaโ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public enum ErrorCode {
4747
CHAT_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "์ฑ„ํŒ… ์ „์†ก์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค."),
4848
NO_ROOM_FOUND(HttpStatus.NOT_FOUND, "์ฑ„ํŒ…๋ฐฉ์ด ์—†์Šต๋‹ˆ๋‹ค."),
4949
NO_ROOM(HttpStatus.NOT_FOUND, "์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ฑ„ํŒ…๋ฐฉ์ž…๋‹ˆ๋‹ค."),
50+
FILE_UPLOAD_FAILED(HttpStatus.BAD_REQUEST, "์ด๋ฏธ์ง€ ํŒŒ์ผ์˜ ํฌ๊ธฐ๋Š” 5MB ์ดํ•˜์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."),
5051

5152
//chatroom_title
5253
REQUEST_SAME_AS_CURRENT_TITLE(HttpStatus.BAD_REQUEST, "ํ˜„์žฌ ์ œ๋ชฉ๊ณผ ๋ฐ”๊พธ๋ ค๋Š” ์ œ๋ชฉ์ด ๊ฐ™์Šต๋‹ˆ๋‹ค."),

0 commit comments

Comments
ย (0)