1package com.student_loan.controller;
3import org.springframework.http.HttpStatus;
4import org.springframework.http.ResponseEntity;
5import org.springframework.security.core.Authentication;
6import org.springframework.security.core.context.SecurityContextHolder;
7import org.springframework.web.bind.annotation.*;
8import org.springframework.web.server.ResponseStatusException;
10import com.student_loan.model.Item;
11import com.student_loan.model.User;
12import com.student_loan.service.ItemService;
13import com.student_loan.service.UserService;
14import com.student_loan.dtos.UserRecord;
15import com.student_loan.dtos.CredentialsDTO;
16import com.student_loan.dtos.LoanAndItemDto;
17import com.student_loan.dtos.RegistrationRecord;
18import com.student_loan.dtos.UserDTO;
20import java.util.ArrayList;
29@RequestMapping(
"/users")
33 private UserService userService;
35 private ItemService itemService;
42 this.userService = userService;
43 this.itemService = itemService;
52 public ResponseEntity<List<User>>
getAllUsers(@RequestParam(
"token") String token) {
53 User user = userService.getUserByToken(token);
54 if (user ==
null || user.getAdmin()==
false) {
55 return new ResponseEntity<>(
new ArrayList<>(),HttpStatus.UNAUTHORIZED);
57 return new ResponseEntity<>(userService.getAllUsers(), HttpStatus.OK);
65 @PostMapping(
"/login")
66 public ResponseEntity<?> login(@RequestBody CredentialsDTO credentials) {
67 String token = userService.login(credentials);
69 if (token.equals(
"Invalid credentials")) {
70 return ResponseEntity.status(401).body(
"Invalid credentials");
72 return ResponseEntity.ok().body(
"{\"token\": \"" + token +
"\"}");
80 @PostMapping(
"/logout")
81 public ResponseEntity<String> logout(@RequestParam("token") String token) {
82 if (userService.logout(token)) {
83 return new ResponseEntity<>(HttpStatus.OK);
85 return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
95 public ResponseEntity<UserDTO> getUserById(@PathVariable Long
id) {
96 Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
97 String email = authentication.getName();
99 User user = userService.getUserByEmail(email);
101 return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
103 User retrievedUser = userService.getUserById(
id).get();
104 UserDTO userDTO =
new UserDTO(retrievedUser.getId(), retrievedUser.getName(), retrievedUser.getEmail());
106 return new ResponseEntity<>(userDTO, HttpStatus.OK);
117 @GetMapping(
"/{id}/record")
118 public ResponseEntity<UserRecord> getUserRecordById(@PathVariable Long
id) {
119 Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
120 String email = authentication.getName();
122 User requester = userService.getUserByEmail(email);
123 if (requester ==
null) {
124 return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
127 User target = userService.getUserById(
id)
128 .orElseThrow(() ->
new ResponseStatusException(HttpStatus.NOT_FOUND));
130 return ResponseEntity.ok(userToUserRecord(target));
134 @GetMapping(
"/{userId}/items/lent")
135 public ResponseEntity<List<LoanAndItemDto>> getItemsLentByUser(@PathVariable Long userId) {
136 List<LoanAndItemDto> items = itemService.getItemsLentByUserWithActiveLoans(userId);
137 return ResponseEntity.ok(items);
141 @GetMapping(
"/{userId}/items/borrowed")
142 public ResponseEntity<List<LoanAndItemDto>> getItemsBorrowedByUser(@PathVariable Long userId) {
143 List<LoanAndItemDto> items = itemService.getItemsBorrowedByUserWithActiveLoans(userId);
144 return ResponseEntity.ok(items);
156 public ResponseEntity<User> updateUser(@PathVariable Long
id, @RequestBody UserRecord userData, @RequestParam("token") String token) {
157 User user = userService.getUserByToken(token);
158 if (user ==
null || user.getAdmin() ==
false && user.getId() !=
id) {
159 return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
163 User updatedUser = userService.updateUser(
id, userRecordToUser(userData));
164 return new ResponseEntity<>(updatedUser, HttpStatus.OK);
165 }
catch (RuntimeException e) {
166 return new ResponseEntity<>(HttpStatus.NOT_FOUND);
177 @PostMapping(
"/register")
178 public ResponseEntity<String> register(@RequestBody RegistrationRecord userDTO) {
179 if (userService.register(registerRecordToUser(userDTO))) {
180 return ResponseEntity.ok(
"User registered correctly");
182 return ResponseEntity.badRequest().body(
"The user already exists");
193 @DeleteMapping(
"/{id}")
194 public ResponseEntity<String> deleteUser(@PathVariable Long
id, @RequestParam("token") String token) {
195 User user = userService.getUserByToken(token);
196 if (user ==
null || user.getAdmin() ==
false && user.getId() !=
id) {
197 return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
199 userService.deleteUser(
id);
201 return new ResponseEntity<>(HttpStatus.OK);
213 User user =
new User();
214 user.setName(data.name() +
" " + data.lastName() );
215 user.setEmail(data.email());
216 user.setPassword(data.password());
217 user.setTelephoneNumber(data.telephoneNumber());
218 user.setAddress(data.address());
219 user.setDegreeType(User.DegreeType.valueOf(data.degreeType()));
220 user.setDegreeYear(data.degreeYear());
221 user.setPenalties(0);
222 user.setAverageRating(0.0);
223 user.setAdmin(
false);
234 User user =
new User();
235 user.setName(userDTO.name()+
" "+userDTO.lastName());
236 user.setEmail(userDTO.email());
237 user.setPassword(userDTO.password());
238 user.setTelephoneNumber(userDTO.telephoneNumber());
239 user.setAddress(userDTO.address());
240 user.setDegreeType(User.DegreeType.UNIVERSITY_DEGREE);
241 user.setDegreeYear(userDTO.degreeYear());
242 user.setPenalties(userDTO.penalties());
243 user.setAverageRating(userDTO.averageRating());
244 user.setAdmin(userDTO.admin());
250 String[] nameParts = user.getName().split(
" ");
251 String firstName = nameParts[0];
252 String lastName = nameParts.length > 1 ? nameParts[nameParts.length - 1] :
"";
254 return new UserRecord(
259 user.getTelephoneNumber(),
261 user.getDegreeType().name(),
262 user.getDegreeYear(),
264 user.getAverageRating(),
UserController(UserService userService, ItemService itemService)
ResponseEntity< List< User > > getAllUsers(@RequestParam("token") String token)
UserRecord userToUserRecord(User user)
User userRecordToUser(UserRecord userDTO)
User registerRecordToUser(RegistrationRecord data)