From 16bd83c57015977a233d9a48d763df6592ea153d Mon Sep 17 00:00:00 2001 From: joungmin Date: Mon, 9 Mar 2026 21:41:57 +0900 Subject: [PATCH] Fix login 401, admin permission, video links serialization, and admin UI styling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix UserInfo boolean field naming (isAdmin → admin) for proper Jackson/MyBatis mapping - Configure Google OAuth audience with actual client ID to fix token verification - Parse CLOB fields and convert Oracle TIMESTAMP in restaurant video links API - Add explicit bg-white/text-gray-900 to admin page inputs, selects, and table headers - Add keyPrefix to RestaurantList to avoid duplicate React keys across desktop/mobile Co-Authored-By: Claude Opus 4.6 --- .../java/com/tasteby/domain/UserInfo.java | 2 +- .../java/com/tasteby/service/AuthService.java | 6 +- .../tasteby/service/RestaurantService.java | 8 ++- .../src/main/resources/application.yml | 1 + .../mybatis/mapper/RestaurantMapper.xml | 3 +- .../resources/mybatis/mapper/UserMapper.xml | 2 +- frontend/src/app/admin/page.tsx | 60 +++++++++---------- frontend/src/app/page.tsx | 2 + frontend/src/components/RestaurantList.tsx | 4 +- 9 files changed, 51 insertions(+), 37 deletions(-) diff --git a/backend-java/src/main/java/com/tasteby/domain/UserInfo.java b/backend-java/src/main/java/com/tasteby/domain/UserInfo.java index 0656d89..828cca5 100644 --- a/backend-java/src/main/java/com/tasteby/domain/UserInfo.java +++ b/backend-java/src/main/java/com/tasteby/domain/UserInfo.java @@ -16,7 +16,7 @@ public class UserInfo { private String nickname; private String avatarUrl; @JsonProperty("is_admin") - private boolean isAdmin; + private boolean admin; private String provider; private String providerId; private String createdAt; diff --git a/backend-java/src/main/java/com/tasteby/service/AuthService.java b/backend-java/src/main/java/com/tasteby/service/AuthService.java index 89d0cc6..a90fb7b 100644 --- a/backend-java/src/main/java/com/tasteby/service/AuthService.java +++ b/backend-java/src/main/java/com/tasteby/service/AuthService.java @@ -6,6 +6,7 @@ import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; import com.tasteby.domain.UserInfo; import com.tasteby.security.JwtTokenProvider; +import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.web.server.ResponseStatusException; @@ -20,12 +21,13 @@ public class AuthService { private final JwtTokenProvider jwtProvider; private final GoogleIdTokenVerifier verifier; - public AuthService(UserService userService, JwtTokenProvider jwtProvider) { + public AuthService(UserService userService, JwtTokenProvider jwtProvider, + @Value("${app.google.client-id}") String googleClientId) { this.userService = userService; this.jwtProvider = jwtProvider; this.verifier = new GoogleIdTokenVerifier.Builder( new NetHttpTransport(), GsonFactory.getDefaultInstance()) - .setAudience(Collections.emptyList()) // Accept any audience + .setAudience(Collections.singletonList(googleClientId)) .build(); } diff --git a/backend-java/src/main/java/com/tasteby/service/RestaurantService.java b/backend-java/src/main/java/com/tasteby/service/RestaurantService.java index 8ac2aca..7418b7f 100644 --- a/backend-java/src/main/java/com/tasteby/service/RestaurantService.java +++ b/backend-java/src/main/java/com/tasteby/service/RestaurantService.java @@ -35,7 +35,13 @@ public class RestaurantService { public List> findVideoLinks(String restaurantId) { var rows = mapper.findVideoLinks(restaurantId); - return rows.stream().map(JsonUtil::lowerKeys).toList(); + return rows.stream().map(row -> { + var m = JsonUtil.lowerKeys(row); + m.put("foods_mentioned", JsonUtil.parseStringList(m.get("foods_mentioned"))); + m.put("evaluation", JsonUtil.parseMap(m.get("evaluation"))); + m.put("guests", JsonUtil.parseStringList(m.get("guests"))); + return m; + }).toList(); } public void update(String id, Map fields) { diff --git a/backend-java/src/main/resources/application.yml b/backend-java/src/main/resources/application.yml index 625a79d..2b8ca4a 100644 --- a/backend-java/src/main/resources/application.yml +++ b/backend-java/src/main/resources/application.yml @@ -54,6 +54,7 @@ app: google: maps-api-key: ${GOOGLE_MAPS_API_KEY} youtube-api-key: ${YOUTUBE_DATA_API_KEY} + client-id: ${GOOGLE_CLIENT_ID:635551099330-2l003d3ernjmkqavd4f6s78r8r405iml.apps.googleusercontent.com} cache: ttl-seconds: 600 diff --git a/backend-java/src/main/resources/mybatis/mapper/RestaurantMapper.xml b/backend-java/src/main/resources/mybatis/mapper/RestaurantMapper.xml index c5c1441..d1ae2a7 100644 --- a/backend-java/src/main/resources/mybatis/mapper/RestaurantMapper.xml +++ b/backend-java/src/main/resources/mybatis/mapper/RestaurantMapper.xml @@ -60,7 +60,8 @@ setNewName(e.target.value)} - className="border rounded px-3 py-2 flex-1 text-sm" + className="border rounded px-3 py-2 flex-1 text-sm bg-white text-gray-900" /> setNewFilter(e.target.value)} - className="border rounded px-3 py-2 w-40 text-sm" + className="border rounded px-3 py-2 w-40 text-sm bg-white text-gray-900" />