From e2a8fc93d56d3b122ccfc86ecaae00d2e95115cf Mon Sep 17 00:00:00 2001 From: rokaf6444 Date: Thu, 14 Nov 2024 01:40:00 +0900 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=EB=AC=B8=EC=9E=90=20=EC=9E=84?= =?UTF-8?q?=EC=8B=9C=20=EC=A0=80=EC=9E=A5=20=EA=B8=B0=EB=8A=A5=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 --- .../message/controller/MessageController.java | 12 +++++++ .../com/pictalk/message/domain/Message.java | 12 +++++-- .../pictalk/message/domain/MessageStatus.java | 3 +- .../com/pictalk/message/domain/Receiver.java | 4 +++ .../message/dto/MessageRequestDto.java | 7 ++++ .../message/dto/MessageResponseDto.java | 7 ++++ .../message/service/MessageService.java | 36 +++++++++++++++++++ 7 files changed, 78 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/pictalk/message/controller/MessageController.java b/src/main/java/com/pictalk/message/controller/MessageController.java index 4f149fd..0e35cb5 100644 --- a/src/main/java/com/pictalk/message/controller/MessageController.java +++ b/src/main/java/com/pictalk/message/controller/MessageController.java @@ -3,7 +3,9 @@ import com.pictalk.global.payload.response.CommonResponse; import com.pictalk.message.dto.MessageRequestDto.SendMessageRequest; import com.pictalk.message.dto.MessageResponseDto.*; +import com.pictalk.message.dto.MessageRequestDto.TempMessageRequest; import com.pictalk.message.service.MessageService; +import io.swagger.v3.oas.annotations.Operation; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -53,4 +55,14 @@ public CommonResponse deleteMessage(@AuthenticationPrincipal UserDetails a messageService.deleteMessage(messageId, userEmail); return CommonResponse.onSuccess(null); } + + @Operation(summary = "Save a temporary message") + @PostMapping("/temp") + public CommonResponse saveTempMessage( + @AuthenticationPrincipal UserDetails authenticatedPrincipal, + @Valid @RequestBody TempMessageRequest request) { + String userEmail = authenticatedPrincipal.getUsername(); + TempMessageResponse response = messageService.saveTempMessage(request, userEmail); + return CommonResponse.onSuccess(response); + } } diff --git a/src/main/java/com/pictalk/message/domain/Message.java b/src/main/java/com/pictalk/message/domain/Message.java index a27ad2a..3a82f12 100644 --- a/src/main/java/com/pictalk/message/domain/Message.java +++ b/src/main/java/com/pictalk/message/domain/Message.java @@ -14,9 +14,11 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToMany; import jakarta.persistence.Table; + import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; + import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -61,8 +63,14 @@ public class Message extends BaseEntity { @Builder.Default private boolean deleted = false; - public void addReceivers(List receivers) { - this.receivers.addAll(receivers); + public void addReceivers(List newReceivers) { + this.receivers.addAll(newReceivers); + newReceivers.forEach(receiver -> receiver.associateWithMessage(this)); + } + + public void addReceiver(Receiver receiver) { + this.receivers.add(receiver); + receiver.associateWithMessage(this); } public void cancel() { diff --git a/src/main/java/com/pictalk/message/domain/MessageStatus.java b/src/main/java/com/pictalk/message/domain/MessageStatus.java index 138485c..dbc4258 100644 --- a/src/main/java/com/pictalk/message/domain/MessageStatus.java +++ b/src/main/java/com/pictalk/message/domain/MessageStatus.java @@ -3,5 +3,6 @@ public enum MessageStatus { SCHEDULED, // 예약됨 SENT, // 전송됨 - CANCELLED // 예약 취소됨 + CANCELLED, // 예약 취소됨 + TEMP // 임시 저장됨 } diff --git a/src/main/java/com/pictalk/message/domain/Receiver.java b/src/main/java/com/pictalk/message/domain/Receiver.java index 630d3de..4eeb118 100644 --- a/src/main/java/com/pictalk/message/domain/Receiver.java +++ b/src/main/java/com/pictalk/message/domain/Receiver.java @@ -44,4 +44,8 @@ public class Receiver { protected void onCreate() { createdAt = LocalDateTime.now(); } + + public void associateWithMessage(Message message) { + this.message = message; + } } diff --git a/src/main/java/com/pictalk/message/dto/MessageRequestDto.java b/src/main/java/com/pictalk/message/dto/MessageRequestDto.java index 49c9269..cf1d2b5 100644 --- a/src/main/java/com/pictalk/message/dto/MessageRequestDto.java +++ b/src/main/java/com/pictalk/message/dto/MessageRequestDto.java @@ -62,6 +62,13 @@ public static class FileDto { private String data; } + @Getter + public static class TempMessageRequest { + private String content; + private String to; + private String sendTime; + } + @Getter public static class CreateAIMessageRequest { private String situation; diff --git a/src/main/java/com/pictalk/message/dto/MessageResponseDto.java b/src/main/java/com/pictalk/message/dto/MessageResponseDto.java index e1a66d0..8e58c2d 100644 --- a/src/main/java/com/pictalk/message/dto/MessageResponseDto.java +++ b/src/main/java/com/pictalk/message/dto/MessageResponseDto.java @@ -37,6 +37,13 @@ public static class CancelMessageResponse { private String status; } + @Getter + @Builder + public static class TempMessageResponse { + private Long messageId; + private String status; + } + @Getter @Builder public static class CreateAIMessageResponse { diff --git a/src/main/java/com/pictalk/message/service/MessageService.java b/src/main/java/com/pictalk/message/service/MessageService.java index 13769a7..824dcfb 100644 --- a/src/main/java/com/pictalk/message/service/MessageService.java +++ b/src/main/java/com/pictalk/message/service/MessageService.java @@ -6,6 +6,7 @@ import com.pictalk.message.dto.MessageRequestDto.*; import com.pictalk.message.dto.MessageResponseDto.*; import com.pictalk.message.repository.MessageRepository; +import com.pictalk.message.repository.SenderRepository; import com.pictalk.user.domain.User; import com.pictalk.user.repository.UserRepository; import lombok.RequiredArgsConstructor; @@ -20,6 +21,7 @@ @RequiredArgsConstructor public class MessageService { private final MessageRepository messageRepository; + private final SenderRepository senderRepository; private final UserRepository userRepository; private final ImmediateMessageService immediateMessageService; private final ScheduledMessageService scheduledMessageService; @@ -94,4 +96,38 @@ public void deleteMessage(Long messageId, String userEmail) { public CancelMessageResponse cancelScheduledMessage(Long messageId, String userEmail) { return scheduledMessageService.cancelScheduledMessage(messageId, userEmail); } + + @Transactional + public TempMessageResponse saveTempMessage(TempMessageRequest request, String userEmail) { + User user = userRepository.findByEmail(userEmail) + .orElseThrow(() -> new GeneralException(ErrorStatus.USER_NOT_FOUND)); + + Sender sender = senderRepository.findSenderByPhoneNumber(request.getTo()) + .orElseGet(() -> senderRepository.save( + Sender.builder() + .user(user) + .phoneNumber(request.getTo()) + .build() + )); + + Message tempMessage = Message.builder() + .sender(sender) + .content(request.getContent()) + .status(MessageStatus.TEMP) + .sentAt(LocalDateTime.parse(request.getSendTime())) + .build(); + + Receiver receiver = Receiver.builder() + .message(tempMessage) + .phoneNumber(request.getTo()) + .build(); + + tempMessage.addReceiver(receiver); + Message savedMessage = messageRepository.save(tempMessage); + + return TempMessageResponse.builder() + .messageId(savedMessage.getId()) + .status("temp") + .build(); + } } From a64047aec3915d7cc4efd0e784967586488024b2 Mon Sep 17 00:00:00 2001 From: rokaf6444 Date: Thu, 14 Nov 2024 15:51:15 +0900 Subject: [PATCH 2/5] =?UTF-8?q?chore:=20Ppurio=20API=20=EC=84=A4=EC=A0=95?= =?UTF-8?q?=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.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index e6fcc17..404b8f4 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -54,4 +54,10 @@ cloud: region: static: ${AWS_S3_REGION} stack: - auto: false \ No newline at end of file + auto: false + +ppurio: + api: + url: ${PPURIO_API_URL} + key: ${PPURIO_API_KEY} + account: ${PPURIO_ACCOUNT} \ No newline at end of file From c1ef4e1acbd7ccda6983d87814c13ef853ccd681 Mon Sep 17 00:00:00 2001 From: rokaf6444 Date: Sat, 16 Nov 2024 21:46:17 +0900 Subject: [PATCH 3/5] feat: WIP --- .../global/config/RestTemplateConfig.java | 14 + .../com/pictalk/global/jwt/JwtService.java | 4 +- .../message/controller/MessageController.java | 13 +- .../com/pictalk/message/domain/Message.java | 8 + .../com/pictalk/message/domain/Request.java | 20 ++ .../message/dto/MessageRequestDto.java | 8 +- .../repository/MessageImageRepository.java | 4 +- .../service/ImmediateMessageService.java | 72 ------ .../message/service/MessageService.java | 239 +++++++++++++----- .../service/ScheduledMessageService.java | 92 ------- src/main/resources/application.yml | 2 +- 11 files changed, 234 insertions(+), 242 deletions(-) create mode 100644 src/main/java/com/pictalk/global/config/RestTemplateConfig.java create mode 100644 src/main/java/com/pictalk/message/domain/Request.java delete mode 100644 src/main/java/com/pictalk/message/service/ImmediateMessageService.java delete mode 100644 src/main/java/com/pictalk/message/service/ScheduledMessageService.java diff --git a/src/main/java/com/pictalk/global/config/RestTemplateConfig.java b/src/main/java/com/pictalk/global/config/RestTemplateConfig.java new file mode 100644 index 0000000..034ccf5 --- /dev/null +++ b/src/main/java/com/pictalk/global/config/RestTemplateConfig.java @@ -0,0 +1,14 @@ +package com.pictalk.global.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class RestTemplateConfig { + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } +} diff --git a/src/main/java/com/pictalk/global/jwt/JwtService.java b/src/main/java/com/pictalk/global/jwt/JwtService.java index 0442160..5f2ab3f 100644 --- a/src/main/java/com/pictalk/global/jwt/JwtService.java +++ b/src/main/java/com/pictalk/global/jwt/JwtService.java @@ -69,7 +69,7 @@ public String createRefreshToken() { .compact(); } -// saveAndFlush 사용으로 @Transactional은 없어도 될 듯 + // saveAndFlush 사용으로 @Transactional은 없어도 될 듯 public String reIssueRefreshToken(User user) { String reIssuedRefreshToken = createRefreshToken(); user.updateRefreshToken(reIssuedRefreshToken); @@ -122,4 +122,4 @@ public Optional decodeAccessToken(String accessToken) { return Optional.empty(); // 유효하지 않은 경우 빈 값 반환 } } -} +} \ No newline at end of file diff --git a/src/main/java/com/pictalk/message/controller/MessageController.java b/src/main/java/com/pictalk/message/controller/MessageController.java index 0e35cb5..5fd1429 100644 --- a/src/main/java/com/pictalk/message/controller/MessageController.java +++ b/src/main/java/com/pictalk/message/controller/MessageController.java @@ -1,7 +1,9 @@ package com.pictalk.message.controller; import com.pictalk.global.payload.response.CommonResponse; +import com.pictalk.message.dto.MessageRequestDto; import com.pictalk.message.dto.MessageRequestDto.SendMessageRequest; +import com.pictalk.message.dto.MessageResponseDto; import com.pictalk.message.dto.MessageResponseDto.*; import com.pictalk.message.dto.MessageRequestDto.TempMessageRequest; import com.pictalk.message.service.MessageService; @@ -22,9 +24,9 @@ public class MessageController { private final MessageService messageService; @PostMapping("/send") - public CommonResponse sendMessage(@AuthenticationPrincipal UserDetails authenticatedPrincipal, @Valid @RequestBody SendMessageRequest request) { + public CommonResponse sendMessage(@AuthenticationPrincipal UserDetails authenticatedPrincipal, @Valid @RequestBody MessageRequestDto.SendMessageRequest request) { String userEmail = authenticatedPrincipal.getUsername(); - SendMessageResponse response = messageService.sendMessage(request, userEmail); + MessageResponseDto.SendMessageResponse response = messageService.sendMessage(request, userEmail); return CommonResponse.onSuccess(response); } @@ -56,13 +58,12 @@ public CommonResponse deleteMessage(@AuthenticationPrincipal UserDetails a return CommonResponse.onSuccess(null); } - @Operation(summary = "Save a temporary message") @PostMapping("/temp") - public CommonResponse saveTempMessage( + public CommonResponse saveTempMessage( @AuthenticationPrincipal UserDetails authenticatedPrincipal, - @Valid @RequestBody TempMessageRequest request) { + @Valid @RequestBody MessageRequestDto.TempMessageRequest request) { String userEmail = authenticatedPrincipal.getUsername(); - TempMessageResponse response = messageService.saveTempMessage(request, userEmail); + MessageResponseDto.TempMessageResponse response = messageService.saveTempMessage(request, userEmail); return CommonResponse.onSuccess(response); } } diff --git a/src/main/java/com/pictalk/message/domain/Message.java b/src/main/java/com/pictalk/message/domain/Message.java index 3a82f12..6f6fc3d 100644 --- a/src/main/java/com/pictalk/message/domain/Message.java +++ b/src/main/java/com/pictalk/message/domain/Message.java @@ -63,6 +63,9 @@ public class Message extends BaseEntity { @Builder.Default private boolean deleted = false; + @Column(name = "external_message_id") + private String externalMessageId; + public void addReceivers(List newReceivers) { this.receivers.addAll(newReceivers); newReceivers.forEach(receiver -> receiver.associateWithMessage(this)); @@ -82,4 +85,9 @@ public void cancel() { public void softDelete() { this.deleted = true; } + + public Message withExternalMessageId(String externalMessageId) { + this.externalMessageId = externalMessageId; + return this; + } } diff --git a/src/main/java/com/pictalk/message/domain/Request.java b/src/main/java/com/pictalk/message/domain/Request.java new file mode 100644 index 0000000..99d0682 --- /dev/null +++ b/src/main/java/com/pictalk/message/domain/Request.java @@ -0,0 +1,20 @@ +package com.pictalk.message.domain; + +public class Request { + + private String requestUri; + private String authorization; + + public Request(String requestUri, String authorization) { + this.requestUri = requestUri; + this.authorization = authorization; + } + + public String getRequestUri() { + return requestUri; + } + + public String getAuthorization() { + return authorization; + } +} diff --git a/src/main/java/com/pictalk/message/dto/MessageRequestDto.java b/src/main/java/com/pictalk/message/dto/MessageRequestDto.java index cf1d2b5..c54f064 100644 --- a/src/main/java/com/pictalk/message/dto/MessageRequestDto.java +++ b/src/main/java/com/pictalk/message/dto/MessageRequestDto.java @@ -22,10 +22,10 @@ public static class SendMessageRequest { private int targetCount; private List targets; private String refKey; - private String rejectType; - private String sendTime; - private String subject; - private List files; +// private String rejectType; +// private String sendTime; +// private String subject; +// private List files; } @Getter diff --git a/src/main/java/com/pictalk/message/repository/MessageImageRepository.java b/src/main/java/com/pictalk/message/repository/MessageImageRepository.java index 3abfa67..bec475d 100644 --- a/src/main/java/com/pictalk/message/repository/MessageImageRepository.java +++ b/src/main/java/com/pictalk/message/repository/MessageImageRepository.java @@ -7,5 +7,5 @@ public interface MessageImageRepository extends JpaRepository { List findAllByMessage(Message message); - -} + +} \ No newline at end of file diff --git a/src/main/java/com/pictalk/message/service/ImmediateMessageService.java b/src/main/java/com/pictalk/message/service/ImmediateMessageService.java deleted file mode 100644 index ac059b4..0000000 --- a/src/main/java/com/pictalk/message/service/ImmediateMessageService.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.pictalk.message.service; - -import com.pictalk.global.exception.GeneralException; -import com.pictalk.global.payload.status.ErrorStatus; -import com.pictalk.message.domain.*; -import com.pictalk.message.dto.MessageRequestDto.SendMessageRequest; -import com.pictalk.message.dto.MessageResponseDto.SendMessageResponse; -import com.pictalk.message.repository.MessageRepository; -import com.pictalk.message.repository.SenderRepository; -import com.pictalk.user.domain.User; -import com.pictalk.user.repository.UserRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.stream.Collectors; - -@Service -@RequiredArgsConstructor -public class ImmediateMessageService { - private final MessageRepository messageRepository; - private final SenderRepository senderRepository; - private final UserRepository userRepository; - - @Transactional - public SendMessageResponse sendImmediateMessage(SendMessageRequest request, String userEmail) { - User user = userRepository.findByEmail(userEmail) - .orElseThrow(() -> new GeneralException(ErrorStatus.USER_NOT_FOUND)); - - Sender sender = senderRepository.findSenderByPhoneNumber(request.getFrom()) - .orElseGet(() -> senderRepository.save( - Sender.builder() - .user(user) - .nickname(request.getFrom()) - .phoneNumber(request.getFrom()) - .build() - )); - - Message message = Message.builder() - .sender(sender) - .content(request.getContent()) - .status(MessageStatus.SENT) - .sentAt(LocalDateTime.now()) - .build(); - - List receivers = request.getTargets().stream() - .map(target -> Receiver.builder() - .message(message) - .nickname(target.getName()) - .phoneNumber(target.getTo()) - .build()) - .collect(Collectors.toList()); - - message.addReceivers(receivers); - messageRepository.save(message); - - sendSms(message, receivers); - - return SendMessageResponse.builder() - .externalMessageId(String.valueOf(message.getId())) - .status("sent") - .build(); - } - - private void sendSms(Message message, List receivers) { - receivers.forEach(receiver -> { - System.out.println("Sending SMS to " + receiver.getPhoneNumber() + ": " + message.getContent()); - }); - } -} diff --git a/src/main/java/com/pictalk/message/service/MessageService.java b/src/main/java/com/pictalk/message/service/MessageService.java index 824dcfb..305d799 100644 --- a/src/main/java/com/pictalk/message/service/MessageService.java +++ b/src/main/java/com/pictalk/message/service/MessageService.java @@ -2,68 +2,199 @@ import com.pictalk.global.exception.GeneralException; import com.pictalk.global.payload.status.ErrorStatus; -import com.pictalk.message.domain.*; +import com.pictalk.message.domain.Message; +import com.pictalk.message.domain.MessageStatus; +import com.pictalk.message.domain.Receiver; +import com.pictalk.message.domain.Sender; import com.pictalk.message.dto.MessageRequestDto.*; import com.pictalk.message.dto.MessageResponseDto.*; import com.pictalk.message.repository.MessageRepository; +import com.pictalk.message.repository.ReceiverRepository; import com.pictalk.message.repository.SenderRepository; import com.pictalk.user.domain.User; import com.pictalk.user.repository.UserRepository; -import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.*; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.client.RestTemplate; import java.time.LocalDateTime; -import java.util.List; -import java.util.stream.Collectors; +import java.util.*; @Service -@RequiredArgsConstructor public class MessageService { + + @Value("${ppurio.api.url}") + private String apiUrl; + + @Value("${ppurio.api.key}") + private String apiKey; + + @Value("${ppurio.api.account}") + private String ppurioAccount; + + private final RestTemplate restTemplate; private final MessageRepository messageRepository; private final SenderRepository senderRepository; + private final ReceiverRepository receiverRepository; private final UserRepository userRepository; - private final ImmediateMessageService immediateMessageService; - private final ScheduledMessageService scheduledMessageService; + + public MessageService(RestTemplate restTemplate, MessageRepository messageRepository, + SenderRepository senderRepository, ReceiverRepository receiverRepository, + UserRepository userRepository) { + this.restTemplate = restTemplate; + this.messageRepository = messageRepository; + this.senderRepository = senderRepository; + this.receiverRepository = receiverRepository; + this.userRepository = userRepository; + } @Transactional public SendMessageResponse sendMessage(SendMessageRequest request, String userEmail) { - LocalDateTime sendTime = LocalDateTime.parse(request.getSendTime()); - LocalDateTime now = LocalDateTime.now(); + // 1. 사용자 및 발신자 정보 확인 + User user = userRepository.findByEmail(userEmail) + .orElseThrow(() -> new GeneralException(ErrorStatus.USER_NOT_FOUND)); - if (sendTime.isBefore(now)) { - throw new GeneralException(ErrorStatus.BAD_REQUEST); + Sender sender = senderRepository.findSenderByPhoneNumber(request.getFrom()) + .orElseGet(() -> senderRepository.save(Sender.builder() + .user(user) + .phoneNumber(request.getFrom()) + .build())); + + // 2. 메시지 엔티티 생성 + Message message = Message.builder() + .sender(sender) + .content(request.getContent()) + .status(MessageStatus.SCHEDULED) + .createdAt(LocalDateTime.now()) + .build(); + + // 3. 수신자 정보 추가 + for (Target target : request.getTargets()) { + Receiver receiver = Receiver.builder() + .phoneNumber(target.getTo()) + .nickname(target.getName()) + .build(); + message.addReceiver(receiver); } - if (sendTime.isEqual(now)) { - return immediateMessageService.sendImmediateMessage(request, userEmail); - } else { - return scheduledMessageService.scheduleMessage(request, userEmail); + message = messageRepository.save(message); + + try { + // 4. 토큰 발급 받기 + HttpHeaders tokenHeaders = new HttpHeaders(); + tokenHeaders.setContentType(MediaType.APPLICATION_JSON); + tokenHeaders.setBasicAuth(ppurioAccount, apiKey); + + HttpEntity tokenRequest = new HttpEntity<>(tokenHeaders); + + ResponseEntity tokenResponse = restTemplate.exchange( + apiUrl + "/v1/token", + HttpMethod.POST, + tokenRequest, + Map.class + ); + + if (tokenResponse.getStatusCode() != HttpStatus.OK || tokenResponse.getBody() == null) { + throw new GeneralException(ErrorStatus.INTERNAL_SERVER_ERROR); + } + + String accessToken = (String) tokenResponse.getBody().get("token"); + + // 5. 메시지 전송 요청 준비 + HttpHeaders messageHeaders = new HttpHeaders(); + messageHeaders.setContentType(MediaType.APPLICATION_JSON); + messageHeaders.setBearerAuth(accessToken); + + SendMessageRequest requestWithAccount = SendMessageRequest.builder() + .account(ppurioAccount) + .messageType(request.getMessageType()) + .content(request.getContent()) + .from(request.getFrom()) + .duplicateFlag(request.getDuplicateFlag()) + .targetCount(request.getTargets().size()) + .targets(request.getTargets()) + .refKey(request.getRefKey()) + .build(); + + HttpEntity messageEntity = new HttpEntity<>(requestWithAccount, messageHeaders); + + // 6. 메시지 전송 및 응답 처리 + ResponseEntity messageResponse = restTemplate.exchange( + apiUrl + "/v1/message", + HttpMethod.POST, + messageEntity, + Map.class + ); + + if (messageResponse.getStatusCode() == HttpStatus.OK && messageResponse.getBody() != null) { + String messageKey = (String) messageResponse.getBody().get("messageKey"); + message.withExternalMessageId(messageKey); + message = messageRepository.save(message); + + return SendMessageResponse.builder() + .externalMessageId(messageKey) + .status("success") + .build(); + } else { + System.out.println("Error sending message1"); + throw new GeneralException(ErrorStatus.INTERNAL_SERVER_ERROR); + } + + } catch (Exception e) { + System.out.println("Error sending message2"); + throw new GeneralException(ErrorStatus.INTERNAL_SERVER_ERROR); } } - public List getMessages(String userEmail) { + @Transactional + public TempMessageResponse saveTempMessage(TempMessageRequest request, String userEmail) { User user = userRepository.findByEmail(userEmail) .orElseThrow(() -> new GeneralException(ErrorStatus.USER_NOT_FOUND)); - List messages = messageRepository.findAllByDeletedFalseAndSenderUser(user); + Message tempMessage = Message.builder() + .sender(user.getSenders().get(0)) // Assuming the user has at least one sender + .content(request.getContent()) + .status(MessageStatus.TEMP) + .createdAt(LocalDateTime.now()) + .build(); - return messages.stream().map(message -> MessageResponse.builder() - .messageId(message.getId()) - .content(message.getContent()) - .to(getReceiversAsString(message.getReceivers())) - .sendTime(message.getSentAt() != null ? message.getSentAt().toString() : null) - .status(message.getStatus().toString()) - .build() - ).collect(Collectors.toList()); + Receiver receiver = Receiver.builder() + .phoneNumber(request.getTo()) + .build(); + tempMessage.addReceiver(receiver); + + tempMessage = messageRepository.save(tempMessage); + + return TempMessageResponse.builder() + .messageId(tempMessage.getId()) + .status("temp_saved") + .build(); } - private String getReceiversAsString(List receivers) { - return receivers.stream() - .map(Receiver::getPhoneNumber) - .collect(Collectors.joining(", ")); + @Transactional(readOnly = true) + public List getMessages(String userEmail) { + User user = userRepository.findByEmail(userEmail) + .orElseThrow(() -> new GeneralException(ErrorStatus.USER_NOT_FOUND)); + + List messages = messageRepository.findAllByDeletedFalseAndSenderUser(user); + List responses = new ArrayList<>(); + + for (Message message : messages) { + responses.add(MessageResponse.builder() + .messageId(message.getId()) + .content(message.getContent()) + .to(message.getReceivers().get(0).getPhoneNumber()) // Assuming single receiver + .sendTime(message.getSentAt() != null ? message.getSentAt().toString() : null) + .status(message.getStatus().toString()) + .build()); + } + + return responses; } + @Transactional(readOnly = true) public MessageResponse getMessage(Long messageId, String userEmail) { User user = userRepository.findByEmail(userEmail) .orElseThrow(() -> new GeneralException(ErrorStatus.USER_NOT_FOUND)); @@ -74,60 +205,42 @@ public MessageResponse getMessage(Long messageId, String userEmail) { return MessageResponse.builder() .messageId(message.getId()) .content(message.getContent()) - .to(getReceiversAsString(message.getReceivers())) + .to(message.getReceivers().get(0).getPhoneNumber()) // Assuming single receiver .sendTime(message.getSentAt() != null ? message.getSentAt().toString() : null) .status(message.getStatus().toString()) .build(); } @Transactional - public void deleteMessage(Long messageId, String userEmail) { + public CancelMessageResponse cancelScheduledMessage(Long messageId, String userEmail) { User user = userRepository.findByEmail(userEmail) .orElseThrow(() -> new GeneralException(ErrorStatus.USER_NOT_FOUND)); Message message = messageRepository.findByIdAndSenderUserAndDeletedFalse(messageId, user) .orElseThrow(() -> new GeneralException(ErrorStatus.MESSAGE_NOT_FOUND)); - message.softDelete(); + if (message.getStatus() != MessageStatus.SCHEDULED) { + throw new GeneralException(ErrorStatus.BAD_REQUEST); + } + + message.cancel(); messageRepository.save(message); - } - @Transactional - public CancelMessageResponse cancelScheduledMessage(Long messageId, String userEmail) { - return scheduledMessageService.cancelScheduledMessage(messageId, userEmail); + return CancelMessageResponse.builder() + .messageId(message.getId()) + .status(message.getStatus().toString()) + .build(); } @Transactional - public TempMessageResponse saveTempMessage(TempMessageRequest request, String userEmail) { + public void deleteMessage(Long messageId, String userEmail) { User user = userRepository.findByEmail(userEmail) .orElseThrow(() -> new GeneralException(ErrorStatus.USER_NOT_FOUND)); - Sender sender = senderRepository.findSenderByPhoneNumber(request.getTo()) - .orElseGet(() -> senderRepository.save( - Sender.builder() - .user(user) - .phoneNumber(request.getTo()) - .build() - )); - - Message tempMessage = Message.builder() - .sender(sender) - .content(request.getContent()) - .status(MessageStatus.TEMP) - .sentAt(LocalDateTime.parse(request.getSendTime())) - .build(); - - Receiver receiver = Receiver.builder() - .message(tempMessage) - .phoneNumber(request.getTo()) - .build(); - - tempMessage.addReceiver(receiver); - Message savedMessage = messageRepository.save(tempMessage); + Message message = messageRepository.findByIdAndSenderUserAndDeletedFalse(messageId, user) + .orElseThrow(() -> new GeneralException(ErrorStatus.MESSAGE_NOT_FOUND)); - return TempMessageResponse.builder() - .messageId(savedMessage.getId()) - .status("temp") - .build(); + message.softDelete(); + messageRepository.save(message); } } diff --git a/src/main/java/com/pictalk/message/service/ScheduledMessageService.java b/src/main/java/com/pictalk/message/service/ScheduledMessageService.java deleted file mode 100644 index 3868bca..0000000 --- a/src/main/java/com/pictalk/message/service/ScheduledMessageService.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.pictalk.message.service; - -import com.pictalk.global.exception.GeneralException; -import com.pictalk.global.payload.status.ErrorStatus; -import com.pictalk.message.domain.*; -import com.pictalk.message.dto.MessageRequestDto.SendMessageRequest; -import com.pictalk.message.dto.MessageResponseDto.SendMessageResponse; -import com.pictalk.message.dto.MessageResponseDto.CancelMessageResponse; -import com.pictalk.message.repository.MessageRepository; -import com.pictalk.message.repository.SenderRepository; -import com.pictalk.user.domain.User; -import com.pictalk.user.repository.UserRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.stream.Collectors; - -@Service -@RequiredArgsConstructor -public class ScheduledMessageService { - private final MessageRepository messageRepository; - private final SenderRepository senderRepository; - private final UserRepository userRepository; - - @Transactional - public SendMessageResponse scheduleMessage(SendMessageRequest request, String userEmail) { - User user = userRepository.findByEmail(userEmail) - .orElseThrow(() -> new GeneralException(ErrorStatus.USER_NOT_FOUND)); - - Sender sender = senderRepository.findSenderByPhoneNumber(request.getFrom()) - .orElseGet(() -> senderRepository.save( - Sender.builder() - .user(user) - .nickname(request.getFrom()) - .phoneNumber(request.getFrom()) - .build() - )); - - LocalDateTime scheduledTime = LocalDateTime.parse(request.getSendTime()); - - if (scheduledTime.isBefore(LocalDateTime.now())) { - throw new GeneralException(ErrorStatus.BAD_REQUEST); - } - - Message message = Message.builder() - .sender(sender) - .content(request.getContent()) - .status(MessageStatus.SCHEDULED) - .sentAt(scheduledTime) - .build(); - - List receivers = request.getTargets().stream() - .map(target -> Receiver.builder() - .message(message) - .nickname(target.getName()) - .phoneNumber(target.getTo()) - .build()) - .collect(Collectors.toList()); - - message.addReceivers(receivers); - messageRepository.save(message); - - return SendMessageResponse.builder() - .externalMessageId(String.valueOf(message.getId())) - .status("scheduled") - .build(); - } - - @Transactional - public CancelMessageResponse cancelScheduledMessage(Long messageId, String userEmail) { - User user = userRepository.findByEmail(userEmail) - .orElseThrow(() -> new GeneralException(ErrorStatus.USER_NOT_FOUND)); - - Message message = messageRepository.findByIdAndSenderUserAndDeletedFalse(messageId, user) - .orElseThrow(() -> new GeneralException(ErrorStatus.MESSAGE_NOT_FOUND)); - - if (message.getStatus() != MessageStatus.SCHEDULED) { - throw new GeneralException(ErrorStatus.BAD_REQUEST); - } - - message.cancel(); - messageRepository.save(message); - - return CancelMessageResponse.builder() - .messageId(message.getId()) - .status("cancelled") - .build(); - } -} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 404b8f4..0004a8f 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -60,4 +60,4 @@ ppurio: api: url: ${PPURIO_API_URL} key: ${PPURIO_API_KEY} - account: ${PPURIO_ACCOUNT} \ No newline at end of file + account: ${PPURIO_API_ACCOUNT} \ No newline at end of file From cd768f42b9004c4d9e39e9e895c82fe169927fe1 Mon Sep 17 00:00:00 2001 From: enble Date: Mon, 18 Nov 2024 13:53:03 +0900 Subject: [PATCH 4/5] fix: WIP --- .../message/controller/MessageController.java | 39 +++-- .../com/pictalk/message/domain/Message.java | 13 -- .../message/repository/MessageRepository.java | 6 +- .../message/service/MessageService.java | 137 +++++------------- src/main/resources/application.yml | 4 +- src/test/resources/application.yml | 9 +- 6 files changed, 74 insertions(+), 134 deletions(-) diff --git a/src/main/java/com/pictalk/message/controller/MessageController.java b/src/main/java/com/pictalk/message/controller/MessageController.java index 1b9f3cb..16845d0 100644 --- a/src/main/java/com/pictalk/message/controller/MessageController.java +++ b/src/main/java/com/pictalk/message/controller/MessageController.java @@ -1,20 +1,16 @@ package com.pictalk.message.controller; -import static com.pictalk.message.service.MessageService.getReceiversAsString; - import com.pictalk.global.payload.response.CommonResponse; import com.pictalk.message.domain.Message; import com.pictalk.message.domain.MessageImage; +import com.pictalk.message.domain.Receiver; import com.pictalk.message.dto.MessageRequestDto; import com.pictalk.message.dto.MessageRequestDto.SendMessageRequest; +import com.pictalk.message.dto.MessageResponseDto; import com.pictalk.message.dto.MessageResponseDto.CancelMessageResponse; import com.pictalk.message.dto.MessageResponseDto.MessageResponse; import com.pictalk.message.dto.MessageResponseDto.SendMessageResponse; -import com.pictalk.message.dto.MessageResponseDto; -import com.pictalk.message.dto.MessageResponseDto.*; -import com.pictalk.message.dto.MessageRequestDto.TempMessageRequest; import com.pictalk.message.service.MessageService; -import io.swagger.v3.oas.annotations.Operation; import jakarta.validation.Valid; import java.util.List; import java.util.stream.Collectors; @@ -46,7 +42,8 @@ public CommonResponse sendMessage(@AuthenticationPrincipal } @GetMapping - public CommonResponse> getMessages(@AuthenticationPrincipal UserDetails authenticatedPrincipal) { + public CommonResponse> getMessages( + @AuthenticationPrincipal UserDetails authenticatedPrincipal) { String userEmail = authenticatedPrincipal.getUsername(); List messages = messageService.getMessages(userEmail); @@ -58,7 +55,7 @@ public CommonResponse> getMessages(@AuthenticationPrincipa .messageImages(getImageUrls(message.getMessageImages())) .status(message.getStatus().toString()) .build() - ).collect(Collectors.toList()); + ).toList(); return CommonResponse.onSuccess(messageResponses); } @@ -66,20 +63,32 @@ public CommonResponse> getMessages(@AuthenticationPrincipa private List getImageUrls(List messageImages) { return messageImages.stream() .map(messageImage -> messageImage.getImage().getImageUrl()) - .collect(Collectors.toList()); + .toList(); } @GetMapping("/{message-id}") public CommonResponse getMessage(@AuthenticationPrincipal UserDetails authenticatedPrincipal, @PathVariable("message-id") Long messageId) { String userEmail = authenticatedPrincipal.getUsername(); - MessageResponse response = messageService.getMessage(messageId, userEmail); + Message message = messageService.getMessage(messageId, userEmail); + + MessageResponse response = MessageResponse.builder() + .messageId(message.getId()) + .content(message.getContent()) + .to(getReceiversAsString(message.getReceivers())) + .sendTime(message.getSentAt() != null ? message.getSentAt().toString() : null) + .status(message.getStatus().toString()) + .messageImages(message.getMessageImages().stream() + .map(messageImage -> messageImage.getImage().getImageUrl()) + .collect(Collectors.toList())) + .build(); return CommonResponse.onSuccess(response); } @PatchMapping("/{message-id}") - public CommonResponse cancelScheduledMessage(@AuthenticationPrincipal UserDetails authenticatedPrincipal, - @PathVariable("message-id") Long messageId) { + public CommonResponse cancelScheduledMessage( + @AuthenticationPrincipal UserDetails authenticatedPrincipal, + @PathVariable("message-id") Long messageId) { String userEmail = authenticatedPrincipal.getUsername(); CancelMessageResponse response = messageService.cancelScheduledMessage(messageId, userEmail); return CommonResponse.onSuccess(response); @@ -101,4 +110,10 @@ public CommonResponse saveTempMessage( MessageResponseDto.TempMessageResponse response = messageService.saveTempMessage(request, userEmail); return CommonResponse.onSuccess(response); } + + private String getReceiversAsString(List receivers) { + return receivers.stream() + .map(Receiver::getPhoneNumber) + .collect(Collectors.joining(", ")); + } } diff --git a/src/main/java/com/pictalk/message/domain/Message.java b/src/main/java/com/pictalk/message/domain/Message.java index 6f6fc3d..3f4e93c 100644 --- a/src/main/java/com/pictalk/message/domain/Message.java +++ b/src/main/java/com/pictalk/message/domain/Message.java @@ -14,11 +14,9 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToMany; import jakarta.persistence.Table; - import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; - import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -54,15 +52,8 @@ public class Message extends BaseEntity { private String content; - @Column(nullable = false) - private LocalDateTime createdAt; - - private LocalDateTime updatedAt; private LocalDateTime sentAt; - @Builder.Default - private boolean deleted = false; - @Column(name = "external_message_id") private String externalMessageId; @@ -82,10 +73,6 @@ public void cancel() { } } - public void softDelete() { - this.deleted = true; - } - public Message withExternalMessageId(String externalMessageId) { this.externalMessageId = externalMessageId; return this; diff --git a/src/main/java/com/pictalk/message/repository/MessageRepository.java b/src/main/java/com/pictalk/message/repository/MessageRepository.java index 47e11ae..82b0040 100644 --- a/src/main/java/com/pictalk/message/repository/MessageRepository.java +++ b/src/main/java/com/pictalk/message/repository/MessageRepository.java @@ -2,18 +2,16 @@ import com.pictalk.message.domain.Message; import com.pictalk.user.domain.User; - import java.util.List; import java.util.Optional; - import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface MessageRepository extends JpaRepository { // 삭제되지 않은 특정 사용자의 모든 메시지 조회 - List findAllByDeletedFalseAndSenderUser(User user); + List findAllBySenderUser(User user); // 삭제되지 않은 특정 사용자의 특정 메시지 조회 - Optional findByIdAndSenderUserAndDeletedFalse(Long id, User user); + Optional findByIdAndSenderUser(Long id, User user); } diff --git a/src/main/java/com/pictalk/message/service/MessageService.java b/src/main/java/com/pictalk/message/service/MessageService.java index 98c8f1c..572e445 100644 --- a/src/main/java/com/pictalk/message/service/MessageService.java +++ b/src/main/java/com/pictalk/message/service/MessageService.java @@ -6,32 +6,30 @@ import com.pictalk.message.domain.MessageStatus; import com.pictalk.message.domain.Receiver; import com.pictalk.message.domain.Sender; -import com.pictalk.message.dto.MessageRequestDto.*; -import com.pictalk.message.dto.MessageResponseDto.*; -import com.pictalk.message.domain.Message; -import com.pictalk.message.domain.Receiver; import com.pictalk.message.dto.MessageRequestDto.SendMessageRequest; +import com.pictalk.message.dto.MessageRequestDto.Target; +import com.pictalk.message.dto.MessageRequestDto.TempMessageRequest; import com.pictalk.message.dto.MessageResponseDto.CancelMessageResponse; -import com.pictalk.message.dto.MessageResponseDto.MessageResponse; import com.pictalk.message.dto.MessageResponseDto.SendMessageResponse; +import com.pictalk.message.dto.MessageResponseDto.TempMessageResponse; import com.pictalk.message.repository.MessageRepository; import com.pictalk.message.repository.ReceiverRepository; import com.pictalk.message.repository.SenderRepository; import com.pictalk.user.domain.User; import com.pictalk.user.repository.UserRepository; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.*; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.client.RestTemplate; - -import java.time.LocalDateTime; -import java.util.*; import java.util.List; -import java.util.stream.Collectors; +import java.util.Map; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.client.RestTemplate; @Service @RequiredArgsConstructor @@ -58,26 +56,16 @@ public SendMessageResponse sendMessage(SendMessageRequest request, String userEm User user = userRepository.findByEmail(userEmail) .orElseThrow(() -> new GeneralException(ErrorStatus.USER_NOT_FOUND)); - Sender sender = senderRepository.findSenderByPhoneNumber(request.getFrom()) - .orElseGet(() -> senderRepository.save(Sender.builder() - .user(user) - .phoneNumber(request.getFrom()) - .build())); + Sender sender = senderRepository.findSenderByPhoneNumber(request.getFrom()).orElseGet( + () -> senderRepository.save(Sender.builder().user(user).phoneNumber(request.getFrom()).build())); // 2. 메시지 엔티티 생성 - Message message = Message.builder() - .sender(sender) - .content(request.getContent()) - .status(MessageStatus.SCHEDULED) - .createdAt(LocalDateTime.now()) + Message message = Message.builder().sender(sender).content(request.getContent()).status(MessageStatus.SCHEDULED) .build(); // 3. 수신자 정보 추가 for (Target target : request.getTargets()) { - Receiver receiver = Receiver.builder() - .phoneNumber(target.getTo()) - .nickname(target.getName()) - .build(); + Receiver receiver = Receiver.builder().phoneNumber(target.getTo()).nickname(target.getName()).build(); message.addReceiver(receiver); } @@ -91,12 +79,8 @@ public SendMessageResponse sendMessage(SendMessageRequest request, String userEm HttpEntity tokenRequest = new HttpEntity<>(tokenHeaders); - ResponseEntity tokenResponse = restTemplate.exchange( - apiUrl + "/v1/token", - HttpMethod.POST, - tokenRequest, - Map.class - ); + ResponseEntity tokenResponse = restTemplate.exchange(apiUrl + "/v1/token", HttpMethod.POST, + tokenRequest, Map.class); if (tokenResponse.getStatusCode() != HttpStatus.OK || tokenResponse.getBody() == null) { throw new GeneralException(ErrorStatus.INTERNAL_SERVER_ERROR); @@ -109,36 +93,23 @@ public SendMessageResponse sendMessage(SendMessageRequest request, String userEm messageHeaders.setContentType(MediaType.APPLICATION_JSON); messageHeaders.setBearerAuth(accessToken); - SendMessageRequest requestWithAccount = SendMessageRequest.builder() - .account(ppurioAccount) - .messageType(request.getMessageType()) - .content(request.getContent()) - .from(request.getFrom()) - .duplicateFlag(request.getDuplicateFlag()) - .targetCount(request.getTargets().size()) - .targets(request.getTargets()) - .refKey(request.getRefKey()) - .build(); + SendMessageRequest requestWithAccount = SendMessageRequest.builder().account(ppurioAccount) + .messageType(request.getMessageType()).content(request.getContent()).from(request.getFrom()) + .duplicateFlag(request.getDuplicateFlag()).targetCount(request.getTargets().size()) + .targets(request.getTargets()).refKey(request.getRefKey()).build(); HttpEntity messageEntity = new HttpEntity<>(requestWithAccount, messageHeaders); // 6. 메시지 전송 및 응답 처리 - ResponseEntity messageResponse = restTemplate.exchange( - apiUrl + "/v1/message", - HttpMethod.POST, - messageEntity, - Map.class - ); + ResponseEntity messageResponse = restTemplate.exchange(apiUrl + "/v1/message", HttpMethod.POST, + messageEntity, Map.class); if (messageResponse.getStatusCode() == HttpStatus.OK && messageResponse.getBody() != null) { String messageKey = (String) messageResponse.getBody().get("messageKey"); message.withExternalMessageId(messageKey); message = messageRepository.save(message); - return SendMessageResponse.builder() - .externalMessageId(messageKey) - .status("success") - .build(); + return SendMessageResponse.builder().externalMessageId(messageKey).status("success").build(); } else { System.out.println("Error sending message1"); throw new GeneralException(ErrorStatus.INTERNAL_SERVER_ERROR); @@ -157,68 +128,32 @@ public TempMessageResponse saveTempMessage(TempMessageRequest request, String us Message tempMessage = Message.builder() .sender(user.getSenders().get(0)) // Assuming the user has at least one sender - .content(request.getContent()) - .status(MessageStatus.TEMP) - .createdAt(LocalDateTime.now()) - .build(); + .content(request.getContent()).status(MessageStatus.TEMP).build(); - Receiver receiver = Receiver.builder() - .phoneNumber(request.getTo()) - .build(); + Receiver receiver = Receiver.builder().phoneNumber(request.getTo()).build(); tempMessage.addReceiver(receiver); tempMessage = messageRepository.save(tempMessage); - return TempMessageResponse.builder() - .messageId(tempMessage.getId()) - .status("temp_saved") - .build(); + return TempMessageResponse.builder().messageId(tempMessage.getId()).status("temp_saved").build(); } @Transactional(readOnly = true) - public List getMessages(String userEmail) { + public List getMessages(String userEmail) { User user = userRepository.findByEmail(userEmail) .orElseThrow(() -> new GeneralException(ErrorStatus.USER_NOT_FOUND)); - List messages = messageRepository.findAllByDeletedFalseAndSenderUser(user); - List responses = new ArrayList<>(); - - for (Message message : messages) { - responses.add(MessageResponse.builder() - .messageId(message.getId()) - .content(message.getContent()) - .to(message.getReceivers().get(0).getPhoneNumber()) // Assuming single receiver - .sendTime(message.getSentAt() != null ? message.getSentAt().toString() : null) - .status(message.getStatus().toString()) - .build()); - } - return responses; + return messageRepository.findAllBySenderUser(user); } - private String getReceiversAsString(List receivers) { - return receivers.stream() - .map(Receiver::getPhoneNumber) - .collect(Collectors.joining(", ")); - } @Transactional(readOnly = true) - public MessageResponse getMessage(Long messageId, String userEmail) { + public Message getMessage(Long messageId, String userEmail) { User user = userRepository.findByEmail(userEmail) .orElseThrow(() -> new GeneralException(ErrorStatus.USER_NOT_FOUND)); - Message message = messageRepository.findByIdAndSenderUserAndDeletedFalse(messageId, user) + return messageRepository.findByIdAndSenderUser(messageId, user) .orElseThrow(() -> new GeneralException(ErrorStatus.MESSAGE_NOT_FOUND)); - - return MessageResponse.builder() - .messageId(message.getId()) - .content(message.getContent()) - .to(getReceiversAsString(message.getReceivers())) - .sendTime(message.getSentAt() != null ? message.getSentAt().toString() : null) - .status(message.getStatus().toString()) - .messageImages(message.getMessageImages().stream() - .map(messageImage -> messageImage.getImage().getImageUrl()) - .collect(Collectors.toList())) - .build(); } @Transactional @@ -226,7 +161,7 @@ public CancelMessageResponse cancelScheduledMessage(Long messageId, String userE User user = userRepository.findByEmail(userEmail) .orElseThrow(() -> new GeneralException(ErrorStatus.USER_NOT_FOUND)); - Message message = messageRepository.findByIdAndSenderUserAndDeletedFalse(messageId, user) + Message message = messageRepository.findByIdAndSenderUser(messageId, user) .orElseThrow(() -> new GeneralException(ErrorStatus.MESSAGE_NOT_FOUND)); if (message.getStatus() != MessageStatus.SCHEDULED) { @@ -236,9 +171,7 @@ public CancelMessageResponse cancelScheduledMessage(Long messageId, String userE message.cancel(); messageRepository.save(message); - return CancelMessageResponse.builder() - .messageId(message.getId()) - .status(message.getStatus().toString()) + return CancelMessageResponse.builder().messageId(message.getId()).status(message.getStatus().toString()) .build(); } @@ -247,7 +180,7 @@ public void deleteMessage(Long messageId, String userEmail) { User user = userRepository.findByEmail(userEmail) .orElseThrow(() -> new GeneralException(ErrorStatus.USER_NOT_FOUND)); - Message message = messageRepository.findByIdAndSenderUserAndDeletedFalse(messageId, user) + Message message = messageRepository.findByIdAndSenderUser(messageId, user) .orElseThrow(() -> new GeneralException(ErrorStatus.MESSAGE_NOT_FOUND)); message.softDelete(); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 0004a8f..e21fe04 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -7,7 +7,7 @@ spring: jpa: hibernate: - ddl-auto: update + ddl-auto: create-drop show-sql: true properties: hibernate: @@ -60,4 +60,4 @@ ppurio: api: url: ${PPURIO_API_URL} key: ${PPURIO_API_KEY} - account: ${PPURIO_API_ACCOUNT} \ No newline at end of file + account: ${PPURIO_API_ACCOUNT} diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index f086e1c..8232a32 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -51,4 +51,11 @@ cloud: region: static: MockAWSS3Region stack: - auto: false \ No newline at end of file + auto: false + + +ppurio: + api: + url: MockPPURIOUrl + key: MockPPURIOKey + account: MockPPURIOAccount From fc412146442a3094dd8602c51370bd0540e5a3ae Mon Sep 17 00:00:00 2001 From: sanghun Date: Mon, 18 Nov 2024 14:21:17 +0900 Subject: [PATCH 5/5] =?UTF-8?q?fix=20:=20=EB=B6=88=ED=95=84=EC=9A=94=20?= =?UTF-8?q?=ED=95=84=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/pictalk/message/domain/Sender.java | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/pictalk/message/domain/Sender.java b/src/main/java/com/pictalk/message/domain/Sender.java index b8e694a..60b5bfe 100644 --- a/src/main/java/com/pictalk/message/domain/Sender.java +++ b/src/main/java/com/pictalk/message/domain/Sender.java @@ -1,12 +1,25 @@ package com.pictalk.message.domain; import com.pictalk.user.domain.User; -import jakarta.persistence.*; -import lombok.*; - +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToMany; +import jakarta.persistence.PrePersist; +import jakarta.persistence.Table; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; @Entity @Table(name = "sender") @@ -37,9 +50,6 @@ public class Sender { @Column(updatable = false) private LocalDateTime createdAt; - @Builder.Default - private boolean deleted = false; - @PrePersist protected void onCreate() { createdAt = LocalDateTime.now();