/
SubmissionCommandService.java
169 lines (142 loc) · 7.08 KB
/
SubmissionCommandService.java
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
package com.mryqr.core.submission.command;
import com.mryqr.common.ratelimit.MryRateLimiter;
import com.mryqr.core.app.domain.App;
import com.mryqr.core.app.domain.AppRepository;
import com.mryqr.core.app.domain.page.Page;
import com.mryqr.core.common.domain.permission.ManagePermissionChecker;
import com.mryqr.core.common.domain.permission.SubmissionPermissionChecker;
import com.mryqr.core.common.domain.permission.SubmissionPermissions;
import com.mryqr.core.common.domain.user.User;
import com.mryqr.core.group.domain.Group;
import com.mryqr.core.group.domain.GroupRepository;
import com.mryqr.core.plate.domain.PlateRepository;
import com.mryqr.core.qr.domain.AppedQr;
import com.mryqr.core.qr.domain.QR;
import com.mryqr.core.qr.domain.QrRepository;
import com.mryqr.core.submission.domain.CreateSubmissionWithQrResult;
import com.mryqr.core.submission.domain.Submission;
import com.mryqr.core.submission.domain.SubmissionFactory;
import com.mryqr.core.submission.domain.SubmissionRepository;
import com.mryqr.core.submission.domain.answer.Answer;
import com.mryqr.core.submission.domain.answer.SubmissionDomainService;
import com.mryqr.core.tenant.domain.PackagesStatus;
import com.mryqr.core.tenant.domain.TenantRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.util.Set;
import static com.mryqr.core.common.domain.permission.Permission.maxPermission;
@Slf4j
@Component
@RequiredArgsConstructor
public class SubmissionCommandService {
private final QrRepository qrRepository;
private final SubmissionRepository submissionRepository;
private final SubmissionFactory submissionFactory;
private final SubmissionPermissionChecker submissionPermissionChecker;
private final ManagePermissionChecker managePermissionChecker;
private final AppRepository appRepository;
private final PlateRepository plateRepository;
private final SubmissionDomainService submissionDomainService;
private final TenantRepository tenantRepository;
private final GroupRepository groupRepository;
private final MryRateLimiter mryRateLimiter;
@Transactional
public String newSubmission(NewSubmissionCommand command, User user) {
AppedQr appedQr = qrRepository.appedQrById(command.getQrId());
App app = appedQr.getApp();
mryRateLimiter.applyFor(app.getTenantId(), "Submission:New", 50);
QR qr = appedQr.getQr();
app.checkActive();
qr.checkActive(app);
PackagesStatus packagesStatus = tenantRepository.packagesStatusOf(app.getTenantId());
packagesStatus.validateAddSubmission();
Page page = app.pageById(command.getPageId());
SubmissionPermissions submissionPermissions = submissionPermissionChecker.permissionsFor(user, appedQr);
if (maxPermission(app.requiredPermission(), page.requiredPermission()).requireLogin()) {
user.checkIsHumanUser();
}
submissionPermissions.checkPermissions(app.requiredPermission(), page.requiredPermission());
Set<Answer> answers = command.getAnswers();
if (qr.isTemplate()) {
packagesStatus.validateAddQr();
packagesStatus.validateAddPlate();
CreateSubmissionWithQrResult result = submissionFactory.createSubmissionFromQrTemplate(answers,
qr,
page,
app,
submissionPermissions.getPermissions(),
command.getReferenceData(),
user
);
submissionRepository.houseKeepSave(result.getSubmission(), app);
qrRepository.save(result.getQr());
plateRepository.save(result.getPlate());
return result.getSubmission().getId();
} else {
Submission submission = submissionFactory.createNewSubmission(
answers,
qr,
page,
app,
submissionPermissions.getPermissions(),
command.getReferenceData(),
user
);
submissionRepository.houseKeepSave(submission, app);
log.info("Created submission[{}].", submission.getId());
return submission.getId();
}
}
@Transactional
public void updateSubmission(String submissionId, UpdateSubmissionCommand command, User user) {
mryRateLimiter.applyFor(user.getTenantId(), "Submission:Update", 20);
Submission submission = submissionRepository.byIdAndCheckTenantShip(submissionId, user);
AppedQr appedQr = qrRepository.appedQrById(submission.getQrId());
App app = appedQr.getApp();
QR qr = appedQr.getQr();
app.checkActive();
qr.checkActive(app);
Page page = app.pageById(submission.getPageId());
SubmissionPermissions submissionPermissions = submissionPermissionChecker.permissionsFor(user, app, submission.getGroupId());
submissionPermissions.checkCanUpdateSubmission(submission, page, app);
submissionDomainService.updateSubmission(submission,
app,
page,
qr,
command.getAnswers(),
submissionPermissions.getPermissions(),
user
);
submissionRepository.houseKeepSave(submission, app);
log.info("Updated submission[{}].", submissionId);
}
@Transactional
public void approveSubmission(String submissionId, ApproveSubmissionCommand command, User user) {
mryRateLimiter.applyFor(user.getTenantId(), "Submission:Approve", 20);
Submission submission = submissionRepository.byIdAndCheckTenantShip(submissionId, user);
PackagesStatus packagesStatus = tenantRepository.cachedById(submission.getTenantId()).packagesStatus();
packagesStatus.validateApproveSubmission();
QR qr = qrRepository.byId(submission.getQrId());
App app = appRepository.cachedById(submission.getAppId());
app.checkActive();
qr.checkActive(app);
Page page = app.pageById(submission.getPageId());
SubmissionPermissions submissionPermissions = submissionPermissionChecker.permissionsFor(user, app, submission.getGroupId());
submissionPermissions.checkCanApproveSubmission(submission, page, app);
submission.approve(command.isPassed(), command.getNote(), page, user);
submissionRepository.houseKeepSave(submission, app);
log.info("Approved submission[{}].", submissionId);
}
@Transactional
public void deleteSubmission(String submissionId, User user) {
mryRateLimiter.applyFor(user.getTenantId(), "Submission:Delete", 10);
Submission submission = submissionRepository.byIdAndCheckTenantShip(submissionId, user);
Group group = groupRepository.cachedById(submission.getGroupId());
managePermissionChecker.checkCanManageGroup(user, group);
submission.onDelete(user);
submissionRepository.delete(submission);
log.info("Deleted submission[{}].", submissionId);
}
}