Skip to content

Commit

Permalink
feat: user deletion
Browse files Browse the repository at this point in the history
  • Loading branch information
jombidev committed May 13, 2024
1 parent 7e291db commit 210b58b
Show file tree
Hide file tree
Showing 10 changed files with 42 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ class AuthController(
@RequestBody @Valid reissueTokenReq: ReissueTokenReq
) = ResponseData.ok("토큰 재발급 성공", authService.reissue(reissueTokenReq))

@DeleteMapping
fun revoke() {
authService.revokeAccount()
}

@PostMapping("/test")
fun test(@RequestParam("email") email: String) =
ResponseData.ok("테스트 로그인 성공", authService.test(email))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ enum class GlobalExceptionCode(
INVALID_ROLE(HttpStatus.FORBIDDEN, "유효하지 않은 권한"),
TOKEN_NOT_PROVIDED(HttpStatus.BAD_REQUEST, "잘못된 토큰"),
TOKEN_EXPIRED(HttpStatus.UNAUTHORIZED, "만료된 토큰"),
USER_IS_DELETED(HttpStatus.GONE, "삭제된 유저"),
INTERNAL_SERVER(HttpStatus.INTERNAL_SERVER_ERROR, "서버 오류");

override fun getHttpStatus(): HttpStatus {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ interface AuthService {
suspend fun signIn(code: String): Token
fun reissue(reissueTokenReq: ReissueTokenReq): ReissueTokenRes
fun test(email: String): Token
fun revokeAccount()
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package com.molohala.grow.core.auth.application.service

import com.molohala.grow.common.exception.GlobalExceptionCode
import com.molohala.grow.common.exception.custom.CustomException
import com.molohala.grow.common.exception.custom.InternalServerException
import com.molohala.grow.core.auth.DodamMemberClient
import com.molohala.grow.core.auth.IssueJwtToken
import com.molohala.grow.core.auth.application.dto.DodamUserData
import com.molohala.grow.core.auth.application.dto.Token
import com.molohala.grow.core.auth.application.dto.req.ReissueTokenReq
import com.molohala.grow.core.auth.application.dto.res.ReissueTokenRes
import com.molohala.grow.core.member.application.MemberSessionHolder
import com.molohala.grow.core.member.domain.consts.MemberRole
import com.molohala.grow.core.member.domain.consts.MemberState
import com.molohala.grow.core.member.domain.entity.Member
Expand All @@ -21,20 +24,17 @@ import org.springframework.transaction.annotation.Transactional
class AuthServiceImpl(
private val dodamMemberClient: DodamMemberClient,
private val issueJwtToken: IssueJwtToken,
private val memberJpaRepository: MemberJpaRepository
private val memberJpaRepository: MemberJpaRepository,
private val memberSessionHolder: MemberSessionHolder
) : AuthService {

@Transactional(rollbackFor = [Exception::class])
override suspend fun signIn(code: String): Token {
val dodamUserData: DodamUserData? = dodamMemberClient.getMemberInfo(code)
dodamUserData?.let { userData ->
return withContext(Dispatchers.IO) {
var member: Member? = memberJpaRepository.findByEmail(userData.email)
if (member == null) {
member = save(userData)
} else {
member.updateEmail(userData.email)
}
val member = memberJpaRepository.findByEmail(userData.email) ?: save(userData)
if (member.state == MemberState.DELETED) throw CustomException(GlobalExceptionCode.USER_IS_DELETED)
issueJwtToken.issueToken(member.email, member.role)
}
} ?: throw InternalServerException()
Expand All @@ -60,4 +60,9 @@ class AuthServiceImpl(
return issueJwtToken.issueToken(email, member!!.role)
}

@Transactional(rollbackFor = [Exception::class])
override fun revokeAccount() {
memberJpaRepository.save(memberSessionHolder.current().markDelete())
}

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.molohala.grow.core.info.application.service

import com.molohala.grow.common.exception.GlobalExceptionCode
import com.molohala.grow.common.exception.custom.CustomException
import com.molohala.grow.core.info.GithubInfoClient
import com.molohala.grow.core.info.SolvedAcInfoClient
Expand All @@ -11,6 +12,7 @@ import com.molohala.grow.core.info.application.dto.res.SolvedAcInfoRes
import com.molohala.grow.core.info.exception.InfoExceptionCode
import com.molohala.grow.core.member.application.MemberSessionHolder
import com.molohala.grow.core.member.domain.consts.MemberJob
import com.molohala.grow.core.member.domain.consts.MemberState
import com.molohala.grow.core.member.domain.consts.SocialType
import com.molohala.grow.core.member.domain.entity.SocialAccount
import com.molohala.grow.core.member.repository.MemberJpaRepository
Expand Down Expand Up @@ -78,6 +80,7 @@ class InfoServiceImpl(
override fun getUserInfo(userId: Long): InfoRes {
val member = memberJpaRepository.findById(userId)
.orElseThrow { CustomException(InfoExceptionCode.USER_NOT_FOUND) }
if (member.state == MemberState.DELETED) throw CustomException(GlobalExceptionCode.USER_IS_DELETED)
val socials = socialAccountJpaRepository.findSocialAccountsByMemberId(member.id!!) // id won't be null
.map {
SocialAccountRes(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,24 @@
package com.molohala.grow.core.language.application.service

import com.molohala.grow.common.exception.GlobalExceptionCode
import com.molohala.grow.common.exception.custom.CustomException
import com.molohala.grow.core.info.exception.InfoExceptionCode
import com.molohala.grow.core.language.domain.entity.Language
import com.molohala.grow.core.language.domain.entity.MemberAndLanguage
import com.molohala.grow.core.language.exception.LanguageExceptionCode
import com.molohala.grow.core.language.repository.LanguageJpaRepository
import com.molohala.grow.core.language.repository.MemberLanguageJpaRepository
import com.molohala.grow.core.language.repository.MemberLanguageQueryRepository
import com.molohala.grow.core.member.application.MemberSessionHolder
import com.molohala.grow.core.member.domain.consts.MemberState
import com.molohala.grow.core.member.repository.MemberJpaRepository
import jakarta.transaction.Transactional
import org.springframework.stereotype.Service

@Service
class LanguageServiceImpl(
private val memberSessionHolder: MemberSessionHolder,
private val memberJpaRepository: MemberJpaRepository,
private val languageJpaRepository: LanguageJpaRepository,
private val memberLanguageJpaRepository: MemberLanguageJpaRepository,
private val memberLanguageQueryRepository: MemberLanguageQueryRepository
Expand Down Expand Up @@ -49,6 +54,8 @@ class LanguageServiceImpl(
}

override fun getUsingLanguagesByOther(user: Long): List<Language> {
val member = memberJpaRepository.findById(user).orElseThrow { CustomException(InfoExceptionCode.USER_NOT_FOUND) }
if (member.state == MemberState.DELETED) throw CustomException(GlobalExceptionCode.USER_IS_DELETED)
return memberLanguageQueryRepository.getLanguagesByMemberId(user)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,4 +54,9 @@ class Member(
if (bio != null) this.bio = bio
if (job != null) this.job = job
}

fun markDelete(): Member {
state = MemberState.DELETED
return this
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package com.molohala.grow.infra.security

import com.molohala.grow.common.exception.GlobalExceptionCode
import com.molohala.grow.common.exception.custom.CustomException
import com.molohala.grow.core.member.application.service.MemberService
import com.molohala.grow.core.member.domain.consts.MemberState
import com.molohala.grow.core.member.domain.entity.Member
import org.springframework.security.core.userdetails.UserDetails
import org.springframework.security.core.userdetails.UserDetailsService
Expand All @@ -13,7 +16,7 @@ class MemberDetailsService(

override fun loadUserByUsername(email: String): UserDetails {
val member: Member? = memberService.getByEmail(email)

if (member?.state == MemberState.DELETED) throw CustomException(GlobalExceptionCode.USER_IS_DELETED)
return MemberDetails(member)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class SecurityConfig(
.addFilterBefore(tokenExceptionFilter, TokenFilter::class.java)
.authorizeHttpRequests { authorize ->
authorize
.requestMatchers("auth/**").permitAll()
.requestMatchers("/auth/sign-in", "/auth/reissue").permitAll()
.requestMatchers("/v3/api-docs/**", "/swagger-ui/**").permitAll()
.anyRequest().authenticated()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@ package com.molohala.grow.infra.token

import com.molohala.grow.common.exception.GlobalExceptionCode
import com.molohala.grow.common.exception.custom.CustomException
import com.molohala.grow.core.member.application.service.MemberService
import com.molohala.grow.core.member.domain.entity.Member
import com.molohala.grow.infra.security.MemberDetails
import com.molohala.grow.infra.security.MemberDetailsService
import io.jsonwebtoken.*
import io.jsonwebtoken.io.Decoders
import io.jsonwebtoken.security.Keys
Expand All @@ -18,16 +16,14 @@ import java.util.*

@Component
class TokenExtractor(
private val memberService: MemberService,
private val memberDetailsService: MemberDetailsService,
private val jwtProperties: JwtProperties
) {
fun signingKey() = Keys.hmacShaKeyFor(Decoders.BASE64.decode(jwtProperties.secret))

fun getAuthentication(accessToken: String): Authentication {
val claims = extractClaims(accessToken)
val member: Member? = memberService.getByEmail(claims.subject.toString())

val details = MemberDetails(member)
val details = memberDetailsService.loadUserByUsername(claims.subject.toString())

return UsernamePasswordAuthenticationToken(details, null, details.authorities)
}
Expand Down

0 comments on commit 210b58b

Please sign in to comment.