Skip to content

Commit 603a2d2

Browse files
Merge pull request #33 from OtavioXimarelli/copilot/fix-bf63447b-ec34-47d4-8a73-e4360de2143b
Consolidate controllers and security layer - remove duplicated code and redundant files
2 parents c9bb0c4 + 6a23429 commit 603a2d2

File tree

10 files changed

+484
-705
lines changed

10 files changed

+484
-705
lines changed

src/main/java/com/otavio/aifoodapp/config/SecurityDebugConfig.java

Lines changed: 0 additions & 42 deletions
This file was deleted.

src/main/java/com/otavio/aifoodapp/controller/ApplicationControllerAdvice.java

Lines changed: 0 additions & 44 deletions
This file was deleted.

src/main/java/com/otavio/aifoodapp/controller/AuthController.java

Lines changed: 71 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,37 @@
11
package com.otavio.aifoodapp.controller;
22

3+
import java.util.HashMap;
34
import java.util.Map;
5+
import java.util.Optional;
46
import java.util.concurrent.ConcurrentHashMap;
57

68
import org.springframework.http.HttpStatus;
79
import org.springframework.http.ResponseEntity;
810
import org.springframework.security.core.Authentication;
911
import org.springframework.security.core.context.SecurityContextHolder;
1012
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
13+
import org.springframework.security.oauth2.core.user.OAuth2User;
14+
import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
1115
import org.springframework.web.bind.annotation.GetMapping;
1216
import org.springframework.web.bind.annotation.PostMapping;
1317
import org.springframework.web.bind.annotation.RequestMapping;
1418
import org.springframework.web.bind.annotation.RestController;
1519

20+
import com.otavio.aifoodapp.dto.UserDTO;
1621
import com.otavio.aifoodapp.model.User;
22+
import com.otavio.aifoodapp.repository.UserRepository;
1723
import com.otavio.aifoodapp.security.TokenService;
1824
import com.otavio.aifoodapp.service.FoodItemService;
1925

2026
import jakarta.servlet.http.Cookie;
2127
import jakarta.servlet.http.HttpServletRequest;
28+
import jakarta.servlet.http.HttpServletResponse;
2229
import jakarta.servlet.http.HttpSession;
2330
import lombok.extern.slf4j.Slf4j;
2431

2532
/**
26-
* Controller for authentication related endpoints
33+
* Controlador consolidado para autenticação
34+
* Combina funcionalidades de status, login, logout e gerenciamento de tokens
2735
*/
2836
@RestController
2937
@RequestMapping("/api/auth")
@@ -32,22 +40,79 @@ public class AuthController {
3240

3341
private final FoodItemService foodItemService;
3442
private final TokenService tokenService;
43+
private final UserRepository userRepository;
3544

3645
// Cache para controlar a frequência de verificações por sessão
3746
private final Map<String, Long> lastStatusChecks = new ConcurrentHashMap<>();
3847
private static final long STATUS_CHECK_THROTTLE_MS = 2000; // 2 segundos
3948

40-
public AuthController(FoodItemService foodItemService, TokenService tokenService) {
49+
public AuthController(FoodItemService foodItemService, TokenService tokenService, UserRepository userRepository) {
4150
this.foodItemService = foodItemService;
4251
this.tokenService = tokenService;
52+
this.userRepository = userRepository;
4353
}
4454

55+
4556
/**
46-
* Check if user is authenticated and return user details
47-
* Used by the frontend to verify persistent authentication
48-
* @return User authentication status and details
57+
* Verificar informações do usuário atual
58+
* Endpoint alternativo para obter dados do usuário autenticado
59+
*/
60+
@GetMapping("/me")
61+
public ResponseEntity<UserDTO> getCurrentUser(Authentication authentication) {
62+
if (authentication == null || !authentication.isAuthenticated()) {
63+
return ResponseEntity.status(401).build();
64+
}
65+
66+
if (authentication.getPrincipal() instanceof OAuth2User oauth2User) {
67+
String email = oauth2User.getAttribute("email");
68+
String name = oauth2User.getAttribute("name");
69+
70+
Optional<User> dbUser = (email != null) ? userRepository.findByEmail(email) : Optional.empty();
71+
if (dbUser.isPresent()) {
72+
return ResponseEntity.ok(UserDTO.fromUser(dbUser.get()));
73+
} else {
74+
UserDTO dto = new UserDTO(null, email, name, "USER");
75+
return ResponseEntity.ok(dto);
76+
}
77+
}
78+
79+
if (authentication.getPrincipal() instanceof User user) {
80+
return ResponseEntity.ok(UserDTO.fromUser(user));
81+
}
82+
83+
return ResponseEntity.status(401).build();
84+
}
85+
86+
/**
87+
* Endpoint para logout
88+
*/
89+
@PostMapping("/logout")
90+
public ResponseEntity<Map<String, String>> logout(HttpServletRequest request,
91+
HttpServletResponse response,
92+
Authentication authentication) {
93+
if (authentication != null) {
94+
new SecurityContextLogoutHandler().logout(request, response, authentication);
95+
}
96+
Map<String, String> result = new HashMap<>();
97+
result.put("message", "Logged out successfully");
98+
return ResponseEntity.ok(result);
99+
}
100+
101+
/**
102+
* Endpoint para obter URL de login do Google
103+
*/
104+
@GetMapping("/login/google")
105+
public ResponseEntity<Map<String, String>> getGoogleLoginUrl() {
106+
Map<String, String> response = new HashMap<>();
107+
response.put("loginUrl", "/oauth2/authorization/google");
108+
response.put("message", "Redirect to this URL to login with Google");
109+
return ResponseEntity.ok(response);
110+
}
111+
112+
/**
113+
* Verificar se o usuário está autenticado e retornar detalhes
114+
* Usado pelo frontend para verificar autenticação persistente
49115
*/
50-
51116
@GetMapping("/status")
52117
public ResponseEntity<?> authStatus(HttpServletRequest request) {
53118
log.info("=== AUTH STATUS CHECK ===");

src/main/java/com/otavio/aifoodapp/controller/AuthenticationController.java

Lines changed: 0 additions & 84 deletions
This file was deleted.

0 commit comments

Comments
 (0)