StudentLoanManagement
UserController.java
Go to the documentation of this file.
1package com.student_loan.controller;
2
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;
9
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;
19
20import java.util.ArrayList;
21import java.util.List;
22
28@RestController
29@RequestMapping("/users")
30public class UserController {
31
32
33 private UserService userService;
34
35 private ItemService itemService;
41 public UserController(UserService userService, ItemService itemService) {
42 this.userService = userService;
43 this.itemService = itemService;
44 }
51 @GetMapping
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);
56 }
57 return new ResponseEntity<>(userService.getAllUsers(), HttpStatus.OK);
58 }
65 @PostMapping("/login")
66 public ResponseEntity<?> login(@RequestBody CredentialsDTO credentials) {
67 String token = userService.login(credentials);
68
69 if (token.equals("Invalid credentials")) {
70 return ResponseEntity.status(401).body("Invalid credentials");
71 }
72 return ResponseEntity.ok().body("{\"token\": \"" + token + "\"}");
73 }
80 @PostMapping("/logout")
81 public ResponseEntity<String> logout(@RequestParam("token") String token) {
82 if (userService.logout(token)) {
83 return new ResponseEntity<>(HttpStatus.OK);
84 } else {
85 return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
86 }
87 }
94 @GetMapping("/{id}")
95 public ResponseEntity<UserDTO> getUserById(@PathVariable Long id) {
96 Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
97 String email = authentication.getName();
98
99 User user = userService.getUserByEmail(email);
100 if (user == null) {
101 return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
102 }
103 User retrievedUser = userService.getUserById(id).get();
104 UserDTO userDTO = new UserDTO(retrievedUser.getId(), retrievedUser.getName(), retrievedUser.getEmail());
105
106 return new ResponseEntity<>(userDTO, HttpStatus.OK);
107 }
108
117 @GetMapping("/{id}/record")
118 public ResponseEntity<UserRecord> getUserRecordById(@PathVariable Long id) {
119 Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
120 String email = authentication.getName();
121
122 User requester = userService.getUserByEmail(email);
123 if (requester == null) {
124 return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
125 }
126
127 User target = userService.getUserById(id)
128 .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));
129
130 return ResponseEntity.ok(userToUserRecord(target));
131 }
132
133 // Ítems prestados por un usuario
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);
138 }
139
140 // Ítems tomados prestados por un usuario
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);
145 }
146
155 @PutMapping("/{id}")
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);
160 }
161
162 try {
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);
167 }
168 }
169
176 //Register
177 @PostMapping("/register")
178 public ResponseEntity<String> register(@RequestBody RegistrationRecord userDTO) {
179 if (userService.register(registerRecordToUser(userDTO))) {
180 return ResponseEntity.ok("User registered correctly");
181 } else {
182 return ResponseEntity.badRequest().body("The user already exists");
183 }
184 }
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);
198 }
199 userService.deleteUser(id);
200
201 return new ResponseEntity<>(HttpStatus.OK);
202 }
203
204
212 public User registerRecordToUser(RegistrationRecord data) {
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);
224 return user;
225 }
233 public User userRecordToUser(UserRecord userDTO) {
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());
245
246 return user;
247 }
248
249 public UserRecord userToUserRecord(User user) {
250 String[] nameParts = user.getName().split(" ");
251 String firstName = nameParts[0];
252 String lastName = nameParts.length > 1 ? nameParts[nameParts.length - 1] : "";
253
254 return new UserRecord(
255 firstName,
256 lastName,
257 user.getEmail(),
258 user.getPassword(),
259 user.getTelephoneNumber(),
260 user.getAddress(),
261 user.getDegreeType().name(),
262 user.getDegreeYear(),
263 user.getPenalties(),
264 user.getAverageRating(),
265 user.getAdmin()
266 );
267 }
268}
UserController(UserService userService, ItemService itemService)
ResponseEntity< List< User > > getAllUsers(@RequestParam("token") String token)
User registerRecordToUser(RegistrationRecord data)