1010import javax .crypto .SecretKey ;
1111
1212import org .springframework .beans .factory .annotation .Autowired ;
13+ import org .springframework .http .HttpStatus ;
1314import org .springframework .http .ResponseEntity ;
1415import org .springframework .security .core .Authentication ;
1516import org .springframework .security .core .context .SecurityContextHolder ;
2223import org .springframework .web .bind .annotation .RestController ;
2324
2425import de .tum .aet .devops25 .api .generated .controller .UserRegistrationApi ;
26+ import de .tum .aet .devops25 .api .generated .model .ErrorResponse ;
2527import de .tum .aet .devops25 .api .generated .model .RegisterUserRequest ;
28+ import de .tum .aet .devops25 .api .generated .model .UpdateUserRequest ;
2629import de .tum .aet .devops25 .api .generated .model .User ;
2730import io .jsonwebtoken .Jwts ;
2831import io .jsonwebtoken .security .Keys ;
@@ -45,7 +48,7 @@ public UserController(UserRepository userRepository) {
4548 public ResponseEntity <User > registerUser (RegisterUserRequest registerUserRequest ) {
4649 // Check if user already exists
4750 if (userRepository .findByEmail (registerUserRequest .getEmail ()).isPresent ()) {
48- return ResponseEntity . status ( 409 ). build (); // Conflict: user already exists
51+ throw new UserAlreadyExistsException ( "User with this email already exists" );
4952 }
5053
5154 // Create and save new user
@@ -108,14 +111,26 @@ public Map<String, Object> getUserServiceHealth() {
108111 }
109112
110113 @ PostMapping ("/api/users/login" )
111- public ResponseEntity <LoginResponse > login (@ RequestBody LoginRequest loginRequest ) {
114+ public ResponseEntity <? > login (@ RequestBody LoginRequest loginRequest ) {
112115 Optional <UserEntity > userOpt = userRepository .findByEmail (loginRequest .getEmail ());
113116 if (userOpt .isEmpty ()) {
114- return ResponseEntity .status (401 ).build ();
117+ ErrorResponse error = new ErrorResponse ()
118+ .error ("INVALID_CREDENTIALS" )
119+ .message ("Invalid email or password" )
120+ .path ("/api/users/login" )
121+ .status (401 )
122+ .timestamp (OffsetDateTime .now ());
123+ return ResponseEntity .status (401 ).body (error );
115124 }
116125 UserEntity user = userOpt .get ();
117126 if (!passwordEncoder .matches (loginRequest .getPassword (), user .getPasswordHash ())) {
118- return ResponseEntity .status (401 ).build ();
127+ ErrorResponse error = new ErrorResponse ()
128+ .error ("INVALID_CREDENTIALS" )
129+ .message ("Invalid email or password" )
130+ .path ("/api/users/login" )
131+ .status (401 )
132+ .timestamp (OffsetDateTime .now ());
133+ return ResponseEntity .status (401 ).body (error );
119134 }
120135
121136 // Update lastLoginAt
@@ -140,13 +155,19 @@ public ResponseEntity<LoginResponse> login(@RequestBody LoginRequest loginReques
140155 }
141156
142157 @ GetMapping ("/api/users/profile" )
143- public ResponseEntity <User > getProfile () {
158+ public ResponseEntity <? > getProfile () {
144159 Authentication auth = SecurityContextHolder .getContext ().getAuthentication ();
145160 String userId = (String ) auth .getPrincipal ();
146161
147162 Optional <UserEntity > userOpt = userRepository .findById (UUID .fromString (userId ));
148163 if (userOpt .isEmpty ()) {
149- return ResponseEntity .status (404 ).build ();
164+ ErrorResponse error = new ErrorResponse ()
165+ .error ("USER_NOT_FOUND" )
166+ .message ("User not found" )
167+ .path ("/api/users/profile" )
168+ .status (404 )
169+ .timestamp (OffsetDateTime .now ());
170+ return ResponseEntity .status (404 ).body (error );
150171 }
151172
152173 UserEntity userEntity = userOpt .get ();
@@ -185,7 +206,13 @@ public ResponseEntity<?> updateProfile(@RequestBody UpdateUserRequest updateRequ
185206
186207 Optional <UserEntity > userOpt = userRepository .findById (UUID .fromString (userId ));
187208 if (userOpt .isEmpty ()) {
188- return ResponseEntity .status (404 ).body ("User not found" );
209+ ErrorResponse error = new ErrorResponse ()
210+ .error ("USER_NOT_FOUND" )
211+ .message ("User not found" )
212+ .path ("/api/users/profile" )
213+ .status (404 )
214+ .timestamp (OffsetDateTime .now ());
215+ return ResponseEntity .status (404 ).body (error );
189216 }
190217 UserEntity user = userOpt .get ();
191218
@@ -196,8 +223,8 @@ public ResponseEntity<?> updateProfile(@RequestBody UpdateUserRequest updateRequ
196223 if (updateRequest .getLastName () != null ) {
197224 user .setLastName (updateRequest .getLastName ());
198225 }
199- if (updateRequest .getEmail () != null ) {
200- user .setEmail (updateRequest .getEmail ());
226+ if (updateRequest .getIsActive () != null ) {
227+ user .setActive (updateRequest .getIsActive ());
201228 }
202229 if (updateRequest .getPreferences () != null ) {
203230 // Get existing preferences or create new ones
@@ -229,14 +256,30 @@ public ResponseEntity<?> updateProfile(@RequestBody UpdateUserRequest updateRequ
229256 user .setUpdatedAt (OffsetDateTime .now ());
230257
231258 // Add more fields as needed
232- userRepository .save (user );
259+ UserEntity savedUser = userRepository .save (user );
260+
261+ // Map to API User model and return
262+ User userResponse = new User ()
263+ .id (savedUser .getId ())
264+ .email (savedUser .getEmail ())
265+ .firstName (savedUser .getFirstName ())
266+ .lastName (savedUser .getLastName ())
267+ .isActive (savedUser .isActive ())
268+ .preferences (UserPreferencesMapper .toDto (savedUser .getPreferences ()))
269+ .createdAt (savedUser .getCreatedAt ())
270+ .updatedAt (savedUser .getUpdatedAt ());
271+
272+ // Handle lastLoginAt properly
273+ if (savedUser .getLastLoginAt () != null ) {
274+ userResponse .lastLoginAt (savedUser .getLastLoginAt ());
275+ }
233276
234- return ResponseEntity .ok ("Profile updated successfully" );
277+ return ResponseEntity .ok (userResponse );
235278 }
236279
237280 @ PostMapping ("/api/users/logout" )
238281 public ResponseEntity <?> logout () {
239- // For stateless JWT, just return 200 OK.
240- return ResponseEntity .ok ("Logged out successfully" );
282+ // For stateless JWT, just return 200 OK with a simple message
283+ return ResponseEntity .ok (). body ( "Logged out successfully" );
241284 }
242285}
0 commit comments