Skip to content

Commit a079a32

Browse files
authored
feat: 약 사진 등록 기능 추가 (Neibce/OnGi#144)
1 parent c5f4c6c commit a079a32

File tree

6 files changed

+48
-3
lines changed

6 files changed

+48
-3
lines changed

backend/ongi/src/main/java/ongi/pill/controller/PillController.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import ongi.pill.dto.PillInfo;
99
import ongi.pill.dto.PillInfoWithIntakeStatus;
1010
import ongi.pill.dto.PillIntakeRecordRequest;
11+
import ongi.pill.dto.PillPresignedResponseDto;
1112
import ongi.pill.service.PillService;
1213
import ongi.security.CustomUserDetails;
1314
import org.springframework.http.HttpStatus;
@@ -37,6 +38,14 @@ public class PillController {
3738
private final FamilyService familyService;
3839
private final TemperatureService temperatureService;
3940

41+
@GetMapping("/presigned-url")
42+
public ResponseEntity<PillPresignedResponseDto> getPillPresignedUrl(
43+
@AuthenticationPrincipal CustomUserDetails userDetails) {
44+
PillPresignedResponseDto presignedResponse =
45+
pillService.getPresignedPutUrl(userDetails.getUser());
46+
return ResponseEntity.ok(presignedResponse);
47+
}
48+
4049
@PostMapping
4150
public ResponseEntity<PillInfo> createPill(
4251
@AuthenticationPrincipal CustomUserDetails userDetails,

backend/ongi/src/main/java/ongi/pill/dto/PillCreateRequest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public record PillCreateRequest(
1616
@NotNull IntakeDetail intakeDetail,
1717
@NotNull List<LocalTime> intakeTimes,
1818
@NotNull Set<DayOfWeek> intakeDays,
19-
@NotNull UUID parentUuid
19+
@NotNull UUID parentUuid,
20+
String fileName
2021
) {
2122
}

backend/ongi/src/main/java/ongi/pill/dto/PillInfoWithIntakeStatus.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package ongi.pill.dto;
22

3+
import java.net.URL;
34
import java.time.temporal.ChronoUnit;
45
import ongi.pill.entity.IntakeDetail;
56
import ongi.pill.entity.Pill;
@@ -16,6 +17,7 @@
1617
public record PillInfoWithIntakeStatus(
1718
Long id,
1819
String name,
20+
URL imageUrl,
1921
Integer times,
2022
IntakeDetail intakeDetail,
2123
List<LocalTime> intakeTimes,
@@ -24,10 +26,11 @@ public record PillInfoWithIntakeStatus(
2426
Map<LocalTime, LocalTime> dayIntakeStatus
2527
) {
2628

27-
public PillInfoWithIntakeStatus(Pill pill, List<PillIntakeRecord> intakeRecords) {
29+
public PillInfoWithIntakeStatus(Pill pill, URL imageUrl, List<PillIntakeRecord> intakeRecords) {
2830
this(
2931
pill.getId(),
3032
pill.getName(),
33+
imageUrl,
3134
pill.getTimes(),
3235
pill.getIntakeDetail(),
3336
pill.getIntakeTimes(),
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package ongi.pill.dto;
2+
3+
import java.net.URL;
4+
5+
public record PillPresignedResponseDto(
6+
URL presignedUrl,
7+
String fileName
8+
) {
9+
10+
}

backend/ongi/src/main/java/ongi/pill/entity/Pill.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ public class Pill extends BaseEntity {
4444
@Column(nullable = false)
4545
private Set<DayOfWeek> intakeDays;
4646

47+
private String fileName;
48+
4749
@ManyToOne(fetch = FetchType.LAZY)
4850
private User owner;
4951
}

backend/ongi/src/main/java/ongi/pill/service/PillService.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package ongi.pill.service;
22

3+
import java.net.URL;
34
import java.time.LocalDate;
45
import java.util.UUID;
56
import lombok.RequiredArgsConstructor;
@@ -10,12 +11,14 @@
1011
import ongi.pill.dto.PillInfo;
1112
import ongi.pill.dto.PillInfoWithIntakeStatus;
1213
import ongi.pill.dto.PillIntakeRecordRequest;
14+
import ongi.pill.dto.PillPresignedResponseDto;
1315
import ongi.pill.entity.Pill;
1416
import ongi.pill.entity.PillIntakeRecord;
1517
import ongi.pill.repository.PillIntakeRecordRepository;
1618
import ongi.pill.repository.PillRepository;
1719
import ongi.user.entity.User;
1820
import ongi.user.repository.UserRepository;
21+
import ongi.util.S3FileService;
1922
import org.springframework.stereotype.Service;
2023
import org.springframework.transaction.annotation.Transactional;
2124

@@ -32,6 +35,9 @@ public class PillService {
3235
private final UserRepository userRepository;
3336
private final FamilyRepository familyRepository;
3437
private final PillIntakeRecordRepository pillIntakeRecordRepository;
38+
private final S3FileService s3FileService;
39+
40+
private static final String DIR_NAME = "pill-photos";
3541

3642
@Transactional
3743
public PillInfo createPill(User child, PillCreateRequest request) {
@@ -49,13 +55,20 @@ public PillInfo createPill(User child, PillCreateRequest request) {
4955
throw new IllegalArgumentException("가족에 속하지 않은 사용자입니다.");
5056
}
5157

58+
if(request.fileName() != null) {
59+
if (!s3FileService.objectExists(DIR_NAME, request.fileName())) {
60+
throw new IllegalArgumentException("S3에 파일이 존재하지 않습니다.");
61+
}
62+
}
63+
5264
Pill pill = Pill.builder()
5365
.name(request.name())
5466
.times(request.times())
5567
.intakeDetail(request.intakeDetail())
5668
.intakeTimes(request.intakeTimes())
5769
.intakeDays(request.intakeDays())
5870
.owner(parent)
71+
.fileName(request.fileName())
5972
.build();
6073

6174
Pill savedPill = pillRepository.save(pill);
@@ -143,8 +156,15 @@ public List<PillInfoWithIntakeStatus> getFamilyPills(User user, UUID parentUuid,
143156
.collect(Collectors.groupingBy(record -> record.getPill().getId()));
144157

145158
return pills.stream()
146-
.map(pill -> new PillInfoWithIntakeStatus(pill,
159+
.map(pill -> new PillInfoWithIntakeStatus(pill, s3FileService.createSignedGetUrl(DIR_NAME, pill.getFileName()),
147160
intakeRecordsMap.getOrDefault(pill.getId(), List.of())))
148161
.toList();
149162
}
163+
164+
public PillPresignedResponseDto getPresignedPutUrl(User user) {
165+
String fileName = UUID.randomUUID().toString();
166+
URL signedGetUrl = s3FileService.createSignedPutUrl(user, DIR_NAME, fileName);
167+
168+
return new PillPresignedResponseDto(signedGetUrl, fileName);
169+
}
150170
}

0 commit comments

Comments
 (0)