Skip to content

Commit

Permalink
Merge pull request #156 from TeamSobokSobok/develop
Browse files Browse the repository at this point in the history
RELEASE 2024/07/25 20:39:00
  • Loading branch information
dev-Crayon authored Jul 25, 2024
2 parents 2d337f0 + 0a8143e commit 1f31673
Show file tree
Hide file tree
Showing 7 changed files with 128 additions and 66 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ public enum SuccessCode {
GET_PILL_INFO_SUCCESS(HttpStatus.OK, "약 정보 조회에 성공했습니다."),
SEND_PILL_SUCCESS(HttpStatus.CREATED, "약 전송에 성공했습니다."),
DELETE_PILL_SUCCESS(HttpStatus.OK, "약 삭제에 성공했습니다."),
UPDATE_PILL_SUCCESS(HttpStatus.OK, "약 수정에 성공했습니다."),

// schedule
CHECK_PILL_SCHEDULE_SUCCESS(HttpStatus.OK, "복용 완료 체크에 성공했습니다."),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@

import com.google.firebase.messaging.*;
import io.sobok.SobokSobok.auth.application.util.UserServiceUtil;
import io.sobok.SobokSobok.auth.domain.Platform;
import io.sobok.SobokSobok.auth.domain.User;
import io.sobok.SobokSobok.auth.infrastructure.UserRepository;
import io.sobok.SobokSobok.exception.ErrorCode;
import io.sobok.SobokSobok.exception.model.BadRequestException;
import io.sobok.SobokSobok.external.firebase.dto.PushNotificationRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -19,78 +22,43 @@ public class FCMPushService {
private final UserRepository userRepository;

public void sendNotificationByToken(PushNotificationRequest request) {
User user = UserServiceUtil.findUserById(userRepository, request.userId());

Message message = Message.builder()
.setToken(user.getDeviceToken())
.setNotification(
Notification.builder()
.setTitle(request.title())
.setBody(request.body())
.build()
)
.setAndroidConfig(
AndroidConfig.builder()
.setNotification(
AndroidNotification.builder()
.setTitle(request.title())
.setBody(request.body())
.setClickAction("push_click")
.build()
)
.build()
)
.setApnsConfig(
ApnsConfig.builder()
.setAps(Aps.builder()
.setCategory("push_click")
.build())
.build()
)
.putData("title", request.title())
.putData("body", request.body() == null ? "" : request.body())
.putData("type", request.type())
.build();

sendMessageToFirebase(message, user.getId());
sendNotification(request, null);
}

public void sendNotificationByTokenWithFriendData(PushNotificationRequest request) {
sendNotification(request, request.data().get("friendId"));
}

private void sendNotification(PushNotificationRequest request, String friendId) {
User user = UserServiceUtil.findUserById(userRepository, request.userId());
Message.Builder messageBuilder;
if (user.getPlatform().equals(Platform.ANDROID)) {
messageBuilder = Message.builder()
.setToken(user.getDeviceToken())
.putData("title", request.title())
.putData("body", request.body() == null ? "" : request.body())
.putData("type", request.type());
} else if (user.getPlatform().equals(Platform.iOS)) {
messageBuilder = Message.builder()
.setToken(user.getDeviceToken())
.setNotification(buildNotification(request))
.putData("type", request.type());
} else {
throw new BadRequestException(ErrorCode.INVALID_PLATFORM);
}

Message message = Message.builder()
.setToken(user.getDeviceToken())
.setNotification(
Notification.builder()
.setTitle(request.title())
.setBody(request.body())
.build()
)
.setAndroidConfig(
AndroidConfig.builder()
.setNotification(
AndroidNotification.builder()
.setTitle(request.title())
.setBody(request.body())
.setClickAction("push_click")
.build()
)
.build()
)
.setApnsConfig(
ApnsConfig.builder()
.setAps(Aps.builder()
.setCategory("push_click")
.build())
.build()
)
.putData("title", request.title())
.putData("body", request.body() == null ? "" : request.body())
.putData("type", request.type())
.putData("friendId", request.data().get("friendId"))
.build();
if (friendId != null) {
messageBuilder.putData("friendId", friendId);
}

sendMessageToFirebase(message, user.getId());
sendMessageToFirebase(messageBuilder.build(), user.getId());
}

private Notification buildNotification(PushNotificationRequest request) {
return Notification.builder()
.setTitle(request.title())
.setBody(request.body())
.build();
}

private void sendMessageToFirebase(Message message, Long userId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import io.sobok.SobokSobok.pill.ui.dto.PillListResponse;
import io.sobok.SobokSobok.pill.ui.dto.PillRequest;
import io.sobok.SobokSobok.pill.ui.dto.PillResponse;
import io.sobok.SobokSobok.pill.ui.dto.PillUpdateRequest;
import io.sobok.SobokSobok.utils.PillUtil;
import lombok.RequiredArgsConstructor;
import io.sobok.SobokSobok.pill.infrastructure.PillQueryRepository;
Expand All @@ -30,6 +31,7 @@
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

Expand Down Expand Up @@ -152,6 +154,41 @@ public Integer getPillCount(Long userId) {
return pillQueryRepository.getPillCount(userId);
}

@Transactional
public void updatePill(Long userId, Long pillId, PillUpdateRequest request) {
UserServiceUtil.existsUserById(userRepository, userId);
Pill pill = PillServiceUtil.findPillById(pillRepository, pillId);
boolean isTimeListChanged = false;

if (!pill.isPillUser(userId)) {
throw new ForbiddenException(ErrorCode.UNAUTHORIZED_PILL);
}

if (!pill.getPillName().equals(request.pillName())) {
pill.updatePillName(request.pillName());
}

List<String> timeList = Arrays.asList(request.timeList());
if (!timeList.equals(pillScheduleQueryRepository.getPillScheduleTime(pillId))) {
isTimeListChanged = true;
}

if (PillUtil.checkChangePillSchedule(pill, request) || isTimeListChanged) {
pillScheduleRepository.deleteAllByPillId(pillId);
LocalDate[] scheduleDate = PillUtil.getScheduleDateList(request.startDate(), request.endDate(), request.day().split(", "));
for (LocalDate date : scheduleDate) {
for (String time : request.timeList()) {
pillScheduleRepository.save(PillSchedule.builder()
.scheduleDate(date)
.scheduleTime(time)
.pillId(pillId)
.build()
);
}
}
}
}

@Transactional
public void deletePill(Long userId, Long pillId) {

Expand Down
4 changes: 4 additions & 0 deletions src/main/java/io/sobok/SobokSobok/pill/domain/Pill.java
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,10 @@ public void receivePill(Long userId) {
this.userId = userId;
}

public void updatePillName(String newPillName) {
this.pillName = newPillName;
}

public boolean isPillUser(Long userId) {
return Objects.equals(this.userId, userId);
}
Expand Down
19 changes: 19 additions & 0 deletions src/main/java/io/sobok/SobokSobok/pill/ui/PillController.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
import io.sobok.SobokSobok.auth.domain.User;
import io.sobok.SobokSobok.common.dto.ApiResponse;
import io.sobok.SobokSobok.exception.SuccessCode;
import io.sobok.SobokSobok.pill.application.PillScheduleService;
import io.sobok.SobokSobok.pill.application.PillService;
import io.sobok.SobokSobok.pill.ui.dto.PillListResponse;
import io.sobok.SobokSobok.pill.ui.dto.PillRequest;
import io.sobok.SobokSobok.pill.ui.dto.PillResponse;
import io.sobok.SobokSobok.pill.ui.dto.PillUpdateRequest;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
Expand All @@ -25,6 +27,7 @@
public class PillController {

private final PillService pillService;
private final PillScheduleService pillScheduleService;

@PostMapping("")
@Operation(
Expand Down Expand Up @@ -89,6 +92,22 @@ public ResponseEntity<ApiResponse<Void>> sendPillToFriend(
.body(ApiResponse.success(SuccessCode.SEND_PILL_SUCCESS));
}

@PutMapping("/{pillId}")
@Operation(
summary = "약 수정 API 메서드",
description = "내 약 정보를 수정하는 메서드입니다."
)
public ResponseEntity<ApiResponse<Void>> updatePill(
@AuthenticationPrincipal User user,
@PathVariable Long pillId,
@RequestBody @Valid final PillUpdateRequest request
) {
pillService.updatePill(user.getId(), pillId, request);
return ResponseEntity
.status(HttpStatus.OK)
.body(ApiResponse.success(SuccessCode.UPDATE_PILL_SUCCESS));
}

@DeleteMapping("/{pillId}")
@Operation(
summary = "약 삭제 API 메서드",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package io.sobok.SobokSobok.pill.ui.dto;

import io.swagger.v3.oas.annotations.media.Schema;

import java.time.LocalDate;

public record PillUpdateRequest(

@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
String pillName,

@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
String day,

@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
String[] timeList,

@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
LocalDate startDate,

@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
LocalDate endDate
) {
}
9 changes: 9 additions & 0 deletions src/main/java/io/sobok/SobokSobok/utils/PillUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@

import io.sobok.SobokSobok.exception.ErrorCode;
import io.sobok.SobokSobok.exception.model.BadRequestException;
import io.sobok.SobokSobok.pill.domain.Pill;
import io.sobok.SobokSobok.pill.ui.dto.PillRequest;
import io.sobok.SobokSobok.pill.ui.dto.PillUpdateRequest;

import java.time.DayOfWeek;
import java.time.LocalDate;
Expand Down Expand Up @@ -39,6 +42,12 @@ public static LocalDate[] getScheduleDateList(LocalDate startDate, LocalDate end
return matchingDates.toArray(new LocalDate[0]);
}

public static Boolean checkChangePillSchedule(Pill pill, PillUpdateRequest pillRequest) {
return !pill.getScheduleDay().equals(pillRequest.day()) ||
!pill.getStartDate().equals(pillRequest.startDate()) ||
!pill.getEndDate().equals(pillRequest.endDate());
}

private static String convertToEnglishDayOfWeek(String koreanDayOfWeek) {
return switch (koreanDayOfWeek) {
case "월" -> "MONDAY";
Expand Down

0 comments on commit 1f31673

Please sign in to comment.