-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathApplicationService.java
More file actions
106 lines (93 loc) · 4.77 KB
/
ApplicationService.java
File metadata and controls
106 lines (93 loc) · 4.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package life.mosu.mosuserver.application.application;
import java.util.List;
import java.util.Set;
import life.mosu.mosuserver.application.application.dto.RegisterApplicationCommand;
import life.mosu.mosuserver.application.application.processor.GetApplicationsStepProcessor;
import life.mosu.mosuserver.application.application.processor.RegisterApplicationStepProcessor;
import life.mosu.mosuserver.application.application.processor.SaveExamTicketStepProcessor;
import life.mosu.mosuserver.application.application.validator.ApplicationValidator;
import life.mosu.mosuserver.application.exam.cache.ExamQuotaCacheManager;
import life.mosu.mosuserver.application.user.UserService;
import life.mosu.mosuserver.domain.application.entity.ApplicationJpaEntity;
import life.mosu.mosuserver.domain.application.entity.Subject;
import life.mosu.mosuserver.domain.application.repository.ApplicationJpaRepository;
import life.mosu.mosuserver.domain.exam.entity.ExamJpaEntity;
import life.mosu.mosuserver.domain.exam.entity.ExamJpaRepository;
import life.mosu.mosuserver.presentation.application.dto.ApplicationGuestRequest;
import life.mosu.mosuserver.presentation.application.dto.ApplicationRequest;
import life.mosu.mosuserver.presentation.application.dto.ApplicationResponse;
import life.mosu.mosuserver.presentation.application.dto.CreateApplicationResponse;
import life.mosu.mosuserver.presentation.application.dto.ExamApplicationRequest;
import life.mosu.mosuserver.presentation.common.FileRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Service
@RequiredArgsConstructor
@Slf4j
public class ApplicationService {
private final UserService userService;
private final ApplicationJpaRepository applicationJpaRepository;
private final ExamJpaRepository examJpaRepository;
private final ExamQuotaCacheManager cacheManager;
private final RegisterApplicationStepProcessor registerApplicationStepProcessor;
private final SaveExamTicketStepProcessor saveExamTicketStepProcessor;
private final GetApplicationsStepProcessor getApplicationsStepProcessor;
private final ApplicationValidator validator;
@Transactional
public CreateApplicationResponse apply(Long userId, ApplicationRequest request) {
List<Long> examIds = request.examApplication().stream()
.map(ExamApplicationRequest::examId)
.toList();
validator.agreedToTerms(request);
validator.requestNoDuplicateExams(examIds);
return handleApplication(
userId,
examIds,
request.getSubjects(),
request.toApplicationJpaEntity(userId),
request.examApplication(),
request.admissionTicket()
);
}
@Transactional
public CreateApplicationResponse applyByGuest(ApplicationGuestRequest request) {
Long userId = userService.saveOrGetUser(request.toUserJpaEntity());
CreateApplicationResponse response = handleApplication(
userId,
List.of(request.examApplication().examId()),
request.getSubjects(),
request.toApplicationJpaEntity(userId),
List.of(request.examApplication()),
request.admissionTicket());
cacheManager.increaseCurrentApplications(request.examApplication().examId());
return response;
}
private CreateApplicationResponse handleApplication(
Long userId,
List<Long> examIds,
Set<Subject> subjects,
ApplicationJpaEntity applicationEntity,
List<ExamApplicationRequest> examApplications,
FileRequest admissionTicket
) {
List<ExamJpaEntity> exams = examJpaRepository.findAllById(examIds);
validator.examDateNotPassed(exams);
validator.examNotFull(exams);
validator.examIdsAndLunchSelection(examApplications);
validator.noDuplicateApplication(userId, examIds);
ApplicationJpaEntity savedApplication = applicationJpaRepository.save(applicationEntity);
Long applicationId = savedApplication.getId();
registerApplicationStepProcessor.process(
RegisterApplicationCommand.of(userId, applicationId, examApplications, subjects));
saveExamTicketStepProcessor.process(
ApplicationProcessingContext.of(applicationId, admissionTicket));
return CreateApplicationResponse.of(applicationId);
}
@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
public List<ApplicationResponse> getApplications(Long userId) {
return getApplicationsStepProcessor.process(userId);
}
}