1 package io.extact.rms.external.webapi;
2
3 import java.time.LocalDate;
4 import java.time.LocalDateTime;
5 import java.util.List;
6
7 import jakarta.annotation.security.RolesAllowed;
8 import jakarta.enterprise.context.ApplicationScoped;
9 import jakarta.inject.Inject;
10 import jakarta.ws.rs.Path;
11
12 import io.extact.rms.application.RentalReservationApplication;
13 import io.extact.rms.application.common.LoginUserUtils;
14 import io.extact.rms.application.domain.constraint.ValidationGroups.Add;
15 import io.extact.rms.external.webapi.dto.AddRentalItemDto;
16 import io.extact.rms.external.webapi.dto.AddReservationDto;
17 import io.extact.rms.external.webapi.dto.AddUserAccountDto;
18 import io.extact.rms.external.webapi.dto.LoginDto;
19 import io.extact.rms.external.webapi.dto.RentalItemResourceDto;
20 import io.extact.rms.external.webapi.dto.ReservationResourceDto;
21 import io.extact.rms.external.webapi.dto.UserAccountResourceDto;
22 import io.extact.rms.platform.jwt.consumer.Authenticated;
23 import io.extact.rms.platform.jwt.provider.GenerateToken;
24 import io.extact.rms.platform.validate.ValidateGroup;
25 import io.extact.rms.platform.validate.ValidateParam;
26
27 @Path("/rms")
28 @ApplicationScoped
29 @ValidateParam
30 public class RentalReservationResource implements WebApiSpec {
31
32 private RentalReservationApplication application;
33
34 @Inject
35 public RentalReservationResource(RentalReservationApplication application) {
36 this.application = application;
37 }
38
39 @GenerateToken
40 @Override
41 public UserAccountResourceDto authenticate(String loginId, String password) {
42 return authenticate(LoginDto.of(loginId, password));
43 }
44
45 @GenerateToken
46 @Override
47 public UserAccountResourceDto authenticate(LoginDto loginDto) {
48 return application.authenticate(loginDto.getLoginId(), loginDto.getPassword())
49 .transform(UserAccountResourceDto::toDto);
50 }
51
52 @Authenticated
53 @RolesAllowed(MEMBER_ROLE)
54 @Override
55 public List<ReservationResourceDto> findReservationByRentalItemAndStartDate(Integer rentalItemId, LocalDate date) {
56 return application.findReservationByRentalItemAndStartDate(rentalItemId, date)
57 .stream()
58 .map(ReservationResourceDto::toDto)
59 .toList();
60 }
61
62 @Authenticated
63 @RolesAllowed(MEMBER_ROLE)
64 @Override
65 public List<ReservationResourceDto> findReservationByReserverId(Integer reserverId) {
66 return application.findReservationByReserverId(reserverId)
67 .stream()
68 .map(ReservationResourceDto::toDto)
69 .toList();
70 }
71
72 @Authenticated
73 @RolesAllowed(MEMBER_ROLE)
74 @Override
75 public List<ReservationResourceDto> getOwnReservations() {
76 return findReservationByReserverId(LoginUserUtils.get().getUserId());
77 }
78
79 @Authenticated
80 @RolesAllowed({ MEMBER_ROLE, ADMIN_ROLE })
81 @Override
82 public List<RentalItemResourceDto> getAllRentalItems() {
83 return application.getAllRentalItems()
84 .stream()
85 .map(RentalItemResourceDto::toDto)
86 .toList();
87 }
88
89 @Authenticated
90 @RolesAllowed(MEMBER_ROLE)
91 @ValidateGroup(groups = Add.class)
92 @Override
93 public ReservationResourceDto addReservation(AddReservationDto addDto) {
94 return application.addReservation(addDto.toEntity())
95 .transform(ReservationResourceDto::toDto);
96 }
97
98 @Authenticated
99 @RolesAllowed(MEMBER_ROLE)
100 @Override
101 public void cancelReservation(Integer reservationId) {
102 application.cancelReservation(reservationId);
103 }
104
105
106 @Authenticated
107 @RolesAllowed(MEMBER_ROLE)
108 @Override
109 public List<ReservationResourceDto> findReservationByRentalItemId(Integer rentalItemId) {
110 return application.findReservationByRentalItemId(rentalItemId)
111 .stream()
112 .map(ReservationResourceDto::toDto)
113 .toList();
114 }
115
116
117 @Authenticated
118 @RolesAllowed(MEMBER_ROLE)
119 @Override
120 public List<RentalItemResourceDto> findCanRentedItemAtTerm(LocalDateTime from, LocalDateTime to) {
121 return application.findCanRentedItemAtTerm(from, to)
122 .stream()
123 .map(RentalItemResourceDto::toDto)
124 .toList();
125 }
126
127
128 @Authenticated
129 @RolesAllowed(MEMBER_ROLE)
130 @Override
131 public boolean canRentedItemAtTerm(Integer rentalItemId, LocalDateTime from, LocalDateTime to) {
132 return application.canRentedItemAtTerm(rentalItemId, from, to);
133 }
134
135 @Authenticated
136 @RolesAllowed(ADMIN_ROLE)
137 @Override
138 public RentalItemResourceDto addRentalItem(AddRentalItemDto addDto) {
139 return application.addRentalItem(addDto.toEntity())
140 .transform(RentalItemResourceDto::toDto);
141 }
142
143
144 @Authenticated
145 @RolesAllowed(ADMIN_ROLE)
146 @Override
147 public RentalItemResourceDto updateRentalItem(RentalItemResourceDto updateDto) {
148 return application.updateRentalItem(updateDto.toEntity())
149 .transform(RentalItemResourceDto::toDto);
150 }
151
152
153 @Authenticated
154 @RolesAllowed(ADMIN_ROLE)
155 @Override
156 public void deleteRentalItem(Integer rentalItemId) {
157 application.deleteRentalItem(rentalItemId);
158 }
159
160
161 @Authenticated
162 @RolesAllowed(ADMIN_ROLE)
163 @Override
164 public List<ReservationResourceDto> getAllReservations() {
165 return application.getAllReservations()
166 .stream()
167 .map(ReservationResourceDto::toDto)
168 .toList();
169 }
170
171
172 @Authenticated
173 @RolesAllowed(ADMIN_ROLE)
174 @Override
175 public ReservationResourceDto updateReservation(ReservationResourceDto updateDto) {
176 return application.updateReservation(updateDto.toEntity())
177 .transform(ReservationResourceDto::toDto);
178 }
179
180
181 @Authenticated
182 @RolesAllowed(ADMIN_ROLE)
183 @Override
184 public void deleteReservation(Integer reservationId) {
185 application.deleteReservation(reservationId);
186 }
187
188 @Authenticated
189 @RolesAllowed(ADMIN_ROLE)
190 @Override
191 public List<UserAccountResourceDto> getAllUserAccounts() {
192 return application.getAllUserAccounts()
193 .stream()
194 .map(UserAccountResourceDto::toDto)
195 .toList();
196 }
197
198 @Authenticated
199 @RolesAllowed(ADMIN_ROLE)
200 @Override
201 public UserAccountResourceDto addUserAccount(AddUserAccountDto addDto) {
202 return application.addUserAccount(addDto.toEntity())
203 .transform(UserAccountResourceDto::toDto);
204 }
205
206 @Authenticated
207 @RolesAllowed(ADMIN_ROLE)
208 @Override
209 public UserAccountResourceDto updateUserAccount(UserAccountResourceDto updateDto) {
210 return application.updateUserAccount(updateDto.toEntity())
211 .transform(UserAccountResourceDto::toDto);
212 }
213
214
215 @Authenticated
216 @RolesAllowed(ADMIN_ROLE)
217 @Override
218 public void deleteUserAccount(Integer userAccountId) {
219 application.deleteUserAccount(userAccountId);
220 }
221
222 @Authenticated
223 @RolesAllowed({ MEMBER_ROLE, ADMIN_ROLE })
224 @Override
225 public UserAccountResourceDto getOwnUserProfile() {
226 return application.getOwnUserProfile().transform(UserAccountResourceDto::toDto);
227 }
228
229 @Authenticated
230 @RolesAllowed({ MEMBER_ROLE, ADMIN_ROLE })
231 @Override
232 public UserAccountResourceDto updateUserProfile(UserAccountResourceDto updateDto) {
233 return application.updateUserProfile(updateDto.toEntity())
234 .transform(UserAccountResourceDto::toDto);
235 }
236 }