diff --git a/src/main/java/flipnote/user/user/presentation/grpc/GrpcUserQueryService.java b/src/main/java/flipnote/user/user/presentation/grpc/GrpcUserQueryService.java index 24647e5..e38d3e6 100644 --- a/src/main/java/flipnote/user/user/presentation/grpc/GrpcUserQueryService.java +++ b/src/main/java/flipnote/user/user/presentation/grpc/GrpcUserQueryService.java @@ -1,9 +1,13 @@ package flipnote.user.user.presentation.grpc; +import flipnote.user.auth.domain.TokenClaims; +import flipnote.user.auth.infrastructure.jwt.JwtProvider; import flipnote.user.user.domain.User; import flipnote.user.user.domain.UserRepository; import flipnote.user.grpc.GetUserByEmailRequest; import flipnote.user.grpc.GetUserByEmailResponse; +import flipnote.user.grpc.GetUserByTokenRequest; +import flipnote.user.grpc.GetUserByTokenResponse; import flipnote.user.grpc.GetUserRequest; import flipnote.user.grpc.GetUserResponse; import flipnote.user.grpc.GetUsersRequest; @@ -23,6 +27,7 @@ public class GrpcUserQueryService extends UserQueryServiceGrpc.UserQueryServiceImplBase { private final UserRepository userRepository; + private final JwtProvider jwtProvider; @Override public void getUser(GetUserRequest request, StreamObserver responseObserver) { @@ -85,6 +90,40 @@ public void getUserByEmail(GetUserByEmailRequest request, StreamObserver responseObserver) { + try { + if (!jwtProvider.isTokenValid(request.getAccessToken())) { + responseObserver.onError( + Status.UNAUTHENTICATED.withDescription("유효하지 않은 토큰입니다.").asRuntimeException() + ); + return; + } + + TokenClaims claims = jwtProvider.extractClaims(request.getAccessToken()); + User user = userRepository.findByIdAndStatus(claims.userId(), User.Status.ACTIVE) + .orElse(null); + + if (user == null) { + responseObserver.onError( + Status.NOT_FOUND.withDescription("사용자를 찾을 수 없습니다.").asRuntimeException() + ); + return; + } + + GetUserByTokenResponse response = GetUserByTokenResponse.newBuilder() + .setUserId(user.getId()) + .setNickname(user.getNickname()) + .build(); + + responseObserver.onNext(response); + responseObserver.onCompleted(); + } catch (Exception e) { + log.error("gRPC getUserByToken error", e); + responseObserver.onError(Status.INTERNAL.withDescription("Internal error").asRuntimeException()); + } + } + private GetUserResponse toResponse(User user) { return GetUserResponse.newBuilder() .setId(user.getId()) diff --git a/src/main/proto/user_query.proto b/src/main/proto/user_query.proto index 688e7c1..cd63e56 100644 --- a/src/main/proto/user_query.proto +++ b/src/main/proto/user_query.proto @@ -10,6 +10,7 @@ service UserQueryService { rpc GetUser(GetUserRequest) returns (GetUserResponse); rpc GetUsers(GetUsersRequest) returns (GetUsersResponse); rpc GetUserByEmail(GetUserByEmailRequest) returns (GetUserByEmailResponse); + rpc GetUserByToken(GetUserByTokenRequest) returns (GetUserByTokenResponse); } message GetUserRequest { @@ -39,3 +40,12 @@ message GetUserByEmailResponse { bool exists = 1; GetUserResponse user = 2; } + +message GetUserByTokenRequest { + string access_token = 1; +} + +message GetUserByTokenResponse { + int64 user_id = 1; + string nickname = 2; +}