Skip to content

Commit 77a4287

Browse files
authored
feat : 이벤트 응모 API 작성 (#51)
1 parent a3d4992 commit 77a4287

File tree

8 files changed

+89
-3
lines changed

8 files changed

+89
-3
lines changed

src/main/java/ddingdong/ddingdongBE/common/exception/ErrorMessage.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@ public enum ErrorMessage {
1515
NO_SUCH_CLUB("해당 동아리가 존재하지 않습니다."),
1616
NO_SUCH_NOTICE("해당 공지사항이 존재하지 않습니다."),
1717
NO_SUCH_ACTIVITY_REPORT("해당 활동보고서가 존재하지 않습니다."),
18+
NO_SUCH_QR_STAMP_HISTORY("이벤트 참여 내역이 존재하지 않습니다."),
1819
INVALID_CLUB_SCORE_VALUE("동아리 점수는 0 ~ 999점 입니다."),
1920
INVALID_PASSWORD("잘못된 비밀번호입니다."),
21+
INVALID_STAMP_COUNT_FOR_APPLY("스탬프를 모두 모아야 이벤트에 참여할 수 있어요!"),
2022
ACCESS_DENIED("접근권한이 없습니다."),
2123
UNREGISTER_ID("등록되지 않은 ID입니다."),
2224
NO_SUCH_BANNER("해당 배너가 존재하지 않습니다."),

src/main/java/ddingdong/ddingdongBE/domain/event/controller/EventController.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
@RestController
1212
@RequiredArgsConstructor
13-
@RequestMapping("/server/event")
13+
@RequestMapping("/server/events")
1414
public class EventController {
1515

1616
private final EventQrGenerator eventQrGenerator;
@@ -22,4 +22,5 @@ public EventQrResponse generateQrCode(
2222
) {
2323
return eventQrGenerator.generateQrCodeUri(studentName, studentNumber);
2424
}
25+
2526
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package ddingdong.ddingdongBE.domain.event.controller.dto.request;
2+
3+
import javax.validation.constraints.NotBlank;
4+
5+
public record ApplyEventRequest(
6+
@NotBlank(message = "학번은 빈 값이 될 수 없습니다.")
7+
String studentNumber,
8+
9+
@NotBlank(message = "전화번호는 빈 값이 될 수 없습니다.")
10+
String telephone
11+
) {
12+
13+
}

src/main/java/ddingdong/ddingdongBE/domain/fileinformation/entity/FileDomainCategory.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ public enum FileDomainCategory {
1212
NOTICE("notice/"),
1313
BANNER("banner/"),
1414
ACTIVITY_REPORT("activity-report/"),
15-
FIX_ZONE("fix/");
15+
FIX_ZONE("fix/"),
16+
EVENT("event/");
1617

1718
private final String fileDomain;
1819
}

src/main/java/ddingdong/ddingdongBE/domain/qrstamp/controller/QrStampController.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,36 @@
11
package ddingdong.ddingdongBE.domain.qrstamp.controller;
22

3+
import static ddingdong.ddingdongBE.domain.fileinformation.entity.FileDomainCategory.EVENT;
4+
import static ddingdong.ddingdongBE.domain.fileinformation.entity.FileTypeCategory.IMAGE;
5+
6+
import ddingdong.ddingdongBE.domain.event.controller.dto.request.ApplyEventRequest;
7+
import ddingdong.ddingdongBE.domain.fileinformation.service.FileInformationService;
38
import ddingdong.ddingdongBE.domain.qrstamp.controller.dto.request.CollectStampRequest;
49
import ddingdong.ddingdongBE.domain.qrstamp.controller.dto.response.CollectionResultResponse;
510
import ddingdong.ddingdongBE.domain.qrstamp.service.QrStampService;
11+
import ddingdong.ddingdongBE.file.service.FileService;
612
import java.time.LocalDateTime;
13+
import java.util.List;
714
import lombok.RequiredArgsConstructor;
815
import org.springframework.web.bind.annotation.GetMapping;
16+
import org.springframework.web.bind.annotation.ModelAttribute;
17+
import org.springframework.web.bind.annotation.PatchMapping;
918
import org.springframework.web.bind.annotation.PostMapping;
1019
import org.springframework.web.bind.annotation.RequestBody;
1120
import org.springframework.web.bind.annotation.RequestMapping;
1221
import org.springframework.web.bind.annotation.RequestParam;
22+
import org.springframework.web.bind.annotation.RequestPart;
1323
import org.springframework.web.bind.annotation.RestController;
24+
import org.springframework.web.multipart.MultipartFile;
1425

1526
@RestController
1627
@RequestMapping("/server/events")
1728
@RequiredArgsConstructor
1829
public class QrStampController {
1930

2031
private final QrStampService qrStampService;
32+
private final FileService fileService;
33+
private final FileInformationService fileInformationService;
2134

2235
@PostMapping("/stamps")
2336
public String collectStamp(@RequestBody CollectStampRequest request) {
@@ -30,4 +43,18 @@ public CollectionResultResponse getCollectionResult(@RequestParam String student
3043
return qrStampService.getCollectionResult(studentName, studentNumber);
3144
}
3245

46+
@PatchMapping("/apply")
47+
public void applyEvent(
48+
@ModelAttribute ApplyEventRequest request,
49+
@RequestPart(name = "certificationImage", required = false) MultipartFile image
50+
) {
51+
Long stampHistoryId = qrStampService.findByStudentNumber(request.studentNumber());
52+
53+
fileService.uploadFile(stampHistoryId, List.of(image), IMAGE, EVENT);
54+
55+
List<String> imageUrls = fileInformationService.getImageUrls(IMAGE.getFileType() + EVENT.getFileDomain() + stampHistoryId);
56+
57+
qrStampService.applyEvent(request, imageUrls);
58+
}
59+
3360
}

src/main/java/ddingdong/ddingdongBE/domain/qrstamp/entity/StampHistory.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,19 @@ public class StampHistory extends BaseEntity {
4444

4545
private String department;
4646

47+
private String telephone;
48+
4749
private String certificationImageUrl;
4850

4951
@Builder
5052

5153
private StampHistory(Long id, String studentName, String department, String studentNumber,
52-
LocalDateTime completedAt, String certificationImageUrl) {
54+
String telephone, LocalDateTime completedAt, String certificationImageUrl) {
5355
this.id = id;
5456
this.studentName = studentName;
5557
this.department = department;
5658
this.studentNumber = studentNumber;
59+
this.telephone = telephone;
5760
this.completedAt = completedAt;
5861
this.certificationImageUrl = certificationImageUrl;
5962
}
@@ -69,4 +72,10 @@ public boolean isCompleted() {
6972
return this.collectedStamps.size() >= 10;
7073
}
7174

75+
76+
public void apply(String telephone, String certificationImageUrl) {
77+
this.telephone = telephone;
78+
this.certificationImageUrl = certificationImageUrl;
79+
}
80+
7281
}

src/main/java/ddingdong/ddingdongBE/domain/qrstamp/repository/StampHistoryRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
@Repository
99
public interface StampHistoryRepository extends JpaRepository<StampHistory, Long> {
1010

11+
Optional<StampHistory> findStampHistoryByStudentNumber(String studentNumber);
12+
1113
Optional<StampHistory> findStampHistoryByStudentNameAndStudentNumber(String studentName, String studentNumber);
1214

1315
}

src/main/java/ddingdong/ddingdongBE/domain/qrstamp/service/QrStampService.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package ddingdong.ddingdongBE.domain.qrstamp.service;
22

3+
import static ddingdong.ddingdongBE.common.exception.ErrorMessage.INVALID_STAMP_COUNT_FOR_APPLY;
4+
import static ddingdong.ddingdongBE.common.exception.ErrorMessage.NO_SUCH_QR_STAMP_HISTORY;
35

6+
import ddingdong.ddingdongBE.domain.event.controller.dto.request.ApplyEventRequest;
47
import ddingdong.ddingdongBE.domain.qrstamp.controller.dto.request.CollectStampRequest;
58
import ddingdong.ddingdongBE.domain.qrstamp.controller.dto.response.CollectedStampsResponse;
69
import ddingdong.ddingdongBE.domain.qrstamp.controller.dto.response.CollectionResultResponse;
@@ -9,7 +12,9 @@
912
import ddingdong.ddingdongBE.domain.qrstamp.repository.StampHistoryRepository;
1013
import java.time.LocalDateTime;
1114
import java.util.List;
15+
import java.util.NoSuchElementException;
1216
import lombok.RequiredArgsConstructor;
17+
import org.springframework.security.core.parameters.P;
1318
import org.springframework.stereotype.Service;
1419
import org.springframework.transaction.annotation.Transactional;
1520

@@ -49,4 +54,30 @@ public CollectionResultResponse getCollectionResult(String studentNumber, String
4954
.toList();
5055
return CollectionResultResponse.of(stampHistory.isCompleted(), collectedStampsResponse);
5156
}
57+
58+
@Transactional
59+
public void applyEvent(ApplyEventRequest request, List<String> imageUrls) {
60+
StampHistory stampHistory = stampHistoryRepository.findStampHistoryByStudentNumber(
61+
request.studentNumber()
62+
)
63+
.orElseThrow(() -> new NoSuchElementException(NO_SUCH_QR_STAMP_HISTORY.getText()));
64+
65+
validateEventIsCompleted(stampHistory);
66+
67+
stampHistory.apply(request.telephone(), imageUrls.get(0));
68+
}
69+
70+
public Long findByStudentNumber(String studentNumber) {
71+
StampHistory stampHistory = stampHistoryRepository.findStampHistoryByStudentNumber(studentNumber)
72+
.orElseThrow(() -> new NoSuchElementException(NO_SUCH_QR_STAMP_HISTORY.getText()));
73+
74+
return stampHistory.getId();
75+
}
76+
77+
private void validateEventIsCompleted(StampHistory stampHistory) {
78+
if (!stampHistory.isCompleted()) {
79+
throw new IllegalArgumentException(INVALID_STAMP_COUNT_FOR_APPLY.getText());
80+
}
81+
}
82+
5283
}

0 commit comments

Comments
 (0)