From 225cf6cbabf04cf7db3c661a63d9235ddc115f06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=A3?= Date: Sun, 21 Sep 2025 15:14:16 -0300 Subject: [PATCH 1/5] =?UTF-8?q?feat(exception):=20cria=20a=20exce=C3=A7?= =?UTF-8?q?=C3=A3o=20InvalidTokenException=20para=20tratamento=20de=20toke?= =?UTF-8?q?ns=20inv=C3=A1lidos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/linktreeclone/exception/InvalidTokenException.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 linktreeclone-backend/src/main/java/br/com/linktreeclone/exception/InvalidTokenException.java diff --git a/linktreeclone-backend/src/main/java/br/com/linktreeclone/exception/InvalidTokenException.java b/linktreeclone-backend/src/main/java/br/com/linktreeclone/exception/InvalidTokenException.java new file mode 100644 index 0000000..b64c646 --- /dev/null +++ b/linktreeclone-backend/src/main/java/br/com/linktreeclone/exception/InvalidTokenException.java @@ -0,0 +1,7 @@ +package br.com.linktreeclone.exception; + +public class InvalidTokenException extends RuntimeException { + public InvalidTokenException(String message) { + super(message); + } +} From fd8d7e7e108c39d13e6dbd4809281d72fdfb592c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=A3?= Date: Sun, 21 Sep 2025 15:14:21 -0300 Subject: [PATCH 2/5] =?UTF-8?q?refactor(exception):=20ajusta=20a=20formata?= =?UTF-8?q?=C3=A7=C3=A3o=20da=20classe=20InvalidTokenException?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../linktreeclone/exception/InvalidTokenException.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/linktreeclone-backend/src/main/java/br/com/linktreeclone/exception/InvalidTokenException.java b/linktreeclone-backend/src/main/java/br/com/linktreeclone/exception/InvalidTokenException.java index b64c646..60c8921 100644 --- a/linktreeclone-backend/src/main/java/br/com/linktreeclone/exception/InvalidTokenException.java +++ b/linktreeclone-backend/src/main/java/br/com/linktreeclone/exception/InvalidTokenException.java @@ -1,7 +1,8 @@ package br.com.linktreeclone.exception; -public class InvalidTokenException extends RuntimeException { - public InvalidTokenException(String message) { - super(message); - } +public class InvalidTokenException extends RuntimeException +{ + public InvalidTokenException(String message) { + super(message); + } } From d172bc70a30d151e19c9443bd3a8ed47448e5d05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=A3?= Date: Sun, 21 Sep 2025 15:43:14 -0300 Subject: [PATCH 3/5] =?UTF-8?q?feat(exception):=20adiciona=20tratamento=20?= =?UTF-8?q?para=20exce=C3=A7=C3=A3o=20InvalidTokenException?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/RestExceptionHandler.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/linktreeclone-backend/src/main/java/br/com/linktreeclone/exception/RestExceptionHandler.java b/linktreeclone-backend/src/main/java/br/com/linktreeclone/exception/RestExceptionHandler.java index 12c69e1..8782ca9 100644 --- a/linktreeclone-backend/src/main/java/br/com/linktreeclone/exception/RestExceptionHandler.java +++ b/linktreeclone-backend/src/main/java/br/com/linktreeclone/exception/RestExceptionHandler.java @@ -38,4 +38,16 @@ public ResponseEntity handleUnauthorizedException(UnauthorizedExc return new ResponseEntity<>(errorResponse, HttpStatus.FORBIDDEN); } + + @ExceptionHandler(InvalidTokenException.class) + public ResponseEntity handleInvalidTokenException(InvalidTokenException ex, WebRequest request) { + ErrorResponse errorResponse = new ErrorResponse( + LocalDateTime.now(), + HttpStatus.FORBIDDEN.value(), + "Forbidden", + ex.getMessage(), + request.getDescription(false).replace("uri=", "") + ); + return new ResponseEntity<>(errorResponse, HttpStatus.FORBIDDEN); + } } From 88f2b7e25135e3a70efbff616a45c5815258a4e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=A3?= Date: Sun, 21 Sep 2025 15:43:19 -0300 Subject: [PATCH 4/5] =?UTF-8?q?feat(exception):=20substitui=20RuntimeExcep?= =?UTF-8?q?tion=20por=20InvalidTokenException=20no=20m=C3=A9todo=20validat?= =?UTF-8?q?eToken?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/br/com/linktreeclone/security/TokenService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/linktreeclone-backend/src/main/java/br/com/linktreeclone/security/TokenService.java b/linktreeclone-backend/src/main/java/br/com/linktreeclone/security/TokenService.java index c4193f2..0a59aec 100644 --- a/linktreeclone-backend/src/main/java/br/com/linktreeclone/security/TokenService.java +++ b/linktreeclone-backend/src/main/java/br/com/linktreeclone/security/TokenService.java @@ -1,6 +1,7 @@ package br.com.linktreeclone.security; import br.com.linktreeclone.entity.User; +import br.com.linktreeclone.exception.InvalidTokenException; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.security.Keys; @@ -53,7 +54,7 @@ public String validateToken(String token) .getSubject(); } catch (Exception e) { - throw new RuntimeException("Token JWT expirado ou inválido"); + throw new InvalidTokenException("Token JWT expirado ou inválido"); } } } \ No newline at end of file From 24be1bde924f1a371ac579f21303413fbbc15954 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=A3?= Date: Sun, 21 Sep 2025 15:43:25 -0300 Subject: [PATCH 5/5] fix(api): atualiza a URL base do cliente Axios para o novo endpoint da API --- linktreeclone-frontend/src/api/axiosConfig.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/linktreeclone-frontend/src/api/axiosConfig.js b/linktreeclone-frontend/src/api/axiosConfig.js index 9e707df..2a967aa 100644 --- a/linktreeclone-frontend/src/api/axiosConfig.js +++ b/linktreeclone-frontend/src/api/axiosConfig.js @@ -1,7 +1,7 @@ import axios from 'axios'; const apiClient = axios.create({ - baseURL: 'https://linktree-clone-api-238899108893.southamerica-east1.run.app', + baseURL: 'https://linktree-clone-api-faw777jkuq-rj.a.run.app', }); @@ -15,4 +15,18 @@ apiClient.interceptors.request.use((config) => { return Promise.reject(error); }); +apiClient.interceptors.response.use( + (response) => { + return response; + }, + (error) => { + if (error.response && (error.response.status === 401 || error.response.status === 403)) { + localStorage.removeItem('authToken'); + window.location.href = '/login'; + console.log('Sessão expirada. Redirecionando para o login.'); + } + return Promise.reject(error); + } +); + export default apiClient; \ No newline at end of file