Skip to content

Commit 1f31673

Browse files
authored
Merge pull request #156 from TeamSobokSobok/develop
RELEASE 2024/07/25 20:39:00
2 parents 2d337f0 + 0a8143e commit 1f31673

File tree

7 files changed

+128
-66
lines changed

7 files changed

+128
-66
lines changed

src/main/java/io/sobok/SobokSobok/exception/SuccessCode.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public enum SuccessCode {
2727
GET_PILL_INFO_SUCCESS(HttpStatus.OK, "약 정보 조회에 성공했습니다."),
2828
SEND_PILL_SUCCESS(HttpStatus.CREATED, "약 전송에 성공했습니다."),
2929
DELETE_PILL_SUCCESS(HttpStatus.OK, "약 삭제에 성공했습니다."),
30+
UPDATE_PILL_SUCCESS(HttpStatus.OK, "약 수정에 성공했습니다."),
3031

3132
// schedule
3233
CHECK_PILL_SCHEDULE_SUCCESS(HttpStatus.OK, "복용 완료 체크에 성공했습니다."),

src/main/java/io/sobok/SobokSobok/external/firebase/FCMPushService.java

Lines changed: 34 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22

33
import com.google.firebase.messaging.*;
44
import io.sobok.SobokSobok.auth.application.util.UserServiceUtil;
5+
import io.sobok.SobokSobok.auth.domain.Platform;
56
import io.sobok.SobokSobok.auth.domain.User;
67
import io.sobok.SobokSobok.auth.infrastructure.UserRepository;
8+
import io.sobok.SobokSobok.exception.ErrorCode;
9+
import io.sobok.SobokSobok.exception.model.BadRequestException;
710
import io.sobok.SobokSobok.external.firebase.dto.PushNotificationRequest;
811
import lombok.RequiredArgsConstructor;
912
import lombok.extern.slf4j.Slf4j;
@@ -19,78 +22,43 @@ public class FCMPushService {
1922
private final UserRepository userRepository;
2023

2124
public void sendNotificationByToken(PushNotificationRequest request) {
22-
User user = UserServiceUtil.findUserById(userRepository, request.userId());
23-
24-
Message message = Message.builder()
25-
.setToken(user.getDeviceToken())
26-
.setNotification(
27-
Notification.builder()
28-
.setTitle(request.title())
29-
.setBody(request.body())
30-
.build()
31-
)
32-
.setAndroidConfig(
33-
AndroidConfig.builder()
34-
.setNotification(
35-
AndroidNotification.builder()
36-
.setTitle(request.title())
37-
.setBody(request.body())
38-
.setClickAction("push_click")
39-
.build()
40-
)
41-
.build()
42-
)
43-
.setApnsConfig(
44-
ApnsConfig.builder()
45-
.setAps(Aps.builder()
46-
.setCategory("push_click")
47-
.build())
48-
.build()
49-
)
50-
.putData("title", request.title())
51-
.putData("body", request.body() == null ? "" : request.body())
52-
.putData("type", request.type())
53-
.build();
54-
55-
sendMessageToFirebase(message, user.getId());
25+
sendNotification(request, null);
5626
}
5727

5828
public void sendNotificationByTokenWithFriendData(PushNotificationRequest request) {
29+
sendNotification(request, request.data().get("friendId"));
30+
}
31+
32+
private void sendNotification(PushNotificationRequest request, String friendId) {
5933
User user = UserServiceUtil.findUserById(userRepository, request.userId());
34+
Message.Builder messageBuilder;
35+
if (user.getPlatform().equals(Platform.ANDROID)) {
36+
messageBuilder = Message.builder()
37+
.setToken(user.getDeviceToken())
38+
.putData("title", request.title())
39+
.putData("body", request.body() == null ? "" : request.body())
40+
.putData("type", request.type());
41+
} else if (user.getPlatform().equals(Platform.iOS)) {
42+
messageBuilder = Message.builder()
43+
.setToken(user.getDeviceToken())
44+
.setNotification(buildNotification(request))
45+
.putData("type", request.type());
46+
} else {
47+
throw new BadRequestException(ErrorCode.INVALID_PLATFORM);
48+
}
6049

61-
Message message = Message.builder()
62-
.setToken(user.getDeviceToken())
63-
.setNotification(
64-
Notification.builder()
65-
.setTitle(request.title())
66-
.setBody(request.body())
67-
.build()
68-
)
69-
.setAndroidConfig(
70-
AndroidConfig.builder()
71-
.setNotification(
72-
AndroidNotification.builder()
73-
.setTitle(request.title())
74-
.setBody(request.body())
75-
.setClickAction("push_click")
76-
.build()
77-
)
78-
.build()
79-
)
80-
.setApnsConfig(
81-
ApnsConfig.builder()
82-
.setAps(Aps.builder()
83-
.setCategory("push_click")
84-
.build())
85-
.build()
86-
)
87-
.putData("title", request.title())
88-
.putData("body", request.body() == null ? "" : request.body())
89-
.putData("type", request.type())
90-
.putData("friendId", request.data().get("friendId"))
91-
.build();
50+
if (friendId != null) {
51+
messageBuilder.putData("friendId", friendId);
52+
}
9253

93-
sendMessageToFirebase(message, user.getId());
54+
sendMessageToFirebase(messageBuilder.build(), user.getId());
55+
}
56+
57+
private Notification buildNotification(PushNotificationRequest request) {
58+
return Notification.builder()
59+
.setTitle(request.title())
60+
.setBody(request.body())
61+
.build();
9462
}
9563

9664
private void sendMessageToFirebase(Message message, Long userId) {

src/main/java/io/sobok/SobokSobok/pill/application/PillService.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import io.sobok.SobokSobok.pill.ui.dto.PillListResponse;
2222
import io.sobok.SobokSobok.pill.ui.dto.PillRequest;
2323
import io.sobok.SobokSobok.pill.ui.dto.PillResponse;
24+
import io.sobok.SobokSobok.pill.ui.dto.PillUpdateRequest;
2425
import io.sobok.SobokSobok.utils.PillUtil;
2526
import lombok.RequiredArgsConstructor;
2627
import io.sobok.SobokSobok.pill.infrastructure.PillQueryRepository;
@@ -30,6 +31,7 @@
3031
import org.springframework.transaction.annotation.Transactional;
3132

3233
import java.time.LocalDate;
34+
import java.util.Arrays;
3335
import java.util.List;
3436
import java.util.stream.Collectors;
3537

@@ -152,6 +154,41 @@ public Integer getPillCount(Long userId) {
152154
return pillQueryRepository.getPillCount(userId);
153155
}
154156

157+
@Transactional
158+
public void updatePill(Long userId, Long pillId, PillUpdateRequest request) {
159+
UserServiceUtil.existsUserById(userRepository, userId);
160+
Pill pill = PillServiceUtil.findPillById(pillRepository, pillId);
161+
boolean isTimeListChanged = false;
162+
163+
if (!pill.isPillUser(userId)) {
164+
throw new ForbiddenException(ErrorCode.UNAUTHORIZED_PILL);
165+
}
166+
167+
if (!pill.getPillName().equals(request.pillName())) {
168+
pill.updatePillName(request.pillName());
169+
}
170+
171+
List<String> timeList = Arrays.asList(request.timeList());
172+
if (!timeList.equals(pillScheduleQueryRepository.getPillScheduleTime(pillId))) {
173+
isTimeListChanged = true;
174+
}
175+
176+
if (PillUtil.checkChangePillSchedule(pill, request) || isTimeListChanged) {
177+
pillScheduleRepository.deleteAllByPillId(pillId);
178+
LocalDate[] scheduleDate = PillUtil.getScheduleDateList(request.startDate(), request.endDate(), request.day().split(", "));
179+
for (LocalDate date : scheduleDate) {
180+
for (String time : request.timeList()) {
181+
pillScheduleRepository.save(PillSchedule.builder()
182+
.scheduleDate(date)
183+
.scheduleTime(time)
184+
.pillId(pillId)
185+
.build()
186+
);
187+
}
188+
}
189+
}
190+
}
191+
155192
@Transactional
156193
public void deletePill(Long userId, Long pillId) {
157194

src/main/java/io/sobok/SobokSobok/pill/domain/Pill.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ public void receivePill(Long userId) {
5959
this.userId = userId;
6060
}
6161

62+
public void updatePillName(String newPillName) {
63+
this.pillName = newPillName;
64+
}
65+
6266
public boolean isPillUser(Long userId) {
6367
return Objects.equals(this.userId, userId);
6468
}

src/main/java/io/sobok/SobokSobok/pill/ui/PillController.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
import io.sobok.SobokSobok.auth.domain.User;
44
import io.sobok.SobokSobok.common.dto.ApiResponse;
55
import io.sobok.SobokSobok.exception.SuccessCode;
6+
import io.sobok.SobokSobok.pill.application.PillScheduleService;
67
import io.sobok.SobokSobok.pill.application.PillService;
78
import io.sobok.SobokSobok.pill.ui.dto.PillListResponse;
89
import io.sobok.SobokSobok.pill.ui.dto.PillRequest;
910
import io.sobok.SobokSobok.pill.ui.dto.PillResponse;
11+
import io.sobok.SobokSobok.pill.ui.dto.PillUpdateRequest;
1012
import io.swagger.v3.oas.annotations.Operation;
1113
import io.swagger.v3.oas.annotations.tags.Tag;
1214
import jakarta.validation.Valid;
@@ -25,6 +27,7 @@
2527
public class PillController {
2628

2729
private final PillService pillService;
30+
private final PillScheduleService pillScheduleService;
2831

2932
@PostMapping("")
3033
@Operation(
@@ -89,6 +92,22 @@ public ResponseEntity<ApiResponse<Void>> sendPillToFriend(
8992
.body(ApiResponse.success(SuccessCode.SEND_PILL_SUCCESS));
9093
}
9194

95+
@PutMapping("/{pillId}")
96+
@Operation(
97+
summary = "약 수정 API 메서드",
98+
description = "내 약 정보를 수정하는 메서드입니다."
99+
)
100+
public ResponseEntity<ApiResponse<Void>> updatePill(
101+
@AuthenticationPrincipal User user,
102+
@PathVariable Long pillId,
103+
@RequestBody @Valid final PillUpdateRequest request
104+
) {
105+
pillService.updatePill(user.getId(), pillId, request);
106+
return ResponseEntity
107+
.status(HttpStatus.OK)
108+
.body(ApiResponse.success(SuccessCode.UPDATE_PILL_SUCCESS));
109+
}
110+
92111
@DeleteMapping("/{pillId}")
93112
@Operation(
94113
summary = "약 삭제 API 메서드",
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package io.sobok.SobokSobok.pill.ui.dto;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
5+
import java.time.LocalDate;
6+
7+
public record PillUpdateRequest(
8+
9+
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
10+
String pillName,
11+
12+
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
13+
String day,
14+
15+
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
16+
String[] timeList,
17+
18+
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
19+
LocalDate startDate,
20+
21+
@Schema(requiredMode = Schema.RequiredMode.REQUIRED)
22+
LocalDate endDate
23+
) {
24+
}

src/main/java/io/sobok/SobokSobok/utils/PillUtil.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
import io.sobok.SobokSobok.exception.ErrorCode;
44
import io.sobok.SobokSobok.exception.model.BadRequestException;
5+
import io.sobok.SobokSobok.pill.domain.Pill;
6+
import io.sobok.SobokSobok.pill.ui.dto.PillRequest;
7+
import io.sobok.SobokSobok.pill.ui.dto.PillUpdateRequest;
58

69
import java.time.DayOfWeek;
710
import java.time.LocalDate;
@@ -39,6 +42,12 @@ public static LocalDate[] getScheduleDateList(LocalDate startDate, LocalDate end
3942
return matchingDates.toArray(new LocalDate[0]);
4043
}
4144

45+
public static Boolean checkChangePillSchedule(Pill pill, PillUpdateRequest pillRequest) {
46+
return !pill.getScheduleDay().equals(pillRequest.day()) ||
47+
!pill.getStartDate().equals(pillRequest.startDate()) ||
48+
!pill.getEndDate().equals(pillRequest.endDate());
49+
}
50+
4251
private static String convertToEnglishDayOfWeek(String koreanDayOfWeek) {
4352
return switch (koreanDayOfWeek) {
4453
case "월" -> "MONDAY";

0 commit comments

Comments
 (0)