Skip to content

Commit

Permalink
release: 0.0.1 (#56)
Browse files Browse the repository at this point in the history
* feat: 유저의 친구 조회 API (#27)

* test: 친구 조회 통합테스트를 작성한다

* feat: 유저의 친구 조회 기능을 개발한다

* feat: application.yml profile 별 분리 및 인증 로직 기본 구현, JWT 관련 로직 구현 (#30)

* feat: spring security 관련 의존성 추가

* feat: spring oauth 2.0 관련 의존성 추가

* refactor: User 엔티티 관련 리팩토링 및 관련 클래스 리팩토링

* feat: UserAuthentication (인증 객체) 구현

* feat: SecurityUtil 구현

* feat: redis 의존성 추가

* feat: profile 분리 ( 개발, 운영, 테스트, 인증, 데이터소스, 레디스 )

* feat: io-netty-dns-native-macos 관련 의존성 추가

* feat: JWT 관련 설정값 & Redis 관련 설정값 주입 구현

* feat: application-redis.yml 구현

* feat: jwt 의존성 추가 (#17)

* feat: jwtAuthenticationFilter 구현 및 관련 Service 구현 (#17)

* feat: 응답을 위한 TokenResponse 구현 및 기타 구현 (#17)

* fix: IntegrationTest 수정 (#17)

* refactor: JwtAuthenticationFilter 불필요한 주석 제거 (#17)

* fix: ci 에러 수정 (#17)

* fix: ci 에러 수정 (#17)

* fix: ci 에러 수정 (#17)

* fix: PropertyTest 제거 (#17)

* fix: ci 에러 수정 (#17)

* fix: ci 에러 수정 (#17)

* fix: ci 에러 수정 (#17)

* fix: ci 에러 수정 (#17)

* fix: ci 에러 수정 (#17)

* fix: ci 에러 수정 (#17)

* feat: securityConfig JwtAuthenticationFilter 적용 (#17)

* fix: ci 에러 수정 (#17)

* fix: ci 에러 수정 (#17)

* feat: 유저 모임 참여 기능 구현 (#34)

* feat: 유저가 Meeting에 참여한다.

- Collection List -> Set 변경

* feat: 종료된 모임에 참여할 수 없도록 예외 추가

* test: 모임 참여에 대한 테스트 작성

- 정상적인 동작 테스트
- 종료된 모임에 대한 예외 테스트
- 최대 인원이 초과된 예외 테스트
- 이미 참여한 모임에 대한 예외 테스트

* feat: 유저 정보 가져오는 방식 수정

+ 테스트 수정

* feat: 유저가 참여한 모임을 취소한다. (#35)

* feat: 유저가 참여한 모임에 모임을 취소한다.

* test: 모임 참여 취소에 대한 테스트를 작성한다.

- 참여된 모임의 참여 취소를 성공한다.
- 참여하지 않은 모임에 대한 예외 케이스
- 종료된 모임에 대한 예외 케이스

* feat: 공통 관심질문 생성 기능 개발 (#37)

* test: 통합테스트를 작성한다

* feat: GPT 통신 클래스를 정의하고 통신기능을 구현한다

* feat: UserService와 Controller를 구현한다

* feat: 유저들의 공통 관심사를 기반으로 질문을 찾는 API를 개발한다

* refactor: retry 횟수를 상수로 뺀다

* feat: Sentry 연동 (#38)

* feat: 인증 로직 리팩토링 및 추가 구현, 카카오,네이버 소셜 로그인 관련 설정 추가 (#39)

* refactor: SecurityConfig 불필요한 변수 삭제 (#31)

* refactor: jwtAuthenticationFilter 리팩토링 (#31)

* feat: application-auth.yml 소셜 로그인 관련 설정 추가 (#31)

* feat: application-datasource.yml 에 flyway 관련 설정 (#31)

* refactor: 전반적인 코드 리팩토링 (#31)

* fix: sonarCloud 코드 에러 수정 (#31)

* chore: application-dev.yml ddl-auto -> validate 로 변경 (#31)

* chore: jwt 라이브러리 gradle 변경 (#31)

* chore: kakao,naver 사용자 정보 조회 api url 변경 (#31)

* chore: naver 관련 설정 삭제 (#31)

* feat: 카카오,네이버 소셜 로그인을 구현한다. (#41)

* refactor: jwtService 불필요한 주석 제거 (#32)

* feat: TokenResponse 레코드 형식으로 구현 (#32)

* feat: OAuth 소셜 로그인 응답 객체 OAuthUserInfo 및 상속체 구현 (#32)

* feat: OAuth 소셜 로그인 최종 응답 객체 OAuthUserAttributes 구현 (#32)

* feat: OAuth 소셜 로그인 로직 구현 (#32)

* feat: OAuth 소셜 로그인 로직 구현 (#32)

* fix: sonarcloud 코드 버그 수정 (#32)

* fix: sonarcloud 코드 버그 수정 (#32)

* fix: sonarcloud 코드 버그 수정 (#32)

* refactor: 인가 코드 콜백 URL 컨벤션 맞게 수정 (#32)

* refactor: 소셜 로그인 관련 에러 수정 및 exception handler 추가 (#46)

* chore: 브랜치 푸쉬 (#43)

* refactor: yml 관련 리팩토링 (#43)

* feat: CORS 관련 CorsConfig 구성 (#43)

* feat: jwt 관련 exception handler 구성 (#43)

* feat: oAuth 로그인 webClient 방식으로 변경 (#43)

* refactor: 코트 컨벤션 반영 및 코드 포맷팅

* feat: test 하위 application.properties OAuth2.0 관련 임의 설정 값 추가

* refactor: 공통 관심 주제 게임 응답으로 관심 질문을 받아볼 수 있도록 추가 (#45)

* build: sentry.gradle을 build.gradle에 포함시킨다

* refactor: GPT응답에서 관심주제도 받아볼 수 있도록 수정한다

* refactor: balance game type을 enum으로 변경한다

* feat: AccessToken, RefreshToken 재발급 기능을 구현한다. (#48)

* refactor: jwtService 코드 리팩토링(#40)

* feat: 토큰 재발행 관련 AuthController,AuthService 구현 (#40)

* refactor: jwtService 코드 재정렬 (#40)

* refactor: AuthService 코드 리팩토링 (#40)

* refactor: 코드 형식 재정렬 (#40)

* test: Jwt 재발급 통합 테스트 진행 (#40)

* test: Jwt 재발급 컨트롤러 단위 테스트 진행 (#40)

* test: Jwt 재발급 서비스 단위 테스트 진행 (#40)

* refactor: 코드 재정렬 (#40)

* fix: sonarcloud 에러 수정 (#40)

* feat: 회원 탈퇴를 구현한다. (#50)

* refactor: JwtService 코드 재정렬 (#40)

* refactor: 불필요한 import 노출 제거 (#42)

* refactor: 코드 재정렬 (#42)

* feat: 회원탈퇴 API 구현 (#42)

* test: 회원탈퇴 통합 테스트 구현 (#42)

* refactor: SecurityConfig 코드 재정렬 (#42)

* refactor: 기타 코드 리팩토링 (#42)

* fix: CI 에러 수정 (#42)

* feat: Redis 관련 설정 클래스를 구현하고 적용한다. (#51)

* refactor: 기존 코드 리팩토링 (#49)

* feat: RedisConfig 구현 (#49)

* fix: CI 에러 수정 (#49)

* fix: 테스트명 변경 (#49)

* fix: 컨트롤러 url 컨벤션 적용 (#40)

* fix: CI 임시 해결 ( test 코드 추후 다시 작성 예정 )(#40)

* fix: CI 임시 해결 (#40)

* fix: CI 해결 (#40)

* fix: CI 해결 (#40)

* refactor: 회원 탈퇴 uri 컨벤션으로 수정 (#40)

* feat: 모임 생성을 구현한다. (#54)

* 회원 카드 등록 API 을 구현한다. (#53)

* refactor: jwtService 코드 리팩토링(#40)

* feat: 토큰 재발행 관련 AuthController,AuthService 구현 (#40)

* refactor: jwtService 코드 재정렬 (#40)

* refactor: AuthService 코드 리팩토링 (#40)

* refactor: 코드 형식 재정렬 (#40)

* test: Jwt 재발급 통합 테스트 진행 (#40)

* test: Jwt 재발급 컨트롤러 단위 테스트 진행 (#40)

* test: Jwt 재발급 서비스 단위 테스트 진행 (#40)

* refactor: JwtService 코드 재정렬 (#40)

* refactor: 불필요한 import 노출 제거 (#42)

* refactor: 코드 재정렬 (#42)

* feat: 회원탈퇴 API 구현 (#42)

* test: 회원탈퇴 통합 테스트 구현 (#42)

* refactor: SecurityConfig 코드 재정렬 (#42)

* refactor: 기타 코드 리팩토링 (#42)

* fix: CI 에러 수정 (#42)

* refactor: 기존 코드 리팩토링 (#49)

* feat: RedisConfig 구현 (#49)

* fix: CI 에러 수정 (#49)

* feat: 회원 카드 등록 API 구현 (#47)

* feat: 회원 카드 등록 API 통합 테스트 (#47)

* fix: CI 에러 수정 (#47)

* refactor: deleteUser 메소드 중복 제거 (#47)

* feat: test 을 위한 application.p
 jwt 관련 설정값 추가 (#47)

* test: 테스트 코드 관련 리팩토링 (#47)

* test: 레디스 관련 설정 변경 (#47)

* test: 회원 카드 등록 테스트 수정 및 추가 구현 (#47)

* test: Property Test 구현 (#47)

* fix: CI 에러 수정 (#47)

* fix: SonarCloud 에러 수정 (#47)

* fix: SonarCloud 에러 수정 (#47)

* fix: SonarCloud 에러 수정 (#47)

* fix: SonarCloud 에러 수정 (#47)

* ci: cd 구성 (#55)

* ci: cd를 구성한다

* fix: SENTRY_AUTH_TOKEN을 env가 아닌, property로 가져오도록 수정한다

* fix: ghcr 레포지토리 명을 수정한다

* ci: 깃헙 패키지 권한을 확인한다

* build: plain.jar가 생성되지 않도록 한다

* ci: cd를 완성한다

---------

Co-authored-by: ChoiDongKuen <[email protected]>
Co-authored-by: ddingmin <[email protected]>
  • Loading branch information
3 people authored Jan 14, 2024
1 parent 246a88d commit 5f261b0
Show file tree
Hide file tree
Showing 103 changed files with 3,285 additions and 358 deletions.
105 changes: 105 additions & 0 deletions .github/workflows/deployer.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
name: 🎇 Deployer

on:
push:
branches:
- 'main'

jobs:
build:
name: build and set image
runs-on: ubuntu-latest
strategy:
matrix:
java-version: [ 21 ]
steps:
- name: checkout code
uses: actions/checkout@v3
with:
submodules: true

- name: Set up JDK 21
uses: actions/setup-java@v3
with:
distribution: 'zulu'
java-version: ${{ matrix.java-version }}
kotlin-version: ${{ matrix.kotlin-version }}

- name: Cache Gradle packages
uses: actions/cache@v3
with:
path: ~/.gradle/caches
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
restore-keys: ${{ runner.os }}-gradle

- name: build server
run: ./gradlew build -x test -DSENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }}

- name: docker arm64 build set up - qemu
uses: docker/setup-qemu-action@v2

- name: docker arm64 build set up - buildx
uses: docker/setup-buildx-action@v2

- name: login github container registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: extract version
run: echo "##[set-output name=version;]$(echo '${{ github.event.head_commit.message }}' | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')"
id: extract_version_name

- name: push
uses: docker/build-push-action@v4
with:
context: .
platforms: linux/arm64/v8
push: true
tags: |
ghcr.io/depromeet/teum-teum-server/api:${{ steps.extract_version_name.outputs.version }}
build-args: |
"KAKAO_CLIENT_ID=${{ secrets.KAKAO_CLIENT_ID }}"
"KAKAO_CLIENT_SECRET=${{ secrets.KAKAO_CLIENT_SECRET }}"
"KAKAO_REDIRECT_URI=${{ secrets.KAKAO_REDIRECT_URI }}"
"NAVER_CLIENT_ID=${{ secrets.NAVER_CLIENT_ID }}"
"NAVER_CLIENT_SECRET=${{ secrets.NAVER_CLIENT_SECRET }}"
"NAVER_REDIRECT_URI=${{ secrets.NAVER_REDIRECT_URI }}"
"JWT_SECRET_KEY=${{ secrets.NAVER_REDIRECT_URI }}"
"DB_URL=${{ secrets.DB_URL }}"
"DB_USERNAME=${{ secrets.DB_USERNAME }}"
"DB_PASSWORD=${{ secrets.DB_PASSWORD }}"
"SENTRY_AUTH_TOKEN=${{ secrets.SENTRY_AUTH_TOKEN }}"
"GPT_TOKEN=${{ secrets.GPT_TOKEN }}"
"REDIS_HOST=${{ secrets.REDIS_HOST }}"
"REDIS_PORT=${{ secrets.REDIS_PORT }}"
"AWS_ACCESS_KEY=${{ secrets.AWS_ACCESS_KEY }}"
"AWS_SECRET_KEY=${{ secrets.AWS_SECRET_KEY }}"
"AWS_REGION=${{ secrets.AWS_REGION }}"
"AWS_S3_BUCKET=${{ secrets.AWS_S3_BUCKET }}"
- name: create release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ steps.extract_version_name.outputs.version }}
release_name: ${{ steps.extract_version_name.outputs.version }}

deploy:
needs: build
name: deploy
runs-on: self-hosted
steps:
- name: extract version
run: echo "##[set-output name=version;]$(echo '${{ github.event.head_commit.message }}' | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')"
id: extract_version_name

- name: run server
run: |
sudo docker pull ghcr.io/depromeet/teum-teum-server/api:${{ steps.extract_version_name.outputs.version }}
sudo docker ps -q --filter "expose=8080" | xargs sudo docker stop | xargs sudo docker rm
sudo docker run -d -p 8080:8080 ghcr.io/depromeet/teum-teum-server/api:${{ steps.extract_version_name.outputs.version }}
67 changes: 67 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
FROM openjdk:11.0.11-jre-slim

ARG KAKAO_CLIENT_ID
ARG KAKAO_CLIENT_SECRET
ARG KAKAO_REDIRECT_URI
ARG NAVER_CLIENT_ID
ARG NAVER_CLIENT_SECRET
ARG NAVER_REDIRECT_URI
ARG JWT_SECRET_KEY
ARG DB_URL
ARG DB_USERNAME
ARG DB_PASSWORD
ARG SENTRY_AUTH_TOKEN
ARG GPT_TOKEN
ARG REDIS_HOST
ARG REDIS_PORT
ARG AWS_ACCESS_KEY
ARG AWS_SECRET_KEY
ARG AWS_REGION
ARG AWS_S3_BUCKET

ARG JAR_FILE=./build/libs/*.jar

COPY ${JAR_FILE} teum.jar

ENV kakao_client_id=${KAKAO_CLIENT_ID} \
kakao_client_secret=${KAKAO_CLIENT_SECRET} \
kakao_redirect_uri=${KAKAO_REDIRECT_URI} \
naver_client_id=${NAVER_CLIENT_ID} \
naver_client_secret=${NAVER_CLIENT_SECRET} \
naver_redirect_uri=${NAVER_REDIRECT_URI} \
jwt_secret_key=${JWT_SECRET_KEY} \
db_url=${DB_URL} \
db_user=${DB_USERNAME} \
db_password=${DB_PASSWORD} \
sentry_auth_token=${SENTRY_AUTH_TOKEN} \
gpt_token=${GPT_TOKEN} \
redis_host=${REDIS_HOST} \
redis_port=${REDIS_PORT} \
aws_access_key=${AWS_ACCESS_KEY} \
aws_secret_key=${AWS_SECRET_KEY} \
aws_region=${AWS_REGION} \
aws_s3_bucket=${AWS_S3_BUCKET}


ENTRYPOINT java -jar teum.jar \
--spring.datasource.url=${db_url} \
--spring.security.oauth2.client.registration.kakao.client-id=${kakao_client_id} \
--spring.security.oauth2.client.registration.kakao.client-secret=${kakao_client_secret} \
--spring.security.oauth2.client.registration.kakao.redirect-uri=${kakao_redirect_uri} \
--spring.security.oauth2.client.registration.naver.client-id=${naver_client_id} \
--spring.security.oauth2.client.registration.naver.client-secret=${naver_client_secret} \
--spring.security.oauth2.client.registration.naver.redirect-uri=${naver_redirect_uri} \
--jwt.secret=${jwt_secret_key} \
--spring.datasource.url=${db_url} \
--spring.datasource.username=${db_user} \
--spring.datasource.password=${db_password} \
--spring.flyway.url=${db_url} \
--spring.flyway.user=${db_user} \
--spring.flyway.password=${db_password} \
--gpt.token=${gpt_token} \
--spring.data.redis.host=${redis_host} \
--spring.data.redis.port=${redis_port} \
--spring.cloud.aws.credentials.access-key=${aws_access_key} \
--spring.cloud.aws.credentials.secret-key=${aws_secret_key} \
--spring.cloud.aws.region.static=${aws_region} \
--spring.cloud.aws.s3.bucket=${aws_s3_bucket}
7 changes: 7 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,23 @@ plugins {
id 'org.springframework.boot' apply false
id 'io.spring.dependency-management'
id 'org.sonarqube'
id 'io.sentry.jvm.gradle'
}

apply from: "gradle/spring.gradle"
apply from: "gradle/devtool.gradle"
apply from: "gradle/test.gradle"
apply from: "gradle/sonar.gradle"
apply from: "gradle/db.gradle"
apply from: "gradle/aws.gradle"
apply from: "gradle/sentry.gradle"

allprojects {

jar {
enabled = false
}

group = "${projectGroup}"
version = "${projectVersion}"

Expand Down
11 changes: 6 additions & 5 deletions gradle.properties
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
### PROJECT ###
projectGroup=net.teumteum
projectVersion=1.0

### TEST ###
junitVersion=5.10.1
assertJVersion=3.24.2

### LOMBOK ###
lombokVersion=1.18.30

### SPRING ###
springBootVersion=3.2.0
springDependencyManagementVersion=1.1.4

### SONAR ###
sonarVersion=4.4.1.3373

### MYSQL ###
mysqlConnectorVersion=8.0.33
### MOCK_WEB_SERVER ###
mockWebServerVersion=4.12.0
### SENTRY ###
sentryVersion=4.1.1
### AWS-CLOUD ###
springCloudAwsVersion=3.1.0
5 changes: 5 additions & 0 deletions gradle/aws.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
dependencies {
implementation platform("io.awspring.cloud:spring-cloud-aws-dependencies:${springCloudAwsVersion}")
implementation "io.awspring.cloud:spring-cloud-aws-starter-s3"

}
1 change: 1 addition & 0 deletions gradle/devtool.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ allprojects {
dependencies {
compileOnly "org.projectlombok:lombok:${lombokVersion}"
annotationProcessor "org.projectlombok:lombok"
implementation 'io.jsonwebtoken:jjwt:0.9.1'

testCompileOnly "org.projectlombok:lombok:${lombokVersion}"
testAnnotationProcessor "org.projectlombok:lombok"
Expand Down
7 changes: 7 additions & 0 deletions gradle/sentry.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
sentry {
includeSourceContext = true

org = "teum-teum"
projectName = "java-spring-boot"
authToken = System.getProperty("SENTRY_AUTH_TOKEN")
}
13 changes: 13 additions & 0 deletions gradle/spring.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,25 @@ allprojects {
dependencies {
implementation "org.springframework.boot:spring-boot-starter"
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-configuration-processor'

runtimeOnly 'io.netty:netty-resolver-dns-native-macos:4.1.104.Final:osx-aarch_64'
implementation "org.springframework.boot:spring-boot-starter-webflux"

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'

implementation 'org.springframework.boot:spring-boot-starter-validation'

implementation "org.springframework.boot:spring-boot-starter-actuator"

implementation "org.springframework.boot:spring-boot-starter-security"
implementation "org.springframework.boot:spring-boot-starter-oauth2-client"


runtimeOnly 'io.micrometer:micrometer-registry-prometheus'

testImplementation "org.springframework.boot:spring-boot-starter-test"
testImplementation 'org.springframework.security:spring-security-test'
}
}
2 changes: 2 additions & 0 deletions gradle/test.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,7 @@ allprojects {
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:${junitVersion}"

testImplementation "org.assertj:assertj-core:${assertJVersion}"

testImplementation "com.squareup.okhttp3:mockwebserver:${mockWebServerVersion}"
}
}
1 change: 1 addition & 0 deletions settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ pluginManagement {
id 'org.springframework.boot' version "${springBootVersion}"
id 'io.spring.dependency-management' version "${springDependencyManagementVersion}"
id 'org.sonarqube' version "${sonarVersion}"
id 'io.sentry.jvm.gradle' version "${sentryVersion}"
}
}

Expand Down
4 changes: 1 addition & 3 deletions src/main/java/net/teumteum/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,10 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@EnableJpaAuditing

@SpringBootApplication
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
Expand Down
25 changes: 25 additions & 0 deletions src/main/java/net/teumteum/auth/controller/AuthController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package net.teumteum.auth.controller;

import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import net.teumteum.auth.domain.response.TokenResponse;
import net.teumteum.auth.service.AuthService;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@RequestMapping("/auth")
public class AuthController {

private final AuthService authService;

@PostMapping("/reissues")
@ResponseStatus(HttpStatus.OK)
public TokenResponse reissue(HttpServletRequest request) {
return authService.reissue(request);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package net.teumteum.auth.controller;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.teumteum.auth.domain.response.TokenResponse;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;

@Slf4j
@RequestMapping
@RequiredArgsConstructor
public class OAuthLoginController {

private final net.teumteum.auth.service.OAuthService oAuthService;

@GetMapping("/logins/callbacks/{provider}")
@ResponseStatus(HttpStatus.OK)
public TokenResponse oAuthLogin(
@PathVariable String provider,
@RequestParam String code) {
return oAuthService.oAuthLogin(provider, code);
}
}
41 changes: 41 additions & 0 deletions src/main/java/net/teumteum/auth/domain/CustomOAuthUser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package net.teumteum.auth.domain;

import java.util.Collection;
import java.util.Map;
import lombok.Getter;
import net.teumteum.user.domain.User;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.oauth2.core.user.OAuth2User;

@Getter
public class CustomOAuthUser implements OAuth2User {

private final User user;
private final Map<String, Object> attributes;
private final Collection<? extends GrantedAuthority> authorities;

public CustomOAuthUser(User user, OAuth2User oAuth2User) {
this.user = user;
this.attributes = oAuth2User.getAttributes();
this.authorities = oAuth2User.getAuthorities();
}

@Override
public Map<String, Object> getAttributes() {
return attributes;
}

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return authorities;
}

@Override
public String getName() {
return user.getName();
}

public Long getUserId() {
return user.getId();
}
}
Loading

0 comments on commit 5f261b0

Please sign in to comment.