From c44ee855ef6def72ad0b3f569f3f7fcec6ec2459 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Tue, 29 Oct 2024 00:57:10 +0900 Subject: [PATCH 001/123] =?UTF-8?q?fix:=20RedisMessageListner=20Bean=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/leets/X/global/config/RedisConfig.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/com/leets/X/global/config/RedisConfig.java b/src/main/java/com/leets/X/global/config/RedisConfig.java index a60b2e5..55fe2c9 100644 --- a/src/main/java/com/leets/X/global/config/RedisConfig.java +++ b/src/main/java/com/leets/X/global/config/RedisConfig.java @@ -11,6 +11,7 @@ import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.listener.ChannelTopic; +import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.springframework.data.redis.listener.adapter.MessageListenerAdapter; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; @@ -54,6 +55,21 @@ public RedisTemplate chatRedisTemplate(RedisConnectionFa return chatRedisTemplate; } + // RedisMessageListnerContainer Bean 등록 + @Bean + public RedisMessageListenerContainer redisMessageListener(RedisConnectionFactory connectionFactory, + MessageListenerAdapter listenerAdapter, + ChannelTopic channelTopic) { + RedisMessageListenerContainer container = new RedisMessageListenerContainer(); + // listenerAdapter가 특정 채널(channelTopic)에서 발행된 메시지를 수신하도록 구성합니다. + container.setConnectionFactory(connectionFactory); + // 메시지 수신 준비 + 구독할 채널 설정 + // listenerAdapter가 특정 채널(channelTopic)에서 발행된 메시지를 수신하도록 구성합니다. 메시지 리스너 등록 +// container.addMessageListener(listenerAdapter, channelTopic); + return container; + } + + @Bean public ChannelTopic topic(){ return new ChannelTopic("/chatRoom"); From 48e238a5126366e09e4b7baa2090daf6288f3a76 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Tue, 29 Oct 2024 02:11:18 +0900 Subject: [PATCH 002/123] =?UTF-8?q?feat:=20=EB=AA=BD=EA=B3=A0=20DB=20Confi?= =?UTF-8?q?g=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets/X/global/config/MongoDBConfig.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/com/leets/X/global/config/MongoDBConfig.java diff --git a/src/main/java/com/leets/X/global/config/MongoDBConfig.java b/src/main/java/com/leets/X/global/config/MongoDBConfig.java new file mode 100644 index 0000000..1c93e02 --- /dev/null +++ b/src/main/java/com/leets/X/global/config/MongoDBConfig.java @@ -0,0 +1,28 @@ +package com.leets.X.global.config; + + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.mongodb.MongoDatabaseFactory; +import org.springframework.data.mongodb.config.EnableMongoAuditing; +import org.springframework.data.mongodb.core.convert.DbRefResolver; +import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver; +import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper; +import org.springframework.data.mongodb.core.convert.MappingMongoConverter; +import org.springframework.data.mongodb.core.mapping.MongoMappingContext; +import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; + +@Configuration +@EnableMongoRepositories("com.leets.X.domain.chat.repository") +@EnableMongoAuditing // 자동 검사 +public class MongoDBConfig { + + @Bean + public MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory mongoDatabaseFactory, MongoMappingContext mongoMappingContext) { + DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDatabaseFactory); + MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext); + converter.setTypeMapper(new DefaultMongoTypeMapper(null)); + return converter; + } + +} From 30a03868b5292dc90755b482aae39412648bddf1 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Tue, 29 Oct 2024 23:25:53 +0900 Subject: [PATCH 003/123] =?UTF-8?q?feat:=20RedisMessageListener=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/redis/RedisMessageListener.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/chat/redis/RedisMessageListener.java diff --git a/src/main/java/com/leets/X/domain/chat/redis/RedisMessageListener.java b/src/main/java/com/leets/X/domain/chat/redis/RedisMessageListener.java new file mode 100644 index 0000000..023df4f --- /dev/null +++ b/src/main/java/com/leets/X/domain/chat/redis/RedisMessageListener.java @@ -0,0 +1,19 @@ +package com.leets.X.domain.chat.redis; + +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.listener.ChannelTopic; +import org.springframework.data.redis.listener.RedisMessageListenerContainer; + +@Configuration +@RequiredArgsConstructor +public class RedisMessageListener { + + private final RedisMessageListenerContainer redisMessageListener; + private final RedisSubscriber redisSubscriber; + + public void adaptMessageListener(Long roomId) { + ChannelTopic topic = new ChannelTopic("/sub/chats/" + roomId); + redisMessageListener.addMessageListener(redisSubscriber, topic); + } +} From fd1f27721fd514282f9a6c1ad2adff46bef16418 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Tue, 29 Oct 2024 23:38:07 +0900 Subject: [PATCH 004/123] =?UTF-8?q?fix:=20RedisMessageListener=20->=20Redi?= =?UTF-8?q?sListener=EB=A1=9C=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=AA=85=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../redis/{RedisMessageListener.java => RedisListener.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename src/main/java/com/leets/X/domain/chat/redis/{RedisMessageListener.java => RedisListener.java} (94%) diff --git a/src/main/java/com/leets/X/domain/chat/redis/RedisMessageListener.java b/src/main/java/com/leets/X/domain/chat/redis/RedisListener.java similarity index 94% rename from src/main/java/com/leets/X/domain/chat/redis/RedisMessageListener.java rename to src/main/java/com/leets/X/domain/chat/redis/RedisListener.java index 023df4f..28f89ee 100644 --- a/src/main/java/com/leets/X/domain/chat/redis/RedisMessageListener.java +++ b/src/main/java/com/leets/X/domain/chat/redis/RedisListener.java @@ -7,11 +7,11 @@ @Configuration @RequiredArgsConstructor -public class RedisMessageListener { +public class RedisListener { private final RedisMessageListenerContainer redisMessageListener; private final RedisSubscriber redisSubscriber; - + public void adaptMessageListener(Long roomId) { ChannelTopic topic = new ChannelTopic("/sub/chats/" + roomId); redisMessageListener.addMessageListener(redisSubscriber, topic); From 415052ec1a290b8a45dee2c993c91db6dc04da1f Mon Sep 17 00:00:00 2001 From: koreaioi Date: Wed, 30 Oct 2024 00:14:53 +0900 Subject: [PATCH 005/123] =?UTF-8?q?feat:=20ChatRoomService=20-=20save()=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/chat/service/ChatRoomService.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java diff --git a/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java b/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java new file mode 100644 index 0000000..b671006 --- /dev/null +++ b/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java @@ -0,0 +1,43 @@ +package com.leets.X.domain.chat.service; + +import com.leets.X.domain.chat.dto.request.ChatRoomRequestDto; +import com.leets.X.domain.chat.dto.response.ChatRoomResponseDto; +import com.leets.X.domain.chat.entity.ChatRoom; +import com.leets.X.domain.chat.redis.RedisListener; +import com.leets.X.domain.chat.repository.ChatRoomRepository; +import com.leets.X.domain.user.domain.User; +import com.leets.X.domain.user.exception.UserNotFoundException; +import com.leets.X.domain.user.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +@RequiredArgsConstructor +public class ChatRoomService { + + private final RedisListener redisMessageListener; + private final ChatRoomRepository chatRoomRepository; + private final UserRepository userRepository; + + public ChatRoomResponseDto save(ChatRoomRequestDto chatRoomRequestDto) { + + // 이 부분은 UserService에 비지니스 로직을 추가 해달라고 한 뒤 or 추가하고 UserService 단에서 접근하는게 나을거 같다. + Optional user1 = userRepository.findById(chatRoomRequestDto.user1Id()); + Optional user2 = userRepository.findById(chatRoomRequestDto.user2Id()); + + if (user1.isPresent() && user2.isPresent()) { + ChatRoom savedRoom = chatRoomRepository.save(ChatRoom.of(user1.get(), user2.get())); // 채팅방 RDB에 저장 + redisMessageListener.adaptMessageListener(savedRoom.getId()); // 리스너 등록 + + return new ChatRoomResponseDto(savedRoom.getId()); + }else{ + // 사용자 없음 예외 발생 + //int code = (user2.isPresent()) ? USER1_NOT_FOUND.getCode() : USER2_NOT_FOUND.getCode(); + //String message = (user2.isPresent()) ? USER1_NOT_FOUND.getMessage() : USER2_NOT_FOUND.getMessage(); + // UserNotFoundException 예외 발생 + throw new UserNotFoundException(); + } + } +} From 1689676ffa1e84d67c28a22ad9098053f4ba8ada Mon Sep 17 00:00:00 2001 From: koreaioi Date: Wed, 30 Oct 2024 00:15:20 +0900 Subject: [PATCH 006/123] =?UTF-8?q?feat:=20ChatRoomResponseDto=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../X/domain/chat/dto/response/ChatRoomResponseDto.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/chat/dto/response/ChatRoomResponseDto.java diff --git a/src/main/java/com/leets/X/domain/chat/dto/response/ChatRoomResponseDto.java b/src/main/java/com/leets/X/domain/chat/dto/response/ChatRoomResponseDto.java new file mode 100644 index 0000000..5341efd --- /dev/null +++ b/src/main/java/com/leets/X/domain/chat/dto/response/ChatRoomResponseDto.java @@ -0,0 +1,7 @@ +package com.leets.X.domain.chat.dto.response; + +public record ChatRoomResponseDto ( + + Long roomId + +){} From 032451218e544a6880186a785dc6cf5a88e8f50c Mon Sep 17 00:00:00 2001 From: koreaioi Date: Wed, 30 Oct 2024 00:15:26 +0900 Subject: [PATCH 007/123] =?UTF-8?q?feat:=20ChatRoomRequestDto=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../X/domain/chat/dto/request/ChatRoomRequestDto.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/chat/dto/request/ChatRoomRequestDto.java diff --git a/src/main/java/com/leets/X/domain/chat/dto/request/ChatRoomRequestDto.java b/src/main/java/com/leets/X/domain/chat/dto/request/ChatRoomRequestDto.java new file mode 100644 index 0000000..f045c73 --- /dev/null +++ b/src/main/java/com/leets/X/domain/chat/dto/request/ChatRoomRequestDto.java @@ -0,0 +1,7 @@ +package com.leets.X.domain.chat.dto.request; + +public record ChatRoomRequestDto ( + + Long user1Id, + Long user2Id +){} From 82d553fdc4ed78b31ae666012e4be4b08a134f85 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Wed, 30 Oct 2024 00:15:36 +0900 Subject: [PATCH 008/123] =?UTF-8?q?feat:=20ChatRoomRepository=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../X/domain/chat/repository/ChatRoomRepository.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/chat/repository/ChatRoomRepository.java diff --git a/src/main/java/com/leets/X/domain/chat/repository/ChatRoomRepository.java b/src/main/java/com/leets/X/domain/chat/repository/ChatRoomRepository.java new file mode 100644 index 0000000..c40ab9c --- /dev/null +++ b/src/main/java/com/leets/X/domain/chat/repository/ChatRoomRepository.java @@ -0,0 +1,10 @@ +package com.leets.X.domain.chat.repository; + +import com.leets.X.domain.chat.entity.ChatRoom; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ChatRoomRepository extends JpaRepository { + +} From 335b27d460306162c52f7fe176625922759e6067 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Wed, 30 Oct 2024 00:16:06 +0900 Subject: [PATCH 009/123] =?UTF-8?q?feat:=20ChatRoomController=20createChat?= =?UTF-8?q?Room()=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/controller/ChatRoomController.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java diff --git a/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java b/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java new file mode 100644 index 0000000..5c63846 --- /dev/null +++ b/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java @@ -0,0 +1,41 @@ +package com.leets.X.domain.chat.controller; + + +import com.leets.X.domain.chat.dto.request.ChatRoomRequestDto; +import com.leets.X.domain.chat.dto.response.ChatRoomResponseDto; +import com.leets.X.domain.chat.service.ChatRoomService; +import com.leets.X.global.common.response.ResponseDto; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +@Controller +@Slf4j +@Validated +@RequestMapping("/api/v1/chatRoom") +@RequiredArgsConstructor +public class ChatRoomController { + + private final ChatRoomService chatRoomService; + + @GetMapping("/check") + public void getChatRoomByUser1IdUser2Id(){ + + + } + + @PostMapping + public ResponseDto createChatRoom(@RequestBody ChatRoomRequestDto chatRoomRequestDto){ + ChatRoomResponseDto response = chatRoomService.save(chatRoomRequestDto); + return ResponseDto.response(200, "Successfully create ChatRoom!", response); + } + +// @GetMapping("/{roomId}") +// public ResponseDto findChatRoom(@PathVariable("roomNo") Integer roomNo){ +// ChatRoomResponseDto response = new ChatRoomResponseDto(1L); +// return ResponseDto.response(200, "Successfully return ChatRoom", response); +// } + +} From 0e8feaf38f3af1c5fec526c0a1400d5b26d2b7e1 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Wed, 30 Oct 2024 00:16:37 +0900 Subject: [PATCH 010/123] =?UTF-8?q?feat:=20ChatRoom=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/leets/X/domain/chat/entity/ChatRoom.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/leets/X/domain/chat/entity/ChatRoom.java b/src/main/java/com/leets/X/domain/chat/entity/ChatRoom.java index ba88dbe..50075d3 100644 --- a/src/main/java/com/leets/X/domain/chat/entity/ChatRoom.java +++ b/src/main/java/com/leets/X/domain/chat/entity/ChatRoom.java @@ -6,9 +6,9 @@ import jakarta.persistence.*; import lombok.*; -import java.time.LocalDateTime; @Builder +@Getter @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) // 기본 생성자 접근 레벨 PROTECTED @Entity @@ -28,4 +28,13 @@ public class ChatRoom extends BaseTimeEntity { private User user2; private String lastMessage; + + public static ChatRoom of(User user1, User user2) { + + return ChatRoom.builder() + .user1(user1) + .user2(user2) + .lastMessage("") + .build(); + } } From a7ec44d3f4487bc966d18a28e7143706804f438d Mon Sep 17 00:00:00 2001 From: koreaioi Date: Wed, 30 Oct 2024 00:18:42 +0900 Subject: [PATCH 011/123] fix: test securityConfig --- src/main/java/com/leets/X/global/config/SecurityConfig.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/leets/X/global/config/SecurityConfig.java b/src/main/java/com/leets/X/global/config/SecurityConfig.java index 4e46a94..97b142d 100644 --- a/src/main/java/com/leets/X/global/config/SecurityConfig.java +++ b/src/main/java/com/leets/X/global/config/SecurityConfig.java @@ -51,7 +51,9 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { authorize .requestMatchers("/v3/api-docs", "/v3/api-docs/**", "/swagger-ui.html", "/swagger-ui/**", "/swagger/**").permitAll() .requestMatchers("/api/v1/users/login").permitAll() + .requestMatchers("/api/v1/chatRoom").permitAll() .anyRequest().authenticated() + ) .addFilterBefore(jwtFilter(), UsernamePasswordAuthenticationFilter.class) .exceptionHandling(exceptioHandling -> From c8e7c33fd0c75cf7728ef82d77c19225c3d3ebb0 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Wed, 30 Oct 2024 00:19:11 +0900 Subject: [PATCH 012/123] =?UTF-8?q?fix:=20mongodb=20yml=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-local.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index 8a30912..f1f5276 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -15,6 +15,8 @@ spring: redis: host: ${REDIS_HOST} port: ${REDIS_PORT} + mongodb: + uri: mongodb://localhost:27017/chatdb x: @@ -26,3 +28,5 @@ x: refresh: expiration: ${REFRESH_EXP} header: ${REFRESH_HEAD} + + From 7efe39343f6eee9c54bb61f81cd15a7d22965ef3 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Wed, 30 Oct 2024 09:56:14 +0900 Subject: [PATCH 013/123] =?UTF-8?q?fix:=20@RestController=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/controller/ChatRoomController.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java b/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java index 5c63846..92d1f58 100644 --- a/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java +++ b/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java @@ -7,14 +7,13 @@ import com.leets.X.global.common.response.ResponseDto; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Controller; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -@Controller +@RestController @Slf4j @Validated -@RequestMapping("/api/v1/chatRoom") +@RequestMapping("/api/v1") @RequiredArgsConstructor public class ChatRoomController { @@ -26,16 +25,19 @@ public void getChatRoomByUser1IdUser2Id(){ } - @PostMapping + @PostMapping("/chatRoom") public ResponseDto createChatRoom(@RequestBody ChatRoomRequestDto chatRoomRequestDto){ ChatRoomResponseDto response = chatRoomService.save(chatRoomRequestDto); return ResponseDto.response(200, "Successfully create ChatRoom!", response); } -// @GetMapping("/{roomId}") -// public ResponseDto findChatRoom(@PathVariable("roomNo") Integer roomNo){ -// ChatRoomResponseDto response = new ChatRoomResponseDto(1L); -// return ResponseDto.response(200, "Successfully return ChatRoom", response); -// } + // 채팅방 하나를 조회해준다. (대화 내용을 돌려준다는 의미) + @GetMapping("/chatRoom") + public ResponseDto findChatRoom( + @RequestParam Long roomId, @RequestParam int size, @RequestParam int page ){ + chatRoomService.findByChatRoom(roomId, size, page); + ChatRoomResponseDto response = new ChatRoomResponseDto(1L); + return ResponseDto.response(200, "Successfully return ChatRoom", response); + } } From d31f6ef63e41042e1600a98861dc05f29bcac128 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 01:19:05 +0900 Subject: [PATCH 014/123] =?UTF-8?q?feat:=20MongoRespositoy=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/chat/repository/ChatMessageRepository.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/chat/repository/ChatMessageRepository.java diff --git a/src/main/java/com/leets/X/domain/chat/repository/ChatMessageRepository.java b/src/main/java/com/leets/X/domain/chat/repository/ChatMessageRepository.java new file mode 100644 index 0000000..803ccb5 --- /dev/null +++ b/src/main/java/com/leets/X/domain/chat/repository/ChatMessageRepository.java @@ -0,0 +1,10 @@ +package com.leets.X.domain.chat.repository; + +import com.leets.X.domain.chat.entity.ChatMessage; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.mongodb.repository.MongoRepository; + +public interface ChatMessageRepository extends MongoRepository { + +} From f5ffdf7c293dff5339b672b0726f274dbeaedd1d Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 01:20:02 +0900 Subject: [PATCH 015/123] =?UTF-8?q?feat:=20=EC=B1=84=ED=8C=85=EB=A9=94?= =?UTF-8?q?=EC=84=B8=EC=A7=80=20=EC=A1=B0=ED=9A=8C=20(=EB=82=B4=EB=A6=BC?= =?UTF-8?q?=EC=B0=A8=EC=88=9C,=20=ED=8E=98=EC=9D=B4=EC=A7=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets/X/domain/chat/repository/ChatMessageRepository.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/leets/X/domain/chat/repository/ChatMessageRepository.java b/src/main/java/com/leets/X/domain/chat/repository/ChatMessageRepository.java index 803ccb5..82b86ad 100644 --- a/src/main/java/com/leets/X/domain/chat/repository/ChatMessageRepository.java +++ b/src/main/java/com/leets/X/domain/chat/repository/ChatMessageRepository.java @@ -6,5 +6,7 @@ import org.springframework.data.mongodb.repository.MongoRepository; public interface ChatMessageRepository extends MongoRepository { - + + Page findByRoomIdOrderByCreatedAtDesc(Long roomId, Pageable pageable); + } From faadc80cd9dcfbab9e9fd92152ce352021fd35b5 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 01:26:30 +0900 Subject: [PATCH 016/123] =?UTF-8?q?feat:=20=EC=B1=84=ED=8C=85=20ErrorMessa?= =?UTF-8?q?ge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../X/domain/chat/exception/ErrorMessage.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/chat/exception/ErrorMessage.java diff --git a/src/main/java/com/leets/X/domain/chat/exception/ErrorMessage.java b/src/main/java/com/leets/X/domain/chat/exception/ErrorMessage.java new file mode 100644 index 0000000..c0c91a0 --- /dev/null +++ b/src/main/java/com/leets/X/domain/chat/exception/ErrorMessage.java @@ -0,0 +1,15 @@ +package com.leets.X.domain.chat.exception; + + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum ErrorMessage { + + NOT_FOUND_CHATROOM(400, "해당 채팅방을 찾을 수 없습니다."); + + private final int code; + private final String message; +} From b6ebad68c16b92a0df7c9c0578571e598f199c87 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 01:26:55 +0900 Subject: [PATCH 017/123] =?UTF-8?q?feat:=20=EC=B1=84=ED=8C=85=20ResponseMe?= =?UTF-8?q?ssage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/chat/controller/ResponseMessage.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/chat/controller/ResponseMessage.java diff --git a/src/main/java/com/leets/X/domain/chat/controller/ResponseMessage.java b/src/main/java/com/leets/X/domain/chat/controller/ResponseMessage.java new file mode 100644 index 0000000..d7dd9c0 --- /dev/null +++ b/src/main/java/com/leets/X/domain/chat/controller/ResponseMessage.java @@ -0,0 +1,16 @@ +package com.leets.X.domain.chat.controller; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum ResponseMessage { + + CHATROOM_CREATE_SUCCESS(201,"채팅방 생성에 성공했습니다."), + GET_CHATROOM(200, "하나의 채팅방을 반환합니다."), + GET_ROOMID(200, "채팅방 번호를 반환합니다."); + + private final int code; + private final String message; +} From 1a730371297d2c087408a8d7774bcd3fa6364aa2 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 01:27:16 +0900 Subject: [PATCH 018/123] =?UTF-8?q?feat:=20NotFoundChatRoomException=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/exception/NotFoundChatRoomException.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/chat/exception/NotFoundChatRoomException.java diff --git a/src/main/java/com/leets/X/domain/chat/exception/NotFoundChatRoomException.java b/src/main/java/com/leets/X/domain/chat/exception/NotFoundChatRoomException.java new file mode 100644 index 0000000..0186cb4 --- /dev/null +++ b/src/main/java/com/leets/X/domain/chat/exception/NotFoundChatRoomException.java @@ -0,0 +1,10 @@ +package com.leets.X.domain.chat.exception; + +import com.leets.X.global.common.exception.BaseException; +import static com.leets.X.domain.chat.exception.ErrorMessage.NOT_FOUND_CHATROOM; + +public class NotFoundChatRoomException extends BaseException { + public NotFoundChatRoomException() { + super(NOT_FOUND_CHATROOM.getCode(), NOT_FOUND_CHATROOM.getMessage()); + } +} From 8de3fda0e14359672be628ad04f2bb5071cfe031 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 01:41:56 +0900 Subject: [PATCH 019/123] =?UTF-8?q?fix:=20RedisSubscriber=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/leets/X/domain/chat/redis/RedisSubscriber.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/com/leets/X/domain/chat/redis/RedisSubscriber.java b/src/main/java/com/leets/X/domain/chat/redis/RedisSubscriber.java index ae0234e..0a3a079 100644 --- a/src/main/java/com/leets/X/domain/chat/redis/RedisSubscriber.java +++ b/src/main/java/com/leets/X/domain/chat/redis/RedisSubscriber.java @@ -28,13 +28,10 @@ public void onMessage(Message message, byte[] pattern) { log.info("구독자 전송 전 message: {}", tmpMessage); try { - // 역직렬화한 문자열을 PublishMessage로 변환 PublishMessage publishMessage = obejctMapper.readValue(tmpMessage, PublishMessage.class); - messageTemplate.convertAndSend("/sub/chats/" + publishMessage.getRoomId(), publishMessage); log.info("구독자 전송 후 message: {}", publishMessage.getContent()); } catch (JsonProcessingException e) { - e.printStackTrace(); throw new RuntimeException(e); } } From 54af582f7a91c176f0d9496c3b8f9e5000d444fb Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 01:43:40 +0900 Subject: [PATCH 020/123] =?UTF-8?q?fix:=20HTML=20Live=20Server=20CORS=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/leets/X/global/config/SecurityConfig.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/leets/X/global/config/SecurityConfig.java b/src/main/java/com/leets/X/global/config/SecurityConfig.java index 97b142d..fdb8587 100644 --- a/src/main/java/com/leets/X/global/config/SecurityConfig.java +++ b/src/main/java/com/leets/X/global/config/SecurityConfig.java @@ -50,8 +50,8 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { authorize -> authorize .requestMatchers("/v3/api-docs", "/v3/api-docs/**", "/swagger-ui.html", "/swagger-ui/**", "/swagger/**").permitAll() - .requestMatchers("/api/v1/users/login").permitAll() - .requestMatchers("/api/v1/chatRoom").permitAll() + .requestMatchers("/api/v1/users/login", "/api/v1/chatRoom").permitAll() + .requestMatchers("/api/v1/chatRoom/**", "/ws","/ws/**").permitAll() .anyRequest().authenticated() ) @@ -82,6 +82,7 @@ public CorsConfigurationSource corsConfigurationSource() { CorsConfiguration configuration = new CorsConfiguration(); configuration.addAllowedOriginPattern("http://localhost:3000"); + configuration.addAllowedOriginPattern("http://127.0.0.1:5500"); // HTML Live Server CORS 설정 configuration.addAllowedMethod("*"); configuration.addAllowedHeader("*"); configuration.addExposedHeader("Authorization"); From 4df28a4285334d6ae7cca7ca0c4185e189d73dc1 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 01:44:31 +0900 Subject: [PATCH 021/123] =?UTF-8?q?feat:=20PublishMessage.class=20-=20send?= =?UTF-8?q?erName=20=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/leets/X/domain/chat/dto/PublishMessage.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/leets/X/domain/chat/dto/PublishMessage.java b/src/main/java/com/leets/X/domain/chat/dto/PublishMessage.java index 0c0aae4..6cb9b93 100644 --- a/src/main/java/com/leets/X/domain/chat/dto/PublishMessage.java +++ b/src/main/java/com/leets/X/domain/chat/dto/PublishMessage.java @@ -25,6 +25,8 @@ public class PublishMessage implements Serializable { private Long senderId; + private String senderName; + private String content; } From 93e37d01e03d03ea108ef5f87d4e884a4a717c66 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 01:44:45 +0900 Subject: [PATCH 022/123] =?UTF-8?q?feat:=20MessageDto=20-=20senderName=20?= =?UTF-8?q?=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/leets/X/domain/chat/dto/request/MessageDto.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/leets/X/domain/chat/dto/request/MessageDto.java b/src/main/java/com/leets/X/domain/chat/dto/request/MessageDto.java index 3527af5..384eb89 100644 --- a/src/main/java/com/leets/X/domain/chat/dto/request/MessageDto.java +++ b/src/main/java/com/leets/X/domain/chat/dto/request/MessageDto.java @@ -19,6 +19,8 @@ public class MessageDto implements Serializable { private Long senderId; + private String senderName; + private String content; } From 3b96e5af19d47e947fcb659fc6ca175c4174a789 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 01:45:15 +0900 Subject: [PATCH 023/123] feat: add ErrorMessage --- .../com/leets/X/domain/user/exception/ErrorMessage.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/leets/X/domain/user/exception/ErrorMessage.java b/src/main/java/com/leets/X/domain/user/exception/ErrorMessage.java index 7a7c134..5af4cb7 100644 --- a/src/main/java/com/leets/X/domain/user/exception/ErrorMessage.java +++ b/src/main/java/com/leets/X/domain/user/exception/ErrorMessage.java @@ -7,7 +7,11 @@ @AllArgsConstructor public enum ErrorMessage { - USER_NOT_FOUND(404,"존재하지 않는 유저입니다."); + USER_NOT_FOUND(404,"존재하지 않는 유저입니다."), + USER1_NOT_FOUND(404, "유저1은 존재하지 않습니다."), + USER2_NOT_FOUND(404, "유저2는 존재하지 않습니다."); + + // 송우석 추가 내용 private final int code; private final String message; From c51f3b769354bde2575a5c8c46cce22000e0ad5c Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 01:45:34 +0900 Subject: [PATCH 024/123] =?UTF-8?q?feat:=20RedisPublisher=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../X/domain/chat/redis/RedisPublisher.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/chat/redis/RedisPublisher.java diff --git a/src/main/java/com/leets/X/domain/chat/redis/RedisPublisher.java b/src/main/java/com/leets/X/domain/chat/redis/RedisPublisher.java new file mode 100644 index 0000000..8525625 --- /dev/null +++ b/src/main/java/com/leets/X/domain/chat/redis/RedisPublisher.java @@ -0,0 +1,22 @@ +package com.leets.X.domain.chat.redis; + +import com.leets.X.domain.chat.dto.PublishMessage; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.listener.ChannelTopic; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@RequiredArgsConstructor +public class RedisPublisher { + + private final RedisTemplate redisTemplate; + + public void publish(PublishMessage publishMessage) { + ChannelTopic topic = new ChannelTopic("/sub/chats/" + publishMessage.getRoomId()); + redisTemplate.convertAndSend(topic.getTopic(), publishMessage); + log.info("Redis 서버에 메시지 전송 완료"); + } +} From d3f3a7ae6b63fdd8b2d3b679a542ec018da5989b Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 01:53:12 +0900 Subject: [PATCH 025/123] =?UTF-8?q?feat:=20ChatRoomService=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/chat/service/ChatRoomService.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java b/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java index b671006..5f10895 100644 --- a/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java +++ b/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java @@ -1,24 +1,35 @@ package com.leets.X.domain.chat.service; +import com.leets.X.domain.chat.dto.request.ChatRoomCheckRequstDto; import com.leets.X.domain.chat.dto.request.ChatRoomRequestDto; +import com.leets.X.domain.chat.dto.response.ChatMessageResponseDto; import com.leets.X.domain.chat.dto.response.ChatRoomResponseDto; +import com.leets.X.domain.chat.dto.response.ChattingDto; import com.leets.X.domain.chat.entity.ChatRoom; +import com.leets.X.domain.chat.exception.NotFoundChatRoomException; import com.leets.X.domain.chat.redis.RedisListener; +import com.leets.X.domain.chat.repository.ChatMessageRepository; import com.leets.X.domain.chat.repository.ChatRoomRepository; import com.leets.X.domain.user.domain.User; import com.leets.X.domain.user.exception.UserNotFoundException; import com.leets.X.domain.user.repository.UserRepository; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; +import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; +@Slf4j @Service @RequiredArgsConstructor public class ChatRoomService { private final RedisListener redisMessageListener; private final ChatRoomRepository chatRoomRepository; + private final ChatMessageRepository chatMessageRepository; private final UserRepository userRepository; public ChatRoomResponseDto save(ChatRoomRequestDto chatRoomRequestDto) { @@ -40,4 +51,29 @@ public ChatRoomResponseDto save(ChatRoomRequestDto chatRoomRequestDto) { throw new UserNotFoundException(); } } + + public ChattingDto findByChatRoom(Long roomId, int size, int page) { + ChatRoom findRoom = chatRoomRepository.findById(roomId) + .orElseThrow(NotFoundChatRoomException::new); + User user1 = findRoom.getUser1(); + User user2 = findRoom.getUser2(); + + List chatMessageList = chatMessageRepository.findByRoomIdOrderByCreatedAtDesc(roomId, PageRequest.of(page - 1, size)) + .getContent() + .stream() + .map(ChatMessageResponseDto::fromEntity) + .collect(Collectors.toList()); + + return new ChattingDto(user1.getId(), user2.getId(), user1.getCustomId(), user2.getCustomId(), chatMessageList); + } + + public ChatRoomResponseDto findUser1User2ChatRoom(ChatRoomCheckRequstDto checkDto) { + Long result = chatRoomRepository.findRoomIdByUserIds(checkDto.user1Id(), checkDto.user2Id()).orElse(1L); + return new ChatRoomResponseDto(result); + } + + // 테스트를 위해서 만들어둠. 추후 삭제 + public void addListener(Long roomId) { + redisMessageListener.adaptMessageListener(roomId); // 리스너 등록 + } } From fc1201b56887236c0a47c418efb2dcf1cc045b88 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 01:53:38 +0900 Subject: [PATCH 026/123] =?UTF-8?q?feat:=20=20ChattingDto=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20(=ED=95=9C=EA=B0=9C=EC=9D=98=20=EC=B1=84=ED=8C=85?= =?UTF-8?q?=EB=B0=A9=20DTO)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../X/domain/chat/dto/response/ChattingDto.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/chat/dto/response/ChattingDto.java diff --git a/src/main/java/com/leets/X/domain/chat/dto/response/ChattingDto.java b/src/main/java/com/leets/X/domain/chat/dto/response/ChattingDto.java new file mode 100644 index 0000000..ef4736f --- /dev/null +++ b/src/main/java/com/leets/X/domain/chat/dto/response/ChattingDto.java @@ -0,0 +1,12 @@ +package com.leets.X.domain.chat.dto.response; + +import java.util.List; + +public record ChattingDto( + Long user1Id, + Long user2Id, + String user1Name, + String user2Name, + List chatMessageList +) { +} From 65f82a04882446eafc349c5fa1d83ce8aefb37f7 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 01:54:58 +0900 Subject: [PATCH 027/123] =?UTF-8?q?feat:=20ChatRoomRepository=20-=20?= =?UTF-8?q?=EC=9C=A0=EC=A0=801,=20=EC=9C=A0=EC=A0=802=EC=9D=98=20=EC=B1=84?= =?UTF-8?q?=ED=8C=85=EB=B0=A9=20=EC=A1=B4=EC=9E=AC=20=EC=97=AC=EB=B6=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/repository/ChatRoomRepository.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/java/com/leets/X/domain/chat/repository/ChatRoomRepository.java b/src/main/java/com/leets/X/domain/chat/repository/ChatRoomRepository.java index c40ab9c..17e11cd 100644 --- a/src/main/java/com/leets/X/domain/chat/repository/ChatRoomRepository.java +++ b/src/main/java/com/leets/X/domain/chat/repository/ChatRoomRepository.java @@ -2,9 +2,24 @@ import com.leets.X.domain.chat.entity.ChatRoom; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.util.Optional; + @Repository public interface ChatRoomRepository extends JpaRepository { +/* + SELECT room_id FROM chat_room WHERE + (user1_id = :user1Id AND user2_id = :user2Id) OR + (user1_id = :user2Id AND user2_id = :user1Id); +*/ + + @Query("SELECT c.id FROM ChatRoom c WHERE " + + "(c.user1.id = :user1Id AND c.user2.id = :user2Id) OR " + + "(c.user1.id = :user2Id AND c.user2.id = :user1Id)") + Optional findRoomIdByUserIds(@Param("user1Id") Long user1Id, @Param("user2Id") Long user2Id); + } From 7265ccf8fa64cd204155efabf802334099a27fe9 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 01:55:16 +0900 Subject: [PATCH 028/123] =?UTF-8?q?feat:=20ChatRoomCheckRequstDto=20-=20?= =?UTF-8?q?=EC=9C=A0=EC=A0=801,=20=EC=9C=A0=EC=A0=802=EC=9D=98=20=EC=B1=84?= =?UTF-8?q?=ED=8C=85=EB=B0=A9=20=EC=A1=B4=EC=9E=AC=20=EC=97=AC=EB=B6=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/chat/dto/request/ChatRoomCheckRequstDto.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/chat/dto/request/ChatRoomCheckRequstDto.java diff --git a/src/main/java/com/leets/X/domain/chat/dto/request/ChatRoomCheckRequstDto.java b/src/main/java/com/leets/X/domain/chat/dto/request/ChatRoomCheckRequstDto.java new file mode 100644 index 0000000..4f3e806 --- /dev/null +++ b/src/main/java/com/leets/X/domain/chat/dto/request/ChatRoomCheckRequstDto.java @@ -0,0 +1,9 @@ +package com.leets.X.domain.chat.dto.request; + +public record ChatRoomCheckRequstDto( + + Long user1Id, + Long user2Id + +) { +} From 48f775f20f615d6e17c9f671baab83e58c5f6b86 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 01:56:07 +0900 Subject: [PATCH 029/123] =?UTF-8?q?fix:=20ChatMessage=20-=20senderName,=20?= =?UTF-8?q?createdAt=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets/X/domain/chat/entity/ChatMessage.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/leets/X/domain/chat/entity/ChatMessage.java b/src/main/java/com/leets/X/domain/chat/entity/ChatMessage.java index 253e78c..767cf21 100644 --- a/src/main/java/com/leets/X/domain/chat/entity/ChatMessage.java +++ b/src/main/java/com/leets/X/domain/chat/entity/ChatMessage.java @@ -1,6 +1,7 @@ package com.leets.X.domain.chat.entity; +import com.fasterxml.jackson.annotation.JsonFormat; import com.leets.X.domain.chat.dto.PublishMessage; import com.leets.X.global.common.domain.BaseTimeEntity; import jakarta.persistence.Id; @@ -10,25 +11,32 @@ import java.time.LocalDateTime; -@Document +@Document(collection = "chatMessage") @Getter @Builder -public class ChatMessage extends BaseTimeEntity { +public class ChatMessage { @Id - private Long id; // MongoDb에서 사용하는 ObjectId + private String id; // MongoDb에서 사용하는 ObjectId private Long roomId; private Long senderId; + private String senderName; + private String content; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createdAt; + public static ChatMessage of(PublishMessage publishMessage) { return ChatMessage.builder() .roomId(publishMessage.getRoomId()) .senderId(publishMessage.getSenderId()) + .senderName(publishMessage.getSenderName()) .content(publishMessage.getContent()) + .createdAt(LocalDateTime.now()) .build(); } From a1ed4504df7adccbb75e2408252d8bc4ea3acd82 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 01:56:35 +0900 Subject: [PATCH 030/123] =?UTF-8?q?fix:=20ChatMessageController=20-=20Mess?= =?UTF-8?q?age=20Publish=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ChatMessageController.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/chat/controller/ChatMessageController.java diff --git a/src/main/java/com/leets/X/domain/chat/controller/ChatMessageController.java b/src/main/java/com/leets/X/domain/chat/controller/ChatMessageController.java new file mode 100644 index 0000000..0f3563d --- /dev/null +++ b/src/main/java/com/leets/X/domain/chat/controller/ChatMessageController.java @@ -0,0 +1,23 @@ +package com.leets.X.domain.chat.controller; + + +import com.leets.X.domain.chat.dto.request.MessageDto; +import com.leets.X.domain.chat.service.ChatMessageService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.messaging.handler.annotation.MessageMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@Slf4j +@RequiredArgsConstructor +public class ChatMessageController { + + private final ChatMessageService chatMessageService; + + // 클라이언트는 /pub/chats/messages/ + roomId로 보낸다. + @MessageMapping("/chats/messages/{room-id}") + public void message(MessageDto messageDto) { + chatMessageService.publishMessage(messageDto); + } +} From 4992376c7e88d3641abf2ddc619517f86e729ef1 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 01:57:45 +0900 Subject: [PATCH 031/123] =?UTF-8?q?feat:=20ChatMessageResponseDto=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/ChatMessageResponseDto.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/chat/dto/response/ChatMessageResponseDto.java diff --git a/src/main/java/com/leets/X/domain/chat/dto/response/ChatMessageResponseDto.java b/src/main/java/com/leets/X/domain/chat/dto/response/ChatMessageResponseDto.java new file mode 100644 index 0000000..ca61f6b --- /dev/null +++ b/src/main/java/com/leets/X/domain/chat/dto/response/ChatMessageResponseDto.java @@ -0,0 +1,23 @@ +package com.leets.X.domain.chat.dto.response; + +import com.leets.X.domain.chat.entity.ChatMessage; + +import java.time.LocalDateTime; + +public record ChatMessageResponseDto( + + Long senderId, + String senderName, + String content, + LocalDateTime createdAt + +) { + public static ChatMessageResponseDto fromEntity(ChatMessage chatMessage){ + return new ChatMessageResponseDto( + chatMessage.getSenderId(), + chatMessage.getSenderName(), + chatMessage.getContent(), + chatMessage.getCreatedAt() + ); + } +} From bfda80ecae7480313e3b23c1ce67da1a73988a87 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 01:58:16 +0900 Subject: [PATCH 032/123] =?UTF-8?q?feat:=20ChatRoomController=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/controller/ChatRoomController.java | 36 ++++++++++++++----- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java b/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java index 92d1f58..cfcc0e6 100644 --- a/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java +++ b/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java @@ -1,8 +1,10 @@ package com.leets.X.domain.chat.controller; +import com.leets.X.domain.chat.dto.request.ChatRoomCheckRequstDto; import com.leets.X.domain.chat.dto.request.ChatRoomRequestDto; import com.leets.X.domain.chat.dto.response.ChatRoomResponseDto; +import com.leets.X.domain.chat.dto.response.ChattingDto; import com.leets.X.domain.chat.service.ChatRoomService; import com.leets.X.global.common.response.ResponseDto; import lombok.RequiredArgsConstructor; @@ -10,10 +12,12 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import static com.leets.X.domain.chat.controller.ResponseMessage.*; + @RestController @Slf4j @Validated -@RequestMapping("/api/v1") +@RequestMapping("/api/v1/chatRoom") @RequiredArgsConstructor public class ChatRoomController { @@ -25,19 +29,33 @@ public void getChatRoomByUser1IdUser2Id(){ } - @PostMapping("/chatRoom") + @PostMapping public ResponseDto createChatRoom(@RequestBody ChatRoomRequestDto chatRoomRequestDto){ ChatRoomResponseDto response = chatRoomService.save(chatRoomRequestDto); - return ResponseDto.response(200, "Successfully create ChatRoom!", response); + return ResponseDto.response(CHATROOM_CREATE_SUCCESS.getCode(), CHATROOM_CREATE_SUCCESS.getMessage(), response); } - // 채팅방 하나를 조회해준다. (대화 내용을 돌려준다는 의미) - @GetMapping("/chatRoom") - public ResponseDto findChatRoom( + // 채팅방 하나를 조회해준다. (대화 내역을 돌려준다는 의미) + @GetMapping + public ResponseDto findChatRoom( @RequestParam Long roomId, @RequestParam int size, @RequestParam int page ){ - chatRoomService.findByChatRoom(roomId, size, page); - ChatRoomResponseDto response = new ChatRoomResponseDto(1L); - return ResponseDto.response(200, "Successfully return ChatRoom", response); + ChattingDto response = chatRoomService.findByChatRoom(roomId, size, page); + return ResponseDto.response(GET_CHATROOM.getCode(), GET_CHATROOM.getMessage(), response); + } + + // user1Id와 user2Id의 채팅방이 있는 지 조회 + @GetMapping("/user") + public ResponseDto existChatRoom(@RequestBody ChatRoomCheckRequstDto checkDto){ + ChatRoomResponseDto response = chatRoomService.findUser1User2ChatRoom(checkDto); + + return ResponseDto.response(GET_ROOMID.getCode(), GET_ROOMID.getMessage(), response); + + } + + @PostMapping("/test") // addListener 테스트 용 + public void addListener(@RequestParam Long roomId) { + chatRoomService.addListener(roomId); + log.info("addListener"); } } From 8e1fa95ef95a48c92a12f54e6f49ec1dde282412 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 01:58:51 +0900 Subject: [PATCH 033/123] =?UTF-8?q?feat:=20ChatMessageService=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/service/ChatMessageService.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/chat/service/ChatMessageService.java diff --git a/src/main/java/com/leets/X/domain/chat/service/ChatMessageService.java b/src/main/java/com/leets/X/domain/chat/service/ChatMessageService.java new file mode 100644 index 0000000..dac58d9 --- /dev/null +++ b/src/main/java/com/leets/X/domain/chat/service/ChatMessageService.java @@ -0,0 +1,28 @@ +package com.leets.X.domain.chat.service; + +import com.leets.X.domain.chat.dto.PublishMessage; +import com.leets.X.domain.chat.dto.request.MessageDto; +import com.leets.X.domain.chat.entity.ChatMessage; +import com.leets.X.domain.chat.redis.RedisPublisher; +import com.leets.X.domain.chat.repository.ChatMessageRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@RequiredArgsConstructor +public class ChatMessageService { + + private final RedisPublisher redisPublisher; + private final ChatMessageRepository chatMessageRepository; + + public void publishMessage(MessageDto messageDto) { + PublishMessage publishMessage = + new PublishMessage(messageDto.getRoomId(), messageDto.getSenderId(), messageDto.getSenderName(), messageDto.getContent()); + + redisPublisher.publish(publishMessage); + chatMessageRepository.save(ChatMessage.of(publishMessage)); + } + +} From 8779ce517d9d3afe91026fc29874e24a1d82c5e7 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 04:10:01 +0900 Subject: [PATCH 034/123] =?UTF-8?q?fix:=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets/X/domain/chat/controller/ChatRoomController.java | 4 ++-- .../java/com/leets/X/domain/chat/service/ChatRoomService.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java b/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java index cfcc0e6..a260823 100644 --- a/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java +++ b/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java @@ -31,7 +31,7 @@ public void getChatRoomByUser1IdUser2Id(){ @PostMapping public ResponseDto createChatRoom(@RequestBody ChatRoomRequestDto chatRoomRequestDto){ - ChatRoomResponseDto response = chatRoomService.save(chatRoomRequestDto); + ChatRoomResponseDto response = chatRoomService.saveChatRoom(chatRoomRequestDto); return ResponseDto.response(CHATROOM_CREATE_SUCCESS.getCode(), CHATROOM_CREATE_SUCCESS.getMessage(), response); } @@ -39,7 +39,7 @@ public ResponseDto createChatRoom(@RequestBody ChatRoomRequ @GetMapping public ResponseDto findChatRoom( @RequestParam Long roomId, @RequestParam int size, @RequestParam int page ){ - ChattingDto response = chatRoomService.findByChatRoom(roomId, size, page); + ChattingDto response = chatRoomService.getChatRoom(roomId, size, page); return ResponseDto.response(GET_CHATROOM.getCode(), GET_CHATROOM.getMessage(), response); } diff --git a/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java b/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java index 5f10895..840f5f6 100644 --- a/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java +++ b/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java @@ -32,7 +32,7 @@ public class ChatRoomService { private final ChatMessageRepository chatMessageRepository; private final UserRepository userRepository; - public ChatRoomResponseDto save(ChatRoomRequestDto chatRoomRequestDto) { + public ChatRoomResponseDto saveChatRoom(ChatRoomRequestDto chatRoomRequestDto) { // 이 부분은 UserService에 비지니스 로직을 추가 해달라고 한 뒤 or 추가하고 UserService 단에서 접근하는게 나을거 같다. Optional user1 = userRepository.findById(chatRoomRequestDto.user1Id()); @@ -52,7 +52,7 @@ public ChatRoomResponseDto save(ChatRoomRequestDto chatRoomRequestDto) { } } - public ChattingDto findByChatRoom(Long roomId, int size, int page) { + public ChattingDto getChatRoom(Long roomId, int size, int page) { ChatRoom findRoom = chatRoomRepository.findById(roomId) .orElseThrow(NotFoundChatRoomException::new); User user1 = findRoom.getUser1(); From 1d0514436cb123021d63b94944e377324db5d4ed Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 23:09:48 +0900 Subject: [PATCH 035/123] fix: rename ChatMessageService -> PublishMessageService --- .../{ChatMessageService.java => PublishMessageService.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/com/leets/X/domain/chat/service/{ChatMessageService.java => PublishMessageService.java} (96%) diff --git a/src/main/java/com/leets/X/domain/chat/service/ChatMessageService.java b/src/main/java/com/leets/X/domain/chat/service/PublishMessageService.java similarity index 96% rename from src/main/java/com/leets/X/domain/chat/service/ChatMessageService.java rename to src/main/java/com/leets/X/domain/chat/service/PublishMessageService.java index dac58d9..e0624f7 100644 --- a/src/main/java/com/leets/X/domain/chat/service/ChatMessageService.java +++ b/src/main/java/com/leets/X/domain/chat/service/PublishMessageService.java @@ -12,7 +12,7 @@ @Slf4j @Service @RequiredArgsConstructor -public class ChatMessageService { +public class PublishMessageService { private final RedisPublisher redisPublisher; private final ChatMessageRepository chatMessageRepository; From 66d4d55e3481efb73b6c78c68929fd130d40ad87 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 23:10:31 +0900 Subject: [PATCH 036/123] feat: add ResponseMessage GET_CHATTING_LIST --- .../com/leets/X/domain/chat/controller/ResponseMessage.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/leets/X/domain/chat/controller/ResponseMessage.java b/src/main/java/com/leets/X/domain/chat/controller/ResponseMessage.java index d7dd9c0..e5cd18f 100644 --- a/src/main/java/com/leets/X/domain/chat/controller/ResponseMessage.java +++ b/src/main/java/com/leets/X/domain/chat/controller/ResponseMessage.java @@ -9,7 +9,8 @@ public enum ResponseMessage { CHATROOM_CREATE_SUCCESS(201,"채팅방 생성에 성공했습니다."), GET_CHATROOM(200, "하나의 채팅방을 반환합니다."), - GET_ROOMID(200, "채팅방 번호를 반환합니다."); + GET_ROOMID(200, "채팅방 번호를 반환합니다."), + GET_CHATTING_LIST(200, "모든 채팅방 목록을 반환합니다."); private final int code; private final String message; From db0b8593f47fc18c5a6406c23d6cef0da8eeabed Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 23:11:27 +0900 Subject: [PATCH 037/123] fix: rename ChatMessageController -> PublishMessageController --- ...Controller.java => PublishMessageController.java} | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) rename src/main/java/com/leets/X/domain/chat/controller/{ChatMessageController.java => PublishMessageController.java} (56%) diff --git a/src/main/java/com/leets/X/domain/chat/controller/ChatMessageController.java b/src/main/java/com/leets/X/domain/chat/controller/PublishMessageController.java similarity index 56% rename from src/main/java/com/leets/X/domain/chat/controller/ChatMessageController.java rename to src/main/java/com/leets/X/domain/chat/controller/PublishMessageController.java index 0f3563d..be5ecb6 100644 --- a/src/main/java/com/leets/X/domain/chat/controller/ChatMessageController.java +++ b/src/main/java/com/leets/X/domain/chat/controller/PublishMessageController.java @@ -2,7 +2,7 @@ import com.leets.X.domain.chat.dto.request.MessageDto; -import com.leets.X.domain.chat.service.ChatMessageService; +import com.leets.X.domain.chat.service.PublishMessageService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.messaging.handler.annotation.MessageMapping; @@ -11,13 +11,13 @@ @RestController @Slf4j @RequiredArgsConstructor -public class ChatMessageController { +public class PublishMessageController { - private final ChatMessageService chatMessageService; + private final PublishMessageService publishMessageService; - // 클라이언트는 /pub/chats/messages/ + roomId로 보낸다. - @MessageMapping("/chats/messages/{room-id}") + // 클라이언트는 "/pub/chats/messages" 로 보낸다. + @MessageMapping("/chats/messages") public void message(MessageDto messageDto) { - chatMessageService.publishMessage(messageDto); + publishMessageService.publishMessage(messageDto); } } From cb514fd6dde324dddc3267904f61b67f120ddf06 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 23:12:10 +0900 Subject: [PATCH 038/123] fix: add getChattingList to ChatRoomService --- .../domain/chat/service/ChatRoomService.java | 48 ++++++++++++++----- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java b/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java index 840f5f6..6bc2e6f 100644 --- a/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java +++ b/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java @@ -1,10 +1,10 @@ package com.leets.X.domain.chat.service; import com.leets.X.domain.chat.dto.request.ChatRoomCheckRequstDto; -import com.leets.X.domain.chat.dto.request.ChatRoomRequestDto; -import com.leets.X.domain.chat.dto.response.ChatMessageResponseDto; -import com.leets.X.domain.chat.dto.response.ChatRoomResponseDto; -import com.leets.X.domain.chat.dto.response.ChattingDto; +import com.leets.X.domain.chat.dto.request.GetChatRoomRequestDto; +import com.leets.X.domain.chat.dto.request.FindChatRoomRequestDto; +import com.leets.X.domain.chat.dto.response.*; +import com.leets.X.domain.chat.entity.ChatMessage; import com.leets.X.domain.chat.entity.ChatRoom; import com.leets.X.domain.chat.exception.NotFoundChatRoomException; import com.leets.X.domain.chat.redis.RedisListener; @@ -32,18 +32,18 @@ public class ChatRoomService { private final ChatMessageRepository chatMessageRepository; private final UserRepository userRepository; - public ChatRoomResponseDto saveChatRoom(ChatRoomRequestDto chatRoomRequestDto) { + public ChatRoomResponseDto saveChatRoom(FindChatRoomRequestDto findChatRoomRequestDto) { // 이 부분은 UserService에 비지니스 로직을 추가 해달라고 한 뒤 or 추가하고 UserService 단에서 접근하는게 나을거 같다. - Optional user1 = userRepository.findById(chatRoomRequestDto.user1Id()); - Optional user2 = userRepository.findById(chatRoomRequestDto.user2Id()); + Optional user1 = userRepository.findById(findChatRoomRequestDto.user1Id()); + Optional user2 = userRepository.findById(findChatRoomRequestDto.user2Id()); if (user1.isPresent() && user2.isPresent()) { ChatRoom savedRoom = chatRoomRepository.save(ChatRoom.of(user1.get(), user2.get())); // 채팅방 RDB에 저장 redisMessageListener.adaptMessageListener(savedRoom.getId()); // 리스너 등록 return new ChatRoomResponseDto(savedRoom.getId()); - }else{ + } else { // 사용자 없음 예외 발생 //int code = (user2.isPresent()) ? USER1_NOT_FOUND.getCode() : USER2_NOT_FOUND.getCode(); //String message = (user2.isPresent()) ? USER1_NOT_FOUND.getMessage() : USER2_NOT_FOUND.getMessage(); @@ -52,13 +52,14 @@ public ChatRoomResponseDto saveChatRoom(ChatRoomRequestDto chatRoomRequestDto) { } } - public ChattingDto getChatRoom(Long roomId, int size, int page) { - ChatRoom findRoom = chatRoomRepository.findById(roomId) + public ChattingDto getChatRoom(GetChatRoomRequestDto getChatRoomRequestDto) { + ChatRoom findRoom = chatRoomRepository.findById(getChatRoomRequestDto.roomId()) .orElseThrow(NotFoundChatRoomException::new); User user1 = findRoom.getUser1(); User user2 = findRoom.getUser2(); - List chatMessageList = chatMessageRepository.findByRoomIdOrderByCreatedAtDesc(roomId, PageRequest.of(page - 1, size)) + List chatMessageList = chatMessageRepository.findByRoomIdOrderByCreatedAtDesc( + getChatRoomRequestDto.roomId(), PageRequest.of(getChatRoomRequestDto.page()- 1, getChatRoomRequestDto.size())) .getContent() .stream() .map(ChatMessageResponseDto::fromEntity) @@ -68,7 +69,7 @@ public ChattingDto getChatRoom(Long roomId, int size, int page) { } public ChatRoomResponseDto findUser1User2ChatRoom(ChatRoomCheckRequstDto checkDto) { - Long result = chatRoomRepository.findRoomIdByUserIds(checkDto.user1Id(), checkDto.user2Id()).orElse(1L); + Long result = chatRoomRepository.findRoomIdByUserIds(checkDto.user1Id(), checkDto.user2Id()).orElse(-1L); return new ChatRoomResponseDto(result); } @@ -76,4 +77,27 @@ public ChatRoomResponseDto findUser1User2ChatRoom(ChatRoomCheckRequstDto checkDt public void addListener(Long roomId) { redisMessageListener.adaptMessageListener(roomId); // 리스너 등록 } + + public List getChattingList(Long userId) { + List chatRooms = chatRoomRepository.findRoomIdByUserId(userId) + .orElseThrow(NotFoundChatRoomException::new); + + return chatRooms.stream() + .map(chatRoom -> { + ChatMessage latestMessage = chatMessageRepository.findTopByRoomIdOrderByCreatedAtDesc(chatRoom.getId()).orElse(null); + LatestMessageDto latestMessageDto = (latestMessage != null) + ? LatestMessageDto.of(latestMessage) + : new LatestMessageDto("", null); + + return ChattingListResponseDto.of(chatRoom, latestMessageDto); + }) + .collect(Collectors.toList()); + } + + + public void hi(Long roomId){ + ChatMessage chatMessage = chatMessageRepository.findTopByRoomIdOrderByCreatedAtDesc(roomId).get(); + System.out.println(chatMessage.getRoomId() + " " + chatMessage.getCreatedAt() + " " + chatMessage.getContent()); + } + } From f0fddce844c1935e9f2297d1fcd15249af2f37e3 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 23:13:11 +0900 Subject: [PATCH 039/123] =?UTF-8?q?feat:=20=EC=B5=9C=EA=B7=BC=20=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=EC=A7=80=20=EB=82=B4=EC=9A=A9,=20=EC=8B=9C=EA=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/dto/response/LatestMessageDto.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/chat/dto/response/LatestMessageDto.java diff --git a/src/main/java/com/leets/X/domain/chat/dto/response/LatestMessageDto.java b/src/main/java/com/leets/X/domain/chat/dto/response/LatestMessageDto.java new file mode 100644 index 0000000..fd2edb7 --- /dev/null +++ b/src/main/java/com/leets/X/domain/chat/dto/response/LatestMessageDto.java @@ -0,0 +1,17 @@ +package com.leets.X.domain.chat.dto.response; + +import com.leets.X.domain.chat.entity.ChatMessage; + +import java.time.LocalDateTime; + + +public record LatestMessageDto( + + String content, + LocalDateTime createdAt + +) { + public static LatestMessageDto of(ChatMessage message) { + return new LatestMessageDto(message.getContent(), message.getCreatedAt()); + } +} From c93eac94858933e3c2cd8a1f8ecd42ffddab624d Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 23:14:30 +0900 Subject: [PATCH 040/123] =?UTF-8?q?feat:=20ChattingListResponseDto=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/ChattingListResponseDto.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/chat/dto/response/ChattingListResponseDto.java diff --git a/src/main/java/com/leets/X/domain/chat/dto/response/ChattingListResponseDto.java b/src/main/java/com/leets/X/domain/chat/dto/response/ChattingListResponseDto.java new file mode 100644 index 0000000..742ad39 --- /dev/null +++ b/src/main/java/com/leets/X/domain/chat/dto/response/ChattingListResponseDto.java @@ -0,0 +1,23 @@ +package com.leets.X.domain.chat.dto.response; + +import com.leets.X.domain.chat.entity.ChatRoom; + +public record ChattingListResponseDto( + Long roomId, + Long user1Id, + Long user2Id, + String user1Name, + String user2Name, + LatestMessageDto latestMessageDto +) { + public static ChattingListResponseDto of(ChatRoom chatRoom, LatestMessageDto latestMessageDto) { + return new ChattingListResponseDto( + chatRoom.getId(), + chatRoom.getUser1().getId(), + chatRoom.getUser2().getId(), + chatRoom.getUser1().getCustomId(), + chatRoom.getUser2().getCustomId(), + latestMessageDto + ); + } +} From 43950fbf7500dd0b1362fb814d30e0dfe2ca99c1 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 23:14:54 +0900 Subject: [PATCH 041/123] =?UTF-8?q?feat:=20GetChatRoomRequestDto=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/chat/dto/request/GetChatRoomRequestDto.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/chat/dto/request/GetChatRoomRequestDto.java diff --git a/src/main/java/com/leets/X/domain/chat/dto/request/GetChatRoomRequestDto.java b/src/main/java/com/leets/X/domain/chat/dto/request/GetChatRoomRequestDto.java new file mode 100644 index 0000000..4424493 --- /dev/null +++ b/src/main/java/com/leets/X/domain/chat/dto/request/GetChatRoomRequestDto.java @@ -0,0 +1,10 @@ +package com.leets.X.domain.chat.dto.request; + +public record GetChatRoomRequestDto( + + Long roomId, + int size, + int page + +){ +} From 9a02e838586c4653b142de47ad171acf42ca8fe0 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 23:15:25 +0900 Subject: [PATCH 042/123] feat: add Method findTopByRoomIdOrderByCreatedAtDesc() to ChatMessageRepository --- .../X/domain/chat/repository/ChatMessageRepository.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/leets/X/domain/chat/repository/ChatMessageRepository.java b/src/main/java/com/leets/X/domain/chat/repository/ChatMessageRepository.java index 82b86ad..538b8ba 100644 --- a/src/main/java/com/leets/X/domain/chat/repository/ChatMessageRepository.java +++ b/src/main/java/com/leets/X/domain/chat/repository/ChatMessageRepository.java @@ -5,8 +5,13 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.mongodb.repository.MongoRepository; +import java.util.Optional; + public interface ChatMessageRepository extends MongoRepository { Page findByRoomIdOrderByCreatedAtDesc(Long roomId, Pageable pageable); + Optional findTopByRoomIdOrderByCreatedAtDesc(Long roomId); + + } From 5c5effcfff158df8ccb915faa78acf0e67309a76 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 23:16:56 +0900 Subject: [PATCH 043/123] feat: add findRoomIdByUserId ChatRoomRepository --- .../chat/repository/ChatRoomRepository.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/java/com/leets/X/domain/chat/repository/ChatRoomRepository.java b/src/main/java/com/leets/X/domain/chat/repository/ChatRoomRepository.java index 17e11cd..609431d 100644 --- a/src/main/java/com/leets/X/domain/chat/repository/ChatRoomRepository.java +++ b/src/main/java/com/leets/X/domain/chat/repository/ChatRoomRepository.java @@ -6,6 +6,7 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.util.ArrayList; import java.util.Optional; @Repository @@ -22,4 +23,23 @@ public interface ChatRoomRepository extends JpaRepository { "(c.user1.id = :user2Id AND c.user2.id = :user1Id)") Optional findRoomIdByUserIds(@Param("user1Id") Long user1Id, @Param("user2Id") Long user2Id); + /* + * SELECT room_id FROM chat_room WHERE + * (user1_id =:user1Id) OR (user2_id=:user1Id) + * + * Fetch Join 적용 X + * @Query("SELECT c FROM ChatRoom c WHERE" + + " (c.user1.id =:userId) OR" + + " (c.user2.id =:userId)") + * + * */ + + + // Fetch Join으로 성능 향상 N+1문제 해결 + @Query("SELECT c FROM ChatRoom c " + + "JOIN FETCH c.user1 " + + "JOIN FETCH c.user2 " + + "WHERE c.user1.id = :userId OR c.user2.id = :userId") + Optional> findRoomIdByUserId(Long userId); + } From 12003cf70ee7b2e5553bdbcf410e025c311947c5 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 23:18:41 +0900 Subject: [PATCH 044/123] feat: add getChattingList to ChatRoomController --- .../chat/controller/ChatRoomController.java | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java b/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java index a260823..e47283a 100644 --- a/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java +++ b/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java @@ -2,9 +2,11 @@ import com.leets.X.domain.chat.dto.request.ChatRoomCheckRequstDto; -import com.leets.X.domain.chat.dto.request.ChatRoomRequestDto; +import com.leets.X.domain.chat.dto.request.GetChatRoomRequestDto; +import com.leets.X.domain.chat.dto.request.FindChatRoomRequestDto; import com.leets.X.domain.chat.dto.response.ChatRoomResponseDto; import com.leets.X.domain.chat.dto.response.ChattingDto; +import com.leets.X.domain.chat.dto.response.ChattingListResponseDto; import com.leets.X.domain.chat.service.ChatRoomService; import com.leets.X.global.common.response.ResponseDto; import lombok.RequiredArgsConstructor; @@ -12,6 +14,8 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.List; + import static com.leets.X.domain.chat.controller.ResponseMessage.*; @RestController @@ -23,33 +27,34 @@ public class ChatRoomController { private final ChatRoomService chatRoomService; - @GetMapping("/check") - public void getChatRoomByUser1IdUser2Id(){ - - - } - @PostMapping - public ResponseDto createChatRoom(@RequestBody ChatRoomRequestDto chatRoomRequestDto){ - ChatRoomResponseDto response = chatRoomService.saveChatRoom(chatRoomRequestDto); + public ResponseDto createChatRoom(@RequestBody FindChatRoomRequestDto findChatRoomRequestDto){ + ChatRoomResponseDto response = chatRoomService.saveChatRoom(findChatRoomRequestDto); return ResponseDto.response(CHATROOM_CREATE_SUCCESS.getCode(), CHATROOM_CREATE_SUCCESS.getMessage(), response); } // 채팅방 하나를 조회해준다. (대화 내역을 돌려준다는 의미) @GetMapping public ResponseDto findChatRoom( - @RequestParam Long roomId, @RequestParam int size, @RequestParam int page ){ - ChattingDto response = chatRoomService.getChatRoom(roomId, size, page); + @RequestBody GetChatRoomRequestDto getChatRoomRequestDto){ + ChattingDto response = chatRoomService.getChatRoom(getChatRoomRequestDto); return ResponseDto.response(GET_CHATROOM.getCode(), GET_CHATROOM.getMessage(), response); } // user1Id와 user2Id의 채팅방이 있는 지 조회 - @GetMapping("/user") + @GetMapping("/users") public ResponseDto existChatRoom(@RequestBody ChatRoomCheckRequstDto checkDto){ ChatRoomResponseDto response = chatRoomService.findUser1User2ChatRoom(checkDto); return ResponseDto.response(GET_ROOMID.getCode(), GET_ROOMID.getMessage(), response); + } + + @GetMapping("/chattingList") + public ResponseDto> getChattingList(@RequestParam Long userId){ + + List response = chatRoomService.getChattingList(userId); + return ResponseDto.response(GET_CHATTING_LIST.getCode(), GET_CHATTING_LIST.getMessage(), response); } @PostMapping("/test") // addListener 테스트 용 @@ -58,4 +63,10 @@ public void addListener(@RequestParam Long roomId) { log.info("addListener"); } + @GetMapping("/test1") // addListener 테스트 용 + public void test1(@RequestParam Long roomId) { + chatRoomService.hi(roomId); + log.info("test1"); + } + } From 7ae9343512e63fc31e55b11f056add01d5166cde Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sat, 2 Nov 2024 23:19:08 +0900 Subject: [PATCH 045/123] =?UTF-8?q?feat:=20ChatRoomRequestDto=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{ChatRoomRequestDto.java => FindChatRoomRequestDto.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/com/leets/X/domain/chat/dto/request/{ChatRoomRequestDto.java => FindChatRoomRequestDto.java} (71%) diff --git a/src/main/java/com/leets/X/domain/chat/dto/request/ChatRoomRequestDto.java b/src/main/java/com/leets/X/domain/chat/dto/request/FindChatRoomRequestDto.java similarity index 71% rename from src/main/java/com/leets/X/domain/chat/dto/request/ChatRoomRequestDto.java rename to src/main/java/com/leets/X/domain/chat/dto/request/FindChatRoomRequestDto.java index f045c73..202ccd8 100644 --- a/src/main/java/com/leets/X/domain/chat/dto/request/ChatRoomRequestDto.java +++ b/src/main/java/com/leets/X/domain/chat/dto/request/FindChatRoomRequestDto.java @@ -1,6 +1,6 @@ package com.leets.X.domain.chat.dto.request; -public record ChatRoomRequestDto ( +public record FindChatRoomRequestDto( Long user1Id, Long user2Id From 642f5d000792133b9a2835d2573f9a8ea470f89f Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sun, 3 Nov 2024 02:53:05 +0900 Subject: [PATCH 046/123] =?UTF-8?q?feat:=20ChattingController,=20Service?= =?UTF-8?q?=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/controller/ChattingController.java | 37 ++++++++++++ .../domain/chat/service/ChattingService.java | 60 +++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/chat/controller/ChattingController.java create mode 100644 src/main/java/com/leets/X/domain/chat/service/ChattingService.java diff --git a/src/main/java/com/leets/X/domain/chat/controller/ChattingController.java b/src/main/java/com/leets/X/domain/chat/controller/ChattingController.java new file mode 100644 index 0000000..ae929af --- /dev/null +++ b/src/main/java/com/leets/X/domain/chat/controller/ChattingController.java @@ -0,0 +1,37 @@ +package com.leets.X.domain.chat.controller; + +import com.leets.X.domain.chat.dto.request.GetChatRoomRequestDto; +import com.leets.X.domain.chat.dto.response.ChattingDto; +import com.leets.X.domain.chat.dto.response.ChattingListResponseDto; +import com.leets.X.domain.chat.service.ChattingService; +import com.leets.X.global.common.response.ResponseDto; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +import static com.leets.X.domain.chat.controller.ResponseMessage.GET_CHATROOM; +import static com.leets.X.domain.chat.controller.ResponseMessage.GET_CHATTING_LIST; + +@RestController +@RequestMapping("/api/v1") +@RequiredArgsConstructor +public class ChattingController { + + private final ChattingService chattingService; + + // 채팅방 하나를 조회해준다. (대화 내역을 돌려준다는 의미) + @GetMapping("/chatting") + public ResponseDto findChatting( @RequestBody GetChatRoomRequestDto getChatRoomRequestDto){ + ChattingDto response = chattingService.getChatRoom(getChatRoomRequestDto); + return ResponseDto.response(GET_CHATROOM.getCode(), GET_CHATROOM.getMessage(), response); + } + + + @GetMapping("/chattingList") + public ResponseDto> findChattingList(@RequestParam Long userId){ + List response = chattingService.getChattingList(userId); + return ResponseDto.response(GET_CHATTING_LIST.getCode(), GET_CHATTING_LIST.getMessage(), response); + } + +} diff --git a/src/main/java/com/leets/X/domain/chat/service/ChattingService.java b/src/main/java/com/leets/X/domain/chat/service/ChattingService.java new file mode 100644 index 0000000..3481744 --- /dev/null +++ b/src/main/java/com/leets/X/domain/chat/service/ChattingService.java @@ -0,0 +1,60 @@ +package com.leets.X.domain.chat.service; + +import com.leets.X.domain.chat.dto.request.GetChatRoomRequestDto; +import com.leets.X.domain.chat.dto.response.ChatMessageResponseDto; +import com.leets.X.domain.chat.dto.response.ChattingDto; +import com.leets.X.domain.chat.dto.response.ChattingListResponseDto; +import com.leets.X.domain.chat.dto.response.LatestMessageDto; +import com.leets.X.domain.chat.entity.ChatMessage; +import com.leets.X.domain.chat.entity.ChatRoom; +import com.leets.X.domain.chat.exception.NotFoundChatRoomException; +import com.leets.X.domain.chat.repository.ChatMessageRepository; +import com.leets.X.domain.chat.repository.ChatRoomRepository; +import com.leets.X.domain.user.domain.User; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class ChattingService { + + private final ChatRoomRepository chatRoomRepository; + private final ChatMessageRepository chatMessageRepository; + + public ChattingDto getChatRoom(GetChatRoomRequestDto getChatRoomRequestDto) { + ChatRoom findRoom = chatRoomRepository.findById(getChatRoomRequestDto.roomId()) + .orElseThrow(NotFoundChatRoomException::new); + User user1 = findRoom.getUser1(); + User user2 = findRoom.getUser2(); + + List chatMessageList = chatMessageRepository.findByRoomIdOrderByCreatedAtDesc( + getChatRoomRequestDto.roomId(), PageRequest.of(getChatRoomRequestDto.page()- 1, getChatRoomRequestDto.size())) + .getContent() + .stream() + .map(ChatMessageResponseDto::fromEntity) + .collect(Collectors.toList()); + + return new ChattingDto(user1.getId(), user2.getId(), user1.getCustomId(), user2.getCustomId(), chatMessageList); + } + + public List getChattingList(Long userId) { // 추후 JWT 파싱으로 받아내기. + List chatRooms = chatRoomRepository.findRoomIdByUserId(userId) + .orElseThrow(NotFoundChatRoomException::new); + + return chatRooms.stream() + .map(chatRoom -> { + ChatMessage latestMessage = chatMessageRepository.findTopByRoomIdOrderByCreatedAtDesc(chatRoom.getId()).orElse(null); + LatestMessageDto latestMessageDto = (latestMessage != null) + ? LatestMessageDto.of(latestMessage) + : new LatestMessageDto("", null); + + return ChattingListResponseDto.of(chatRoom, latestMessageDto); + }) + .collect(Collectors.toList()); + } + +} From 9dbd7aae13f6d8c13aa4578f6d1e3df9a4b28c69 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sun, 3 Nov 2024 02:54:19 +0900 Subject: [PATCH 047/123] =?UTF-8?q?fix:=20ChatRoom=20=EC=B1=85=EC=9E=84=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/controller/ChatRoomController.java | 29 +++--------- .../domain/chat/service/ChatRoomService.java | 47 ++----------------- 2 files changed, 10 insertions(+), 66 deletions(-) diff --git a/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java b/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java index e47283a..d84cbbb 100644 --- a/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java +++ b/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java @@ -2,11 +2,8 @@ import com.leets.X.domain.chat.dto.request.ChatRoomCheckRequstDto; -import com.leets.X.domain.chat.dto.request.GetChatRoomRequestDto; import com.leets.X.domain.chat.dto.request.FindChatRoomRequestDto; import com.leets.X.domain.chat.dto.response.ChatRoomResponseDto; -import com.leets.X.domain.chat.dto.response.ChattingDto; -import com.leets.X.domain.chat.dto.response.ChattingListResponseDto; import com.leets.X.domain.chat.service.ChatRoomService; import com.leets.X.global.common.response.ResponseDto; import lombok.RequiredArgsConstructor; @@ -14,7 +11,6 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.List; import static com.leets.X.domain.chat.controller.ResponseMessage.*; @@ -33,13 +29,7 @@ public ResponseDto createChatRoom(@RequestBody FindChatRoom return ResponseDto.response(CHATROOM_CREATE_SUCCESS.getCode(), CHATROOM_CREATE_SUCCESS.getMessage(), response); } - // 채팅방 하나를 조회해준다. (대화 내역을 돌려준다는 의미) - @GetMapping - public ResponseDto findChatRoom( - @RequestBody GetChatRoomRequestDto getChatRoomRequestDto){ - ChattingDto response = chatRoomService.getChatRoom(getChatRoomRequestDto); - return ResponseDto.response(GET_CHATROOM.getCode(), GET_CHATROOM.getMessage(), response); - } + // user1Id와 user2Id의 채팅방이 있는 지 조회 @GetMapping("/users") @@ -49,13 +39,6 @@ public ResponseDto existChatRoom(@RequestBody ChatRoomCheck return ResponseDto.response(GET_ROOMID.getCode(), GET_ROOMID.getMessage(), response); } - @GetMapping("/chattingList") - public ResponseDto> getChattingList(@RequestParam Long userId){ - - List response = chatRoomService.getChattingList(userId); - - return ResponseDto.response(GET_CHATTING_LIST.getCode(), GET_CHATTING_LIST.getMessage(), response); - } @PostMapping("/test") // addListener 테스트 용 public void addListener(@RequestParam Long roomId) { @@ -63,10 +46,10 @@ public void addListener(@RequestParam Long roomId) { log.info("addListener"); } - @GetMapping("/test1") // addListener 테스트 용 - public void test1(@RequestParam Long roomId) { - chatRoomService.hi(roomId); - log.info("test1"); - } +// @GetMapping("/test1") // addListener 테스트 용 +// public void test1(@RequestParam Long roomId) { +// chatRoomService.hi(roomId); +// log.info("test1"); +// } } diff --git a/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java b/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java index 6bc2e6f..6b000f2 100644 --- a/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java +++ b/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java @@ -1,26 +1,18 @@ package com.leets.X.domain.chat.service; import com.leets.X.domain.chat.dto.request.ChatRoomCheckRequstDto; -import com.leets.X.domain.chat.dto.request.GetChatRoomRequestDto; import com.leets.X.domain.chat.dto.request.FindChatRoomRequestDto; import com.leets.X.domain.chat.dto.response.*; -import com.leets.X.domain.chat.entity.ChatMessage; import com.leets.X.domain.chat.entity.ChatRoom; -import com.leets.X.domain.chat.exception.NotFoundChatRoomException; import com.leets.X.domain.chat.redis.RedisListener; -import com.leets.X.domain.chat.repository.ChatMessageRepository; import com.leets.X.domain.chat.repository.ChatRoomRepository; import com.leets.X.domain.user.domain.User; import com.leets.X.domain.user.exception.UserNotFoundException; import com.leets.X.domain.user.repository.UserRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; - -import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; @Slf4j @Service @@ -29,7 +21,6 @@ public class ChatRoomService { private final RedisListener redisMessageListener; private final ChatRoomRepository chatRoomRepository; - private final ChatMessageRepository chatMessageRepository; private final UserRepository userRepository; public ChatRoomResponseDto saveChatRoom(FindChatRoomRequestDto findChatRoomRequestDto) { @@ -52,21 +43,7 @@ public ChatRoomResponseDto saveChatRoom(FindChatRoomRequestDto findChatRoomReque } } - public ChattingDto getChatRoom(GetChatRoomRequestDto getChatRoomRequestDto) { - ChatRoom findRoom = chatRoomRepository.findById(getChatRoomRequestDto.roomId()) - .orElseThrow(NotFoundChatRoomException::new); - User user1 = findRoom.getUser1(); - User user2 = findRoom.getUser2(); - - List chatMessageList = chatMessageRepository.findByRoomIdOrderByCreatedAtDesc( - getChatRoomRequestDto.roomId(), PageRequest.of(getChatRoomRequestDto.page()- 1, getChatRoomRequestDto.size())) - .getContent() - .stream() - .map(ChatMessageResponseDto::fromEntity) - .collect(Collectors.toList()); - return new ChattingDto(user1.getId(), user2.getId(), user1.getCustomId(), user2.getCustomId(), chatMessageList); - } public ChatRoomResponseDto findUser1User2ChatRoom(ChatRoomCheckRequstDto checkDto) { Long result = chatRoomRepository.findRoomIdByUserIds(checkDto.user1Id(), checkDto.user2Id()).orElse(-1L); @@ -78,26 +55,10 @@ public void addListener(Long roomId) { redisMessageListener.adaptMessageListener(roomId); // 리스너 등록 } - public List getChattingList(Long userId) { - List chatRooms = chatRoomRepository.findRoomIdByUserId(userId) - .orElseThrow(NotFoundChatRoomException::new); - - return chatRooms.stream() - .map(chatRoom -> { - ChatMessage latestMessage = chatMessageRepository.findTopByRoomIdOrderByCreatedAtDesc(chatRoom.getId()).orElse(null); - LatestMessageDto latestMessageDto = (latestMessage != null) - ? LatestMessageDto.of(latestMessage) - : new LatestMessageDto("", null); - - return ChattingListResponseDto.of(chatRoom, latestMessageDto); - }) - .collect(Collectors.toList()); - } - - public void hi(Long roomId){ - ChatMessage chatMessage = chatMessageRepository.findTopByRoomIdOrderByCreatedAtDesc(roomId).get(); - System.out.println(chatMessage.getRoomId() + " " + chatMessage.getCreatedAt() + " " + chatMessage.getContent()); - } +// public void hi(Long roomId){ +// ChatMessage chatMessage = chatMessageRepository.findTopByRoomIdOrderByCreatedAtDesc(roomId).get(); +// System.out.println(chatMessage.getRoomId() + " " + chatMessage.getCreatedAt() + " " + chatMessage.getContent()); +// } } From 9d10e44e3669b6144ba74f40ce093cda0fc838e4 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Mon, 4 Nov 2024 19:39:30 +0900 Subject: [PATCH 048/123] =?UTF-8?q?fix:=20application.yml=20=EB=AA=BD?= =?UTF-8?q?=EA=B3=A0=EB=94=94=EB=B9=84=20=EC=84=A4=EC=A0=95=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-local.yml | 2 +- src/main/resources/application-prod.yml | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index f1f5276..d9b001f 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -16,7 +16,7 @@ spring: host: ${REDIS_HOST} port: ${REDIS_PORT} mongodb: - uri: mongodb://localhost:27017/chatdb + uri: mongodb://localhost:27017/testdb x: diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 16b7564..b66cb3f 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -16,6 +16,11 @@ spring: host: ${REDIS_HOST} port: ${REDIS_PORT} password: ${REDIS_PASSWORD} + mongodb: + port: ${MONGO_PORT} + host: ${MONGO_HOST} + database: ${MONGO_DATABASE} + username: ${MONGO_USERNAME} x: From 8090d9fede8861fcb0907a76957f3b6e66091f06 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Mon, 4 Nov 2024 20:19:04 +0900 Subject: [PATCH 049/123] =?UTF-8?q?fix:=20=EC=9D=98=EB=AF=B8=20=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20(Va?= =?UTF-8?q?lid)=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/leets/X/domain/chat/controller/ChatRoomController.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java b/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java index d84cbbb..cffb25e 100644 --- a/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java +++ b/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java @@ -14,9 +14,8 @@ import static com.leets.X.domain.chat.controller.ResponseMessage.*; -@RestController @Slf4j -@Validated +@RestController @RequestMapping("/api/v1/chatRoom") @RequiredArgsConstructor public class ChatRoomController { From 467268ab4e5e23f682c04f3d19020f4e1088fe11 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Mon, 4 Nov 2024 20:24:07 +0900 Subject: [PATCH 050/123] =?UTF-8?q?fix:=20DTO=20@Valid=EB=A1=9C=20?= =?UTF-8?q?=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20=EC=8B=A4?= =?UTF-8?q?=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../X/domain/chat/controller/ChattingController.java | 3 ++- .../X/domain/chat/dto/request/GetChatRoomRequestDto.java | 8 +++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/leets/X/domain/chat/controller/ChattingController.java b/src/main/java/com/leets/X/domain/chat/controller/ChattingController.java index ae929af..13225fa 100644 --- a/src/main/java/com/leets/X/domain/chat/controller/ChattingController.java +++ b/src/main/java/com/leets/X/domain/chat/controller/ChattingController.java @@ -5,6 +5,7 @@ import com.leets.X.domain.chat.dto.response.ChattingListResponseDto; import com.leets.X.domain.chat.service.ChattingService; import com.leets.X.global.common.response.ResponseDto; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; @@ -22,7 +23,7 @@ public class ChattingController { // 채팅방 하나를 조회해준다. (대화 내역을 돌려준다는 의미) @GetMapping("/chatting") - public ResponseDto findChatting( @RequestBody GetChatRoomRequestDto getChatRoomRequestDto){ + public ResponseDto findChatting( @RequestBody @Valid GetChatRoomRequestDto getChatRoomRequestDto){ ChattingDto response = chattingService.getChatRoom(getChatRoomRequestDto); return ResponseDto.response(GET_CHATROOM.getCode(), GET_CHATROOM.getMessage(), response); } diff --git a/src/main/java/com/leets/X/domain/chat/dto/request/GetChatRoomRequestDto.java b/src/main/java/com/leets/X/domain/chat/dto/request/GetChatRoomRequestDto.java index 4424493..e408ae4 100644 --- a/src/main/java/com/leets/X/domain/chat/dto/request/GetChatRoomRequestDto.java +++ b/src/main/java/com/leets/X/domain/chat/dto/request/GetChatRoomRequestDto.java @@ -1,10 +1,12 @@ package com.leets.X.domain.chat.dto.request; +import jakarta.validation.constraints.NotNull; + public record GetChatRoomRequestDto( - Long roomId, - int size, - int page + @NotNull Long roomId, + @NotNull Integer size, + @NotNull Integer page ){ } From 3f81c885ed3c666ec730010f7889983932422d97 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Mon, 4 Nov 2024 20:32:44 +0900 Subject: [PATCH 051/123] =?UTF-8?q?fix:=20@NotNull=20@Valid=20=EC=9C=A0?= =?UTF-8?q?=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../X/domain/chat/controller/ChatRoomController.java | 11 +++++------ .../X/domain/chat/controller/ChattingController.java | 3 ++- .../chat/dto/request/ChatRoomCheckRequstDto.java | 6 ++++-- .../chat/dto/request/FindChatRoomRequestDto.java | 6 ++++-- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java b/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java index cffb25e..24c7394 100644 --- a/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java +++ b/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java @@ -1,17 +1,16 @@ package com.leets.X.domain.chat.controller; - import com.leets.X.domain.chat.dto.request.ChatRoomCheckRequstDto; import com.leets.X.domain.chat.dto.request.FindChatRoomRequestDto; import com.leets.X.domain.chat.dto.response.ChatRoomResponseDto; import com.leets.X.domain.chat.service.ChatRoomService; import com.leets.X.global.common.response.ResponseDto; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; - import static com.leets.X.domain.chat.controller.ResponseMessage.*; @Slf4j @@ -23,7 +22,7 @@ public class ChatRoomController { private final ChatRoomService chatRoomService; @PostMapping - public ResponseDto createChatRoom(@RequestBody FindChatRoomRequestDto findChatRoomRequestDto){ + public ResponseDto createChatRoom(@RequestBody @Valid FindChatRoomRequestDto findChatRoomRequestDto){ ChatRoomResponseDto response = chatRoomService.saveChatRoom(findChatRoomRequestDto); return ResponseDto.response(CHATROOM_CREATE_SUCCESS.getCode(), CHATROOM_CREATE_SUCCESS.getMessage(), response); } @@ -32,7 +31,7 @@ public ResponseDto createChatRoom(@RequestBody FindChatRoom // user1Id와 user2Id의 채팅방이 있는 지 조회 @GetMapping("/users") - public ResponseDto existChatRoom(@RequestBody ChatRoomCheckRequstDto checkDto){ + public ResponseDto existChatRoom(@RequestBody @Valid ChatRoomCheckRequstDto checkDto){ ChatRoomResponseDto response = chatRoomService.findUser1User2ChatRoom(checkDto); return ResponseDto.response(GET_ROOMID.getCode(), GET_ROOMID.getMessage(), response); @@ -40,7 +39,7 @@ public ResponseDto existChatRoom(@RequestBody ChatRoomCheck @PostMapping("/test") // addListener 테스트 용 - public void addListener(@RequestParam Long roomId) { + public void addListener(@RequestParam @NotNull Long roomId) { chatRoomService.addListener(roomId); log.info("addListener"); } diff --git a/src/main/java/com/leets/X/domain/chat/controller/ChattingController.java b/src/main/java/com/leets/X/domain/chat/controller/ChattingController.java index 13225fa..6e233ea 100644 --- a/src/main/java/com/leets/X/domain/chat/controller/ChattingController.java +++ b/src/main/java/com/leets/X/domain/chat/controller/ChattingController.java @@ -6,6 +6,7 @@ import com.leets.X.domain.chat.service.ChattingService; import com.leets.X.global.common.response.ResponseDto; import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; @@ -30,7 +31,7 @@ public ResponseDto findChatting( @RequestBody @Valid GetChatRoomReq @GetMapping("/chattingList") - public ResponseDto> findChattingList(@RequestParam Long userId){ + public ResponseDto> findChattingList(@RequestParam @NotNull Long userId){ List response = chattingService.getChattingList(userId); return ResponseDto.response(GET_CHATTING_LIST.getCode(), GET_CHATTING_LIST.getMessage(), response); } diff --git a/src/main/java/com/leets/X/domain/chat/dto/request/ChatRoomCheckRequstDto.java b/src/main/java/com/leets/X/domain/chat/dto/request/ChatRoomCheckRequstDto.java index 4f3e806..0a61626 100644 --- a/src/main/java/com/leets/X/domain/chat/dto/request/ChatRoomCheckRequstDto.java +++ b/src/main/java/com/leets/X/domain/chat/dto/request/ChatRoomCheckRequstDto.java @@ -1,9 +1,11 @@ package com.leets.X.domain.chat.dto.request; +import jakarta.validation.constraints.NotNull; + public record ChatRoomCheckRequstDto( - Long user1Id, - Long user2Id + @NotNull Long user1Id, + @NotNull Long user2Id ) { } diff --git a/src/main/java/com/leets/X/domain/chat/dto/request/FindChatRoomRequestDto.java b/src/main/java/com/leets/X/domain/chat/dto/request/FindChatRoomRequestDto.java index 202ccd8..a984c93 100644 --- a/src/main/java/com/leets/X/domain/chat/dto/request/FindChatRoomRequestDto.java +++ b/src/main/java/com/leets/X/domain/chat/dto/request/FindChatRoomRequestDto.java @@ -1,7 +1,9 @@ package com.leets.X.domain.chat.dto.request; +import jakarta.validation.constraints.NotNull; + public record FindChatRoomRequestDto( - Long user1Id, - Long user2Id + @NotNull Long user1Id, + @NotNull Long user2Id ){} From 5723a33f075846089d5cb48cc19c694b7dcdeff4 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Mon, 4 Nov 2024 20:36:28 +0900 Subject: [PATCH 052/123] =?UTF-8?q?fix:=20ChatRoomRepository=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EB=AA=85=20=EC=9E=AC=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/leets/X/domain/chat/repository/ChatRoomRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/leets/X/domain/chat/repository/ChatRoomRepository.java b/src/main/java/com/leets/X/domain/chat/repository/ChatRoomRepository.java index 609431d..f33bfd0 100644 --- a/src/main/java/com/leets/X/domain/chat/repository/ChatRoomRepository.java +++ b/src/main/java/com/leets/X/domain/chat/repository/ChatRoomRepository.java @@ -40,6 +40,6 @@ public interface ChatRoomRepository extends JpaRepository { "JOIN FETCH c.user1 " + "JOIN FETCH c.user2 " + "WHERE c.user1.id = :userId OR c.user2.id = :userId") - Optional> findRoomIdByUserId(Long userId); + Optional> findRoomsByUserId(Long userId); } From 6c4abd80d42136bbae14cc7202175b4efb95d6ca Mon Sep 17 00:00:00 2001 From: koreaioi Date: Mon, 4 Nov 2024 20:36:59 +0900 Subject: [PATCH 053/123] =?UTF-8?q?fix:=20ChatRoomRepository=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EB=AA=85=20=EC=9E=AC=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/leets/X/domain/chat/service/ChattingService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/leets/X/domain/chat/service/ChattingService.java b/src/main/java/com/leets/X/domain/chat/service/ChattingService.java index 3481744..6202028 100644 --- a/src/main/java/com/leets/X/domain/chat/service/ChattingService.java +++ b/src/main/java/com/leets/X/domain/chat/service/ChattingService.java @@ -42,7 +42,7 @@ public ChattingDto getChatRoom(GetChatRoomRequestDto getChatRoomRequestDto) { } public List getChattingList(Long userId) { // 추후 JWT 파싱으로 받아내기. - List chatRooms = chatRoomRepository.findRoomIdByUserId(userId) + List chatRooms = chatRoomRepository.findRoomsByUserId(userId) .orElseThrow(NotFoundChatRoomException::new); return chatRooms.stream() From 49efb96066a6ffed8e060edc15a5b157a274c3b4 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Mon, 4 Nov 2024 20:37:17 +0900 Subject: [PATCH 054/123] =?UTF-8?q?fix:=20=EC=B1=84=ED=8C=85=EB=B0=A9=20?= =?UTF-8?q?=EC=97=86=EC=9D=84=20=EC=8B=9C=20=EC=98=88=EC=99=B8=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/leets/X/domain/chat/service/ChatRoomService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java b/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java index 6b000f2..f9fd513 100644 --- a/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java +++ b/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java @@ -4,6 +4,7 @@ import com.leets.X.domain.chat.dto.request.FindChatRoomRequestDto; import com.leets.X.domain.chat.dto.response.*; import com.leets.X.domain.chat.entity.ChatRoom; +import com.leets.X.domain.chat.exception.NotFoundChatRoomException; import com.leets.X.domain.chat.redis.RedisListener; import com.leets.X.domain.chat.repository.ChatRoomRepository; import com.leets.X.domain.user.domain.User; @@ -46,7 +47,8 @@ public ChatRoomResponseDto saveChatRoom(FindChatRoomRequestDto findChatRoomReque public ChatRoomResponseDto findUser1User2ChatRoom(ChatRoomCheckRequstDto checkDto) { - Long result = chatRoomRepository.findRoomIdByUserIds(checkDto.user1Id(), checkDto.user2Id()).orElse(-1L); + Long result = chatRoomRepository.findRoomIdByUserIds(checkDto.user1Id(), checkDto.user2Id()) + .orElseThrow(NotFoundChatRoomException::new); return new ChatRoomResponseDto(result); } From 9361eba9cb8a677885465aeb5bafc94cfbb83783 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Mon, 4 Nov 2024 20:38:37 +0900 Subject: [PATCH 055/123] =?UTF-8?q?fix:=20permitAll()=20=EA=B2=BD=EB=A1=9C?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/leets/X/global/config/SecurityConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/leets/X/global/config/SecurityConfig.java b/src/main/java/com/leets/X/global/config/SecurityConfig.java index fdb8587..38c70a4 100644 --- a/src/main/java/com/leets/X/global/config/SecurityConfig.java +++ b/src/main/java/com/leets/X/global/config/SecurityConfig.java @@ -50,8 +50,8 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { authorize -> authorize .requestMatchers("/v3/api-docs", "/v3/api-docs/**", "/swagger-ui.html", "/swagger-ui/**", "/swagger/**").permitAll() - .requestMatchers("/api/v1/users/login", "/api/v1/chatRoom").permitAll() - .requestMatchers("/api/v1/chatRoom/**", "/ws","/ws/**").permitAll() + .requestMatchers("/api/v1/users/login").permitAll() + .requestMatchers("/ws","/ws/**").permitAll() .anyRequest().authenticated() ) From d7d4464a79341108abfe31b23c79cf4b49086f44 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Wed, 6 Nov 2024 01:33:38 +0900 Subject: [PATCH 056/123] =?UTF-8?q?refactor:=20validate,=20generateChatRoo?= =?UTF-8?q?mMessages=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/chat/service/ChattingService.java | 39 ++++++++++++------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/leets/X/domain/chat/service/ChattingService.java b/src/main/java/com/leets/X/domain/chat/service/ChattingService.java index 6202028..b3a45a9 100644 --- a/src/main/java/com/leets/X/domain/chat/service/ChattingService.java +++ b/src/main/java/com/leets/X/domain/chat/service/ChattingService.java @@ -26,35 +26,46 @@ public class ChattingService { private final ChatMessageRepository chatMessageRepository; public ChattingDto getChatRoom(GetChatRoomRequestDto getChatRoomRequestDto) { - ChatRoom findRoom = chatRoomRepository.findById(getChatRoomRequestDto.roomId()) - .orElseThrow(NotFoundChatRoomException::new); + ChatRoom findRoom = validateChatRoom(getChatRoomRequestDto); User user1 = findRoom.getUser1(); User user2 = findRoom.getUser2(); - List chatMessageList = chatMessageRepository.findByRoomIdOrderByCreatedAtDesc( - getChatRoomRequestDto.roomId(), PageRequest.of(getChatRoomRequestDto.page()- 1, getChatRoomRequestDto.size())) - .getContent() - .stream() - .map(ChatMessageResponseDto::fromEntity) - .collect(Collectors.toList()); - + List chatMessageList = generateChatRoomMessages(getChatRoomRequestDto); return new ChattingDto(user1.getId(), user2.getId(), user1.getCustomId(), user2.getCustomId(), chatMessageList); } + public List getChattingList(Long userId) { // 추후 JWT 파싱으로 받아내기. - List chatRooms = chatRoomRepository.findRoomsByUserId(userId) - .orElseThrow(NotFoundChatRoomException::new); + List chatRooms = validateChatRommList(userId); return chatRooms.stream() .map(chatRoom -> { ChatMessage latestMessage = chatMessageRepository.findTopByRoomIdOrderByCreatedAtDesc(chatRoom.getId()).orElse(null); LatestMessageDto latestMessageDto = (latestMessage != null) - ? LatestMessageDto.of(latestMessage) - : new LatestMessageDto("", null); - + ? LatestMessageDto.of(latestMessage) : new LatestMessageDto("", null); return ChattingListResponseDto.of(chatRoom, latestMessageDto); }) .collect(Collectors.toList()); } + private List generateChatRoomMessages(GetChatRoomRequestDto getChatRoomRequestDto) { + return chatMessageRepository.findByRoomIdOrderByCreatedAtDesc( + getChatRoomRequestDto.roomId(), PageRequest.of(getChatRoomRequestDto.page()- 1, getChatRoomRequestDto.size())) + .getContent() + .stream() + .map(ChatMessageResponseDto::fromEntity) + .collect(Collectors.toList()); + } + + + private ChatRoom validateChatRoom(GetChatRoomRequestDto getChatRoomRequestDto) { + return chatRoomRepository.findById(getChatRoomRequestDto.roomId()) + .orElseThrow(NotFoundChatRoomException::new); + } + + private List validateChatRommList(Long userId) { + return chatRoomRepository.findRoomsByUserId(userId) + .orElseThrow(NotFoundChatRoomException::new); + } + } From aab03c4fba277c566fa006ccb6b77f2f9ca61cab Mon Sep 17 00:00:00 2001 From: koreaioi Date: Wed, 6 Nov 2024 17:47:55 +0900 Subject: [PATCH 057/123] =?UTF-8?q?fix:=20GetMapping=20=EC=97=AC=EB=9F=AC?= =?UTF-8?q?=20=EC=9D=B8=EC=9E=90=20@PathVariable=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/chat/controller/ChatRoomController.java | 6 +++--- .../domain/chat/controller/ChattingController.java | 10 +++++----- .../X/domain/chat/service/ChatRoomService.java | 4 ++-- .../X/domain/chat/service/ChattingService.java | 14 +++++++------- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java b/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java index 24c7394..e5cc777 100644 --- a/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java +++ b/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java @@ -30,9 +30,9 @@ public ResponseDto createChatRoom(@RequestBody @Valid FindC // user1Id와 user2Id의 채팅방이 있는 지 조회 - @GetMapping("/users") - public ResponseDto existChatRoom(@RequestBody @Valid ChatRoomCheckRequstDto checkDto){ - ChatRoomResponseDto response = chatRoomService.findUser1User2ChatRoom(checkDto); + @GetMapping("/{user1Id}/{user2Id}") + public ResponseDto existChatRoom(@PathVariable Long user1Id, @PathVariable Long user2Id){ + ChatRoomResponseDto response = chatRoomService.findUser1User2ChatRoom(user1Id , user2Id); return ResponseDto.response(GET_ROOMID.getCode(), GET_ROOMID.getMessage(), response); } diff --git a/src/main/java/com/leets/X/domain/chat/controller/ChattingController.java b/src/main/java/com/leets/X/domain/chat/controller/ChattingController.java index 6e233ea..6132be4 100644 --- a/src/main/java/com/leets/X/domain/chat/controller/ChattingController.java +++ b/src/main/java/com/leets/X/domain/chat/controller/ChattingController.java @@ -23,15 +23,15 @@ public class ChattingController { private final ChattingService chattingService; // 채팅방 하나를 조회해준다. (대화 내역을 돌려준다는 의미) - @GetMapping("/chatting") - public ResponseDto findChatting( @RequestBody @Valid GetChatRoomRequestDto getChatRoomRequestDto){ - ChattingDto response = chattingService.getChatRoom(getChatRoomRequestDto); + @GetMapping("/chatting/{roomId}/{page}/{size}") + public ResponseDto findChatting(@PathVariable Long roomId, @PathVariable Integer page, @PathVariable Integer size) { + ChattingDto response = chattingService.getChatRoom(roomId, page, size); return ResponseDto.response(GET_CHATROOM.getCode(), GET_CHATROOM.getMessage(), response); } - @GetMapping("/chattingList") - public ResponseDto> findChattingList(@RequestParam @NotNull Long userId){ + @GetMapping("/chattingList/{userId}") + public ResponseDto> findChattingList(@PathVariable Long userId){ List response = chattingService.getChattingList(userId); return ResponseDto.response(GET_CHATTING_LIST.getCode(), GET_CHATTING_LIST.getMessage(), response); } diff --git a/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java b/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java index f9fd513..7fde909 100644 --- a/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java +++ b/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java @@ -46,8 +46,8 @@ public ChatRoomResponseDto saveChatRoom(FindChatRoomRequestDto findChatRoomReque - public ChatRoomResponseDto findUser1User2ChatRoom(ChatRoomCheckRequstDto checkDto) { - Long result = chatRoomRepository.findRoomIdByUserIds(checkDto.user1Id(), checkDto.user2Id()) + public ChatRoomResponseDto findUser1User2ChatRoom(Long user1Id , Long user2Id) { + Long result = chatRoomRepository.findRoomIdByUserIds(user1Id , user2Id) .orElseThrow(NotFoundChatRoomException::new); return new ChatRoomResponseDto(result); } diff --git a/src/main/java/com/leets/X/domain/chat/service/ChattingService.java b/src/main/java/com/leets/X/domain/chat/service/ChattingService.java index b3a45a9..f30c49e 100644 --- a/src/main/java/com/leets/X/domain/chat/service/ChattingService.java +++ b/src/main/java/com/leets/X/domain/chat/service/ChattingService.java @@ -25,12 +25,12 @@ public class ChattingService { private final ChatRoomRepository chatRoomRepository; private final ChatMessageRepository chatMessageRepository; - public ChattingDto getChatRoom(GetChatRoomRequestDto getChatRoomRequestDto) { - ChatRoom findRoom = validateChatRoom(getChatRoomRequestDto); + public ChattingDto getChatRoom(Long roomId, Integer page, Integer size) { + ChatRoom findRoom = validateChatRoom(roomId); User user1 = findRoom.getUser1(); User user2 = findRoom.getUser2(); - List chatMessageList = generateChatRoomMessages(getChatRoomRequestDto); + List chatMessageList = generateChatRoomMessages(roomId, page, size); return new ChattingDto(user1.getId(), user2.getId(), user1.getCustomId(), user2.getCustomId(), chatMessageList); } @@ -48,9 +48,9 @@ public List getChattingList(Long userId) { // 추후 JW .collect(Collectors.toList()); } - private List generateChatRoomMessages(GetChatRoomRequestDto getChatRoomRequestDto) { + private List generateChatRoomMessages(Long roomId, Integer page, Integer size) { return chatMessageRepository.findByRoomIdOrderByCreatedAtDesc( - getChatRoomRequestDto.roomId(), PageRequest.of(getChatRoomRequestDto.page()- 1, getChatRoomRequestDto.size())) + roomId, PageRequest.of(page- 1, size)) .getContent() .stream() .map(ChatMessageResponseDto::fromEntity) @@ -58,8 +58,8 @@ private List generateChatRoomMessages(GetChatRoomRequest } - private ChatRoom validateChatRoom(GetChatRoomRequestDto getChatRoomRequestDto) { - return chatRoomRepository.findById(getChatRoomRequestDto.roomId()) + private ChatRoom validateChatRoom(Long roomId) { + return chatRoomRepository.findById(roomId) .orElseThrow(NotFoundChatRoomException::new); } From ff53bca839c10e48e06a3ceefcea2c0a108c36c9 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Thu, 7 Nov 2024 19:29:29 +0900 Subject: [PATCH 058/123] =?UTF-8?q?refactor:=20UserService=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EC=97=AC=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/controller/ChatRoomController.java | 14 -------- .../domain/chat/service/ChatRoomService.java | 36 ++++--------------- 2 files changed, 7 insertions(+), 43 deletions(-) diff --git a/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java b/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java index e5cc777..2d750a3 100644 --- a/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java +++ b/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java @@ -36,18 +36,4 @@ public ResponseDto existChatRoom(@PathVariable Long user1Id return ResponseDto.response(GET_ROOMID.getCode(), GET_ROOMID.getMessage(), response); } - - - @PostMapping("/test") // addListener 테스트 용 - public void addListener(@RequestParam @NotNull Long roomId) { - chatRoomService.addListener(roomId); - log.info("addListener"); - } - -// @GetMapping("/test1") // addListener 테스트 용 -// public void test1(@RequestParam Long roomId) { -// chatRoomService.hi(roomId); -// log.info("test1"); -// } - } diff --git a/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java b/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java index 7fde909..3c6832e 100644 --- a/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java +++ b/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java @@ -10,6 +10,7 @@ import com.leets.X.domain.user.domain.User; import com.leets.X.domain.user.exception.UserNotFoundException; import com.leets.X.domain.user.repository.UserRepository; +import com.leets.X.domain.user.service.UserService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -22,26 +23,15 @@ public class ChatRoomService { private final RedisListener redisMessageListener; private final ChatRoomRepository chatRoomRepository; - private final UserRepository userRepository; + private final UserService userService; public ChatRoomResponseDto saveChatRoom(FindChatRoomRequestDto findChatRoomRequestDto) { + User user1 = userService.find(findChatRoomRequestDto.user1Id()); + User user2 = userService.find(findChatRoomRequestDto.user2Id()); - // 이 부분은 UserService에 비지니스 로직을 추가 해달라고 한 뒤 or 추가하고 UserService 단에서 접근하는게 나을거 같다. - Optional user1 = userRepository.findById(findChatRoomRequestDto.user1Id()); - Optional user2 = userRepository.findById(findChatRoomRequestDto.user2Id()); - - if (user1.isPresent() && user2.isPresent()) { - ChatRoom savedRoom = chatRoomRepository.save(ChatRoom.of(user1.get(), user2.get())); // 채팅방 RDB에 저장 - redisMessageListener.adaptMessageListener(savedRoom.getId()); // 리스너 등록 - - return new ChatRoomResponseDto(savedRoom.getId()); - } else { - // 사용자 없음 예외 발생 - //int code = (user2.isPresent()) ? USER1_NOT_FOUND.getCode() : USER2_NOT_FOUND.getCode(); - //String message = (user2.isPresent()) ? USER1_NOT_FOUND.getMessage() : USER2_NOT_FOUND.getMessage(); - // UserNotFoundException 예외 발생 - throw new UserNotFoundException(); - } + ChatRoom savedRoom = chatRoomRepository.save(ChatRoom.of(user1, user2)); // 채팅방 RDB에 저장 + redisMessageListener.adaptMessageListener(savedRoom.getId()); // 리스너 등록 + return new ChatRoomResponseDto(savedRoom.getId()); } @@ -51,16 +41,4 @@ public ChatRoomResponseDto findUser1User2ChatRoom(Long user1Id , Long user2Id) { .orElseThrow(NotFoundChatRoomException::new); return new ChatRoomResponseDto(result); } - - // 테스트를 위해서 만들어둠. 추후 삭제 - public void addListener(Long roomId) { - redisMessageListener.adaptMessageListener(roomId); // 리스너 등록 - } - - -// public void hi(Long roomId){ -// ChatMessage chatMessage = chatMessageRepository.findTopByRoomIdOrderByCreatedAtDesc(roomId).get(); -// System.out.println(chatMessage.getRoomId() + " " + chatMessage.getCreatedAt() + " " + chatMessage.getContent()); -// } - } From bcf0037e637479adb3a16a5284bf7e071cfd75da Mon Sep 17 00:00:00 2001 From: hyxklee Date: Thu, 7 Nov 2024 19:51:49 +0900 Subject: [PATCH 059/123] =?UTF-8?q?feat:=20=EC=A0=95=EC=A0=81=20=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/leets/X/domain/image/domain/Image.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/com/leets/X/domain/image/domain/Image.java b/src/main/java/com/leets/X/domain/image/domain/Image.java index 4ad1eda..ddd0e21 100644 --- a/src/main/java/com/leets/X/domain/image/domain/Image.java +++ b/src/main/java/com/leets/X/domain/image/domain/Image.java @@ -1,5 +1,6 @@ package com.leets.X.domain.image.domain; +import com.leets.X.domain.image.dto.request.ImageSaveRequest; import com.leets.X.domain.post.domain.Post; import jakarta.persistence.*; import lombok.*; @@ -24,4 +25,11 @@ public class Image { @JoinColumn(name = "post_Id") private Post post; + public static Image from(ImageSaveRequest dto) { + return Image.builder() + .name(dto.name()) + .url(dto.url()) + .build(); + } + } From c10584cb9744bbc88856d844371f34a698bfa5a0 Mon Sep 17 00:00:00 2001 From: hyxklee Date: Thu, 7 Nov 2024 19:51:56 +0900 Subject: [PATCH 060/123] =?UTF-8?q?feat:=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=EC=86=8C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets/X/domain/image/repository/ImageRepository.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/image/repository/ImageRepository.java diff --git a/src/main/java/com/leets/X/domain/image/repository/ImageRepository.java b/src/main/java/com/leets/X/domain/image/repository/ImageRepository.java new file mode 100644 index 0000000..7af6c53 --- /dev/null +++ b/src/main/java/com/leets/X/domain/image/repository/ImageRepository.java @@ -0,0 +1,7 @@ +package com.leets.X.domain.image.repository; + +import com.leets.X.domain.image.domain.Image; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ImageRepository extends JpaRepository { +} From e80ac52f97a9d494c980c2026da913bf15e80e3e Mon Sep 17 00:00:00 2001 From: hyxklee Date: Thu, 7 Nov 2024 19:52:13 +0900 Subject: [PATCH 061/123] =?UTF-8?q?feat:=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EB=B0=98=ED=99=98=EC=9D=84=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20dto=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../X/domain/image/dto/response/ImageResponse.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/image/dto/response/ImageResponse.java diff --git a/src/main/java/com/leets/X/domain/image/dto/response/ImageResponse.java b/src/main/java/com/leets/X/domain/image/dto/response/ImageResponse.java new file mode 100644 index 0000000..edb120d --- /dev/null +++ b/src/main/java/com/leets/X/domain/image/dto/response/ImageResponse.java @@ -0,0 +1,13 @@ +package com.leets.X.domain.image.dto.response; + +import com.leets.X.domain.image.domain.Image; + +public record ImageResponse( + Long id, + String name, + String url +) { + public static ImageResponse from(Image image) { + return new ImageResponse(image.getId(), image.getName(), image.getUrl()); + } +} From 43a7a12fc2a5fca2ca2c5e40a0d21d6e18d3ce8a Mon Sep 17 00:00:00 2001 From: hyxklee Date: Thu, 7 Nov 2024 19:52:22 +0900 Subject: [PATCH 062/123] =?UTF-8?q?feat:=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=EC=9D=84=20=EC=9C=84=ED=95=9C=20dto=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../X/domain/image/dto/request/ImageSaveRequest.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/image/dto/request/ImageSaveRequest.java diff --git a/src/main/java/com/leets/X/domain/image/dto/request/ImageSaveRequest.java b/src/main/java/com/leets/X/domain/image/dto/request/ImageSaveRequest.java new file mode 100644 index 0000000..25cf651 --- /dev/null +++ b/src/main/java/com/leets/X/domain/image/dto/request/ImageSaveRequest.java @@ -0,0 +1,11 @@ +package com.leets.X.domain.image.dto.request; + +public record ImageSaveRequest( + String name, + String url +) { + public static ImageSaveRequest of(String name, String url, Integer order) { + return new ImageSaveRequest(name, url); + } +} + From 5fed2ca8dbaf027266e31b57f5103ebc0bcc334a Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Fri, 8 Nov 2024 01:28:26 +0900 Subject: [PATCH 063/123] =?UTF-8?q?Feat:=20=EB=8B=B5=EA=B8=80=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets/X/domain/post/controller/PostController.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/com/leets/X/domain/post/controller/PostController.java b/src/main/java/com/leets/X/domain/post/controller/PostController.java index 365481c..6be0a67 100644 --- a/src/main/java/com/leets/X/domain/post/controller/PostController.java +++ b/src/main/java/com/leets/X/domain/post/controller/PostController.java @@ -63,6 +63,14 @@ public ResponseDto addLike(@PathVariable Long postId, @AuthenticationPri return ResponseDto.response(ResponseMessage.ADD_LIKE_SUCCESS.getCode(), responseMessage); } + @PostMapping("/{postId}/reply") + @Operation(summary = "답글 생성") + public ResponseDto createReply(@PathVariable Long postId, @RequestBody PostRequestDTO postRequestDTO, @AuthenticationPrincipal String email) { + // 답글 생성 서비스 호출 (부모 ID를 직접 전달) + PostResponseDto postResponseDto = postService.createReply(postId, postRequestDTO, email); + return ResponseDto.response(ResponseMessage.REPLY_SUCCESS.getCode(), ResponseMessage.REPLY_SUCCESS.getMessage(), postResponseDto); + } + @DeleteMapping("/{postId}") @Operation(summary = "게시물 삭제") From 02075a2a76ef9a9a8f796a53b760f15ed59bd609 Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Fri, 8 Nov 2024 01:30:14 +0900 Subject: [PATCH 064/123] =?UTF-8?q?Feat:=20=EB=8B=B5=EA=B8=80=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EC=84=B1=EA=B3=B5=20=EC=9D=91=EB=8B=B5=20=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/leets/X/domain/post/controller/ResponseMessage.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/leets/X/domain/post/controller/ResponseMessage.java b/src/main/java/com/leets/X/domain/post/controller/ResponseMessage.java index 74fcfb1..dbcafe2 100644 --- a/src/main/java/com/leets/X/domain/post/controller/ResponseMessage.java +++ b/src/main/java/com/leets/X/domain/post/controller/ResponseMessage.java @@ -13,7 +13,8 @@ public enum ResponseMessage { GET_LATEST_POST_SUCCESS(200, "최신 게시물 조회에 성공했습니다."), ADD_LIKE_SUCCESS(201, "좋아요가 추가되었습니다."), POST_DELETED_SUCCESS(200, "게시물이 성공적으로 삭제되었습니다."), - LIKE_CANCEL_SUCCESS(200, "좋아요가 성공적으로 취소되었습니다."); + LIKE_CANCEL_SUCCESS(200, "좋아요가 성공적으로 취소되었습니다."), + REPLY_SUCCESS(201, "답글이 생성되었습니다."); private final int code; private final String message; From bc7578ca32bc2288315362ca19abe96bb704ed60 Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Fri, 8 Nov 2024 01:32:43 +0900 Subject: [PATCH 065/123] =?UTF-8?q?Feat=20:=20parent=20=ED=95=84=EB=93=9C?= =?UTF-8?q?=EC=99=80=20=EB=8B=B5=EA=B8=80=EB=93=A4=EC=9D=84=20=EB=8B=B4?= =?UTF-8?q?=EB=8A=94=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/leets/X/domain/post/domain/Post.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/com/leets/X/domain/post/domain/Post.java b/src/main/java/com/leets/X/domain/post/domain/Post.java index d882a57..90e21d5 100644 --- a/src/main/java/com/leets/X/domain/post/domain/Post.java +++ b/src/main/java/com/leets/X/domain/post/domain/Post.java @@ -29,6 +29,14 @@ public class Post extends BaseTimeEntity { @JoinColumn(name = "user_id") private User user; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "parent_id") + private Post parent; + + @OneToMany(mappedBy = "parent", cascade = CascadeType.REMOVE, orphanRemoval = true) + private List replies = new ArrayList<>(); //답글 리스트 + + @OneToMany(mappedBy = "post", cascade = CascadeType.REMOVE, orphanRemoval = true) private List likes = new ArrayList<>(); @@ -90,5 +98,7 @@ public static Post create(User user, String content) { .images(new ArrayList<>()) // 빈 리스트로 초기화 .build(); } + + } From b5205bd400bf2effdf6ffb8b044fe54d11e6f450 Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Fri, 8 Nov 2024 01:33:51 +0900 Subject: [PATCH 066/123] =?UTF-8?q?Feat:=20Dto=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=EB=A1=9C=20replies=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/dto/response/PostResponseDto.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java b/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java index 4d31e0f..6a79a18 100644 --- a/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java +++ b/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java @@ -13,6 +13,7 @@ import java.time.LocalDateTime; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; @Getter @@ -27,6 +28,7 @@ public class PostResponseDto { private PostUserResponse user; // 작성자 정보 private List images; // 관련 이미지 리스트 private Long likeCount; // 좋아요 개수 추가 + private List replies; // 답글 추가 public static PostResponseDto from(Post post) { return new PostResponseDto( @@ -37,19 +39,30 @@ public static PostResponseDto from(Post post) { post.getCreatedAt(), convertUser(post.getUser()), convertImagesToDtoList(post), - post.getLikesCount() // 좋아요 개수 추가 + post.getLikesCount(), // 좋아요 개수 추가 + convertRepliesToDtoList(post.getReplies()) ); } + private static List convertRepliesToDtoList(List replies) { + return replies != null ? replies.stream() + .map(PostResponseDto::from) // 각 답글을 재귀적으로 변환 + .collect(Collectors.toList()) : Collections.emptyList(); + } + private static PostUserResponse convertUser(User user) { return user != null ? PostUserResponse.from(user) : null; } + //이미지 널체킹 조건 추가 private static List convertImagesToDtoList(Post post) { + if (post.getImages() == null) { + return Collections.emptyList(); // 이미지 리스트가 null인 경우 빈 리스트 반환 + } return post.getImages().stream() .map(ImageResponseDto::from) - .toList(); + .collect(Collectors.toList()); } From f35ff13b66ce5022743ab9c80fb48b369100027d Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Fri, 8 Nov 2024 01:34:49 +0900 Subject: [PATCH 067/123] =?UTF-8?q?Feat=20:=20=EB=8B=B5=EA=B8=80=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../X/domain/post/service/PostService.java | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/leets/X/domain/post/service/PostService.java b/src/main/java/com/leets/X/domain/post/service/PostService.java index f3b892d..91bf653 100644 --- a/src/main/java/com/leets/X/domain/post/service/PostService.java +++ b/src/main/java/com/leets/X/domain/post/service/PostService.java @@ -45,7 +45,6 @@ public PostResponseDto getPostResponse(Long id) { } // 좋아요 수로 정렬한 게시물 조회 (직접 구현) - public List getPostsSortedByLikes() { List posts = postRepository.findAll(); // 모든 게시물 조회 @@ -108,6 +107,23 @@ public String addLike(Long postId, String email) { return "좋아요가 추가되었습니다. 현재 좋아요 수: " + post.getLikesCount(); } + // 답글 생성 + @Transactional + public PostResponseDto createReply(Long parentId, PostRequestDTO postRequestDTO, String email) { + // 이메일을 통해 사용자 조회 + User user = userService.find(email); + + // 부모 글 조회 + Post parentPost = findPost(parentId); + + // 답글 생성 + Post reply = createPost(postRequestDTO, user, parentPost); // 메서드 호출 + + // 답글 저장 후 DTO로 변환하여 반환 + return PostResponseDto.from(postRepository.save(reply)); + } + + // 게시물 삭제 @Transactional public String deletePost(Long postId, String email) { @@ -157,4 +173,16 @@ public PostUserResponse findUser(String email) { User user = userService.find(email); return PostUserResponse.from(user); // PostUserResponse로 변환하여 반환 } + + private Post createPost(PostRequestDTO postRequestDTO, User user, Post parentPost) { + return Post.builder() + .user(user) + .content(postRequestDTO.content()) // DTO에서 내용 가져오기 + .views(0) + .likeCount(0L) + .isDeleted(IsDeleted.ACTIVE) + .parent(parentPost) // 부모 글 설정 + .build(); + } + } From df893d2b5715919892b9d247069f980cb54aa5a6 Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Fri, 8 Nov 2024 02:36:58 +0900 Subject: [PATCH 068/123] =?UTF-8?q?Refactor=20:=20dto=20=ED=83=80=EC=9E=85?= =?UTF-8?q?=20=ED=86=B5=EC=9D=BC=20class=20-->=20record?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/dto/response/CommentResponseDto.java | 14 ++---- .../post/dto/response/ImageResponseDto.java | 14 ++---- .../post/dto/response/PostResponseDto.java | 48 +++++++------------ .../post/dto/response/PostUserResponse.java | 19 ++------ 4 files changed, 29 insertions(+), 66 deletions(-) diff --git a/src/main/java/com/leets/X/domain/post/dto/response/CommentResponseDto.java b/src/main/java/com/leets/X/domain/post/dto/response/CommentResponseDto.java index e653121..5a68b32 100644 --- a/src/main/java/com/leets/X/domain/post/dto/response/CommentResponseDto.java +++ b/src/main/java/com/leets/X/domain/post/dto/response/CommentResponseDto.java @@ -1,17 +1,11 @@ package com.leets.X.domain.post.dto.response; import com.leets.X.domain.comment.domain.Comment; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@NoArgsConstructor -@AllArgsConstructor -public class CommentResponseDto { - private Long commentId; - private String content; +public record CommentResponseDto( + Long commentId, + String content +) { public static CommentResponseDto from(Comment comment) { return new CommentResponseDto(comment.getId(), comment.getContent()); } diff --git a/src/main/java/com/leets/X/domain/post/dto/response/ImageResponseDto.java b/src/main/java/com/leets/X/domain/post/dto/response/ImageResponseDto.java index e4b45b5..46d9266 100644 --- a/src/main/java/com/leets/X/domain/post/dto/response/ImageResponseDto.java +++ b/src/main/java/com/leets/X/domain/post/dto/response/ImageResponseDto.java @@ -1,18 +1,12 @@ package com.leets.X.domain.post.dto.response; import com.leets.X.domain.image.domain.Image; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -@Getter -@NoArgsConstructor -@AllArgsConstructor -public class ImageResponseDto { - - private Long imageId; - private String url; +public record ImageResponseDto( + Long imageId, + String url +) { public static ImageResponseDto from(Image image) { return new ImageResponseDto(image.getId(), image.getUrl()); } diff --git a/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java b/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java index 6a79a18..9047216 100644 --- a/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java +++ b/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java @@ -1,14 +1,10 @@ package com.leets.X.domain.post.dto.response; -import com.leets.X.domain.comment.domain.Comment; -import com.leets.X.domain.image.domain.Image; import com.leets.X.domain.post.domain.Post; import com.leets.X.domain.post.domain.enums.IsDeleted; import com.leets.X.domain.user.domain.User; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; + import java.time.LocalDateTime; import java.util.Collections; @@ -16,20 +12,17 @@ import java.util.stream.Collectors; -@Getter -@NoArgsConstructor -@AllArgsConstructor -public class PostResponseDto { - private Long id; - private String content; - private Integer views; - private IsDeleted isDeleted; - private LocalDateTime createdAt; - private PostUserResponse user; // 작성자 정보 - private List images; // 관련 이미지 리스트 - private Long likeCount; // 좋아요 개수 추가 - private List replies; // 답글 추가 - +public record PostResponseDto( + Long id, + String content, + Integer views, + IsDeleted isDeleted, + LocalDateTime createdAt, + PostUserResponse user, + List images, + Long likeCount, + List replies +) { public static PostResponseDto from(Post post) { return new PostResponseDto( post.getId(), @@ -39,15 +32,14 @@ public static PostResponseDto from(Post post) { post.getCreatedAt(), convertUser(post.getUser()), convertImagesToDtoList(post), - post.getLikesCount(), // 좋아요 개수 추가 + post.getLikesCount(), convertRepliesToDtoList(post.getReplies()) ); } - private static List convertRepliesToDtoList(List replies) { return replies != null ? replies.stream() - .map(PostResponseDto::from) // 각 답글을 재귀적으로 변환 + .map(PostResponseDto::from) .collect(Collectors.toList()) : Collections.emptyList(); } @@ -55,17 +47,9 @@ private static PostUserResponse convertUser(User user) { return user != null ? PostUserResponse.from(user) : null; } - //이미지 널체킹 조건 추가 private static List convertImagesToDtoList(Post post) { - if (post.getImages() == null) { - return Collections.emptyList(); // 이미지 리스트가 null인 경우 빈 리스트 반환 - } - return post.getImages().stream() + return post.getImages() != null ? post.getImages().stream() .map(ImageResponseDto::from) - .collect(Collectors.toList()); + .collect(Collectors.toList()) : Collections.emptyList(); } - - } - - diff --git a/src/main/java/com/leets/X/domain/post/dto/response/PostUserResponse.java b/src/main/java/com/leets/X/domain/post/dto/response/PostUserResponse.java index 1e92273..9e303fb 100644 --- a/src/main/java/com/leets/X/domain/post/dto/response/PostUserResponse.java +++ b/src/main/java/com/leets/X/domain/post/dto/response/PostUserResponse.java @@ -1,27 +1,18 @@ package com.leets.X.domain.post.dto.response; - - import com.leets.X.domain.user.domain.User; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -@Getter -@NoArgsConstructor -@AllArgsConstructor -public class PostUserResponse { - - private Long userId; - private String name; - private String customId; +public record PostUserResponse( + Long userId, + String name, + String customId +) { public static PostUserResponse from(User user) { return new PostUserResponse( user.getId(), user.getName(), user.getCustomId() ); - } } From 6471c8d75271ebe7cf6cf6e98dc7748cf7ec8551 Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Fri, 8 Nov 2024 02:37:42 +0900 Subject: [PATCH 069/123] =?UTF-8?q?fix=20:=20Dto=20=ED=83=80=EC=9E=85?= =?UTF-8?q?=EB=B3=80=ED=99=98=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=ED=98=B8=EC=B6=9C=20=EB=B0=A9?= =?UTF-8?q?=EC=8B=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/leets/X/domain/post/service/PostService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/leets/X/domain/post/service/PostService.java b/src/main/java/com/leets/X/domain/post/service/PostService.java index 91bf653..d5f3f6e 100644 --- a/src/main/java/com/leets/X/domain/post/service/PostService.java +++ b/src/main/java/com/leets/X/domain/post/service/PostService.java @@ -65,7 +65,7 @@ public List getLatestPosts() { return posts.stream() .map(PostResponseDto::from) // Post 객체를 PostResponseDto로 변환 .sorted(Comparator.comparingLong(postResponseDto -> - Math.abs(postResponseDto.getCreatedAt().until(now, java.time.temporal.ChronoUnit.SECONDS)))) // 현재 시각과의 차이를 기준으로 정렬 + Math.abs(postResponseDto.createdAt().until(now, java.time.temporal.ChronoUnit.SECONDS)))) // 현재 시각과의 차이를 기준으로 정렬 .collect(Collectors.toList()); } From 3f8197e1ecd8d7fb1d11aea34f92b242142563f0 Mon Sep 17 00:00:00 2001 From: hyxklee Date: Fri, 8 Nov 2024 09:16:50 +0900 Subject: [PATCH 070/123] =?UTF-8?q?feat:=20S3=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=ED=99=98=EA=B2=BD=EB=B3=80=EC=88=98=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 8b84b45..e894830 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -7,6 +7,13 @@ springdoc: operations-sorter: method tags-sorter: alpha +aws: + s3: + accessKey: ${S3_ACCESS_KEY} + secretKey: ${S3_SECRET_KEY} + bucketName: ${S3_BUCKET} + region: ap-northeast-2 + google: client-id: ${GOOGLE_CLIENT_ID} client-secret: ${GOOGLE_CLIENT_SECRET} From 4f1578135f5af8df77bd2bfc55d2a90c486bff05 Mon Sep 17 00:00:00 2001 From: hyxklee Date: Fri, 8 Nov 2024 09:17:00 +0900 Subject: [PATCH 071/123] =?UTF-8?q?feat:=20S3=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.gradle b/build.gradle index 4b6f2dd..ca320af 100644 --- a/build.gradle +++ b/build.gradle @@ -59,6 +59,8 @@ dependencies { testImplementation 'org.springframework.security:spring-security-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + implementation 'software.amazon.awssdk:s3:2.20.7' + } tasks.named('test') { From a7d7bae2a70c37cbab1f9e2b3759f2251c664e2b Mon Sep 17 00:00:00 2001 From: hyxklee Date: Fri, 8 Nov 2024 09:32:19 +0900 Subject: [PATCH 072/123] =?UTF-8?q?feat:=20=EC=8A=A4=EC=9B=A8=EA=B1=B0=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80,=ED=8C=8C=EC=9D=BC=20=EC=97=85?= =?UTF-8?q?=EB=A1=9C=EB=93=9C=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../swagger/OctetStreamReadMsgConverter.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/main/java/com/leets/X/global/config/swagger/OctetStreamReadMsgConverter.java diff --git a/src/main/java/com/leets/X/global/config/swagger/OctetStreamReadMsgConverter.java b/src/main/java/com/leets/X/global/config/swagger/OctetStreamReadMsgConverter.java new file mode 100644 index 0000000..7e24b2b --- /dev/null +++ b/src/main/java/com/leets/X/global/config/swagger/OctetStreamReadMsgConverter.java @@ -0,0 +1,33 @@ +package com.leets.X.global.config.swagger; + + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter; +import org.springframework.stereotype.Component; + +import java.lang.reflect.Type; + +@Component +public class OctetStreamReadMsgConverter extends AbstractJackson2HttpMessageConverter { + @Autowired + public OctetStreamReadMsgConverter(ObjectMapper objectMapper) { + super(objectMapper, MediaType.APPLICATION_OCTET_STREAM); + } + + @Override + public boolean canWrite(Class clazz, MediaType mediaType) { + return false; + } + + @Override + public boolean canWrite(Type type, Class clazz, MediaType mediaType) { + return false; + } + + @Override + protected boolean canWrite(MediaType mediaType) { + return false; + } +} \ No newline at end of file From aa95cd60f44b32384ba5055ed017f4c367f7daac Mon Sep 17 00:00:00 2001 From: hyxklee Date: Fri, 8 Nov 2024 10:47:12 +0900 Subject: [PATCH 073/123] =?UTF-8?q?feat:=20Image=20=EC=A0=95=EC=A0=81=20?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A6=AC=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/leets/X/domain/image/domain/Image.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/leets/X/domain/image/domain/Image.java b/src/main/java/com/leets/X/domain/image/domain/Image.java index ddd0e21..351daf6 100644 --- a/src/main/java/com/leets/X/domain/image/domain/Image.java +++ b/src/main/java/com/leets/X/domain/image/domain/Image.java @@ -1,7 +1,8 @@ package com.leets.X.domain.image.domain; -import com.leets.X.domain.image.dto.request.ImageSaveRequest; +import com.leets.X.domain.image.dto.request.ImageDto; import com.leets.X.domain.post.domain.Post; +import com.leets.X.global.common.domain.BaseTimeEntity; import jakarta.persistence.*; import lombok.*; @@ -10,7 +11,7 @@ @AllArgsConstructor @Builder @Getter -public class Image { +public class Image extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -21,15 +22,17 @@ public class Image { private String url; - @ManyToOne( fetch = FetchType.LAZY) + @ManyToOne @JoinColumn(name = "post_Id") private Post post; - public static Image from(ImageSaveRequest dto) { + public static Image from(ImageDto dto, Post post) { return Image.builder() .name(dto.name()) .url(dto.url()) + .post(post) .build(); } + } From eb52496f37ff80eb091dff020e43182dc836120d Mon Sep 17 00:00:00 2001 From: hyxklee Date: Fri, 8 Nov 2024 10:47:46 +0900 Subject: [PATCH 074/123] =?UTF-8?q?feat:=20S3client=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20=EC=84=A4=EC=A0=95=20=EB=B0=8F=20=EB=B9=88=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets/X/global/config/S3/S3Config.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/main/java/com/leets/X/global/config/S3/S3Config.java diff --git a/src/main/java/com/leets/X/global/config/S3/S3Config.java b/src/main/java/com/leets/X/global/config/S3/S3Config.java new file mode 100644 index 0000000..8c41fb4 --- /dev/null +++ b/src/main/java/com/leets/X/global/config/S3/S3Config.java @@ -0,0 +1,36 @@ +package com.leets.X.global.config.S3; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.S3Configuration; + +@Configuration +public class S3Config { + + @Value("${aws.s3.accessKey}") + private String accessKey; + + @Value("${aws.s3.secretKey}") + private String secretKey; + + @Value("${aws.s3.region}") + private String region; + + @Bean + public S3Client s3Client() { + AwsBasicCredentials credentials = AwsBasicCredentials.create(accessKey, secretKey); + + return S3Client.builder() + .region(Region.of(region)) + .credentialsProvider(StaticCredentialsProvider.create(credentials)) + .serviceConfiguration(S3Configuration.builder() + .checksumValidationEnabled(true) + .build()) + .build(); + } +} From 35e0dc742acdfab22a18284f15d5f1362cdc0bc6 Mon Sep 17 00:00:00 2001 From: hyxklee Date: Fri, 8 Nov 2024 10:49:58 +0900 Subject: [PATCH 075/123] =?UTF-8?q?refactor:=20=EC=8A=A4=EC=9B=A8=EA=B1=B0?= =?UTF-8?q?=20=EA=B4=80=EB=A0=A8=20=EC=84=A4=EC=A0=95=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20=EB=94=94=EB=A0=89=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/leets/X/global/config/{ => swagger}/SwaggerConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/com/leets/X/global/config/{ => swagger}/SwaggerConfig.java (97%) diff --git a/src/main/java/com/leets/X/global/config/SwaggerConfig.java b/src/main/java/com/leets/X/global/config/swagger/SwaggerConfig.java similarity index 97% rename from src/main/java/com/leets/X/global/config/SwaggerConfig.java rename to src/main/java/com/leets/X/global/config/swagger/SwaggerConfig.java index 4579287..20ac88e 100644 --- a/src/main/java/com/leets/X/global/config/SwaggerConfig.java +++ b/src/main/java/com/leets/X/global/config/swagger/SwaggerConfig.java @@ -1,4 +1,4 @@ -package com.leets.X.global.config; +package com.leets.X.global.config.swagger; import io.swagger.v3.oas.annotations.OpenAPIDefinition; import io.swagger.v3.oas.annotations.info.Info; From 5f33adfbcbb54ddc2f5dd53161b6c40504f998c9 Mon Sep 17 00:00:00 2001 From: hyxklee Date: Fri, 8 Nov 2024 10:50:32 +0900 Subject: [PATCH 076/123] =?UTF-8?q?feat:=20S3=EB=A5=BC=20=EC=9D=B4?= =?UTF-8?q?=EC=9A=A9=ED=95=9C=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=97=85?= =?UTF-8?q?=EB=A1=9C=EB=8D=94=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../image/service/ImageUploadService.java | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/image/service/ImageUploadService.java diff --git a/src/main/java/com/leets/X/domain/image/service/ImageUploadService.java b/src/main/java/com/leets/X/domain/image/service/ImageUploadService.java new file mode 100644 index 0000000..eba5bc8 --- /dev/null +++ b/src/main/java/com/leets/X/domain/image/service/ImageUploadService.java @@ -0,0 +1,77 @@ +package com.leets.X.domain.image.service; + +import com.leets.X.domain.image.dto.request.ImageDto; +import com.leets.X.domain.image.exception.S3UploadException; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import software.amazon.awssdk.core.sync.RequestBody; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.model.PutObjectRequest; +import software.amazon.awssdk.services.s3.model.PutObjectResponse; +import software.amazon.awssdk.services.s3.model.S3Exception; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@Service +@RequiredArgsConstructor +public class ImageUploadService { + @Value("${aws.s3.bucketName}") + private String bucketName; + @Value("${aws.s3.region}") + private String region; + + private final S3Client s3Client; + + public List uploadImages(List files) throws IOException { + + List images = new ArrayList<>(); + + for (MultipartFile file : files) { + String originalName = file.getOriginalFilename(); + String fileName = generateFileName(originalName); + + try { + // PutObjectRequest 생성 및 설정 + PutObjectRequest putObjectRequest = PutObjectRequest.builder() + .bucket(bucketName) + .key(fileName) + .contentType(file.getContentType()) + .build(); + + // S3에 파일 업로드 + PutObjectResponse response = s3Client.putObject( + putObjectRequest, + RequestBody.fromInputStream(file.getInputStream(), file.getSize()) + ); + + // 업로드 성공 여부 확인 + if (response.sdkHttpResponse().isSuccessful()) { + // 업로드된 파일의 URL을 ImageDto로 추가 + images.add(ImageDto.of(originalName, generateFileUrl(fileName))); + } else { + throw new S3UploadException(); + } + } catch (S3Exception e) { + throw new S3UploadException(); + } + } + + return images; + } + // S3에 저장된 파일 URL 생성 + private String generateFileUrl(String fileName) { + return String.format("https://%s.s3.%s.amazonaws.com/%s", bucketName, region, fileName); + } + + // 파일 이름을 고유하게 생성하는 메서드 + private String generateFileName(String originalFileName) { + String uuid = UUID.randomUUID().toString(); + return uuid + "_" + originalFileName.replaceAll("\\s+", "_"); + } + +} From ac0a063a51685f6876546562816d3aab6e36dd90 Mon Sep 17 00:00:00 2001 From: hyxklee Date: Fri, 8 Nov 2024 10:50:45 +0900 Subject: [PATCH 077/123] =?UTF-8?q?feat:=20S3=EB=A5=BC=20=EC=9D=B4?= =?UTF-8?q?=EC=9A=A9=ED=95=9C=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=97=85?= =?UTF-8?q?=EB=A1=9C=EB=93=9C=20=EC=A4=91=20=EB=B0=9C=EC=83=9D=ED=95=A0=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8A=94=20=EC=98=88=EC=99=B8=20=EC=A0=95?= =?UTF-8?q?=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../X/domain/image/exception/S3UploadException.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/image/exception/S3UploadException.java diff --git a/src/main/java/com/leets/X/domain/image/exception/S3UploadException.java b/src/main/java/com/leets/X/domain/image/exception/S3UploadException.java new file mode 100644 index 0000000..b918bd8 --- /dev/null +++ b/src/main/java/com/leets/X/domain/image/exception/S3UploadException.java @@ -0,0 +1,10 @@ +package com.leets.X.domain.image.exception; + +import com.leets.X.global.common.exception.BaseException; + +public class S3UploadException extends BaseException { + public S3UploadException() { + super(ErrorMessage.S3_UPLOAD_FAIL.getCode(), ErrorMessage.S3_UPLOAD_FAIL.getMessage()); + } + +} From b9426aa2b9894a73365bd109c45c2d7d08b5c44e Mon Sep 17 00:00:00 2001 From: hyxklee Date: Fri, 8 Nov 2024 10:51:06 +0900 Subject: [PATCH 078/123] =?UTF-8?q?feat:=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EC=97=85=EB=A1=9C=EB=93=9C=20=ED=9B=84=20=EC=A0=80=EC=9E=A5?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../X/domain/image/service/ImageService.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/image/service/ImageService.java diff --git a/src/main/java/com/leets/X/domain/image/service/ImageService.java b/src/main/java/com/leets/X/domain/image/service/ImageService.java new file mode 100644 index 0000000..ad7cf2c --- /dev/null +++ b/src/main/java/com/leets/X/domain/image/service/ImageService.java @@ -0,0 +1,33 @@ +package com.leets.X.domain.image.service; + +import com.leets.X.domain.image.domain.Image; +import com.leets.X.domain.image.dto.request.ImageDto; +import com.leets.X.domain.image.repository.ImageRepository; +import com.leets.X.domain.post.domain.Post; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class ImageService { + + private final ImageUploadService imageUploadService; + private final ImageRepository imageRepository; + + @Transactional + public List save(List file, Post post) throws IOException { + List dtoList = imageUploadService.uploadImages(file); + + List imageList = dtoList.stream() + .map((ImageDto dto) -> Image.from(dto, post)) + .toList(); + + return imageRepository.saveAll(imageList); + } + +} From 7547b92a8458c10b5eb681701a205a51aafde2f6 Mon Sep 17 00:00:00 2001 From: hyxklee Date: Fri, 8 Nov 2024 10:51:22 +0900 Subject: [PATCH 079/123] =?UTF-8?q?feat:=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20dto=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets/X/domain/image/dto/request/ImageDto.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/image/dto/request/ImageDto.java diff --git a/src/main/java/com/leets/X/domain/image/dto/request/ImageDto.java b/src/main/java/com/leets/X/domain/image/dto/request/ImageDto.java new file mode 100644 index 0000000..fea78e2 --- /dev/null +++ b/src/main/java/com/leets/X/domain/image/dto/request/ImageDto.java @@ -0,0 +1,11 @@ +package com.leets.X.domain.image.dto.request; + +public record ImageDto( + String name, + String url +) { + public static ImageDto of(String name, String url) { + return new ImageDto(name, url); + } +} + From 154b503c958689bcb68a7fff65f0f71fb13597bb Mon Sep 17 00:00:00 2001 From: hyxklee Date: Fri, 8 Nov 2024 10:51:36 +0900 Subject: [PATCH 080/123] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20dto=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../X/domain/image/dto/request/ImageSaveRequest.java | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 src/main/java/com/leets/X/domain/image/dto/request/ImageSaveRequest.java diff --git a/src/main/java/com/leets/X/domain/image/dto/request/ImageSaveRequest.java b/src/main/java/com/leets/X/domain/image/dto/request/ImageSaveRequest.java deleted file mode 100644 index 25cf651..0000000 --- a/src/main/java/com/leets/X/domain/image/dto/request/ImageSaveRequest.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.leets.X.domain.image.dto.request; - -public record ImageSaveRequest( - String name, - String url -) { - public static ImageSaveRequest of(String name, String url, Integer order) { - return new ImageSaveRequest(name, url); - } -} - From 7cce1e0d8b70ec3cf6b67b842c422a82564746f0 Mon Sep 17 00:00:00 2001 From: hyxklee Date: Fri, 8 Nov 2024 10:51:59 +0900 Subject: [PATCH 081/123] =?UTF-8?q?feat:=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=EB=A5=BC=20=EC=BB=AC=EB=A0=89=EC=85=98?= =?UTF-8?q?=EC=97=90=20=EC=B6=94=EA=B0=80=ED=95=98=EB=8A=94=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/leets/X/domain/post/domain/Post.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/leets/X/domain/post/domain/Post.java b/src/main/java/com/leets/X/domain/post/domain/Post.java index d882a57..cf33949 100644 --- a/src/main/java/com/leets/X/domain/post/domain/Post.java +++ b/src/main/java/com/leets/X/domain/post/domain/Post.java @@ -1,6 +1,5 @@ package com.leets.X.domain.post.domain; -import com.leets.X.domain.comment.domain.Comment; import com.leets.X.domain.image.domain.Image; import com.leets.X.domain.like.domain.Like; import com.leets.X.domain.post.domain.enums.IsDeleted; @@ -32,7 +31,7 @@ public class Post extends BaseTimeEntity { @OneToMany(mappedBy = "post", cascade = CascadeType.REMOVE, orphanRemoval = true) private List likes = new ArrayList<>(); - @OneToMany(mappedBy = "post", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, fetch = FetchType.LAZY) + @OneToMany(mappedBy = "post", cascade = CascadeType.REMOVE, orphanRemoval = true) private List images = new ArrayList<>(); @@ -89,6 +88,10 @@ public static Post create(User user, String content) { .isDeleted(IsDeleted.ACTIVE) // 기본값 ACTIVE로 설정 .images(new ArrayList<>()) // 빈 리스트로 초기화 .build(); - } + } + + public void addImage(List images) { + this.images.addAll(images); // 기존 리스트에 이미지 추가 + } } From 39eb431dcf8e327cc3bfa996071b95e22ed34562 Mon Sep 17 00:00:00 2001 From: hyxklee Date: Fri, 8 Nov 2024 10:52:47 +0900 Subject: [PATCH 082/123] =?UTF-8?q?feat:=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=EB=8B=B4=EC=95=84=EC=84=9C=20=EB=B0=98=ED=99=98=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20PostResponseDto=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../X/domain/post/dto/response/PostResponseDto.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java b/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java index 4d31e0f..8822d0d 100644 --- a/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java +++ b/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java @@ -1,8 +1,7 @@ package com.leets.X.domain.post.dto.response; -import com.leets.X.domain.comment.domain.Comment; -import com.leets.X.domain.image.domain.Image; +import com.leets.X.domain.image.dto.response.ImageResponse; import com.leets.X.domain.post.domain.Post; import com.leets.X.domain.post.domain.enums.IsDeleted; import com.leets.X.domain.user.domain.User; @@ -11,7 +10,6 @@ import lombok.NoArgsConstructor; import java.time.LocalDateTime; -import java.util.Collections; import java.util.List; @@ -25,7 +23,7 @@ public class PostResponseDto { private IsDeleted isDeleted; private LocalDateTime createdAt; private PostUserResponse user; // 작성자 정보 - private List images; // 관련 이미지 리스트 + private List images; // 관련 이미지 리스트 private Long likeCount; // 좋아요 개수 추가 public static PostResponseDto from(Post post) { @@ -46,9 +44,9 @@ private static PostUserResponse convertUser(User user) { return user != null ? PostUserResponse.from(user) : null; } - private static List convertImagesToDtoList(Post post) { + private static List convertImagesToDtoList(Post post) { return post.getImages().stream() - .map(ImageResponseDto::from) + .map(ImageResponse::from) .toList(); } From 318f66036552b7da81f00149a64a0cbff4afa819 Mon Sep 17 00:00:00 2001 From: hyxklee Date: Fri, 8 Nov 2024 10:53:16 +0900 Subject: [PATCH 083/123] =?UTF-8?q?feat:=20=EC=9D=B4=EB=AF=B8=EC=A7=80?= =?UTF-8?q?=EC=99=80=20=ED=8F=AC=EC=8A=A4=ED=8A=B8=EB=A5=BC=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=ED=95=98=EB=8A=94=20=EC=9E=84=EC=8B=9C=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../X/domain/post/service/PostService.java | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/leets/X/domain/post/service/PostService.java b/src/main/java/com/leets/X/domain/post/service/PostService.java index f3b892d..c055b94 100644 --- a/src/main/java/com/leets/X/domain/post/service/PostService.java +++ b/src/main/java/com/leets/X/domain/post/service/PostService.java @@ -1,8 +1,9 @@ package com.leets.X.domain.post.service; +import com.leets.X.domain.image.domain.Image; +import com.leets.X.domain.image.service.ImageService; import com.leets.X.domain.like.domain.Like; import com.leets.X.domain.like.repository.LikeRepository; -import com.leets.X.domain.post.controller.ResponseMessage; import com.leets.X.domain.post.domain.Post; import com.leets.X.domain.post.domain.enums.IsDeleted; import com.leets.X.domain.post.dto.request.PostRequestDTO; @@ -16,11 +17,12 @@ import com.leets.X.domain.user.domain.User; import com.leets.X.domain.user.exception.UserNotFoundException; import com.leets.X.domain.user.service.UserService; -import com.leets.X.global.common.response.ResponseDto; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.time.LocalDateTime; import java.util.Comparator; import java.util.List; @@ -33,6 +35,7 @@ public class PostService { private final PostRepository postRepository; private final UserService userService; private final LikeRepository likeRepository; + private final ImageService imageService; // 게시물 ID로 조회 public PostResponseDto getPostResponse(Long id) { @@ -157,4 +160,21 @@ public PostUserResponse findUser(String email) { User user = userService.find(email); return PostUserResponse.from(user); // PostUserResponse로 변환하여 반환 } + + @Transactional + public PostResponseDto createPostImage(PostRequestDTO postRequestDTO, List files) throws IOException { + // 이메일로 사용자 조회 + User user = userService.find("redandkang@gmail.com"); // JWT에서 추출한 이메일 사용 + + Post post = Post.create(user, postRequestDTO.content()); // 글 생성 로직 캡슐화 + Post savedPost = postRepository.save(post); + + if (files != null) { + List images = imageService.save(files, savedPost); + post.addImage(images); + } + + // 저장된 게시글을 ResponseDto에 담아 반환 + return PostResponseDto.from(savedPost); + } } From 611abe1b7fb04a90be8fc75dead87b7b008869b0 Mon Sep 17 00:00:00 2001 From: hyxklee Date: Fri, 8 Nov 2024 10:53:28 +0900 Subject: [PATCH 084/123] =?UTF-8?q?feat:=20=EC=98=88=EC=99=B8=20=EC=83=81?= =?UTF-8?q?=EC=88=98=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../X/domain/image/exception/ErrorMessage.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/com/leets/X/domain/image/exception/ErrorMessage.java diff --git a/src/main/java/com/leets/X/domain/image/exception/ErrorMessage.java b/src/main/java/com/leets/X/domain/image/exception/ErrorMessage.java new file mode 100644 index 0000000..5847ef4 --- /dev/null +++ b/src/main/java/com/leets/X/domain/image/exception/ErrorMessage.java @@ -0,0 +1,15 @@ +package com.leets.X.domain.image.exception; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum ErrorMessage { + + S3_UPLOAD_FAIL(500, "이미지 업로드 중 에러가 발생했습니다."); + + private final int code; + private final String message; + +} From 94664fa87c6aa57a59be4bc6388f25f6a79feb63 Mon Sep 17 00:00:00 2001 From: hyxklee Date: Fri, 8 Nov 2024 11:07:01 +0900 Subject: [PATCH 085/123] =?UTF-8?q?refactor:=20=EC=9E=84=EC=8B=9C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=ED=9B=84=20=EC=9C=A0=EC=A0=80=20email=EC=9D=84=20=EB=B0=9B?= =?UTF-8?q?=EC=95=84=20=EC=98=A4=EB=8F=84=EB=A1=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../X/domain/post/controller/PostController.java | 15 ++++++++++++--- .../leets/X/domain/post/service/PostService.java | 4 ++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/leets/X/domain/post/controller/PostController.java b/src/main/java/com/leets/X/domain/post/controller/PostController.java index 365481c..30b3ca8 100644 --- a/src/main/java/com/leets/X/domain/post/controller/PostController.java +++ b/src/main/java/com/leets/X/domain/post/controller/PostController.java @@ -1,6 +1,5 @@ package com.leets.X.domain.post.controller; -import com.leets.X.domain.post.domain.Post; import com.leets.X.domain.post.dto.request.PostRequestDTO; import com.leets.X.domain.post.dto.response.PostResponseDto; import com.leets.X.domain.post.service.PostService; @@ -8,12 +7,14 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; +import org.springframework.http.MediaType; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.util.List; -import java.util.Map; + //컨트롤러에서 ResponseDto만들게끔 @Tag(name = "POST") @RestController @@ -79,6 +80,14 @@ public ResponseDto cancelLike(@PathVariable Long postId, @Authentication return ResponseDto.response(ResponseMessage.LIKE_CANCEL_SUCCESS.getCode(), responseMessage); } + @PostMapping(value = "/post-image", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @Operation(summary = "글 생성") + public ResponseDto createPost(@RequestPart PostRequestDTO postRequestDTO, + @RequestParam(value = "files", required = false) List files, + @AuthenticationPrincipal String email) throws IOException { + PostResponseDto postResponseDto = postService.createPostImage(postRequestDTO, files, email); + return ResponseDto.response(ResponseMessage.POST_SUCCESS.getCode(), ResponseMessage.POST_SUCCESS.getMessage(), postResponseDto); + } } diff --git a/src/main/java/com/leets/X/domain/post/service/PostService.java b/src/main/java/com/leets/X/domain/post/service/PostService.java index c055b94..356fffa 100644 --- a/src/main/java/com/leets/X/domain/post/service/PostService.java +++ b/src/main/java/com/leets/X/domain/post/service/PostService.java @@ -162,9 +162,9 @@ public PostUserResponse findUser(String email) { } @Transactional - public PostResponseDto createPostImage(PostRequestDTO postRequestDTO, List files) throws IOException { + public PostResponseDto createPostImage(PostRequestDTO postRequestDTO, List files, String email) throws IOException { // 이메일로 사용자 조회 - User user = userService.find("redandkang@gmail.com"); // JWT에서 추출한 이메일 사용 + User user = userService.find(email); // JWT에서 추출한 이메일 사용 Post post = Post.create(user, postRequestDTO.content()); // 글 생성 로직 캡슐화 Post savedPost = postRepository.save(post); From e8f4fc147181a80ce464980c411f4ec09effcc9b Mon Sep 17 00:00:00 2001 From: hyxklee Date: Fri, 8 Nov 2024 14:19:19 +0900 Subject: [PATCH 086/123] =?UTF-8?q?feat:=20=ED=8C=94=EB=A1=9C=EC=9A=B0?= =?UTF-8?q?=EC=8B=9C=20follow=20=EC=B9=B4=EC=9A=B4=ED=8A=B8=EB=A5=BC=20?= =?UTF-8?q?=EC=9E=AC=EA=B3=84=EC=82=B0=ED=95=98=EA=B3=A0,=20=EC=96=B8?= =?UTF-8?q?=ED=8C=94=EB=A1=9C=EC=9A=B0=EC=8B=9C=20=EA=B0=92=EC=9D=84=20?= =?UTF-8?q?=EB=82=B4=EB=A6=AC=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/follow/service/FollowService.java | 49 ++++++++++++++----- 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/leets/X/domain/follow/service/FollowService.java b/src/main/java/com/leets/X/domain/follow/service/FollowService.java index 048bb4c..f9e5c91 100644 --- a/src/main/java/com/leets/X/domain/follow/service/FollowService.java +++ b/src/main/java/com/leets/X/domain/follow/service/FollowService.java @@ -15,6 +15,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.List; + @Slf4j @Service @RequiredArgsConstructor @@ -23,7 +24,7 @@ public class FollowService { private final UserService userService; @Transactional - public void follow(Long userId, String email){ + public void follow(Long userId, String email) { User follower = userService.find(email); User followed = userService.find(userId); @@ -32,62 +33,86 @@ public void follow(Long userId, String email){ Follow follow = followRepository.save(Follow.of(follower, followed)); follower.addFollowing(follow); + follower.updateFollowingCount(countFollowing(follower)); + followed.addFollower(follow); + followed.updateFollowerCount(countFollower(followed)); } - public List getFollowers(Long userId){ + public List getFollowers(Long userId) { User user = userService.find(userId); List followerList = user.getFollowerList(); return followerList.stream() .map(follow -> { - return FollowResponse.from(follow.getFollower()); }) + return FollowResponse.from(follow.getFollower()); + }) .toList(); } - public List getFollowings(Long userId){ + public List getFollowings(Long userId) { User user = userService.find(userId); List followingList = user.getFollowingList(); return followingList.stream() .map(follow -> { - return FollowResponse.from(follow.getFollowed()); }) + return FollowResponse.from(follow.getFollowed()); + }) .toList(); } @Transactional - public void unfollow(Long userId, String email){ + public void unfollow(Long userId, String email) { User follower = userService.find(email); User followed = userService.find(userId); Follow follow = check(follower.getId(), followed.getId()); follower.removeFollowing(follow); + follower.decreaseFollowingCount(); + followed.removeFollower(follow); + followed.decreaseFollowerCount(); followRepository.delete(follow); } - public Follow find(Long followerId, Long followedId){ + public Follow find(Long followerId, Long followedId) { return followRepository.findByFollowerIdAndFollowedId(followerId, followedId) .orElseThrow(FollowNotFoundException::new); } + private Long countFollower(User user) { + return user.getFollowerList().stream() + .map(follow -> { + return FollowResponse.from(follow.getFollower()); + }) + .count(); + } + + private Long countFollowing(User user) { + return user.getFollowingList().stream() + .map(follow -> { + return FollowResponse.from(follow.getFollowed()); + }) + .count(); + } + // 기존 팔로우 정보가 있는지, 나한테 요청을 하지 않는지 검증 - private void validate(Long followerId, Long followedId){ - if(followRepository.existsByFollowerIdAndFollowedId(followerId, followedId)){ + private void validate(Long followerId, Long followedId) { + if (followRepository.existsByFollowerIdAndFollowedId(followerId, followedId)) { throw new AlreadyFollowException(); } - if(followerId.equals(followedId)){ + if (followerId.equals(followedId)) { throw new InvalidFollowException(); } } // 팔로우 되어 있는지 확인 - private Follow check(Long followerId, Long followedId){ - if(!followRepository.existsByFollowerIdAndFollowedId(followerId, followedId)){ + private Follow check(Long followerId, Long followedId) { + if (!followRepository.existsByFollowerIdAndFollowedId(followerId, followedId)) { throw new InvalidUnfollowException(); } return find(followerId, followedId); From 6894f825f8374ef7d40dd8ec9a6f7b022208782e Mon Sep 17 00:00:00 2001 From: hyxklee Date: Fri, 8 Nov 2024 14:19:34 +0900 Subject: [PATCH 087/123] =?UTF-8?q?feat:=20=ED=8C=94=EB=A1=9C=EC=9A=B0=20?= =?UTF-8?q?=ED=9A=9F=EC=88=98=20=EB=B3=80=EA=B2=BD=EC=9D=84=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/leets/X/domain/user/domain/User.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/main/java/com/leets/X/domain/user/domain/User.java b/src/main/java/com/leets/X/domain/user/domain/User.java index 89a3001..24e1f44 100644 --- a/src/main/java/com/leets/X/domain/user/domain/User.java +++ b/src/main/java/com/leets/X/domain/user/domain/User.java @@ -49,6 +49,9 @@ public class User extends BaseTimeEntity { private String introduce; + private long followerCount = 0L; + + private long followingCount = 0L; @OneToMany(mappedBy = "user", cascade = CascadeType.REMOVE, orphanRemoval = true) private List posts = new ArrayList<>(); @@ -90,6 +93,24 @@ public void removeFollowing(Follow follow) { this.followingList.remove(follow); } + public void updateFollowerCount(long followerCount) { + this.followerCount = followerCount; + } + + public void decreaseFollowerCount() { + if(this.followerCount > 0){ + this.followerCount--; + } + } + public void updateFollowingCount(long followingCount) { + this.followingCount = followingCount; + } + + public void decreaseFollowingCount() { + if(this.followingCount>0) { + this.followingCount--; + } + } } From 3b84d309c687202bd26001f4c52af3080947110e Mon Sep 17 00:00:00 2001 From: hyxklee Date: Fri, 8 Nov 2024 14:19:52 +0900 Subject: [PATCH 088/123] =?UTF-8?q?feat:=20=EC=9C=A0=EC=A0=80=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=95=84=20=EC=A1=B0=ED=9A=8C=EC=8B=9C=20followerCoun?= =?UTF-8?q?t,=20followingCount=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/dto/response/UserProfileResponse.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/leets/X/domain/user/dto/response/UserProfileResponse.java b/src/main/java/com/leets/X/domain/user/dto/response/UserProfileResponse.java index 7d30cda..3b11361 100644 --- a/src/main/java/com/leets/X/domain/user/dto/response/UserProfileResponse.java +++ b/src/main/java/com/leets/X/domain/user/dto/response/UserProfileResponse.java @@ -11,10 +11,10 @@ public record UserProfileResponse( Boolean isMyProfile, String name, String customId, - LocalDateTime createAt, - Long followCount, - Long followerCount -) { + Long followerCount, + Long followingCount, + LocalDateTime createAt + ) { // 정적 팩토리 메서드 public static UserProfileResponse from(User user, Boolean isMyProfile) { return UserProfileResponse.builder() @@ -22,6 +22,8 @@ public static UserProfileResponse from(User user, Boolean isMyProfile) { .isMyProfile(isMyProfile) .name(user.getName()) .customId(user.getCustomId()) + .followerCount(user.getFollowerCount()) + .followingCount(user.getFollowingCount()) .createAt(user.getCreatedAt()) .build(); } From 7f762c4abd8b9f8483a957c41fbbfda0b85c32a9 Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Fri, 8 Nov 2024 14:35:41 +0900 Subject: [PATCH 089/123] =?UTF-8?q?Refactor=20:=20=EC=B5=9C=EC=8B=A0=20?= =?UTF-8?q?=EA=B2=8C=EC=8B=9C=EB=AC=BC=20=EC=A1=B0=ED=9A=8C=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=A4=91=EB=B3=B5=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/leets/X/domain/post/service/PostService.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/leets/X/domain/post/service/PostService.java b/src/main/java/com/leets/X/domain/post/service/PostService.java index d5f3f6e..54bd4d7 100644 --- a/src/main/java/com/leets/X/domain/post/service/PostService.java +++ b/src/main/java/com/leets/X/domain/post/service/PostService.java @@ -56,19 +56,18 @@ public List getPostsSortedByLikes() { } // 최신 게시물 조회 + public List getLatestPosts() { - List posts = postRepository.findTop10ByOrderByCreatedAtDesc(); // 최신 10개 게시물 조회 - // 현재 시각 가져오기 - LocalDateTime now = LocalDateTime.now(); + // 최신 10개 게시물 조회 + List posts = postRepository.findTop10ByOrderByCreatedAtDesc(); - // 게시물을 PostResponseDto로 변환하고 정렬 + // Post 객체를 PostResponseDto로 변환하여 반환 return posts.stream() .map(PostResponseDto::from) // Post 객체를 PostResponseDto로 변환 - .sorted(Comparator.comparingLong(postResponseDto -> - Math.abs(postResponseDto.createdAt().until(now, java.time.temporal.ChronoUnit.SECONDS)))) // 현재 시각과의 차이를 기준으로 정렬 .collect(Collectors.toList()); } + // 글 생성 (Refactoring) @Transactional public PostResponseDto createPost(PostRequestDTO postRequestDTO, String email) { From aeb54ba609de0e2ec0b4b627e2d624615b007e50 Mon Sep 17 00:00:00 2001 From: hyxklee Date: Fri, 8 Nov 2024 14:37:58 +0900 Subject: [PATCH 090/123] =?UTF-8?q?refactor:=20=EB=94=94=EB=A0=89=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../enums}/LoginStatus.java | 2 +- .../X/domain/user/service/UserService.java | 25 +++++++++++++------ 2 files changed, 18 insertions(+), 9 deletions(-) rename src/main/java/com/leets/X/domain/user/{service => domain/enums}/LoginStatus.java (51%) diff --git a/src/main/java/com/leets/X/domain/user/service/LoginStatus.java b/src/main/java/com/leets/X/domain/user/domain/enums/LoginStatus.java similarity index 51% rename from src/main/java/com/leets/X/domain/user/service/LoginStatus.java rename to src/main/java/com/leets/X/domain/user/domain/enums/LoginStatus.java index e536f68..5eba020 100644 --- a/src/main/java/com/leets/X/domain/user/service/LoginStatus.java +++ b/src/main/java/com/leets/X/domain/user/domain/enums/LoginStatus.java @@ -1,4 +1,4 @@ -package com.leets.X.domain.user.service; +package com.leets.X.domain.user.domain.enums; public enum LoginStatus { LOGIN, REGISTER diff --git a/src/main/java/com/leets/X/domain/user/service/UserService.java b/src/main/java/com/leets/X/domain/user/service/UserService.java index 07d5d38..88f7966 100644 --- a/src/main/java/com/leets/X/domain/user/service/UserService.java +++ b/src/main/java/com/leets/X/domain/user/service/UserService.java @@ -1,5 +1,6 @@ package com.leets.X.domain.user.service; +import com.leets.X.domain.follow.domain.Follow; import com.leets.X.domain.user.domain.User; import com.leets.X.domain.user.dto.request.UserInitializeRequest; import com.leets.X.domain.user.dto.request.UserUpdateRequest; @@ -17,8 +18,10 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import static com.leets.X.domain.user.service.LoginStatus.LOGIN; -import static com.leets.X.domain.user.service.LoginStatus.REGISTER; +import java.util.List; + +import static com.leets.X.domain.user.domain.enums.LoginStatus.LOGIN; +import static com.leets.X.domain.user.domain.enums.LoginStatus.REGISTER; @Slf4j @Service @@ -70,12 +73,9 @@ public void updateProfile(UserUpdateRequest dto, String email){ public UserProfileResponse getProfile(Long userId, String email){ User user = userRepository.findById(userId) .orElseThrow(UserNotFoundException::new); - // 내 프로필이라면 true - if(user.getEmail().equals(email)){ - return UserProfileResponse.from(user, true); - } - // 아니라면 false - return UserProfileResponse.from(user, false); + boolean isMyProfile = user.getEmail().equals(email); + boolean isFollowing = checkFollowing(user, email); + return UserProfileResponse.from(user, isMyProfile, isFollowing); } // // @Transactional @@ -107,6 +107,15 @@ private JwtResponse generateToken (String email){ .build(); } + // 팔로우 되어있는 유저라면 true + private boolean checkFollowing(User target, String email){ + User source = find(email); + List followerList = target.getFollowerList(); + + return followerList.stream() + .anyMatch(follow -> follow.getFollower().getId().equals(source.getId())); + } + /* * userRepository에서 사용자를 검색하는 메서드 * 공통으로 사용되는 부분이 많기 때문에 별도로 분리 From 10637e816e450f455369112d21db92820e421ba2 Mon Sep 17 00:00:00 2001 From: hyxklee Date: Fri, 8 Nov 2024 14:38:09 +0900 Subject: [PATCH 091/123] =?UTF-8?q?refactor:=20=EB=94=94=EB=A0=89=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/leets/X/domain/user/controller/UserController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/leets/X/domain/user/controller/UserController.java b/src/main/java/com/leets/X/domain/user/controller/UserController.java index d77aa43..b021151 100644 --- a/src/main/java/com/leets/X/domain/user/controller/UserController.java +++ b/src/main/java/com/leets/X/domain/user/controller/UserController.java @@ -5,7 +5,7 @@ import com.leets.X.domain.user.dto.request.UserUpdateRequest; import com.leets.X.domain.user.dto.response.UserProfileResponse; import com.leets.X.domain.user.dto.response.UserSocialLoginResponse; -import com.leets.X.domain.user.service.LoginStatus; +import com.leets.X.domain.user.domain.enums.LoginStatus; import com.leets.X.domain.user.service.UserService; import com.leets.X.global.common.response.ResponseDto; import io.swagger.v3.oas.annotations.Operation; From 5c2fffd6e3478e3aaa3486e849151ee52b243435 Mon Sep 17 00:00:00 2001 From: hyxklee Date: Fri, 8 Nov 2024 14:38:15 +0900 Subject: [PATCH 092/123] =?UTF-8?q?refactor:=20=EB=94=94=EB=A0=89=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../X/domain/user/dto/response/UserSocialLoginResponse.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/leets/X/domain/user/dto/response/UserSocialLoginResponse.java b/src/main/java/com/leets/X/domain/user/dto/response/UserSocialLoginResponse.java index 3ce40f7..12765c7 100644 --- a/src/main/java/com/leets/X/domain/user/dto/response/UserSocialLoginResponse.java +++ b/src/main/java/com/leets/X/domain/user/dto/response/UserSocialLoginResponse.java @@ -1,6 +1,6 @@ package com.leets.X.domain.user.dto.response; -import com.leets.X.domain.user.service.LoginStatus; +import com.leets.X.domain.user.domain.enums.LoginStatus; import com.leets.X.global.auth.jwt.dto.JwtResponse; import lombok.Builder; From 5ecbb189d18b0bc2e45cec597df72cd7d02198ed Mon Sep 17 00:00:00 2001 From: hyxklee Date: Fri, 8 Nov 2024 14:38:24 +0900 Subject: [PATCH 093/123] =?UTF-8?q?refactor:=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EC=8B=9C=EA=B0=84=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/dto/response/UserProfileResponse.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/leets/X/domain/user/dto/response/UserProfileResponse.java b/src/main/java/com/leets/X/domain/user/dto/response/UserProfileResponse.java index 3b11361..e3878ed 100644 --- a/src/main/java/com/leets/X/domain/user/dto/response/UserProfileResponse.java +++ b/src/main/java/com/leets/X/domain/user/dto/response/UserProfileResponse.java @@ -13,10 +13,12 @@ public record UserProfileResponse( String customId, Long followerCount, Long followingCount, - LocalDateTime createAt + Boolean isFollowing, + LocalDateTime createdAt, + LocalDateTime updatedAt ) { // 정적 팩토리 메서드 - public static UserProfileResponse from(User user, Boolean isMyProfile) { + public static UserProfileResponse from(User user, Boolean isMyProfile, Boolean isFollowing) { return UserProfileResponse.builder() .userId(user.getId()) .isMyProfile(isMyProfile) @@ -24,7 +26,9 @@ public static UserProfileResponse from(User user, Boolean isMyProfile) { .customId(user.getCustomId()) .followerCount(user.getFollowerCount()) .followingCount(user.getFollowingCount()) - .createAt(user.getCreatedAt()) + .isFollowing(isFollowing) + .createdAt(user.getCreatedAt()) + .updatedAt(user.getUpdatedAt()) .build(); } } From cecdbf2ed491ee18e658ee22b658e785a353ded9 Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Fri, 8 Nov 2024 14:58:43 +0900 Subject: [PATCH 094/123] =?UTF-8?q?Refactor=20:=20=EC=A2=8B=EC=95=84?= =?UTF-8?q?=EC=9A=94=20=EC=97=AC=EB=B6=80=EB=A5=BC=20=EB=82=98=ED=83=80?= =?UTF-8?q?=EB=82=B4=EB=8A=94=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=98=A4?= =?UTF-8?q?=EB=B2=84=EB=A1=9C=EB=94=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/dto/response/PostResponseDto.java | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java b/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java index 9047216..38ad46f 100644 --- a/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java +++ b/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java @@ -1,6 +1,7 @@ package com.leets.X.domain.post.dto.response; +import com.leets.X.domain.like.repository.LikeRepository; import com.leets.X.domain.post.domain.Post; import com.leets.X.domain.post.domain.enums.IsDeleted; import com.leets.X.domain.user.domain.User; @@ -21,9 +22,11 @@ public record PostResponseDto( PostUserResponse user, List images, Long likeCount, - List replies + List replies, + Boolean isLikedByUser // 좋아요 여부 확인 ) { public static PostResponseDto from(Post post) { + return new PostResponseDto( post.getId(), post.getContent(), @@ -33,9 +36,29 @@ public static PostResponseDto from(Post post) { convertUser(post.getUser()), convertImagesToDtoList(post), post.getLikesCount(), - convertRepliesToDtoList(post.getReplies()) + convertRepliesToDtoList(post.getReplies()), + false + ); } + // 좋아요 여부를 확인하기 위한 메서드 오버로딩 + public static PostResponseDto from(Post post, User user, LikeRepository likeRepository) { + boolean isLikedByUser = user != null && likeRepository.existsByPostAndUser(post, user); // 좋아요 여부 확인 + + return new PostResponseDto( + post.getId(), + post.getContent(), + post.getViews(), + post.getIsDeleted(), + post.getCreatedAt(), + convertUser(post.getUser()), + convertImagesToDtoList(post), + post.getLikesCount(), + convertRepliesToDtoList(post.getReplies()), + isLikedByUser // 좋아요 여부를 동적으로 설정 + ); + } + private static List convertRepliesToDtoList(List replies) { return replies != null ? replies.stream() From a32f6e3e2403dea7d53adabb6878d13075daff24 Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Fri, 8 Nov 2024 15:00:05 +0900 Subject: [PATCH 095/123] =?UTF-8?q?Refactor:=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=EC=97=90=20=EB=A7=A4=EA=B0=9C=EB=B3=80?= =?UTF-8?q?=EC=88=98=20=EC=B6=94=EA=B0=80=20+=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=20=EC=A0=95=EB=B3=B4=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/leets/X/domain/post/service/PostService.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/leets/X/domain/post/service/PostService.java b/src/main/java/com/leets/X/domain/post/service/PostService.java index 54bd4d7..4646e80 100644 --- a/src/main/java/com/leets/X/domain/post/service/PostService.java +++ b/src/main/java/com/leets/X/domain/post/service/PostService.java @@ -35,13 +35,15 @@ public class PostService { private final LikeRepository likeRepository; // 게시물 ID로 조회 - public PostResponseDto getPostResponse(Long id) { + public PostResponseDto getPostResponse(Long id, String email) { Post post = findPost(id); // 삭제되지 않은 게시물만 조회 가능하게끔 수정 if (post.getIsDeleted() != IsDeleted.ACTIVE) { throw new PostNotFoundException(); } - return PostResponseDto.from(post); + User user = userService.find(email); + + return PostResponseDto.from(post,user,likeRepository); } // 좋아요 수로 정렬한 게시물 조회 (직접 구현) From c1ca1032011f0478b1ae9d4bd7f2110a815236fa Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Fri, 8 Nov 2024 15:00:45 +0900 Subject: [PATCH 096/123] =?UTF-8?q?Refactor:=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EB=A7=A4=EA=B0=9C?= =?UTF-8?q?=EB=B3=80=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/leets/X/domain/post/controller/PostController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/leets/X/domain/post/controller/PostController.java b/src/main/java/com/leets/X/domain/post/controller/PostController.java index 6be0a67..28a51be 100644 --- a/src/main/java/com/leets/X/domain/post/controller/PostController.java +++ b/src/main/java/com/leets/X/domain/post/controller/PostController.java @@ -23,11 +23,11 @@ public class PostController { private final PostService postService; - + // 게시물 Id조회 @GetMapping("/{id}") @Operation(summary = "게시물 ID로 조회") - public ResponseDto getPost(@PathVariable Long id) { - PostResponseDto postResponseDto = postService.getPostResponse(id); + public ResponseDto getPost(@PathVariable Long id, @AuthenticationPrincipal String email) { + PostResponseDto postResponseDto = postService.getPostResponse(id, email); return ResponseDto.response(ResponseMessage.GET_POST_SUCCESS.getCode(), ResponseMessage.GET_POST_SUCCESS.getMessage(), postResponseDto); } From d0ffeeb4288f26a1d1e42d1402e786152f2dece8 Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Fri, 8 Nov 2024 15:07:58 +0900 Subject: [PATCH 097/123] =?UTF-8?q?Refactor:=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=EC=97=90=20=EC=A2=8B=EC=95=84=EC=9A=94=20?= =?UTF-8?q?=EB=88=8C=EB=A0=80=EB=8A=94=EC=A7=80=20=EC=97=AC=EB=B6=80=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../X/domain/post/controller/PostController.java | 8 ++++---- .../leets/X/domain/post/service/PostService.java | 16 +++++++++------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/leets/X/domain/post/controller/PostController.java b/src/main/java/com/leets/X/domain/post/controller/PostController.java index 28a51be..5ebc77f 100644 --- a/src/main/java/com/leets/X/domain/post/controller/PostController.java +++ b/src/main/java/com/leets/X/domain/post/controller/PostController.java @@ -34,16 +34,16 @@ public ResponseDto getPost(@PathVariable Long id, @Authenticati @GetMapping("/likes") @Operation(summary = "좋아요 수로 정렬한 게시물 조회") - public ResponseDto> getPostsSortedByLikes() { - List posts = postService.getPostsSortedByLikes(); + public ResponseDto> getPostsSortedByLikes(@AuthenticationPrincipal String email) { + List posts = postService.getPostsSortedByLikes(email); return ResponseDto.response(ResponseMessage.GET_SORTED_BY_LIKES_SUCCESS.getCode(), ResponseMessage.GET_SORTED_BY_LIKES_SUCCESS.getMessage(), posts); } @GetMapping("/latest") @Operation(summary = "최신 게시물 조회") - public ResponseDto> getLatestPosts() { - List posts = postService.getLatestPosts(); + public ResponseDto> getLatestPosts(@AuthenticationPrincipal String email) { + List posts = postService.getLatestPosts(email); return ResponseDto.response(ResponseMessage.GET_LATEST_POST_SUCCESS.getCode(), ResponseMessage.GET_LATEST_POST_SUCCESS.getMessage(), posts); } diff --git a/src/main/java/com/leets/X/domain/post/service/PostService.java b/src/main/java/com/leets/X/domain/post/service/PostService.java index 4646e80..fef9485 100644 --- a/src/main/java/com/leets/X/domain/post/service/PostService.java +++ b/src/main/java/com/leets/X/domain/post/service/PostService.java @@ -47,25 +47,27 @@ public PostResponseDto getPostResponse(Long id, String email) { } // 좋아요 수로 정렬한 게시물 조회 (직접 구현) - public List getPostsSortedByLikes() { - List posts = postRepository.findAll(); // 모든 게시물 조회 + public List getPostsSortedByLikes(String email) { + User user = userService.find(email); // 현재 사용자 정보 조회 + List posts = postRepository.findAll(); return posts.stream() - .filter(post -> post.getIsDeleted() == IsDeleted.ACTIVE) // ACTIVE 상태만 필터링 - .sorted(Comparator.comparing(Post::getLikesCount).reversed()) // 좋아요 수 기준으로 내림차순 정렬 - .map(PostResponseDto::from) // DTO로 변환 + .filter(post -> post.getIsDeleted() == IsDeleted.ACTIVE) + .sorted(Comparator.comparing(Post::getLikesCount).reversed()) + .map(post -> PostResponseDto.from(post, user, likeRepository)) // 좋아요 여부 반영 .collect(Collectors.toList()); } // 최신 게시물 조회 - public List getLatestPosts() { + public List getLatestPosts(String email) { + User user = userService.find(email); // 최신 10개 게시물 조회 List posts = postRepository.findTop10ByOrderByCreatedAtDesc(); // Post 객체를 PostResponseDto로 변환하여 반환 return posts.stream() - .map(PostResponseDto::from) // Post 객체를 PostResponseDto로 변환 + .map(post -> PostResponseDto.from(post, user, likeRepository)) // Post 객체를 PostResponseDto로 변환 .collect(Collectors.toList()); } From b3169d369ed3d6533d168c85f5ae36d5ffa1bc23 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Fri, 8 Nov 2024 15:19:17 +0900 Subject: [PATCH 098/123] =?UTF-8?q?fix:=20application-prod=20mongodb=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-prod.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index b66cb3f..e08f37c 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -20,8 +20,6 @@ spring: port: ${MONGO_PORT} host: ${MONGO_HOST} database: ${MONGO_DATABASE} - username: ${MONGO_USERNAME} - x: jwt: From 644fa50398a942434005b9de25725b8c19cf13b9 Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Fri, 8 Nov 2024 15:27:48 +0900 Subject: [PATCH 099/123] =?UTF-8?q?Refacor:=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EB=8B=A8=ED=8E=B8=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/leets/X/domain/post/controller/PostController.java | 4 ++-- .../java/com/leets/X/domain/post/service/PostService.java | 5 +---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/leets/X/domain/post/controller/PostController.java b/src/main/java/com/leets/X/domain/post/controller/PostController.java index 5ebc77f..de2d328 100644 --- a/src/main/java/com/leets/X/domain/post/controller/PostController.java +++ b/src/main/java/com/leets/X/domain/post/controller/PostController.java @@ -75,8 +75,8 @@ public ResponseDto createReply(@PathVariable Long postId, @Requ @DeleteMapping("/{postId}") @Operation(summary = "게시물 삭제") public ResponseDto deletePost(@PathVariable Long postId, @AuthenticationPrincipal String email) { - String responseMessage = postService.deletePost(postId, email); - return ResponseDto.response(ResponseMessage.POST_DELETED_SUCCESS.getCode(), responseMessage); + postService.deletePost(postId, email); + return ResponseDto.response(ResponseMessage.POST_DELETED_SUCCESS.getCode(), ResponseMessage.POST_DELETED_SUCCESS.getMessage()); } diff --git a/src/main/java/com/leets/X/domain/post/service/PostService.java b/src/main/java/com/leets/X/domain/post/service/PostService.java index fef9485..63b283c 100644 --- a/src/main/java/com/leets/X/domain/post/service/PostService.java +++ b/src/main/java/com/leets/X/domain/post/service/PostService.java @@ -129,7 +129,7 @@ public PostResponseDto createReply(Long parentId, PostRequestDTO postRequestDTO, // 게시물 삭제 @Transactional - public String deletePost(Long postId, String email) { + public void deletePost(Long postId, String email) { Post post = findPost(postId); User user = userService.find(email); @@ -140,9 +140,6 @@ public String deletePost(Long postId, String email) { // 게시물 상태를 삭제 상태로 변경 post.delete(); // delete 메서드 호출로 상태를 변경 - postRepository.save(post); // 상태 업데이트 - - return "게시물이 삭제되었습니다."; } @Transactional From 18221a5b021229371f10cccce3f6cca78abd1a21 Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Fri, 8 Nov 2024 17:20:20 +0900 Subject: [PATCH 100/123] =?UTF-8?q?Refactor:=20=EC=A2=8B=EC=95=84=EC=9A=94?= =?UTF-8?q?=20=EA=B0=9D=EC=B2=B4=20=EC=88=98=EB=A1=9C=20=EA=B0=AF=EC=88=98?= =?UTF-8?q?=20=EA=B3=84=EC=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/leets/X/domain/post/domain/Post.java | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/leets/X/domain/post/domain/Post.java b/src/main/java/com/leets/X/domain/post/domain/Post.java index 90e21d5..c19a5b9 100644 --- a/src/main/java/com/leets/X/domain/post/domain/Post.java +++ b/src/main/java/com/leets/X/domain/post/domain/Post.java @@ -54,25 +54,13 @@ public class Post extends BaseTimeEntity { private LocalDateTime deletedAt; // 좋아요 수를 관리하기 위한 필드 - @Column(name = "like_count") private Long likeCount = 0L; // 기본값을 0L로 초기화하여 null을 방지 - public void incrementLikeCount() { - if (this.likeCount == null) { - this.likeCount = 1L; // null인 경우 1로 초기화 - } else { - this.likeCount++; - } + public void updateLikeCount(long newLikeCount) { + this.likeCount = newLikeCount; } - public void decrementLikeCount() { - if (this.likeCount == null || this.likeCount == 0) { - this.likeCount = 0L; // null이거나 0일 경우 0으로 유지 - } else { - this.likeCount--; - } - } public long getLikesCount() { return likeCount != null ? likeCount : 0; // null일 경우 0 반환 From a788ca1c3cc5125b12dad278f9101819a88b0aa0 Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Fri, 8 Nov 2024 17:21:01 +0900 Subject: [PATCH 101/123] =?UTF-8?q?Refactor:=20=EC=97=94=ED=8B=B0=ED=8B=B0?= =?UTF-8?q?=20=EB=82=B4=20=EB=A9=94=EC=84=9C=EB=93=9C=EB=A5=BC=20=ED=86=B5?= =?UTF-8?q?=ED=95=B4=20=EC=A2=8B=EC=95=84=EC=9A=94=20=EC=88=98=20=EA=B0=B1?= =?UTF-8?q?=EC=8B=A0=20=ED=9B=84=20DB=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../X/domain/post/service/PostService.java | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/leets/X/domain/post/service/PostService.java b/src/main/java/com/leets/X/domain/post/service/PostService.java index 63b283c..ed476dd 100644 --- a/src/main/java/com/leets/X/domain/post/service/PostService.java +++ b/src/main/java/com/leets/X/domain/post/service/PostService.java @@ -103,9 +103,9 @@ public String addLike(Long postId, String email) { Like newLike = new Like(post, user); likeRepository.save(newLike); - // 좋아요 수 증가 - post.incrementLikeCount(); - postRepository.save(post); + + // 좋아요 수 갱신 + updateLikecount(post); return "좋아요가 추가되었습니다. 현재 좋아요 수: " + post.getLikesCount(); } @@ -142,6 +142,7 @@ public void deletePost(Long postId, String email) { post.delete(); // delete 메서드 호출로 상태를 변경 } + //좋아요 취소 @Transactional public String cancelLike(Long postId, String email) { Post post = findPost(postId); @@ -155,13 +156,19 @@ public String cancelLike(Long postId, String email) { // Like 객체 삭제 likeRepository.deleteByPostAndUser(post, user); - // 좋아요 수 증가 - post.decrementLikeCount(); - postRepository.save(post); // likeCount를 데이터베이스에 업데이트 + updateLikecount(post); return "좋아요가 삭제되었습니다. 현재 좋아요 수: " + post.getLikesCount(); } + //엔티티 내 메서드를 통해 좋아요 수 갱신 후 DB 반영 + @Transactional + public void updateLikecount (Post post) { + long actualLikeCount = likeRepository.countByPost(post); + post.updateLikeCount(actualLikeCount); + postRepository.save(post); + } + // 자주 중복되는 코드 메서드로 뽑기 public Post findPost(Long postId) { return postRepository.findById(postId) From cf2787e2f2ca04a52cb12ea0558f3f83b576ff28 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Fri, 8 Nov 2024 17:41:36 +0900 Subject: [PATCH 102/123] =?UTF-8?q?HOTFIX:=20MongoDB=20=ED=99=98=EA=B2=BD?= =?UTF-8?q?=EB=B3=80=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-prod.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index e08f37c..6fd4a96 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -20,6 +20,8 @@ spring: port: ${MONGO_PORT} host: ${MONGO_HOST} database: ${MONGO_DATABASE} + username: ${MONGO_USER} + password: ${MONGO_PASSWORD} x: jwt: From 9871240b17ba64551fdf5fe005638a25b87d755e Mon Sep 17 00:00:00 2001 From: koreaioi Date: Fri, 8 Nov 2024 18:14:18 +0900 Subject: [PATCH 103/123] =?UTF-8?q?HOTFIX:=20MongoDB=20=ED=99=98=EA=B2=BD?= =?UTF-8?q?=20=EB=B3=80=EC=88=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 제발.... --- src/main/resources/application-prod.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 6fd4a96..76562b0 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -17,11 +17,12 @@ spring: port: ${REDIS_PORT} password: ${REDIS_PASSWORD} mongodb: - port: ${MONGO_PORT} - host: ${MONGO_HOST} - database: ${MONGO_DATABASE} - username: ${MONGO_USER} - password: ${MONGO_PASSWORD} + uri: mongodb://${MONGO_USER}:${MONGO_PASSWORD}@${MONGO_HOST}:${MONGO_PORT}/${MONGO_DATABASE} + # port: ${MONGO_PORT} + # host: ${MONGO_HOST} + # database: ${MONGO_DATABASE} + # username: ${MONGO_USER} + # password: ${MONGO_PASSWORD} x: jwt: From 1740fb829cca9bc758cb3be6971d50b23a16d383 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Fri, 8 Nov 2024 19:36:27 +0900 Subject: [PATCH 104/123] =?UTF-8?q?HOTFIX:=20RedisConfig=20=ED=99=98?= =?UTF-8?q?=EA=B2=BD=EB=B3=80=EC=88=98=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/leets/X/global/config/RedisConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/leets/X/global/config/RedisConfig.java b/src/main/java/com/leets/X/global/config/RedisConfig.java index 55fe2c9..403d918 100644 --- a/src/main/java/com/leets/X/global/config/RedisConfig.java +++ b/src/main/java/com/leets/X/global/config/RedisConfig.java @@ -30,7 +30,7 @@ public class RedisConfig { public RedisConnectionFactory redisConnectionFactory(){ // Redis 연동 설정 Host 주소와 Post를 주입해준 redisStandaloneConfiguration를 RedisStandaloneConfiguration redisStandaloneConfiguration = - new RedisStandaloneConfiguration("localhost", 6379); + new RedisStandaloneConfiguration(redisHost, redisPort); // LettuceConnectionFactory의 생성자로 다시 넣어준다. return new LettuceConnectionFactory(redisStandaloneConfiguration); } From 301b23d66a1e6424f63e2c6b5f4388cc6d81da5e Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Fri, 8 Nov 2024 21:58:41 +0900 Subject: [PATCH 105/123] =?UTF-8?q?Refactor=20:=20=EB=93=A4=EC=97=AC?= =?UTF-8?q?=EC=93=B0=EA=B8=B0=20=EC=88=98=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/leets/X/domain/post/domain/Post.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/leets/X/domain/post/domain/Post.java b/src/main/java/com/leets/X/domain/post/domain/Post.java index c19a5b9..3fc6723 100644 --- a/src/main/java/com/leets/X/domain/post/domain/Post.java +++ b/src/main/java/com/leets/X/domain/post/domain/Post.java @@ -1,6 +1,6 @@ package com.leets.X.domain.post.domain; -import com.leets.X.domain.comment.domain.Comment; + import com.leets.X.domain.image.domain.Image; import com.leets.X.domain.like.domain.Like; import com.leets.X.domain.post.domain.enums.IsDeleted; From 5d3ac81cde28236ab7c48f3515eb9e9e6f864419 Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Fri, 8 Nov 2024 22:25:53 +0900 Subject: [PATCH 106/123] =?UTF-8?q?Feat=20:=20=EB=AA=A8=EB=93=A0=20?= =?UTF-8?q?=EA=B8=80=20=EC=A1=B0=ED=9A=8C=20=EB=B0=8F=20=EC=83=81=EC=84=B8?= =?UTF-8?q?=20=EC=A1=B0=ED=9A=8C=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/controller/PostController.java | 18 +++++--- .../X/domain/post/service/PostService.java | 42 ++++++++++++++----- 2 files changed, 43 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/leets/X/domain/post/controller/PostController.java b/src/main/java/com/leets/X/domain/post/controller/PostController.java index de2d328..4184929 100644 --- a/src/main/java/com/leets/X/domain/post/controller/PostController.java +++ b/src/main/java/com/leets/X/domain/post/controller/PostController.java @@ -1,6 +1,6 @@ package com.leets.X.domain.post.controller; -import com.leets.X.domain.post.domain.Post; + import com.leets.X.domain.post.dto.request.PostRequestDTO; import com.leets.X.domain.post.dto.response.PostResponseDto; import com.leets.X.domain.post.service.PostService; @@ -8,13 +8,11 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; import java.util.List; -import java.util.Map; -//컨트롤러에서 ResponseDto만들게끔 + @Tag(name = "POST") @RestController @RequestMapping("/api/v1/posts") @@ -23,14 +21,22 @@ public class PostController { private final PostService postService; - // 게시물 Id조회 + // 게시물 상세 조회(자식 게시물 까지 함께 조회됨) @GetMapping("/{id}") - @Operation(summary = "게시물 ID로 조회") + @Operation(summary = "게시물 ID로 상세 조회") public ResponseDto getPost(@PathVariable Long id, @AuthenticationPrincipal String email) { PostResponseDto postResponseDto = postService.getPostResponse(id, email); return ResponseDto.response(ResponseMessage.GET_POST_SUCCESS.getCode(), ResponseMessage.GET_POST_SUCCESS.getMessage(), postResponseDto); } + // 모든 부모게시물 조회 + @GetMapping("/all") + @Operation(summary = "전체 부모 글 조회") + public ResponseDto> getAllParentPosts(@AuthenticationPrincipal String email) { + List posts = postService.getAllParentPosts(email); + return ResponseDto.response(ResponseMessage.GET_ALL_PARENT_POSTS_SUCCESS.getCode(), ResponseMessage.GET_ALL_PARENT_POSTS_SUCCESS.getMessage(), posts); + } + @GetMapping("/likes") @Operation(summary = "좋아요 수로 정렬한 게시물 조회") diff --git a/src/main/java/com/leets/X/domain/post/service/PostService.java b/src/main/java/com/leets/X/domain/post/service/PostService.java index ed476dd..9b828a1 100644 --- a/src/main/java/com/leets/X/domain/post/service/PostService.java +++ b/src/main/java/com/leets/X/domain/post/service/PostService.java @@ -34,18 +34,36 @@ public class PostService { private final UserService userService; private final LikeRepository likeRepository; + //모든글 조회(자식 글은 조회 안되게) + public List getAllParentPosts(String email) { + User user = userService.find(email); + + // 모든 부모글들을 조회 + List posts = postRepository.findByParentIsNullAndIsDeletedOrderByCreatedAtDesc(IsDeleted.ACTIVE); + + + + // Post 객체를 PostResponseDto로 변환하여 반환 + return posts.stream() + .map(post -> PostResponseDto.withoutReplies(post, user, likeRepository)) + .collect(Collectors.toList()); + } + + // 게시물 ID로 조회 public PostResponseDto getPostResponse(Long id, String email) { - Post post = findPost(id); - // 삭제되지 않은 게시물만 조회 가능하게끔 수정 - if (post.getIsDeleted() != IsDeleted.ACTIVE) { - throw new PostNotFoundException(); - } + // 특정 부모 글과 자식 글을 함께 조회하는 메서드를 사용하여 단일 게시물 조회 + Post post = postRepository.findWithRepliesByIdAndIsDeleted(id,IsDeleted.ACTIVE) + .orElseThrow(PostNotFoundException::new); // 게시물이 없을 때 예외 발생 + + // 사용자 정보 조회 User user = userService.find(email); - return PostResponseDto.from(post,user,likeRepository); + // PostResponseDto 생성 및 반환 + return PostResponseDto.from(post, user, likeRepository); } + // 좋아요 수로 정렬한 게시물 조회 (직접 구현) public List getPostsSortedByLikes(String email) { User user = userService.find(email); // 현재 사용자 정보 조회 @@ -58,16 +76,18 @@ public List getPostsSortedByLikes(String email) { .collect(Collectors.toList()); } - // 최신 게시물 조회 - public List getLatestPosts(String email) { User user = userService.find(email); - // 최신 10개 게시물 조회 - List posts = postRepository.findTop10ByOrderByCreatedAtDesc(); + + // 최신 부모 글 10개 조회 (답글 제외) + List posts = postRepository.findByParentIsNullAndIsDeletedOrderByCreatedAtDesc(IsDeleted.ACTIVE) + .stream() + .limit(10) // 10개로 제한 + .collect(Collectors.toList()); // Post 객체를 PostResponseDto로 변환하여 반환 return posts.stream() - .map(post -> PostResponseDto.from(post, user, likeRepository)) // Post 객체를 PostResponseDto로 변환 + .map(post -> PostResponseDto.withoutReplies(post, user, likeRepository)) // Post 객체를 PostResponseDto로 변환 .collect(Collectors.toList()); } From 1ca3a61d26eae97195724e9fa4d50627a06cc973 Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Fri, 8 Nov 2024 22:26:21 +0900 Subject: [PATCH 107/123] =?UTF-8?q?Feat=20:=20=EB=AA=A8=EB=93=A0=20?= =?UTF-8?q?=EA=B2=8C=EC=8B=9C=EA=B8=80=20=EC=A1=B0=ED=9A=8C=20=EC=84=B1?= =?UTF-8?q?=EA=B3=B5=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/leets/X/domain/post/controller/ResponseMessage.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/leets/X/domain/post/controller/ResponseMessage.java b/src/main/java/com/leets/X/domain/post/controller/ResponseMessage.java index dbcafe2..d32c59d 100644 --- a/src/main/java/com/leets/X/domain/post/controller/ResponseMessage.java +++ b/src/main/java/com/leets/X/domain/post/controller/ResponseMessage.java @@ -14,7 +14,8 @@ public enum ResponseMessage { ADD_LIKE_SUCCESS(201, "좋아요가 추가되었습니다."), POST_DELETED_SUCCESS(200, "게시물이 성공적으로 삭제되었습니다."), LIKE_CANCEL_SUCCESS(200, "좋아요가 성공적으로 취소되었습니다."), - REPLY_SUCCESS(201, "답글이 생성되었습니다."); + REPLY_SUCCESS(201, "답글이 생성되었습니다."), + GET_ALL_PARENT_POSTS_SUCCESS(200, "모든 게시글 조회에 성공하였습니다."); private final int code; private final String message; From 31ed1a235d999c750a461077929fd3142d185277 Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Fri, 8 Nov 2024 22:27:27 +0900 Subject: [PATCH 108/123] =?UTF-8?q?Feat=20:=20=EC=A0=84=EC=B2=B4=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=EC=99=80,=20=EC=83=81=EC=84=B8=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../X/domain/post/repository/PostRepository.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/com/leets/X/domain/post/repository/PostRepository.java b/src/main/java/com/leets/X/domain/post/repository/PostRepository.java index f9fc584..35ecc2c 100644 --- a/src/main/java/com/leets/X/domain/post/repository/PostRepository.java +++ b/src/main/java/com/leets/X/domain/post/repository/PostRepository.java @@ -1,11 +1,27 @@ package com.leets.X.domain.post.repository; import com.leets.X.domain.post.domain.Post; +import com.leets.X.domain.post.domain.enums.IsDeleted; +import io.lettuce.core.dynamic.annotation.Param; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; import java.util.List; +import java.util.Optional; +@Repository public interface PostRepository extends JpaRepository { List findTop10ByOrderByCreatedAtDesc(); // 최신 10개 게시물 조회하기위해 구현 + + +// 부모 글만 조회하고, 자식 글은 포함하지 않음 + List findByParentIsNullAndIsDeletedOrderByCreatedAtDesc(IsDeleted isDeleted); + + // 특정 부모 글과 자식 글을 함께 조회하는 메서드 (페치 조인 자동 생성) + Optional findWithRepliesByIdAndIsDeleted(Long postId, IsDeleted isDeleted); + } + + From 52b8fc9826c2d16f0bd70103fe2b41d0155ed69c Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Fri, 8 Nov 2024 22:28:07 +0900 Subject: [PATCH 109/123] =?UTF-8?q?Feat:=20Replies=EB=A5=BC=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=EC=95=88=ED=95=98=EB=8A=94=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=98=A4=EB=B2=84=EB=A1=9C=EB=94=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/dto/response/PostResponseDto.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java b/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java index 38ad46f..469e1c3 100644 --- a/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java +++ b/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java @@ -25,6 +25,8 @@ public record PostResponseDto( List replies, Boolean isLikedByUser // 좋아요 여부 확인 ) { + + public static PostResponseDto from(Post post) { return new PostResponseDto( @@ -41,6 +43,25 @@ public static PostResponseDto from(Post post) { ); } + // 전체 조회 시 자식 글을 제외하고 부모 글만 가져오기 위한 메서드 + public static PostResponseDto withoutReplies(Post post, User user, LikeRepository likeRepository) { + boolean isLikedByUser = user != null && likeRepository.existsByPostAndUser(post, user); + + return new PostResponseDto( + post.getId(), + post.getContent(), + post.getViews(), + post.getIsDeleted(), + post.getCreatedAt(), + convertUser(post.getUser()), + convertImagesToDtoList(post), + post.getLikesCount(), + Collections.emptyList(), // replies는 빈 리스트로 설정하여 자식 글을 제외 + isLikedByUser + ); + } + + // 좋아요 여부를 확인하기 위한 메서드 오버로딩 public static PostResponseDto from(Post post, User user, LikeRepository likeRepository) { boolean isLikedByUser = user != null && likeRepository.existsByPostAndUser(post, user); // 좋아요 여부 확인 From d6b3ac88f0be600a33c0dc74f46f8998b61044a6 Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Sat, 9 Nov 2024 17:05:13 +0900 Subject: [PATCH 110/123] =?UTF-8?q?Refactor:=20post=20=EA=B0=9D=EC=B2=B4?= =?UTF-8?q?=EC=97=90=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=BA=A1=EC=8A=90?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/leets/X/domain/post/domain/Post.java | 30 ++++++++++++------- .../dto/response/ParentPostResponseDto.java | 4 +++ .../leets/X/global/auth/jwt/JwtFilter.java | 2 +- .../leets/X/global/config/RedisConfig.java | 1 + src/main/resources/application-local.yml | 23 +++++++------- src/main/resources/application.yml | 6 ++-- 6 files changed, 39 insertions(+), 27 deletions(-) create mode 100644 src/main/java/com/leets/X/domain/post/dto/response/ParentPostResponseDto.java diff --git a/src/main/java/com/leets/X/domain/post/domain/Post.java b/src/main/java/com/leets/X/domain/post/domain/Post.java index 3fc6723..3516ac3 100644 --- a/src/main/java/com/leets/X/domain/post/domain/Post.java +++ b/src/main/java/com/leets/X/domain/post/domain/Post.java @@ -58,7 +58,7 @@ public class Post extends BaseTimeEntity { private Long likeCount = 0L; // 기본값을 0L로 초기화하여 null을 방지 public void updateLikeCount(long newLikeCount) { - this.likeCount = newLikeCount; + this.likeCount = newLikeCount; } @@ -67,7 +67,6 @@ public long getLikesCount() { } - // 서비스에서 글의 상태를 삭제 상태로 바꾸기 위한 메서드 public void delete() { if (this.isDeleted == IsDeleted.ACTIVE) { // 이미 삭제 상태가 아닐 때만 변경 @@ -78,15 +77,26 @@ public void delete() { // 정적 메서드로 글 생성 public static Post create(User user, String content) { return Post.builder() - .user(user) - .content(content) - .views(0) // 기본 조회 수 - .likeCount(0L) // 좋아요 갯수 추가 - .isDeleted(IsDeleted.ACTIVE) // 기본값 ACTIVE로 설정 - .images(new ArrayList<>()) // 빈 리스트로 초기화 - .build(); - } + .user(user) + .content(content) + .views(0) // 기본 조회 수 + .likeCount(0L) // 좋아요 갯수 추가 + .isDeleted(IsDeleted.ACTIVE) // 기본값 ACTIVE로 설정 + .images(new ArrayList<>()) // 빈 리스트로 초기화 + .build(); + } + // 정적 팩토리 메서드 + public static Post create(User user, String content, Post parent) { + return Post.builder() + .user(user) + .content(content) + .views(0) // 기본값 설정 + .likeCount(0L) // 기본값 설정 + .isDeleted(IsDeleted.ACTIVE) // 기본값 설정 + .parent(parent) // 부모 글 설정 + .build(); + } } diff --git a/src/main/java/com/leets/X/domain/post/dto/response/ParentPostResponseDto.java b/src/main/java/com/leets/X/domain/post/dto/response/ParentPostResponseDto.java new file mode 100644 index 0000000..8711a3b --- /dev/null +++ b/src/main/java/com/leets/X/domain/post/dto/response/ParentPostResponseDto.java @@ -0,0 +1,4 @@ +package com.leets.X.domain.post.dto.response; + +public record ParentPostResponseDto() { +} diff --git a/src/main/java/com/leets/X/global/auth/jwt/JwtFilter.java b/src/main/java/com/leets/X/global/auth/jwt/JwtFilter.java index fcb0c19..4f24e4f 100644 --- a/src/main/java/com/leets/X/global/auth/jwt/JwtFilter.java +++ b/src/main/java/com/leets/X/global/auth/jwt/JwtFilter.java @@ -23,7 +23,7 @@ public class JwtFilter extends OncePerRequestFilter { private final JwtProvider jwtProvider; @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,FilterChain filterChain) throws ServletException, IOException { String token = getToken(request); try { diff --git a/src/main/java/com/leets/X/global/config/RedisConfig.java b/src/main/java/com/leets/X/global/config/RedisConfig.java index 403d918..18b8af6 100644 --- a/src/main/java/com/leets/X/global/config/RedisConfig.java +++ b/src/main/java/com/leets/X/global/config/RedisConfig.java @@ -4,6 +4,7 @@ import com.leets.X.domain.chat.redis.RedisSubscriber; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.data.redis.RedisProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index d9b001f..48a5a3a 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -1,8 +1,8 @@ spring: datasource: - url: ${DB_URL} - username: ${DB_USER} - password: ${DB_PASSWORD} + url: jdbc:mysql://localhost:3307/x + username: root + password: root driver-class-name: com.mysql.cj.jdbc.Driver jpa: show-sql: true @@ -13,20 +13,17 @@ spring: ddl-auto: update data: redis: - host: ${REDIS_HOST} - port: ${REDIS_PORT} + port: 6379 + host: localhost mongodb: uri: mongodb://localhost:27017/testdb - x: jwt: - key: ${JWT_KEY} + key: a2f5ace34a791d5ad31e820291bc1aa90be266da58d090e58871e324f11d96b9 access: - expiration: ${ACCESS_EXP} - header: ${ACCESS_HEAD} + expiration: 3600000 + header: Authorization refresh: - expiration: ${REFRESH_EXP} - header: ${REFRESH_HEAD} - - + expiration: 1209600000 + header: Authorization_refresh diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 8b84b45..8ac9060 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -8,9 +8,9 @@ springdoc: tags-sorter: alpha google: - client-id: ${GOOGLE_CLIENT_ID} - client-secret: ${GOOGLE_CLIENT_SECRET} - redirect-uri: ${GOOGLE_REDIRECT_URI} + client-id: "40557714074-1f0jhi5lrlqtls0c05bagj890hsb1m9v.apps.googleusercontent.com" + client-secret: "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" + redirect-uri: "http://localhost:3000/login/oauth2/code/google" grant-type: authorization_code authorization-uri: https://accounts.google.com/o/oauth2/auth token-uri: https://oauth2.googleapis.com/token From 02ea5cc4f52699e08adeb87f4f2c4c79a6d8fe6e Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Sat, 9 Nov 2024 17:06:14 +0900 Subject: [PATCH 111/123] =?UTF-8?q?Feat=20:=20=EC=97=AD=ED=95=A0=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=EB=A5=BC=20=EC=9C=84=ED=95=9C,=20=EB=B6=80?= =?UTF-8?q?=EB=AA=A8=EA=B8=80=EB=A7=8C=20=EC=A1=B0=ED=9A=8C=ED=95=98?= =?UTF-8?q?=EB=8A=94=20dto=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/ParentPostResponseDto.java | 44 ++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/leets/X/domain/post/dto/response/ParentPostResponseDto.java b/src/main/java/com/leets/X/domain/post/dto/response/ParentPostResponseDto.java index 8711a3b..3ad2428 100644 --- a/src/main/java/com/leets/X/domain/post/dto/response/ParentPostResponseDto.java +++ b/src/main/java/com/leets/X/domain/post/dto/response/ParentPostResponseDto.java @@ -1,4 +1,46 @@ package com.leets.X.domain.post.dto.response; -public record ParentPostResponseDto() { +import com.leets.X.domain.post.domain.Post; +import com.leets.X.domain.post.domain.enums.IsDeleted; +import com.leets.X.domain.user.domain.User; + +import java.time.LocalDateTime; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public record ParentPostResponseDto( + Long id, + String content, + Integer views, + IsDeleted isDeleted, + LocalDateTime createdAt, + PostUserResponse user, + List images, + Long likeCount, + Boolean isLikedByUser +) { + public static ParentPostResponseDto from(Post post, boolean isLikedByUser) { + return new ParentPostResponseDto( + post.getId(), + post.getContent(), + post.getViews(), + post.getIsDeleted(), + post.getCreatedAt(), + convertUser(post.getUser()), // User 변환 + convertImagesToDtoList(post), // Images 변환 + post.getLikesCount(), + isLikedByUser // 좋아요 여부 설정 + ); +} + + private static PostUserResponse convertUser(User user) { + return user != null ? PostUserResponse.from(user) : null; + } + + private static List convertImagesToDtoList(Post post) { + return post.getImages() != null ? post.getImages().stream() + .map(ImageResponseDto::from) + .collect(Collectors.toList()) : Collections.emptyList(); + } } From a10a37d71a27abe25de39e2c10211aeb1ee1136d Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Sat, 9 Nov 2024 17:06:51 +0900 Subject: [PATCH 112/123] =?UTF-8?q?Refactor:=20withOutReplies=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20Dto=EB=A1=9C=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/dto/response/PostResponseDto.java | 26 +++---------------- 1 file changed, 3 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java b/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java index 469e1c3..274e408 100644 --- a/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java +++ b/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java @@ -27,8 +27,7 @@ public record PostResponseDto( ) { - public static PostResponseDto from(Post post) { - + public static PostResponseDto from(Post post, boolean isLikedByUser) { return new PostResponseDto( post.getId(), post.getContent(), @@ -39,25 +38,7 @@ public static PostResponseDto from(Post post) { convertImagesToDtoList(post), post.getLikesCount(), convertRepliesToDtoList(post.getReplies()), - false - - ); - } - // 전체 조회 시 자식 글을 제외하고 부모 글만 가져오기 위한 메서드 - public static PostResponseDto withoutReplies(Post post, User user, LikeRepository likeRepository) { - boolean isLikedByUser = user != null && likeRepository.existsByPostAndUser(post, user); - - return new PostResponseDto( - post.getId(), - post.getContent(), - post.getViews(), - post.getIsDeleted(), - post.getCreatedAt(), - convertUser(post.getUser()), - convertImagesToDtoList(post), - post.getLikesCount(), - Collections.emptyList(), // replies는 빈 리스트로 설정하여 자식 글을 제외 - isLikedByUser + isLikedByUser // 서비스에서 전달된 boolean 값 사용 ); } @@ -83,10 +64,9 @@ public static PostResponseDto from(Post post, User user, LikeRepository likeRepo private static List convertRepliesToDtoList(List replies) { return replies != null ? replies.stream() - .map(PostResponseDto::from) + .map(reply -> PostResponseDto.from(reply, false)) // 기본적으로 isLikedByUser를 false로 설정 .collect(Collectors.toList()) : Collections.emptyList(); } - private static PostUserResponse convertUser(User user) { return user != null ? PostUserResponse.from(user) : null; } From 03d3636e868989896022c3db4e7c785ca453652a Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Sat, 9 Nov 2024 17:08:13 +0900 Subject: [PATCH 113/123] =?UTF-8?q?Refactor=20:=20=EB=B6=80=EB=AA=A8?= =?UTF-8?q?=EA=B8=80=EB=A7=8C=20=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20Dto?= =?UTF-8?q?=EB=8A=94=20=EB=B0=98=ED=99=98=ED=83=80=EC=9E=85=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets/X/domain/post/controller/PostController.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/leets/X/domain/post/controller/PostController.java b/src/main/java/com/leets/X/domain/post/controller/PostController.java index 4184929..e229f6e 100644 --- a/src/main/java/com/leets/X/domain/post/controller/PostController.java +++ b/src/main/java/com/leets/X/domain/post/controller/PostController.java @@ -2,6 +2,7 @@ import com.leets.X.domain.post.dto.request.PostRequestDTO; +import com.leets.X.domain.post.dto.response.ParentPostResponseDto; import com.leets.X.domain.post.dto.response.PostResponseDto; import com.leets.X.domain.post.service.PostService; import com.leets.X.global.common.response.ResponseDto; @@ -32,8 +33,8 @@ public ResponseDto getPost(@PathVariable Long id, @Authenticati // 모든 부모게시물 조회 @GetMapping("/all") @Operation(summary = "전체 부모 글 조회") - public ResponseDto> getAllParentPosts(@AuthenticationPrincipal String email) { - List posts = postService.getAllParentPosts(email); + public ResponseDto> getAllParentPosts(@AuthenticationPrincipal String email) { + List posts = postService.getAllParentPosts(email); return ResponseDto.response(ResponseMessage.GET_ALL_PARENT_POSTS_SUCCESS.getCode(), ResponseMessage.GET_ALL_PARENT_POSTS_SUCCESS.getMessage(), posts); } @@ -48,8 +49,8 @@ public ResponseDto> getPostsSortedByLikes(@AuthenticationP @GetMapping("/latest") @Operation(summary = "최신 게시물 조회") - public ResponseDto> getLatestPosts(@AuthenticationPrincipal String email) { - List posts = postService.getLatestPosts(email); + public ResponseDto> getLatestPosts(@AuthenticationPrincipal String email) { + List posts = postService.getLatestParentPosts(email); return ResponseDto.response(ResponseMessage.GET_LATEST_POST_SUCCESS.getCode(), ResponseMessage.GET_LATEST_POST_SUCCESS.getMessage(), posts); } From 330b7f6e363675553b4d761be7209075d78277f1 Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Sat, 9 Nov 2024 17:10:27 +0900 Subject: [PATCH 114/123] =?UTF-8?q?Refactor:=20=EC=A2=8B=EC=95=84=EC=9A=94?= =?UTF-8?q?=20=EC=B2=B4=ED=81=AC=20=EC=97=AC=EB=B6=80=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=EA=B3=84=EC=B8=B5=EC=97=90=EC=84=9C=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84,=20=EB=B0=98=ED=99=98=ED=83=80=EC=9E=85,=20=EB=A7=A4?= =?UTF-8?q?=EA=B0=9C=EB=B3=80=EC=88=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../X/domain/post/service/PostService.java | 123 +++++++----------- 1 file changed, 44 insertions(+), 79 deletions(-) diff --git a/src/main/java/com/leets/X/domain/post/service/PostService.java b/src/main/java/com/leets/X/domain/post/service/PostService.java index 9b828a1..83a1aa3 100644 --- a/src/main/java/com/leets/X/domain/post/service/PostService.java +++ b/src/main/java/com/leets/X/domain/post/service/PostService.java @@ -2,10 +2,10 @@ import com.leets.X.domain.like.domain.Like; import com.leets.X.domain.like.repository.LikeRepository; -import com.leets.X.domain.post.controller.ResponseMessage; import com.leets.X.domain.post.domain.Post; import com.leets.X.domain.post.domain.enums.IsDeleted; import com.leets.X.domain.post.dto.request.PostRequestDTO; +import com.leets.X.domain.post.dto.response.ParentPostResponseDto; import com.leets.X.domain.post.dto.response.PostResponseDto; import com.leets.X.domain.post.dto.response.PostUserResponse; import com.leets.X.domain.post.exception.AlreadyLikedException; @@ -16,12 +16,10 @@ import com.leets.X.domain.user.domain.User; import com.leets.X.domain.user.exception.UserNotFoundException; import com.leets.X.domain.user.service.UserService; -import com.leets.X.global.common.response.ResponseDto; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.time.LocalDateTime; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -34,98 +32,89 @@ public class PostService { private final UserService userService; private final LikeRepository likeRepository; - //모든글 조회(자식 글은 조회 안되게) - public List getAllParentPosts(String email) { + // 모든 부모 글만 조회 (자식 글 제외) + public List getAllParentPosts(String email) { User user = userService.find(email); - // 모든 부모글들을 조회 List posts = postRepository.findByParentIsNullAndIsDeletedOrderByCreatedAtDesc(IsDeleted.ACTIVE); - - - // Post 객체를 PostResponseDto로 변환하여 반환 return posts.stream() - .map(post -> PostResponseDto.withoutReplies(post, user, likeRepository)) + .map(post -> { + boolean isLikedByUser = likeRepository.existsByPostAndUser(post, user); + return ParentPostResponseDto.from(post, isLikedByUser); + }) .collect(Collectors.toList()); } - - // 게시물 ID로 조회 + // 전체 게시물 조회 (자식 글 포함) public PostResponseDto getPostResponse(Long id, String email) { - // 특정 부모 글과 자식 글을 함께 조회하는 메서드를 사용하여 단일 게시물 조회 - Post post = postRepository.findWithRepliesByIdAndIsDeleted(id,IsDeleted.ACTIVE) - .orElseThrow(PostNotFoundException::new); // 게시물이 없을 때 예외 발생 + Post post = postRepository.findWithRepliesByIdAndIsDeleted(id, IsDeleted.ACTIVE) + .orElseThrow(PostNotFoundException::new); - // 사용자 정보 조회 User user = userService.find(email); + boolean isLikedByUser = likeRepository.existsByPostAndUser(post, user); - // PostResponseDto 생성 및 반환 - return PostResponseDto.from(post, user, likeRepository); + return PostResponseDto.from(post, isLikedByUser); } - - // 좋아요 수로 정렬한 게시물 조회 (직접 구현) + // 좋아요 순으로 게시물 조회 public List getPostsSortedByLikes(String email) { - User user = userService.find(email); // 현재 사용자 정보 조회 - + User user = userService.find(email); List posts = postRepository.findAll(); + return posts.stream() .filter(post -> post.getIsDeleted() == IsDeleted.ACTIVE) .sorted(Comparator.comparing(Post::getLikesCount).reversed()) - .map(post -> PostResponseDto.from(post, user, likeRepository)) // 좋아요 여부 반영 + .map(post -> { + boolean isLikedByUser = likeRepository.existsByPostAndUser(post, user); + return PostResponseDto.from(post, isLikedByUser); + }) .collect(Collectors.toList()); } - public List getLatestPosts(String email) { + // 최신 부모 글 10개 조회 (자식 글 제외) + public List getLatestParentPosts(String email) { User user = userService.find(email); - // 최신 부모 글 10개 조회 (답글 제외) List posts = postRepository.findByParentIsNullAndIsDeletedOrderByCreatedAtDesc(IsDeleted.ACTIVE) .stream() - .limit(10) // 10개로 제한 + .limit(10) .collect(Collectors.toList()); - // Post 객체를 PostResponseDto로 변환하여 반환 return posts.stream() - .map(post -> PostResponseDto.withoutReplies(post, user, likeRepository)) // Post 객체를 PostResponseDto로 변환 + .map(post -> { + boolean isLikedByUser = likeRepository.existsByPostAndUser(post, user); + return ParentPostResponseDto.from(post, isLikedByUser); + }) .collect(Collectors.toList()); } - - // 글 생성 (Refactoring) + // 글 생성 @Transactional public PostResponseDto createPost(PostRequestDTO postRequestDTO, String email) { - // 이메일로 사용자 조회 - User user = userService.find(email); // JWT에서 추출한 이메일 사용 + User user = userService.find(email); if (user == null) { throw new UserNotFoundException(); } - Post post = Post.create(user, postRequestDTO.content()); // 글 생성 로직 캡슐화 + Post post = Post.create(user, postRequestDTO.content(), null); Post savedPost = postRepository.save(post); - // 저장된 게시글을 ResponseDto에 담아 반환 - return PostResponseDto.from(savedPost); + return PostResponseDto.from(savedPost, false); } - //좋아요 추가 + // 좋아요 추가 @Transactional public String addLike(Long postId, String email) { Post post = findPost(postId); User user = userService.find(email); - // 좋아요가 이미 있는지 확인 if (likeRepository.existsByPostAndUser(post, user)) { throw new AlreadyLikedException(); } - // 새로운 Like 객체 생성 및 저장 - Like newLike = new Like(post, user); - likeRepository.save(newLike); - - - // 좋아요 수 갱신 - updateLikecount(post); + likeRepository.save(new Like(post, user)); + updateLikeCount(post); return "좋아요가 추가되었습니다. 현재 좋아요 수: " + post.getLikesCount(); } @@ -133,83 +122,59 @@ public String addLike(Long postId, String email) { // 답글 생성 @Transactional public PostResponseDto createReply(Long parentId, PostRequestDTO postRequestDTO, String email) { - // 이메일을 통해 사용자 조회 User user = userService.find(email); - - // 부모 글 조회 Post parentPost = findPost(parentId); - // 답글 생성 - Post reply = createPost(postRequestDTO, user, parentPost); // 메서드 호출 + Post reply = Post.create(user, postRequestDTO.content(), parentPost); + Post savedReply = postRepository.save(reply); - // 답글 저장 후 DTO로 변환하여 반환 - return PostResponseDto.from(postRepository.save(reply)); + return PostResponseDto.from(savedReply, false); } - // 게시물 삭제 @Transactional public void deletePost(Long postId, String email) { Post post = findPost(postId); User user = userService.find(email); - // 게시물의 소유자인지 확인 if (!post.getUser().equals(user)) { throw new UnauthorizedPostDeletionException(); } - // 게시물 상태를 삭제 상태로 변경 - post.delete(); // delete 메서드 호출로 상태를 변경 + post.delete(); } - //좋아요 취소 + // 좋아요 취소 @Transactional public String cancelLike(Long postId, String email) { Post post = findPost(postId); User user = userService.find(email); - // 좋아요 여부 확인 후 삭제 if (!likeRepository.existsByPostAndUser(post, user)) { - throw new NotLikedException(); // 예외로 변경 + throw new NotLikedException(); } - // Like 객체 삭제 likeRepository.deleteByPostAndUser(post, user); - - updateLikecount(post); + updateLikeCount(post); return "좋아요가 삭제되었습니다. 현재 좋아요 수: " + post.getLikesCount(); } - //엔티티 내 메서드를 통해 좋아요 수 갱신 후 DB 반영 + // 좋아요 수 갱신 @Transactional - public void updateLikecount (Post post) { + public void updateLikeCount(Post post) { long actualLikeCount = likeRepository.countByPost(post); post.updateLikeCount(actualLikeCount); postRepository.save(post); } - // 자주 중복되는 코드 메서드로 뽑기 public Post findPost(Long postId) { return postRepository.findById(postId) - .orElseThrow(() -> new PostNotFoundException()); + .orElseThrow(PostNotFoundException::new); } - // 사용자 정보를 가져와 PostUserResponse를 반환하는 메서드 public PostUserResponse findUser(String email) { User user = userService.find(email); - return PostUserResponse.from(user); // PostUserResponse로 변환하여 반환 - } - - private Post createPost(PostRequestDTO postRequestDTO, User user, Post parentPost) { - return Post.builder() - .user(user) - .content(postRequestDTO.content()) // DTO에서 내용 가져오기 - .views(0) - .likeCount(0L) - .isDeleted(IsDeleted.ACTIVE) - .parent(parentPost) // 부모 글 설정 - .build(); + return PostUserResponse.from(user); } - } From 4bb0652661ae6e2bc6891a73ce7cbf5da0850ca6 Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Sat, 9 Nov 2024 18:12:07 +0900 Subject: [PATCH 115/123] =?UTF-8?q?fix=20:=20=EA=B9=83=20=EC=BB=A4?= =?UTF-8?q?=EB=B0=8B=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Conflicts: # src/main/java/com/leets/X/domain/post/service/PostService.java --- src/main/java/com/leets/X/domain/post/service/PostService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/leets/X/domain/post/service/PostService.java b/src/main/java/com/leets/X/domain/post/service/PostService.java index 83a1aa3..5ca12a3 100644 --- a/src/main/java/com/leets/X/domain/post/service/PostService.java +++ b/src/main/java/com/leets/X/domain/post/service/PostService.java @@ -177,4 +177,4 @@ public PostUserResponse findUser(String email) { User user = userService.find(email); return PostUserResponse.from(user); } -} +} \ No newline at end of file From 5fae1e064ca38f56b52b5ea79cbbad9022fe9c04 Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Sat, 9 Nov 2024 18:13:57 +0900 Subject: [PATCH 116/123] =?UTF-8?q?fix=20:=20=EA=B9=83=20=EC=BB=A4?= =?UTF-8?q?=EB=B0=8B=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/leets/X/domain/post/service/PostService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/leets/X/domain/post/service/PostService.java b/src/main/java/com/leets/X/domain/post/service/PostService.java index 5ca12a3..83a1aa3 100644 --- a/src/main/java/com/leets/X/domain/post/service/PostService.java +++ b/src/main/java/com/leets/X/domain/post/service/PostService.java @@ -177,4 +177,4 @@ public PostUserResponse findUser(String email) { User user = userService.find(email); return PostUserResponse.from(user); } -} \ No newline at end of file +} From c395976575e120fa71502c8ac63f59d217b32025 Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Sat, 9 Nov 2024 18:24:11 +0900 Subject: [PATCH 117/123] =?UTF-8?q?=20fix=20:=EB=A1=9C=EC=BB=AC=20?= =?UTF-8?q?=EC=9B=90=EA=B2=A9=20=EC=BB=A4=EB=B0=8B=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-local.yml | 10 +++++----- src/main/resources/application.yml | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index 48a5a3a..c7b6b46 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -1,8 +1,8 @@ spring: datasource: - url: jdbc:mysql://localhost:3307/x - username: root - password: root + url: ${DB_URL} + username: ${DB_USER} + password: ${DB_PASSWORD} driver-class-name: com.mysql.cj.jdbc.Driver jpa: show-sql: true @@ -13,8 +13,8 @@ spring: ddl-auto: update data: redis: - port: 6379 - host: localhost + port: ${REDIS_PORT} + host: ${REDIS_HOST} mongodb: uri: mongodb://localhost:27017/testdb diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 8ac9060..8b84b45 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -8,9 +8,9 @@ springdoc: tags-sorter: alpha google: - client-id: "40557714074-1f0jhi5lrlqtls0c05bagj890hsb1m9v.apps.googleusercontent.com" - client-secret: "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" - redirect-uri: "http://localhost:3000/login/oauth2/code/google" + client-id: ${GOOGLE_CLIENT_ID} + client-secret: ${GOOGLE_CLIENT_SECRET} + redirect-uri: ${GOOGLE_REDIRECT_URI} grant-type: authorization_code authorization-uri: https://accounts.google.com/o/oauth2/auth token-uri: https://oauth2.googleapis.com/token From a6a31137f68e7c4ccf4d5a646f9f68e35a1e6858 Mon Sep 17 00:00:00 2001 From: seokjun01 Date: Sun, 10 Nov 2024 00:58:00 +0900 Subject: [PATCH 118/123] =?UTF-8?q?fix=20:=20=ED=99=98=EA=B2=BD=EB=B3=80?= =?UTF-8?q?=EC=88=98=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-local.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index c7b6b46..0af36bc 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -20,10 +20,10 @@ spring: x: jwt: - key: a2f5ace34a791d5ad31e820291bc1aa90be266da58d090e58871e324f11d96b9 + key: ${JWT_KEY} access: - expiration: 3600000 - header: Authorization + expiration: ${ACCESS_EXP} + header: ${ACCESS_HEAD} refresh: - expiration: 1209600000 - header: Authorization_refresh + expiration: ${REFRESH_EXP} + header: ${REFRESH_HEAD} From b2653cbf37a5df8479208141f90024b17050f0f4 Mon Sep 17 00:00:00 2001 From: koreaioi Date: Sun, 10 Nov 2024 01:03:52 +0900 Subject: [PATCH 119/123] =?UTF-8?q?HOTFIX:=20add=20RedisListener=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../leets/X/domain/chat/controller/ChatRoomController.java | 6 ++++++ .../com/leets/X/domain/chat/service/ChatRoomService.java | 6 ++++++ .../com/leets/X/domain/chat/service/ChattingService.java | 3 +++ 3 files changed, 15 insertions(+) diff --git a/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java b/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java index 2d750a3..fc011e6 100644 --- a/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java +++ b/src/main/java/com/leets/X/domain/chat/controller/ChatRoomController.java @@ -36,4 +36,10 @@ public ResponseDto existChatRoom(@PathVariable Long user1Id return ResponseDto.response(GET_ROOMID.getCode(), GET_ROOMID.getMessage(), response); } + + @PostMapping("/{roomId}") // addListener 테스트 용 + public void addListener(@PathVariable @NotNull Long roomId) { + chatRoomService.addListener(roomId); + log.info(roomId+":addListener"); + } } diff --git a/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java b/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java index 3c6832e..0bb610f 100644 --- a/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java +++ b/src/main/java/com/leets/X/domain/chat/service/ChatRoomService.java @@ -41,4 +41,10 @@ public ChatRoomResponseDto findUser1User2ChatRoom(Long user1Id , Long user2Id) { .orElseThrow(NotFoundChatRoomException::new); return new ChatRoomResponseDto(result); } + + // 테스트를 위해서 만들어둠. 추후 삭제 + public void addListener(Long roomId) { + redisMessageListener.adaptMessageListener(roomId); // 리스너 등록 + } + } diff --git a/src/main/java/com/leets/X/domain/chat/service/ChattingService.java b/src/main/java/com/leets/X/domain/chat/service/ChattingService.java index f30c49e..e7af8fa 100644 --- a/src/main/java/com/leets/X/domain/chat/service/ChattingService.java +++ b/src/main/java/com/leets/X/domain/chat/service/ChattingService.java @@ -8,6 +8,7 @@ import com.leets.X.domain.chat.entity.ChatMessage; import com.leets.X.domain.chat.entity.ChatRoom; import com.leets.X.domain.chat.exception.NotFoundChatRoomException; +import com.leets.X.domain.chat.redis.RedisListener; import com.leets.X.domain.chat.repository.ChatMessageRepository; import com.leets.X.domain.chat.repository.ChatRoomRepository; import com.leets.X.domain.user.domain.User; @@ -24,11 +25,13 @@ public class ChattingService { private final ChatRoomRepository chatRoomRepository; private final ChatMessageRepository chatMessageRepository; + private final RedisListener redisMessageListener; public ChattingDto getChatRoom(Long roomId, Integer page, Integer size) { ChatRoom findRoom = validateChatRoom(roomId); User user1 = findRoom.getUser1(); User user2 = findRoom.getUser2(); + redisMessageListener.adaptMessageListener(findRoom.getId()); // 채팅방 내역 조회시 리스너 등록 추가 (운영 시 삭제) List chatMessageList = generateChatRoomMessages(roomId, page, size); return new ChattingDto(user1.getId(), user2.getId(), user1.getCustomId(), user2.getCustomId(), chatMessageList); From a5750241581fd7c2401688d74370d9a59e77b71d Mon Sep 17 00:00:00 2001 From: hyxklee Date: Sun, 10 Nov 2024 18:20:48 +0900 Subject: [PATCH 120/123] =?UTF-8?q?refactor:=20=EC=B6=A9=EB=8F=8C=20?= =?UTF-8?q?=EB=B3=91=ED=95=A9=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/leets/X/domain/post/domain/Post.java | 5 +++++ .../leets/X/domain/post/dto/response/PostResponseDto.java | 3 +-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/leets/X/domain/post/domain/Post.java b/src/main/java/com/leets/X/domain/post/domain/Post.java index a31ef37..9721497 100644 --- a/src/main/java/com/leets/X/domain/post/domain/Post.java +++ b/src/main/java/com/leets/X/domain/post/domain/Post.java @@ -103,8 +103,13 @@ public static Post create(User user, String content, Post parent) { .likeCount(0L) // 기본값 설정 .isDeleted(IsDeleted.ACTIVE) // 기본값 설정 .parent(parent) // 부모 글 설정 + .images(new ArrayList<>()) // 빈 리스트로 초기화 .build(); } + + public void addImage(List images) { + this.images.addAll(images); // 기존 리스트에 이미지 추가 + } } diff --git a/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java b/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java index cb6087c..1abb29e 100644 --- a/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java +++ b/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java @@ -21,7 +21,7 @@ public record PostResponseDto( IsDeleted isDeleted, LocalDateTime createdAt, PostUserResponse user, - List images, + List images, Long likeCount, List replies, Boolean isLikedByUser // 좋아요 여부 확인 @@ -78,7 +78,6 @@ private static List convertImagesToDtoList(Post post) { .toList(); } - } From 6ecb1a66e9e6594f28e07b9eac1daee414369cee Mon Sep 17 00:00:00 2001 From: hyxklee Date: Sun, 10 Nov 2024 18:21:13 +0900 Subject: [PATCH 121/123] =?UTF-8?q?refactor:=20=EC=B6=A9=EB=8F=8C=20?= =?UTF-8?q?=EB=B3=91=ED=95=A9=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/controller/PostController.java | 27 ++++++--------- .../X/domain/post/service/PostService.java | 34 +++++++------------ 2 files changed, 24 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/leets/X/domain/post/controller/PostController.java b/src/main/java/com/leets/X/domain/post/controller/PostController.java index 6349178..6bec614 100644 --- a/src/main/java/com/leets/X/domain/post/controller/PostController.java +++ b/src/main/java/com/leets/X/domain/post/controller/PostController.java @@ -60,11 +60,13 @@ public ResponseDto> getLatestPosts(@AuthenticationPr } - @PostMapping("/post") + @PostMapping(value = "/post", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @Operation(summary = "글 생성") - public ResponseDto createPost(@RequestBody PostRequestDTO postRequestDTO, @AuthenticationPrincipal String email) { + public ResponseDto createPost(@RequestPart PostRequestDTO postRequestDTO, + @RequestPart(value = "files", required = false) List files, + @AuthenticationPrincipal String email) throws IOException { // 인증된 사용자의 이메일을 `@AuthenticationPrincipal`을 통해 주입받음 - PostResponseDto postResponseDto = postService.createPost(postRequestDTO, email); + PostResponseDto postResponseDto = postService.createPost(postRequestDTO, files , email); return ResponseDto.response(ResponseMessage.POST_SUCCESS.getCode(), ResponseMessage.POST_SUCCESS.getMessage(), postResponseDto); } @@ -75,11 +77,14 @@ public ResponseDto addLike(@PathVariable Long postId, @AuthenticationPri return ResponseDto.response(ResponseMessage.ADD_LIKE_SUCCESS.getCode(), responseMessage); } - @PostMapping("/{postId}/reply") + @PostMapping(value = "/{postId}/reply", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @Operation(summary = "답글 생성") - public ResponseDto createReply(@PathVariable Long postId, @RequestBody PostRequestDTO postRequestDTO, @AuthenticationPrincipal String email) { + public ResponseDto createReply(@PathVariable Long postId, + @RequestPart PostRequestDTO postRequestDTO, + @RequestPart(value = "files", required = false) List files, + @AuthenticationPrincipal String email) throws IOException { // 답글 생성 서비스 호출 (부모 ID를 직접 전달) - PostResponseDto postResponseDto = postService.createReply(postId, postRequestDTO, email); + PostResponseDto postResponseDto = postService.createReply(postId, postRequestDTO, files, email); return ResponseDto.response(ResponseMessage.REPLY_SUCCESS.getCode(), ResponseMessage.REPLY_SUCCESS.getMessage(), postResponseDto); } @@ -99,14 +104,4 @@ public ResponseDto cancelLike(@PathVariable Long postId, @Authentication return ResponseDto.response(ResponseMessage.LIKE_CANCEL_SUCCESS.getCode(), responseMessage); } - @PostMapping(value = "/post-image", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - @Operation(summary = "글 생성") - public ResponseDto createPost(@RequestPart PostRequestDTO postRequestDTO, - @RequestParam(value = "files", required = false) List files, - @AuthenticationPrincipal String email) throws IOException { - - PostResponseDto postResponseDto = postService.createPostImage(postRequestDTO, files, email); - return ResponseDto.response(ResponseMessage.POST_SUCCESS.getCode(), ResponseMessage.POST_SUCCESS.getMessage(), postResponseDto); - } - } diff --git a/src/main/java/com/leets/X/domain/post/service/PostService.java b/src/main/java/com/leets/X/domain/post/service/PostService.java index c958409..25f9fa4 100644 --- a/src/main/java/com/leets/X/domain/post/service/PostService.java +++ b/src/main/java/com/leets/X/domain/post/service/PostService.java @@ -4,7 +4,6 @@ import com.leets.X.domain.image.service.ImageService; import com.leets.X.domain.like.domain.Like; import com.leets.X.domain.like.repository.LikeRepository; -import com.leets.X.domain.post.controller.ResponseMessage; import com.leets.X.domain.post.domain.Post; import com.leets.X.domain.post.domain.enums.IsDeleted; import com.leets.X.domain.post.dto.request.PostRequestDTO; @@ -19,14 +18,12 @@ import com.leets.X.domain.user.domain.User; import com.leets.X.domain.user.exception.UserNotFoundException; import com.leets.X.domain.user.service.UserService; -import com.leets.X.global.common.response.ResponseDto; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.time.LocalDateTime; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -38,6 +35,7 @@ public class PostService { private final PostRepository postRepository; private final UserService userService; private final LikeRepository likeRepository; + private final ImageService imageService; // 모든 부모 글만 조회 (자식 글 제외) public List getAllParentPosts(String email) { @@ -98,7 +96,7 @@ public List getLatestParentPosts(String email) { // 글 생성 @Transactional - public PostResponseDto createPost(PostRequestDTO postRequestDTO, String email) { + public PostResponseDto createPost(PostRequestDTO postRequestDTO,List files, String email) throws IOException { User user = userService.find(email); if (user == null) { throw new UserNotFoundException(); @@ -107,6 +105,11 @@ public PostResponseDto createPost(PostRequestDTO postRequestDTO, String email) { Post post = Post.create(user, postRequestDTO.content(), null); Post savedPost = postRepository.save(post); + if (files != null) { + List images = imageService.save(files, savedPost); + savedPost.addImage(images); + } + return PostResponseDto.from(savedPost, false); } @@ -128,13 +131,18 @@ public String addLike(Long postId, String email) { // 답글 생성 @Transactional - public PostResponseDto createReply(Long parentId, PostRequestDTO postRequestDTO, String email) { + public PostResponseDto createReply(Long parentId, PostRequestDTO postRequestDTO, List files, String email) throws IOException { User user = userService.find(email); Post parentPost = findPost(parentId); Post reply = Post.create(user, postRequestDTO.content(), parentPost); Post savedReply = postRepository.save(reply); + if (files != null) { + List images = imageService.save(files, savedReply); + savedReply.addImage(images); + } + return PostResponseDto.from(savedReply, false); } @@ -186,20 +194,4 @@ public PostUserResponse findUser(String email) { return PostUserResponse.from(user); } - @Transactional - public PostResponseDto createPostImage(PostRequestDTO postRequestDTO, List files, String email) throws IOException { - // 이메일로 사용자 조회 - User user = userService.find(email); // JWT에서 추출한 이메일 사용 - - Post post = Post.create(user, postRequestDTO.content()); // 글 생성 로직 캡슐화 - Post savedPost = postRepository.save(post); - - if (files != null) { - List images = imageService.save(files, savedPost); - post.addImage(images); - } - - // 저장된 게시글을 ResponseDto에 담아 반환 - return PostResponseDto.from(savedPost); - } } From 686022f9b3b6675da2b3db3e96c55727c9615d0b Mon Sep 17 00:00:00 2001 From: hyxklee Date: Sun, 10 Nov 2024 18:27:46 +0900 Subject: [PATCH 122/123] =?UTF-8?q?refactor:=20=EB=A1=9C=EB=94=A9=20?= =?UTF-8?q?=ED=83=80=EC=9E=85=20=EB=AA=85=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/leets/X/domain/image/domain/Image.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/leets/X/domain/image/domain/Image.java b/src/main/java/com/leets/X/domain/image/domain/Image.java index 351daf6..12ba864 100644 --- a/src/main/java/com/leets/X/domain/image/domain/Image.java +++ b/src/main/java/com/leets/X/domain/image/domain/Image.java @@ -22,7 +22,7 @@ public class Image extends BaseTimeEntity { private String url; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "post_Id") private Post post; From 7307b459b6db574ef67c8413c319a76b2baec185 Mon Sep 17 00:00:00 2001 From: hyxklee Date: Sun, 10 Nov 2024 18:33:07 +0900 Subject: [PATCH 123/123] =?UTF-8?q?refactor:=20dto=20=ED=95=AD=EB=AA=A9=20?= =?UTF-8?q?=EC=88=9C=EC=84=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/ParentPostResponseDto.java | 10 ++++----- .../post/dto/response/PostResponseDto.java | 22 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/leets/X/domain/post/dto/response/ParentPostResponseDto.java b/src/main/java/com/leets/X/domain/post/dto/response/ParentPostResponseDto.java index 3ad2428..72761dd 100644 --- a/src/main/java/com/leets/X/domain/post/dto/response/ParentPostResponseDto.java +++ b/src/main/java/com/leets/X/domain/post/dto/response/ParentPostResponseDto.java @@ -16,9 +16,9 @@ public record ParentPostResponseDto( IsDeleted isDeleted, LocalDateTime createdAt, PostUserResponse user, - List images, Long likeCount, - Boolean isLikedByUser + Boolean isLikedByUser, + List images ) { public static ParentPostResponseDto from(Post post, boolean isLikedByUser) { return new ParentPostResponseDto( @@ -28,10 +28,10 @@ public static ParentPostResponseDto from(Post post, boolean isLikedByUser) { post.getIsDeleted(), post.getCreatedAt(), convertUser(post.getUser()), // User 변환 - convertImagesToDtoList(post), // Images 변환 post.getLikesCount(), - isLikedByUser // 좋아요 여부 설정 - ); + isLikedByUser, // 좋아요 여부 설정 + convertImagesToDtoList(post) // Images 변환 + ); } private static PostUserResponse convertUser(User user) { diff --git a/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java b/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java index 1abb29e..0aad551 100644 --- a/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java +++ b/src/main/java/com/leets/X/domain/post/dto/response/PostResponseDto.java @@ -21,10 +21,10 @@ public record PostResponseDto( IsDeleted isDeleted, LocalDateTime createdAt, PostUserResponse user, - List images, Long likeCount, - List replies, - Boolean isLikedByUser // 좋아요 여부 확인 + Boolean isLikedByUser, // 좋아요 여부 확인 + List images, + List replies ) { @@ -36,11 +36,11 @@ public static PostResponseDto from(Post post, boolean isLikedByUser) { post.getIsDeleted(), post.getCreatedAt(), convertUser(post.getUser()), - convertImagesToDtoList(post), post.getLikesCount(), - convertRepliesToDtoList(post.getReplies()), - isLikedByUser // 서비스에서 전달된 boolean 값 사용 - ); + isLikedByUser, // 서비스에서 전달된 boolean 값 사용 + convertImagesToDtoList(post), + convertRepliesToDtoList(post.getReplies()) + ); } @@ -55,11 +55,11 @@ public static PostResponseDto from(Post post, User user, LikeRepository likeRepo post.getIsDeleted(), post.getCreatedAt(), convertUser(post.getUser()), - convertImagesToDtoList(post), post.getLikesCount(), - convertRepliesToDtoList(post.getReplies()), - isLikedByUser // 좋아요 여부를 동적으로 설정 - ); + isLikedByUser, // 좋아요 여부를 동적으로 설정 + convertImagesToDtoList(post), + convertRepliesToDtoList(post.getReplies()) + ); }