View Javadoc
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)); // this method is for debug so convert.
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 }) // add admin role for react-ui
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) // for @ReserveStartDateTimeFuture
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     // for react-ui
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     // for react-ui
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     // for react-ui
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     // for react-ui
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     // for react-ui
153     @Authenticated
154     @RolesAllowed(ADMIN_ROLE)
155     @Override
156     public void deleteRentalItem(Integer rentalItemId) {
157         application.deleteRentalItem(rentalItemId);
158     }
159 
160     // for react-ui
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     // for react-ui
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     // for react-ui
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     // for react-ui
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 }