Skip to content

Commit

Permalink
Feat: add delete user api
Browse files Browse the repository at this point in the history
  • Loading branch information
emost22 committed Jan 28, 2024
1 parent 603f409 commit 5c3904e
Show file tree
Hide file tree
Showing 13 changed files with 131 additions and 9 deletions.
1 change: 1 addition & 0 deletions src/docs/asciidoc/index.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ include::{snippets}/user-controller-test/유저_존재_확인/auto-section.adoc[
include::{snippets}/user-controller-test/유저_최초_질문_답변_작성_확인/auto-section.adoc[]
include::{snippets}/user-controller-test/유저_최초_핀고정_확인/auto-section.adoc[]
include::{snippets}/user-controller-test/유저_정보_조회/auto-section.adoc[]
include::{snippets}/user-controller-test/유저_삭제_확인/auto-section.adoc[]

== 프로젝트 API
include::{snippets}/experience-controller-test/본인_경험_저장/auto-section.adoc[]
Expand Down
18 changes: 18 additions & 0 deletions src/main/java/com/sirius/spurt/common/validator/UserValidator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.sirius.spurt.common.validator;

import static com.sirius.spurt.common.meta.ResultCode.NOT_EXIST_USER;

import com.sirius.spurt.common.exception.GlobalException;
import com.sirius.spurt.store.repository.database.entity.UserEntity;

public class UserValidator {
public static void validator(UserEntity userEntity) {
if (!isExistUser(userEntity)) {
throw new GlobalException(NOT_EXIST_USER);
}
}

private static boolean isExistUser(UserEntity userEntity) {
return userEntity != null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.sirius.spurt.service.business.user;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.sirius.spurt.common.template.Business;
import com.sirius.spurt.service.business.user.DeleteUserBusiness.Dto;
import com.sirius.spurt.service.business.user.DeleteUserBusiness.Result;
import com.sirius.spurt.store.provider.experience.ExperienceProvider;
import com.sirius.spurt.store.provider.question.QuestionProvider;
import com.sirius.spurt.store.provider.user.UserProvider;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

@Component
@RequiredArgsConstructor
public class DeleteUserBusiness implements Business<Dto, Result> {
private final UserProvider userProvider;
private final ExperienceProvider experienceProvider;
private final QuestionProvider questionProvider;

@Override
@Transactional
public Result execute(Dto input) {
experienceProvider.deleteExperienceByUser(input.getUserId());
questionProvider.deleteQuestionByUser(input.getUserId());
userProvider.deleteUser(input.getUserId());
return new Result();
}

@Setter
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class Dto implements Business.Dto {
private String userId;
}

@JsonIgnoreProperties
public static class Result implements Business.Result {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@
import com.sirius.spurt.service.business.user.CheckUserExistsBusiness;
import com.sirius.spurt.service.business.user.CheckUserHasPinedBusiness;
import com.sirius.spurt.service.business.user.CheckUserHasPostedBusiness;
import com.sirius.spurt.service.business.user.DeleteUserBusiness;
import com.sirius.spurt.service.business.user.UserInfoBusiness;
import com.sirius.spurt.service.controller.RestResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
Expand All @@ -21,6 +23,7 @@ public class UserController {
private final CheckUserHasPinedBusiness checkUserHasPinedBusiness;
private final CheckUserHasPostedBusiness checkUserHasPostedBusiness;
private final UserInfoBusiness userInfoBusiness;
private final DeleteUserBusiness deleteUserBusiness;

/**
* @return
Expand Down Expand Up @@ -65,4 +68,15 @@ public RestResponse<UserInfoBusiness.Result> getUserInfo(LoginUser loginUser) {
userInfoBusiness.execute(
UserInfoBusiness.Dto.builder().userId(loginUser.getUserId()).build()));
}

/**
* @return
* @title 유저 삭제
*/
@DeleteMapping
public RestResponse<DeleteUserBusiness.Result> deleteUser(LoginUser loginUser) {
return RestResponse.success(
deleteUserBusiness.execute(
DeleteUserBusiness.Dto.builder().userId(loginUser.getUserId()).build()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,6 @@ void updateExperience(
ExperienceVo getExperience(final Long experienceId, final String userId);

String getQuestionExperienceTitle(final Long experienceId, final String userId);

void deleteExperienceByUser(final String userId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import static com.sirius.spurt.common.meta.ResultCode.TIME_FORMAT_ERROR;

import com.sirius.spurt.common.exception.GlobalException;
import com.sirius.spurt.common.validator.UserValidator;
import com.sirius.spurt.store.provider.experience.ExperienceProvider;
import com.sirius.spurt.store.provider.experience.vo.CategoryVo;
import com.sirius.spurt.store.provider.experience.vo.ExperienceVo;
Expand Down Expand Up @@ -153,6 +154,13 @@ public String getQuestionExperienceTitle(final Long experienceId, final String u
return experienceEntity != null ? experienceEntity.getTitle() : null;
}

@Override
public void deleteExperienceByUser(final String userId) {
UserEntity userEntity = userRepository.findByUserId(userId);
UserValidator.validator(userEntity);
experienceRepository.deleteByUserEntity(userEntity);
}

@Mapper
public interface ExperienceProviderImplMapper {
ExperienceProviderImplMapper INSTANCE = Mappers.getMapper(ExperienceProviderImplMapper.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,6 @@ QuestionVoList searchQuestion(
final Boolean myQuestionIndicator,
final String userId,
final PageRequest pageRequest);

void deleteQuestionByUser(final String userId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
import com.sirius.spurt.store.repository.database.repository.ExperienceRepository;
import com.sirius.spurt.store.repository.database.repository.QuestionRepository;
import com.sirius.spurt.store.repository.database.repository.UserRepository;
import jakarta.transaction.Transactional;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.List;
Expand All @@ -28,6 +27,7 @@
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
Expand Down Expand Up @@ -232,6 +232,11 @@ public QuestionVo saveQuestion(
questionRepository.save(questionEntity));
}

@Override
public void deleteQuestionByUser(final String userId) {
questionRepository.deleteByUserId(userId);
}

@Mapper
public interface QuestionProviderImplMapper {
QuestionProviderImpl.QuestionProviderImplMapper INSTANCE =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@
import com.sirius.spurt.store.provider.user.vo.UserVo;

public interface UserProvider {
boolean checkUserExists(String userId);
boolean checkUserExists(final String userId);

UserVo getUserInfo(String userId);
UserVo getUserInfo(final String userId);

boolean checkHasPined(String userId);
boolean checkHasPined(final String userId);

boolean checkHasPosted(String userId);
boolean checkHasPosted(final String userId);

void deleteUser(final String userId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import static com.sirius.spurt.common.meta.ResultCode.NOT_EXIST_USER;

import com.sirius.spurt.common.exception.GlobalException;
import com.sirius.spurt.common.validator.UserValidator;
import com.sirius.spurt.store.provider.user.UserProvider;
import com.sirius.spurt.store.provider.user.vo.UserVo;
import com.sirius.spurt.store.repository.database.entity.UserEntity;
Expand All @@ -18,17 +19,17 @@ public class UserProviderImpl implements UserProvider {
private final UserRepository userRepository;

@Override
public UserVo getUserInfo(String userId) {
public UserVo getUserInfo(final String userId) {
return UserProviderImplMapper.INSTANCE.toUserVo(userRepository.findByUserId(userId));
}

@Override
public boolean checkUserExists(String userId) {
public boolean checkUserExists(final String userId) {
return userRepository.existsByUserId(userId);
}

@Override
public boolean checkHasPined(String userId) {
public boolean checkHasPined(final String userId) {
UserEntity userEntity = userRepository.findByUserId(userId);

if (userEntity == null) {
Expand All @@ -39,7 +40,7 @@ public boolean checkHasPined(String userId) {
}

@Override
public boolean checkHasPosted(String userId) {
public boolean checkHasPosted(final String userId) {
UserEntity userEntity = userRepository.findByUserId(userId);

if (userEntity == null) {
Expand All @@ -49,6 +50,13 @@ public boolean checkHasPosted(String userId) {
return userEntity.getHasPosted();
}

@Override
public void deleteUser(final String userId) {
UserEntity userEntity = userRepository.findByUserId(userId);
UserValidator.validator(userEntity);
userRepository.delete(userEntity);
}

@Mapper
public interface UserProviderImplMapper {
UserProviderImpl.UserProviderImplMapper INSTANCE =
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.sirius.spurt.store.repository.database.repository;

import com.sirius.spurt.store.repository.database.entity.ExperienceEntity;
import com.sirius.spurt.store.repository.database.entity.UserEntity;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;

Expand All @@ -9,4 +10,6 @@ ExperienceEntity findByExperienceIdAndUserEntityUserId(
final Long experienceId, final String userId);

List<ExperienceEntity> findByUserEntityUserId(final String userId);

void deleteByUserEntity(UserEntity userEntity);
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,6 @@ public interface QuestionRepository
QuestionEntity findByQuestionIdAndUserId(final Long id, final String userId);

QuestionEntity findTopByUserIdOrderByCreateTimestampDesc(String userId);

void deleteByUserId(String userId);
}
11 changes: 11 additions & 0 deletions src/test/java/com/sirius/spurt/UserControllerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
Expand All @@ -10,6 +11,7 @@
import com.sirius.spurt.service.business.user.CheckUserExistsBusiness;
import com.sirius.spurt.service.business.user.CheckUserHasPinedBusiness;
import com.sirius.spurt.service.business.user.CheckUserHasPostedBusiness;
import com.sirius.spurt.service.business.user.DeleteUserBusiness;
import com.sirius.spurt.service.business.user.UserInfoBusiness;
import com.sirius.spurt.service.controller.user.UserController;
import org.junit.jupiter.api.Test;
Expand All @@ -22,6 +24,7 @@ public class UserControllerTest extends BaseMvcTest {
@MockBean private CheckUserHasPinedBusiness checkUserHasPinedBusiness;
@MockBean private CheckUserHasPostedBusiness checkUserHasPostedBusiness;
@MockBean private UserInfoBusiness userInfoBusiness;
@MockBean private DeleteUserBusiness deleteUserBusiness;

@Test
void 유저_정보_조회() throws Exception {
Expand Down Expand Up @@ -60,4 +63,12 @@ public class UserControllerTest extends BaseMvcTest {
when(checkUserHasPostedBusiness.execute(any())).thenReturn(result);
this.mockMvc.perform(get("/v1/user/posting")).andExpect(status().isOk()).andDo(print());
}

@Test
void 유저_삭제_확인() throws Exception {
DeleteUserBusiness.Dto dto = DeleteUserBusiness.Dto.builder().userId("userId").build();
DeleteUserBusiness.Result result = new DeleteUserBusiness.Result();
when(deleteUserBusiness.execute(any())).thenReturn(result);
this.mockMvc.perform(delete("/v1/user")).andExpect(status().isOk()).andDo(print());
}
}

0 comments on commit 5c3904e

Please sign in to comment.