Skip to content

Commit

Permalink
feat: [UserService] 유저 아이디로 유저정보를 조회하는 gRPC 서버 코드를 추가합니다. (#140)
Browse files Browse the repository at this point in the history
* fix: update build.gradle

* refactor : Passport 추출 방식 수정

* refactor : 프로토버퍼 수정 (message -> isSuccess, JWTValidateDTO)

* feat : UserService Proto LoadById

* refactor : Passport 관련 클래스 빈 환경설정 등록

* refactor : userId로 유저 조회 gRPC Server 추가

* refactor : passport 환경변수 추가

* feat: user spring's ObjectMapper

* refactor : 로그인 gRPC 응답값 변경

* refactor : typo

* docs : passport ENV 추가

* refactor : github action passport 추가

---------

Co-authored-by: doxxx <doxxx93@gmail.com>
Co-authored-by: Wonyoung Lee <74983448+210-reverof@users.noreply.github.com>
  • Loading branch information
3 people authored Jan 31, 2024
1 parent ba92756 commit 95fded5
Show file tree
Hide file tree
Showing 11 changed files with 187 additions and 126 deletions.
125 changes: 65 additions & 60 deletions .github/workflows/dockerhub-push.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,72 +12,77 @@ jobs:
runs-on: ubuntu-latest

steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Checkout Repository
uses: actions/checkout@v2

- name: Set Environment Variables
run: |
BRANCH_NAME=$(echo $GITHUB_REF | awk -F'/' '{print $3}')
echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV
- name: Cache Gradle dependencies
uses: actions/cache@v2
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
gradle-
- name: Set Environment Variables
run: |
BRANCH_NAME=$(echo $GITHUB_REF | awk -F'/' '{print $3}')
echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV
- name: Set up JDK 17
uses: actions/setup-java@v2
with:
java-version: '17'
distribution: 'temurin'
- name: Cache Gradle dependencies
uses: actions/cache@v2
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
gradle-
- name: Grant execute permission for gradlew
run: chmod +x src/${{ env.BRANCH_NAME }}-service/gradlew
- name: Set up JDK 17
uses: actions/setup-java@v2
with:
java-version: '17'
distribution: 'temurin'

- name: Build with Gradle
env:
USER_DB_URI: ${{ secrets.USER_DB_URI }}
USER_DB_USERNAME: ${{ secrets.USER_DB_USERNAME }}
USER_DB_PASSWORD: ${{ secrets.USER_DB_PASSWORD }}
- name: Grant execute permission for gradlew
run: chmod +x src/${{ env.BRANCH_NAME }}-service/gradlew

SOCIAL_DB_USERNAME: ${{ secrets.SOCIAL_DB_USERNAME }}
SOCIAL_DB_PASSWORD: ${{ secrets.SOCIAL_DB_PASSWORD }}
SOCIAL_DB_URI: ${{ secrets.SOCIAL_DB_URI }}

run: |
cd src/${{ env.BRANCH_NAME }}-service
./gradlew clean build -x test
- name: Build with Gradle
env:
USER_DB_URI: ${{ secrets.USER_DB_URI }}
USER_DB_USERNAME: ${{ secrets.USER_DB_USERNAME }}
USER_DB_PASSWORD: ${{ secrets.USER_DB_PASSWORD }}

- name: Build and Push Docker Image
env:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
BRANCH_NAME: ${{ env.BRANCH_NAME }}
SOCIAL_DB_USERNAME: ${{ secrets.SOCIAL_DB_USERNAME }}
SOCIAL_DB_PASSWORD: ${{ secrets.SOCIAL_DB_PASSWORD }}
SOCIAL_DB_URI: ${{ secrets.SOCIAL_DB_URI }}

USER_DB_URI: ${{ secrets.USER_DB_URI }}
USER_DB_USERNAME: ${{ secrets.USER_DB_USERNAME }}
USER_DB_PASSWORD: ${{ secrets.USER_DB_PASSWORD }}

SOCIAL_DB_USERNAME: ${{ secrets.SOCIAL_DB_USERNAME }}
SOCIAL_DB_PASSWORD: ${{ secrets.SOCIAL_DB_PASSWORD }}
SOCIAL_DB_URI: ${{ secrets.SOCIAL_DB_URI }}
PASSPORT_KEY: ${{ secrets.PASSPORT_KEY }}
PASSPORT_ALGORITHM: ${{ secrets.PASSPORT_ALGORITHM }}

run: |
if [ -n "$BRANCH_NAME" ]; then
DOCKERFILE_DIR="src/$BRANCH_NAME-service"
else
echo "Failed to extract branch name from GITHUB_REF."
exit 1
fi
run: |
cd src/${{ env.BRANCH_NAME }}-service
./gradlew clean build -x test
- name: Build and Push Docker Image
env:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
BRANCH_NAME: ${{ env.BRANCH_NAME }}

cd $DOCKERFILE_DIR
docker run --privileged --rm tonistiigi/binfmt --install all
docker buildx create --use
docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD
docker buildx build --platform=linux/amd64,linux/arm64 -t $DOCKER_USERNAME/$BRANCH_NAME-service:latest . --push
USER_DB_URI: ${{ secrets.USER_DB_URI }}
USER_DB_USERNAME: ${{ secrets.USER_DB_USERNAME }}
USER_DB_PASSWORD: ${{ secrets.USER_DB_PASSWORD }}

SOCIAL_DB_USERNAME: ${{ secrets.SOCIAL_DB_USERNAME }}
SOCIAL_DB_PASSWORD: ${{ secrets.SOCIAL_DB_PASSWORD }}
SOCIAL_DB_URI: ${{ secrets.SOCIAL_DB_URI }}

PASSPORT_KEY: ${{ secrets.PASSPORT_KEY }}
PASSPORT_ALGORITHM: ${{ secrets.PASSPORT_ALGORITHM }}

run: |
if [ -n "$BRANCH_NAME" ]; then
DOCKERFILE_DIR="src/$BRANCH_NAME-service"
else
echo "Failed to extract branch name from GITHUB_REF."
exit 1
fi
cd $DOCKERFILE_DIR
docker run --privileged --rm tonistiigi/binfmt --install all
docker buildx create --use
docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD
docker buildx build --platform=linux/amd64,linux/arm64 -t $DOCKER_USERNAME/$BRANCH_NAME-service:latest . --push
Original file line number Diff line number Diff line change
Expand Up @@ -14,34 +14,31 @@
@RequiredArgsConstructor
public class CommonModuleConfig {

private final ObjectMapper objectMapper;

@Value("${passport.algorithm}")
String HMacAlgorithm;

@Value("${passport.key}")
String passportSecretKey;

@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper();
}

@Bean
public HMACEncoder hmacEncoder() {
return new HMACEncoder(HMacAlgorithm, passportSecretKey);
}

@Bean
public PassportGenerator passportGenerator() {
return new PassportGenerator(objectMapper(), hmacEncoder());
return new PassportGenerator(objectMapper, hmacEncoder());
}

@Bean
public PassportValidator passportValidator() {
return new PassportValidator(objectMapper(), hmacEncoder());
return new PassportValidator(objectMapper, hmacEncoder());
}

@Bean
public PassportExtractor passportExtractor() {
return new PassportExtractor(objectMapper(), passportValidator());
return new PassportExtractor(objectMapper, passportValidator());
}
}
1 change: 1 addition & 0 deletions src/common-module/src/main/proto/user_service.proto
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,5 @@ message GUpdateUserAuthStatusResponse {

message GCheckEmailAndPasswordResponse {
bool isSuccess = 1;
int64 userId = 2;
}
5 changes: 4 additions & 1 deletion src/user-service/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ FROM openjdk:17-oracle
ENV USER_DB_URI=${USER_DB_URI}
ENV USER_DB_USERNAME=${USER_DB_USERNAME}
ENV USER_DB_PASSWORD=${USER_DB_PASSWORD}
ENV PASSPORT_KEY=${PASSPORT_KEY}
ENV PASSPORT_ALGORITHM=${PASSPORT_ALGORITHM}

ARG JAR_FILE=build/libs/easel-user-service-0.0.1-SNAPSHOT.jar
ADD ${JAR_FILE} easel-user-service.jar
ENTRYPOINT ["java", "-jar", "/easel-user-service.jar"]
ENTRYPOINT ["java", "-jar", "/easel-user-service.jar"]
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package org.palette.easeluserservice;

import org.palette.config.CommonModuleConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Import;

@Import({CommonModuleConfig.class})
@SpringBootApplication
public class EaselUserServiceApplication {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,12 @@
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/users")
@RequiredArgsConstructor
public class UserController {

private final UserUsecase userUsecase;

@PostMapping("verify-email")
@PostMapping("/verify-email")
public ResponseEntity<EmailDuplicationVerifyResponse> verifyUsername(
@RequestBody EmailDuplicationVerifyRequest emailDuplicationVerifyRequest
) {
Expand All @@ -29,15 +28,15 @@ public ResponseEntity<EmailDuplicationVerifyResponse> verifyUsername(
}

@ResponseStatus(HttpStatus.CREATED)
@PostMapping("temporary-join")
@PostMapping("/temporary-join")
public void temporaryJoin(
@RequestBody TemporaryJoinRequest temporaryJoinRequest
) {
userUsecase.executeTemporaryJoin(temporaryJoinRequest);
}

@ResponseStatus(HttpStatus.CREATED)
@PostMapping("join")
@PostMapping("/join")
public void join(
@RequestBody JoinRequest joinRequest
) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package org.palette.easeluserservice.external;

import io.grpc.stub.StreamObserver;
import lombok.RequiredArgsConstructor;
import net.devh.boot.grpc.server.service.GrpcService;
import org.palette.easeluserservice.persistence.User;
import org.palette.easeluserservice.service.UserService;
import org.palette.grpc.*;
import org.springframework.transaction.annotation.Transactional;

@GrpcService
@RequiredArgsConstructor
public class GrpcServer extends GUserServiceGrpc.GUserServiceImplBase {

private final UserService userService;

@Transactional
@Override
public void updateUserAuthStatus(
GUpdateUserAuthStatusRequest request,
StreamObserver<GUpdateUserAuthStatusResponse> responseObserver
) {
User user = userService.loadByEmail(request.getEmail());

userService.updateUserAuthStatus(user);

GUpdateUserAuthStatusResponse response = GUpdateUserAuthStatusResponse.newBuilder()
.setIsSuccess(true)
.build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}

@Override
public void checkEmailAndPassword(
GCheckEmailAndPasswordRequest request,
StreamObserver<GCheckEmailAndPasswordResponse> responseObserver
) {
User user = userService.loadByEmail(request.getEmail());

userService.checkEmailAndPasswordByUser(
user,
request.getEmail(),
request.getPassword()
);

GCheckEmailAndPasswordResponse response = GCheckEmailAndPasswordResponse.newBuilder()
.setIsSuccess(true)
.setUserId(user.getId())
.build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}

@Override
public void loadUserInfoFromId(
GLoadUserInfoFromIdRequest request,
StreamObserver<GLoadUserInfoFromIdResponse> responseObserver
) {
User user = userService.loadById(request.getId());

if (user.isNotDeleted()) {
responseObserver.onNext(GLoadUserInfoFromIdResponse.newBuilder()
.setEmail(user.getEmail())
.setNickname(user.getProfile().nickname())
.setUsername(user.getUsername())
.setRole(user.getRole().name())
.setIsActivated(user.getIsActivated())
.setAccessedAt(user.getAccessedAt().toString())
.setCreatedAt(user.getCreatedAt().toString())
.setDeletedAt("")
.build()
);
responseObserver.onCompleted();
return;
}

responseObserver.onNext(GLoadUserInfoFromIdResponse.newBuilder()
.setEmail(user.getEmail())
.setNickname(user.getProfile().nickname())
.setUsername(user.getUsername())
.setRole(user.getRole().name())
.setIsActivated(user.getIsActivated())
.setAccessedAt(user.getAccessedAt().toString())
.setCreatedAt(user.getCreatedAt().toString())
.setDeletedAt(user.getDeletedAt().toString())
.build()
);
responseObserver.onCompleted();
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -127,4 +127,8 @@ public void join(
this.profile = profile;
this.role = Role.NORMAL;
}

public boolean isNotDeleted() {
return this.deletedAt == null;
}
}
Loading

0 comments on commit 95fded5

Please sign in to comment.