Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
6438352
BVFH-92 Create AuthDomainModel
Mongjo May 23, 2025
1f8e264
BVFH-92 feat: implement phone identity verification with SMS, rate li…
Mongjo May 26, 2025
669beee
Merge pull request #1 from Spharos-team1/BVFH-92-auth-phone-verification
chuman0216 May 26, 2025
1ad22a2
BVFH-92 fix: include missing out adapter and out port files previousl…
Mongjo May 26, 2025
dfe27ba
Merge pull request #2 from Spharos-team1/BVFH-92-auth-phone-verification
Mongjo May 26, 2025
4236f22
BVFH-105 doc : add Dockerfile
Mongjo May 26, 2025
bfb6285
BVFH-105 feat : Security Setting & TokenProvider
Mongjo May 26, 2025
5d43d44
Merge pull request #3 from Spharos-team1/BVFH-105-Security
Mongjo May 26, 2025
f6b66c4
BVFH-104 feat : add BaseEntity, MemberEntity
Mongjo May 26, 2025
4f1c638
BVFH-104 feat : implements incomming adapter, incomming port
Mongjo May 26, 2025
516356a
BVFH-104 feat : add AuthEntity, Repo, other port&adapter
Mongjo May 27, 2025
0c67301
BVFH-104 feat : implements SignUp
Mongjo May 27, 2025
5214aeb
BVFH-104 feat: add duplicate validation for username, phone number, a…
Mongjo May 27, 2025
88e2424
BVFH-104 feat: implements exists MemberId, Nickname, PhoneNumber
Mongjo May 27, 2025
1a1929f
BVFH-104 feat: implements sign-up logic
Mongjo May 28, 2025
e65b3b7
Merge pull request #5 from Spharos-team1/BVFH-104-회원가입
Mongjo May 28, 2025
8dfe25c
BVFH-106 feat : define custom UserDetailsService and update signup logic
Mongjo May 28, 2025
1ca9eac
BVFH-106 feat : implements sign-in
Mongjo May 28, 2025
9aa014b
[FEAT] [BVFH-106] implements sign-in, sign-out
Mongjo May 29, 2025
3ea01da
[CHORE] [BVFH-106] integrate Swagger documentation for auth-service
Mongjo May 29, 2025
9289120
Merge pull request #6 from Spharos-team1/BVFH-106-sign-in
Mongjo May 29, 2025
4860c7d
[CHORE] [BVFH-106] clean up unused imports and update ResponseEntity
Mongjo May 29, 2025
8d4eb44
Merge pull request #7 from Spharos-team1/BVFH-106-sign-in
Mongjo May 29, 2025
4a96a24
[CHORE] [BVFH-106] update swagger tags
Mongjo May 29, 2025
55a0d51
Merge pull request #8 from Spharos-team1/BVFH-106-sign-in
Mongjo May 29, 2025
c757930
[CHORE] [BVFH-106] change HTTP method of duplication check API to GET
Mongjo May 29, 2025
62cf8fc
Merge pull request #9 from Spharos-team1/BVFH-106-sign-in
Mongjo May 29, 2025
7eb04e0
[FEAT] [BVFH-138] implements find-id, reset-password
Mongjo Jun 1, 2025
2d0ce93
Merge pull request #11 from Spharos-team1/BVFH-138-find-id-reset-pass…
Mongjo Jun 1, 2025
b133a8c
[FIX] [BVFH-138] fix swagger config
Mongjo Jun 2, 2025
7856f5f
Merge pull request #12 from Spharos-team1/BVFH-138-find-id-reset-pass…
Mongjo Jun 2, 2025
ae13b18
[CHORE] [BVFH-138] add CI workflow file
Mongjo Jun 5, 2025
1baddd5
Update CI.yaml
Mongjo Jun 5, 2025
ca860e0
Merge pull request #13 from Spharos-team1/BVFH-138-find-id-reset-pass…
Mongjo Jun 5, 2025
1c54381
Update CI.yaml
Mongjo Jun 5, 2025
7af5819
[CHORE] [BVFH-138] update gitignore
Mongjo Jun 5, 2025
817d138
Merge branch 'BVFH-91-develop' of https://github.com/Spharos-team1/au…
Mongjo Jun 5, 2025
f1e4418
[CHORE] [BVFH-138] update gitignore
Mongjo Jun 5, 2025
b3984fa
Merge pull request #14 from Spharos-team1/BVFH-138-find-id-reset-pass…
Mongjo Jun 5, 2025
2c009be
Update CI.yaml
Mongjo Jun 5, 2025
ef7cfd8
Update CI.yaml
Mongjo Jun 5, 2025
bc104a5
Update application.yml
Mongjo Jun 5, 2025
bcfdae4
Update application.yml
Mongjo Jun 5, 2025
f6bec66
Update application.yml
Mongjo Jun 5, 2025
25d5b82
Update application.yml
Mongjo Jun 5, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions .github/workflows/CI.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
name: CI

on:
push:
branches:
- BVFH-91-develop


env:
AWS_REGION: ap-northeast-2
ECR_REPOSITORY: cabbage/auth-service
SERVICE_NAME: auth-service

jobs:
build:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v3

- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}

- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1

- name: Build Docker image
run: |
./gradlew bootJar
docker build -t ${{ env.ECR_REPOSITORY }}:latest -f Dockerfile .

- name: Tag & Push to ECR
run: |
REPO_URI=$(aws ecr describe-repositories --repository-names ${{ env.ECR_REPOSITORY }} --region ${{ env.AWS_REGION }} --query "repositories[0].repositoryUri" --output text)
docker tag ${{ env.ECR_REPOSITORY }}:latest $REPO_URI:latest
docker push $REPO_URI:latest

- name: Get image digest
id: digest
run: |
IMAGE_DIGEST=$(aws ecr describe-images --repository-name ${{ env.ECR_REPOSITORY }} --image-ids imageTag=latest --query 'imageDetails[0].imageDigest' --output text)
echo "Image digest: $IMAGE_DIGEST"
echo "digest=$IMAGE_DIGEST" >> $GITHUB_OUTPUT
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ build/
!gradle/wrapper/gradle-wrapper.jar

### Spring ###
application*.yml
.env
logs/
tmp/
Expand All @@ -26,6 +25,9 @@ tmp/
*.ipr
*.iws
out/
!**/src/main/**/out/
!**/src/test/**/out/


# 포함하고 싶은 팀 설정
!.idea/codeStyles/
Expand Down
8 changes: 8 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
FROM eclipse-temurin:17-jdk-alpine
WORKDIR /app
COPY build/libs/authservice-0.0.1-SNAPSHOT.jar app.jar

EXPOSE 8090

# :흰색_확인_표시: ENTRYPOINT로 java만 실행
ENTRYPOINT ["java", "-jar", "app.jar"]
33 changes: 30 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
plugins {
id 'java'
id 'org.springframework.boot' version '3.4.5'
id 'org.springframework.boot' version '3.4.1'
// id 'org.springframework.boot' version '3.1.8'
id 'io.spring.dependency-management' version '1.1.7'
}

Expand All @@ -24,11 +25,28 @@ repositories {
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-validation'
//jpa
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
//redis
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
//spring security
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-web'
//jwt
implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.12.5'
implementation group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.12.5'
implementation group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.12.5'
//swagger
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.7.0'
//coolsms
implementation 'net.nurigo:sdk:4.3.2'
//feign client
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
//actuator
implementation 'org.springframework.boot:spring-boot-starter-actuator'


compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
Expand All @@ -40,3 +58,12 @@ dependencies {
tasks.named('test') {
useJUnitPlatform()
}

dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:2024.0.1"
}
}



Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients(basePackages = "com.chalnakchalnak.authservice.adapter.out.http")
public class AuthserviceApplication {

public static void main(String[] args) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package com.chalnakchalnak.authservice.adapter.in.web.mapper;

import com.chalnakchalnak.authservice.adapter.in.web.vo.in.*;
import com.chalnakchalnak.authservice.adapter.in.web.vo.out.GetMemberIdResponseVo;
import com.chalnakchalnak.authservice.adapter.in.web.vo.out.SignInResponseVo;
import com.chalnakchalnak.authservice.application.port.dto.SignOutDto;
import com.chalnakchalnak.authservice.application.port.dto.in.*;
import com.chalnakchalnak.authservice.application.port.dto.in.GetMemberIdRequestDto;
import com.chalnakchalnak.authservice.application.port.dto.out.GetMemberIdResponseDto;
import com.chalnakchalnak.authservice.application.port.dto.out.SignInResponseDto;
import org.springframework.stereotype.Component;

@Component
public class AuthVoMapper {

public SignUpRequestDto toSignUpRequestDto(SignUpRequestVo signUpRequestVo) {
return SignUpRequestDto.builder()
.memberId(signUpRequestVo.getMemberId())
.password(signUpRequestVo.getPassword())
.nickname(signUpRequestVo.getNickname())
.phoneNumber(signUpRequestVo.getPhoneNumber())
.build();
}

public ExistsMemberIdRequestDto toExistsMemberIdRequestDto(ExistsMemberIdRequestVo existsMemberIdRequestVo) {
return ExistsMemberIdRequestDto.builder()
.memberId(existsMemberIdRequestVo.getMemberId())
.build();
}

public ExistsNicknameRequestDto toExistsNicknameRequestDto(ExistsNicknameRequestVo existsNicknameRequestVo) {
return ExistsNicknameRequestDto.builder()
.nickname(existsNicknameRequestVo.getNickname())
.build();
}

public ExistsPhoneNumberRequestDto toExistsPhoneNumberRequestDto(ExistsPhoneNumberRequestVo existsPhoneNumberRequestVo) {
return ExistsPhoneNumberRequestDto.builder()
.phoneNumber(existsPhoneNumberRequestVo.getPhoneNumber())
.build();
}

public SignInRequestDto toSignInRequestDto(SignInRequestVo signInRequestVo) {
return SignInRequestDto.builder()
.memberId(signInRequestVo.getMemberId())
.password(signInRequestVo.getPassword())
.build();
}

public SignInResponseVo toSignInResponseVo(SignInResponseDto signInResponseDto) {
return SignInResponseVo.builder()
.accessToken(signInResponseDto.getAccessToken())
.refreshToken(signInResponseDto.getRefreshToken())
.build();
}

public ReissueAllTokenRequestDto toReissueAllTokenRequestDto(String refreshToken) {
return ReissueAllTokenRequestDto.builder()
.refreshToken(refreshToken)
.build();
}

public SignOutDto toSignOutDto(String refreshToken) {
return SignOutDto.builder()
.refreshToken(refreshToken)
.build();
}

public GetMemberIdRequestDto toGetMemberIdRequestDto(GetMemberIdRequestVo getMemberIdRequestVo) {
return GetMemberIdRequestDto.builder()
.phoneNumber(getMemberIdRequestVo.getPhoneNumber())
.build();
}

public GetMemberIdResponseVo toGetMemberIdResponseVo(GetMemberIdResponseDto getMemberIdResponseDto) {
return GetMemberIdResponseVo.builder()
.memberId(getMemberIdResponseDto.getMemberId())
.build();
}

public ResetPasswordRequestDto toResetPasswordRequestDto(ResetPasswordRequestVo resetPasswordRequestVo) {
return ResetPasswordRequestDto.builder()
.phoneNumber(resetPasswordRequestVo.getPhoneNumber())
.newPassword(resetPasswordRequestVo.getNewPassword())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.chalnakchalnak.authservice.adapter.in.web.mapper;

import com.chalnakchalnak.authservice.adapter.in.web.vo.in.SendVerificationCodeRequestVo;
import com.chalnakchalnak.authservice.adapter.in.web.vo.in.VerifyCodeRequestVo;
import com.chalnakchalnak.authservice.application.port.dto.in.SendVerificationCodeRequestDto;
import com.chalnakchalnak.authservice.application.port.dto.in.VerifyCodeRequestDto;
import org.springframework.stereotype.Component;

@Component
public class IdentityVerificationVoMapper {

public SendVerificationCodeRequestDto toSendVerificationCodeDto(
SendVerificationCodeRequestVo sendVerificationCodeRequestVo
) {
return SendVerificationCodeRequestDto.builder()
.phoneNumber(sendVerificationCodeRequestVo.getPhoneNumber())
.purpose(sendVerificationCodeRequestVo.getPurpose())
.build();
}

public VerifyCodeRequestDto toVerifyCodeDto(
VerifyCodeRequestVo verifyCodeRequestVo
) {
return VerifyCodeRequestDto.builder()
.phoneNumber(verifyCodeRequestVo.getPhoneNumber())
.verificationCode(verifyCodeRequestVo.getVerificationCode())
.purpose(verifyCodeRequestVo.getPurpose())
.build();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
package com.chalnakchalnak.authservice.adapter.in.web.presentation;

import com.chalnakchalnak.authservice.adapter.in.web.mapper.AuthVoMapper;
import com.chalnakchalnak.authservice.adapter.in.web.vo.in.*;
import com.chalnakchalnak.authservice.adapter.in.web.vo.out.GetMemberIdResponseVo;
import com.chalnakchalnak.authservice.adapter.in.web.vo.out.SignInResponseVo;
import com.chalnakchalnak.authservice.application.port.dto.out.GetMemberIdResponseDto;
import com.chalnakchalnak.authservice.application.port.in.AuthUseCase;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

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

private final AuthUseCase authUseCase;
private final AuthVoMapper authVoMapper;

@Operation(summary = "Sign Up API", description = "회원가입", tags = {"auth"})
@PostMapping("/sign-up")
public void signUp(@RequestBody @Valid SignUpRequestVo signUpRequestVo) {

authUseCase.signUp(authVoMapper.toSignUpRequestDto(signUpRequestVo));
}

@Operation(summary = "Check Member ID API", description = "회원 아이디 중복 확인", tags = {"auth"})
@GetMapping("/exists/member-id")
public Boolean existsMemberId(
@ModelAttribute @Valid ExistsMemberIdRequestVo existsMemberIdRequestVo
) {

return authUseCase.existsMemberId(
authVoMapper.toExistsMemberIdRequestDto(existsMemberIdRequestVo)
);
}

@Operation(summary = "Check Nickname API", description = "닉네임 중복 확인", tags = {"auth"})
@GetMapping("/exists/nickname")
public Boolean existsNickname(
@ModelAttribute @Valid ExistsNicknameRequestVo existsNicknameRequestVo
) {

return authUseCase.existsNickname(
authVoMapper.toExistsNicknameRequestDto(existsNicknameRequestVo)
);
}

@Operation(summary = "Check PhoneNumber API", description = "전화번호 중복 확인", tags = {"auth"})
@GetMapping("/exists/phone-number")
public Boolean existsPhoneNumber(
@ModelAttribute @Valid ExistsPhoneNumberRequestVo existsMemberIdRequestVo
) {

return authUseCase.existsPhoneNumber(
authVoMapper.toExistsPhoneNumberRequestDto(existsMemberIdRequestVo)
);
}

@Operation(summary = "Sign In API", description = "로그인", tags = {"auth"})
@PostMapping("/sign-in")
public SignInResponseVo signIn(
@RequestBody @Valid SignInRequestVo signInRequestVo
) {

return authVoMapper.toSignInResponseVo(
authUseCase.signIn(
authVoMapper.toSignInRequestDto(signInRequestVo)
)
);
}

@Operation(summary = "Reissue Token API", description = "토큰 재발급", tags = {"auth"})
@GetMapping("/reissue")
public SignInResponseVo reissueAllToken(
@RequestHeader("Authorization") String refreshToken
) {

return authVoMapper.toSignInResponseVo(authUseCase.reissueAllToken(
authVoMapper.toReissueAllTokenRequestDto(
refreshToken.substring(7))
)
);
}

@Operation(summary = "Sign Out API", description = "로그아웃", tags = {"auth"})
@GetMapping("/sign-out")
public void signOut(
@RequestHeader("Authorization") String refreshToken
) {

authUseCase.signOut(
authVoMapper.toSignOutDto(refreshToken.substring(7))
);
}

@Operation(summary = "Find Member ID API", description = "회원 아이디 찾기", tags = {"auth"})
@GetMapping("/member-id")
public GetMemberIdResponseVo findMemberId(
@ModelAttribute @Valid GetMemberIdRequestVo getMemberIdRequestVo
) {

return authVoMapper.toGetMemberIdResponseVo(
authUseCase.getMemberId(
authVoMapper.toGetMemberIdRequestDto(getMemberIdRequestVo)
)
);
}

@Operation(summary = "Reest Password API", description = "비밀번호 재설정", tags = {"auth"})
@PatchMapping("/password")
public void resetPassword(
@RequestBody @Valid ResetPasswordRequestVo resetPasswordRequestVo
) {

authUseCase.resetPassword(
authVoMapper.toResetPasswordRequestDto(resetPasswordRequestVo)
);
}
}
Loading
Loading