Skip to content

Commit

Permalink
Merge pull request #35 from pyro-yolog/feat/#34-kakao-logout-withdraw
Browse files Browse the repository at this point in the history
Feat/#34 카카오 로그아웃과 탈퇴 기능 구현
  • Loading branch information
yeonjy authored Jun 24, 2024
2 parents 5801628 + a5401d2 commit d8a7667
Show file tree
Hide file tree
Showing 14 changed files with 145 additions and 73 deletions.
28 changes: 28 additions & 0 deletions src/main/java/com/pyro/yolog/domain/auth/controller/AuthApi.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.pyro.yolog.domain.auth.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;

@Tag(name = "Auth")
public interface AuthApi {

@Operation(
summary = "회원 탈퇴",
description = "회원을 탈퇴합니다. 연결된 소셜과의 연결이 끊깁니다.",
security = {@SecurityRequirement(name = "access_token")}
)
@ApiResponses(
value = {
@ApiResponse(
responseCode = "204",
description = "No Content"
)
}
)
void withdrawMember();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.pyro.yolog.domain.auth.controller;

import com.pyro.yolog.domain.auth.service.AuthService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
public class AuthController implements AuthApi{
private final AuthService authService;

@ResponseStatus(HttpStatus.NO_CONTENT)
@DeleteMapping("/withdrawal")
@Override
public void withdrawMember() {
authService.withdrawMember();
}
}
67 changes: 67 additions & 0 deletions src/main/java/com/pyro/yolog/domain/auth/service/AuthService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package com.pyro.yolog.domain.auth.service;

import com.pyro.yolog.domain.member.entity.Member;
import com.pyro.yolog.domain.member.entity.SocialType;
import com.pyro.yolog.domain.member.repository.MemberRepository;
import com.pyro.yolog.global.jwt.service.JwtService;
import com.pyro.yolog.global.query.QueryService;
import jakarta.persistence.EntityNotFoundException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.*;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;

@Slf4j
@QueryService
@RequiredArgsConstructor
public class AuthService {
private final MemberRepository memberRepository;
private final JwtService jwtService;


@Value("${oauth.kakao.admin-key}")
private String kakaoAdminKey;

@Value("${oauth.kakao.withdraw-uri}")
private String kakaoWithdrawUri;

public Long getLoginUserId() {
return getLoginUser().getId();
}

public Member getLoginUser() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
UserDetails userDetails = (UserDetails) authentication.getPrincipal();
return memberRepository.findByEmail(userDetails.getUsername()).orElseThrow(EntityNotFoundException::new);
}


@Transactional
public void withdrawMember() {
Member member = getLoginUser();
if (member.getSocialType().equals(SocialType.KAKAO)) {
sendWithdrawRequestToKakao(SocialType.KAKAO, member);
}
deleteMemberAccount(member);
}

private void sendWithdrawRequestToKakao(SocialType socialType, Member member) {
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
headers.add("Authorization", "KakaoAK " + kakaoAdminKey);
String data = "target_id_type=user_id" +
"&target_id=" + member.getOauthId();
HttpEntity <String> httpEntity = new HttpEntity<>(data, headers);
ResponseEntity<String> response = restTemplate.exchange(kakaoWithdrawUri, HttpMethod.POST, httpEntity, String.class);
}

private void deleteMemberAccount(Member member) {
memberRepository.delete(member);
}
}
20 changes: 8 additions & 12 deletions src/main/java/com/pyro/yolog/domain/diary/api/DiaryApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,16 @@
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;

import java.time.LocalDateTime;

@Tag(name = "Diary")
public interface DiaryApi {
@Operation(
summary = "일기 조회",
description = "일기장의 일기를 조회합니다.",
security = {@SecurityRequirement(name = "access_token")},
tags = {"diary"}
security = {@SecurityRequirement(name = "access_token")}
)
@ApiResponses(
value = {
Expand All @@ -41,8 +42,7 @@ DiaryResponse getDiary(
@Operation(
summary = "디폴트 일기 생성",
description = "제목과 여행 날짜를 가진 일기를 생성합니다.",
security = {@SecurityRequirement(name = "access_token")},
tags = {"diary"}
security = {@SecurityRequirement(name = "access_token")}
)
@ApiResponses(
value = {
Expand All @@ -63,8 +63,7 @@ DefaultDiaryResponse createDefaultDiary(
@Operation(
summary = "일기 수정",
description = "일기를 수정합니다.",
security = {@SecurityRequirement(name = "access_token")},
tags = {"diary"}
security = {@SecurityRequirement(name = "access_token")}
)
@ApiResponses(
value = {
Expand All @@ -84,8 +83,7 @@ void updateDiaryContent(
@Operation(
summary = "일기 삭제",
description = "일기를 삭제합니다.",
security = {@SecurityRequirement(name = "access_token")},
tags = {"diary"}
security = {@SecurityRequirement(name = "access_token")}
)
@ApiResponses(
value = {
Expand All @@ -102,8 +100,7 @@ void deleteDiary(@Parameter(in = ParameterIn.PATH, description = "일기 ID", re
@Operation(
summary = "일기 날씨 수정",
description = "일기의 날씨 정보를 수정합니다.",
security = {@SecurityRequirement(name = "access_token")},
tags = {"diary"}
security = {@SecurityRequirement(name = "access_token")}
)
@ApiResponses(
value = {
Expand All @@ -123,8 +120,7 @@ void updateWeather(
@Operation(
summary = "일기 기분 수정",
description = "일기의 기분 정보를 수정합니다.",
security = {@SecurityRequirement(name = "access_token")},
tags = {"diary"}
security = {@SecurityRequirement(name = "access_token")}
)
@ApiResponses(
value = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;

@Tag(name = "문의하기")
@Tag(name = "Inquiry")
public interface InquiryApi {
@Operation(
summary = "문의하기 등록",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import com.pyro.yolog.domain.inquiry.mapper.InquiryMapper;
import com.pyro.yolog.domain.inquiry.repository.InquiryRepository;
import com.pyro.yolog.domain.member.entity.Member;
import com.pyro.yolog.domain.member.query.AuthService;
import com.pyro.yolog.domain.auth.service.AuthService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand Down
5 changes: 3 additions & 2 deletions src/main/java/com/pyro/yolog/domain/member/api/SignApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,14 @@
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;

@Tag(name = "Sign Up")
public interface SignApi {
@Operation(
summary = "회원가입",
description = "사용자의 닉네임을 입력받아 회원가입을 진행합니다. 중복된 닉네임이 입력되면 false를 반환합니다.",
security = {@SecurityRequirement(name = "access_token")},
tags = {"로그인"}
security = {@SecurityRequirement(name = "access_token")}
)
@ApiResponses(value = {
@ApiResponse(
Expand Down
32 changes: 0 additions & 32 deletions src/main/java/com/pyro/yolog/domain/member/query/AuthService.java

This file was deleted.

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

import com.pyro.yolog.domain.member.dto.SignUpRequest;
import com.pyro.yolog.domain.member.entity.Member;
import com.pyro.yolog.domain.member.entity.Role;
import com.pyro.yolog.domain.member.query.AuthService;
import com.pyro.yolog.domain.auth.service.AuthService;
import com.pyro.yolog.domain.member.repository.MemberRepository;
import com.pyro.yolog.global.jwt.refresh.service.RefreshTokenService;
import com.pyro.yolog.global.jwt.service.JwtService;
Expand Down
17 changes: 7 additions & 10 deletions src/main/java/com/pyro/yolog/domain/memo/api/MemoApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,17 @@
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;

import java.util.List;

@Tag(name = "Memo")
public interface MemoApi {

@Operation(
summary = "빠른 메모 생성",
description = "빠른 메모를 생성합니다.",
security = {@SecurityRequirement(name = "access_token")},
tags = {"memo"}
security = {@SecurityRequirement(name = "access_token")}
)
@ApiResponses(
value = {
Expand All @@ -38,8 +39,7 @@ void saveMemo(@Parameter(in = ParameterIn.PATH, description = "일기장 ID", re
@Operation(
summary = "빠른 메모 상세 조회",
description = "빠른 메모를 상세 조회합니다.",
security = {@SecurityRequirement(name = "access_token")},
tags = {"memo"}
security = {@SecurityRequirement(name = "access_token")}
)
@ApiResponses(
value = {
Expand All @@ -60,8 +60,7 @@ MemoDetailResponse getMemo(
@Operation(
summary = "빠른 메모 전체 조회",
description = "일기장 별 빠른 메모를 모두 조회합니다.",
security = {@SecurityRequirement(name = "access_token")},
tags = {"memo"}
security = {@SecurityRequirement(name = "access_token")}
)
@ApiResponses(
value = {
Expand All @@ -79,8 +78,7 @@ List<MemoPreviewResponse> getMemos(
@Operation(
summary = "빠른 메모 삭제",
description = "빠른 메모를 삭제합니다.",
security = {@SecurityRequirement(name = "access_token")},
tags = {"memo"}
security = {@SecurityRequirement(name = "access_token")}
)
@ApiResponses(
value = {
Expand All @@ -99,8 +97,7 @@ void deleteMemo(@Parameter(in = ParameterIn.PATH, description = "일기장 ID",
@Operation(
summary = "빠른 메모 수정",
description = "빠른 메모를 수정합니다.",
security = {@SecurityRequirement(name = "access_token")},
tags = {"memo"}
security = {@SecurityRequirement(name = "access_token")}
)
@ApiResponses(
value = {
Expand Down
14 changes: 6 additions & 8 deletions src/main/java/com/pyro/yolog/domain/trip/api/TripApi.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,17 @@
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;

import java.util.List;

@Tag(name = "Trip")
public interface TripApi {

@Operation(
summary = "일기장 생성",
description = "일기장을 생성합니다.",
security = {@SecurityRequirement(name = "access_token")},
tags = {"trip"}
security = {@SecurityRequirement(name = "access_token")}
)
@ApiResponses(value = {
@ApiResponse(
Expand All @@ -31,8 +32,7 @@ public interface TripApi {
@Operation(
summary = "일기장 수정",
description = "일기장을 수정합니다",
security = {@SecurityRequirement(name = "access_token")},
tags = {"trip"}
security = {@SecurityRequirement(name = "access_token")}
)
@ApiResponses(value = {
@ApiResponse(
Expand All @@ -50,8 +50,7 @@ void updateTrip(
@Operation(
summary = "일기장 삭제",
description = "일기장을 삭제합니다.",
security = {@SecurityRequirement(name = "access_token")},
tags = {"trip"}
security = {@SecurityRequirement(name = "access_token")}
)
@ApiResponses(value = {
@ApiResponse(
Expand All @@ -67,8 +66,7 @@ void deleteTrip(
@Operation(
summary = "일기장 전체 조회",
description = "회원별 일기장을 모두 조회합니다.",
security = {@SecurityRequirement(name = "access_token")},
tags = {"trip"}
security = {@SecurityRequirement(name = "access_token")}
)
@ApiResponses(
value = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.pyro.yolog.domain.diary.service.DiaryService;
import com.pyro.yolog.domain.member.entity.Member;
import com.pyro.yolog.domain.member.query.AuthService;
import com.pyro.yolog.domain.auth.service.AuthService;
import com.pyro.yolog.domain.trip.dto.TripRequest;
import com.pyro.yolog.domain.trip.dto.TripResponse;
import com.pyro.yolog.domain.trip.entity.Trip;
Expand All @@ -13,7 +13,6 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

Expand Down
Loading

0 comments on commit d8a7667

Please sign in to comment.