package com.recipeapp.auth; import com.recipeapp.auth.dto.*; import com.recipeapp.common.ApiResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpSession; import jakarta.validation.Valid; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; import java.security.Principal; @RestController @RequestMapping("/v1/auth") public class AuthController { private final AuthService authService; public AuthController(AuthService authService) { this.authService = authService; } @PostMapping("/signup") public ResponseEntity> signup( @Valid @RequestBody SignupRequest request, HttpServletRequest httpRequest) { UserResponse user = authService.signup(request); authService.authenticateInSession(user.email(), "user", httpRequest); return ResponseEntity.status(HttpStatus.CREATED).body(ApiResponse.success(user)); } @PostMapping("/login") public ResponseEntity> login( @Valid @RequestBody LoginRequest request, HttpServletRequest httpRequest) { UserResponse user = authService.login(request); authService.authenticateInSession(user.email(), user.systemRole() != null ? user.systemRole() : "user", httpRequest); return ResponseEntity.ok(ApiResponse.success(user)); } @PostMapping("/logout") public ResponseEntity logout(HttpServletRequest httpRequest) { HttpSession session = httpRequest.getSession(false); if (session != null) { session.invalidate(); } SecurityContextHolder.clearContext(); return ResponseEntity.noContent().build(); } @GetMapping("/me") public ResponseEntity> me(Principal principal) { UserResponse user = authService.getCurrentUser(principal.getName()); return ResponseEntity.ok(ApiResponse.success(user)); } @PatchMapping("/me") public ResponseEntity> updateProfile( Principal principal, @Valid @RequestBody UpdateProfileRequest request) { UserResponse user = authService.updateProfile(principal.getName(), request); return ResponseEntity.ok(ApiResponse.success(user)); } }