Skip to content

Commit

Permalink
[Feat] 디스코드 계정 개수 제한 적용 (#53)
Browse files Browse the repository at this point in the history
  • Loading branch information
iiqcov authored Nov 15, 2024
1 parent af89232 commit d03a1a6
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 45 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ public DiscordInfoResponse discordSocialLogin(@RequestParam String code) {
}

@Operation(summary = "디스코드 연결 해제", description = "디스코드 연결을 해제하는 API")
@GetMapping("/discord/disconnect/{discordId}")
public void discordSocialLogin(@PathVariable Long discordId) {
discordAuthService.discordDisconnect(discordId);
@GetMapping("/discord/disconnect")
public void discordSocialLogin() {
discordAuthService.discordDisconnect();
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package gigedi.dev.domain.discord.application;

import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import gigedi.dev.domain.discord.dao.DiscordRepository;
import gigedi.dev.domain.discord.domain.Discord;
import gigedi.dev.domain.discord.dto.response.*;
import gigedi.dev.domain.member.domain.Member;
import gigedi.dev.global.error.exception.CustomException;
import gigedi.dev.global.error.exception.ErrorCode;
import gigedi.dev.global.util.MemberUtil;
import lombok.RequiredArgsConstructor;

Expand All @@ -18,13 +18,15 @@
public class DiscordAuthService {
private final MemberUtil memberUtil;
private final ImageConverter converter;
private final DiscordService discordService;
private final DiscordAuthApiService discordAuthApiService;
private final DiscordGuildApiService discordGuildApiService;
private final DiscordDmApiService discordDmApiService;
private final DiscordRepository discordRepository;

public DiscordInfoResponse discordConnect(String code) {
DiscordLoginResponse loginResponse = discordAuthApiService.discordLogin(code);
discordService.validateDiscordExistsForMember();
DiscordLoginResponse loginResponse =
discordAuthApiService.discordLogin(URLDecoder.decode(code, StandardCharsets.UTF_8));
DiscordUserResponse userInfo =
discordAuthApiService.getDiscordUserInfo(loginResponse.accessToken());

Expand All @@ -48,29 +50,16 @@ private DiscordInfoResponse saveDiscord(
userInfo.id(),
dmChannel.id(),
loginResponse.getGuildId());
return DiscordInfoResponse.from(discordRepository.save(discord));
return DiscordInfoResponse.from(discordService.saveDiscord(discord));
}

public void discordDisconnect(Long discordId) {
Discord discordById = findDiscordById(discordId);
public void discordDisconnect() {
Discord discord = discordService.findConnectedDiscord();
ReissueDiscordTokenResponse tokenResponse =
discordAuthApiService.reissueDiscordToken(discordById.getRefreshToken());
discordById.updateRefreshToken(tokenResponse.refreshToken());
discordAuthApiService.reissueDiscordToken(discord.getRefreshToken());
discord.updateRefreshToken(tokenResponse.refreshToken());

discordAuthApiService.disconnectDiscordAccount(tokenResponse.accessToken());
discordById.disconnectDiscordAccount();
}

private Discord findDiscordById(Long discordId) {
Member currentMember = memberUtil.getCurrentMember();
Discord discord =
discordRepository
.findById(discordId)
.orElseThrow(
() -> new CustomException(ErrorCode.DISCORD_ACCOUNT_NOT_FOUND));
if (!discord.getMember().equals(currentMember)) {
throw new CustomException(ErrorCode.DISCORD_ACCOUNT_NOT_OWNER);
}
return discord;
discordService.deleteDiscord(discord);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package gigedi.dev.domain.discord.application;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import gigedi.dev.domain.discord.dao.DiscordRepository;
import gigedi.dev.domain.discord.domain.Discord;
import gigedi.dev.domain.member.domain.Member;
import gigedi.dev.global.error.exception.CustomException;
import gigedi.dev.global.error.exception.ErrorCode;
import gigedi.dev.global.util.MemberUtil;
import lombok.RequiredArgsConstructor;

@Service
@Transactional
@RequiredArgsConstructor
public class DiscordService {
private final MemberUtil memberUtil;
private final DiscordRepository discordRepository;

public Discord saveDiscord(Discord discord) {
return discordRepository.save(discord);
}

public Discord findConnectedDiscord() {
Member currentMember = memberUtil.getCurrentMember();
return discordRepository
.findByMember(currentMember)
.orElseThrow(() -> new CustomException(ErrorCode.DISCORD_ACCOUNT_NOT_FOUND));
}

public void deleteDiscord(Discord discord) {
discordRepository.delete(discord);
}

public void validateDiscordExistsForMember() {
Member currentMember = memberUtil.getCurrentMember();
if (discordRepository.findByMember(currentMember).isPresent()) {
throw new CustomException(ErrorCode.DISCORD_ACCOUNT_ALREADY_EXISTS);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
package gigedi.dev.domain.discord.dao;

import java.util.Optional;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import gigedi.dev.domain.discord.domain.Discord;
import gigedi.dev.domain.member.domain.Member;

@Repository
public interface DiscordRepository extends JpaRepository<Discord, Long> {}
public interface DiscordRepository extends JpaRepository<Discord, Long> {
Optional<Discord> findByMember(Member member);
}
19 changes: 2 additions & 17 deletions src/main/java/gigedi/dev/domain/discord/domain/Discord.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,6 @@
package gigedi.dev.domain.discord.domain;

import java.time.LocalDateTime;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.*;

import gigedi.dev.domain.config.BaseTimeEntity;
import gigedi.dev.domain.member.domain.Member;
Expand All @@ -29,8 +20,6 @@ public class Discord extends BaseTimeEntity {
@Column(nullable = false)
private String email;

private LocalDateTime deletedAt;

@Column(nullable = false)
private String dmChannel;

Expand All @@ -43,7 +32,7 @@ public class Discord extends BaseTimeEntity {
@Column(nullable = false)
private String guildId;

@ManyToOne(fetch = FetchType.LAZY)
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member member;

Expand Down Expand Up @@ -83,8 +72,4 @@ public static Discord createDiscord(
public void updateRefreshToken(String refreshToken) {
this.refreshToken = refreshToken;
}

public void disconnectDiscordAccount() {
this.deletedAt = LocalDateTime.now();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ public enum ErrorCode {
DISCORD_ACCOUNT_NOT_OWNER(HttpStatus.NOT_FOUND, "해당 디스코드 계정의 소유자가 아닙니다."),
DISCORD_TOKEN_REISSUE_FAILED(HttpStatus.BAD_REQUEST, "디스코드 토큰 재발급 과정에서 오류가 발생했습니다."),
DISCORD_DISCONNECT_FAILED(HttpStatus.BAD_REQUEST, "디스코드 연결 해제 과정에서 오류가 발생했습니다."),
DISCORD_ACCOUNT_ALREADY_EXISTS(HttpStatus.NOT_FOUND, "연결된 디스코드 계정이 이미 존재합니다."),

// 추가
GOOGLE_LOGIN_FAILED(HttpStatus.BAD_REQUEST, "구글 로그인 과정에서 오류가 발생했습니다."),
Expand Down

0 comments on commit d03a1a6

Please sign in to comment.