diff --git a/wingle/src/main/java/kr/co/wingle/community/article/ArticleMapper.java b/wingle/src/main/java/kr/co/wingle/community/article/ArticleMapper.java index ed698aa8..30797c86 100644 --- a/wingle/src/main/java/kr/co/wingle/community/article/ArticleMapper.java +++ b/wingle/src/main/java/kr/co/wingle/community/article/ArticleMapper.java @@ -5,7 +5,6 @@ import org.springframework.stereotype.Component; -import kr.co.wingle.common.util.AES256Util; import kr.co.wingle.community.util.CommunityUtil; import kr.co.wingle.community.util.ProcessedPersonalInformation; import kr.co.wingle.profile.ProfileService; @@ -25,25 +24,24 @@ public ArticleResponseDto toResponseDto(Article article, List images) { ArticleResponseDto.ArticleResponseDtoBuilder articleResponseDto = ArticleResponseDto.builder(); - if (article != null) { - articleResponseDto.articleId(article.getId()); - articleResponseDto.createdTime(article.getCreatedTime()); - articleResponseDto.updatedTime(article.getUpdatedTime()); - articleResponseDto.content(article.getContent()); - articleResponseDto.likeCount(article.getLikeCount()); - } + articleResponseDto.articleId(article.getId()); + articleResponseDto.createdTime(article.getCreatedTime()); + articleResponseDto.updatedTime(article.getUpdatedTime()); + articleResponseDto.content(article.getContent()); + articleResponseDto.likeCount(article.getLikeCount()); + articleResponseDto.userNickname(processedPersonalInformation.getNickname()); List list = images; if (list != null) { articleResponseDto.images(new ArrayList(list)); } - articleResponseDto.isMine(processedPersonalInformation.isMine()); - articleResponseDto.userId( - AES256Util.encrypt(article.getMember().getId().toString(), article.getId().toString())); + articleResponseDto.userId(processedPersonalInformation.getProcessedMemberId()); articleResponseDto.userImage(profileService.getProfileByMemberId(article.getMember().getId()).getImageUrl()); articleResponseDto.userNation(profileService.getProfileByMemberId(article.getMember().getId()).getNation()); articleResponseDto.userSchoolName(processedPersonalInformation.getSchoolName()); + articleResponseDto.forumId(article.getForum().getId()); + articleResponseDto.isMine(processedPersonalInformation.isMine()); return articleResponseDto.build(); } diff --git a/wingle/src/main/java/kr/co/wingle/community/comment/CommentMapper.java b/wingle/src/main/java/kr/co/wingle/community/comment/CommentMapper.java index 1c774557..df5267e2 100644 --- a/wingle/src/main/java/kr/co/wingle/community/comment/CommentMapper.java +++ b/wingle/src/main/java/kr/co/wingle/community/comment/CommentMapper.java @@ -2,7 +2,6 @@ import org.springframework.stereotype.Component; -import kr.co.wingle.common.util.AES256Util; import kr.co.wingle.community.util.CommunityUtil; import kr.co.wingle.community.util.ProcessedPersonalInformation; import kr.co.wingle.profile.ProfileService; @@ -22,8 +21,7 @@ public CommentResponseDto toResponseDto(Comment comment) { CommentResponseDto.CommentResponseDtoBuilder commentResponseDto = CommentResponseDto.builder(); commentResponseDto.id(comment.getId()); - commentResponseDto.userId( - AES256Util.encrypt(comment.getMember().getId().toString(), comment.getArticle().getId().toString())); + commentResponseDto.userId(processedPersonalInformation.getProcessedMemberId()); commentResponseDto.userNickname(processedPersonalInformation.getNickname()); commentResponseDto.userImage(profileService.getProfileByMemberId(comment.getMember().getId()).getImageUrl()); commentResponseDto.userNation(profileService.getProfileByMemberId(comment.getMember().getId()).getNation()); diff --git a/wingle/src/main/java/kr/co/wingle/community/util/CommunityUtil.java b/wingle/src/main/java/kr/co/wingle/community/util/CommunityUtil.java index 1614ca39..4b35d4bb 100644 --- a/wingle/src/main/java/kr/co/wingle/community/util/CommunityUtil.java +++ b/wingle/src/main/java/kr/co/wingle/community/util/CommunityUtil.java @@ -4,9 +4,11 @@ import kr.co.wingle.common.constants.ErrorCode; import kr.co.wingle.common.exception.NotFoundException; +import kr.co.wingle.common.util.AES256Util; import kr.co.wingle.community.article.Article; import kr.co.wingle.community.comment.Comment; import kr.co.wingle.community.forum.Forum; +import kr.co.wingle.community.forum.ForumCode; import kr.co.wingle.community.forum.ForumService; import kr.co.wingle.member.entity.Member; import kr.co.wingle.member.service.AuthService; @@ -32,20 +34,26 @@ public ProcessedPersonalInformation processPersonalInformation(Writing writing) Profile profile = profileService.getProfileByMemberId(writing.getMember().getId()); Forum forum; + Article article; if (writing instanceof Article) { forum = ((Article)writing).getForum(); + article = (Article)writing; } else if (writing instanceof Comment) { forum = ((Comment)writing).getArticle().getForum(); + article = ((Comment)writing).getArticle(); } else { throw new NotFoundException(ErrorCode.BAD_PARAMETER_TYPE); } + // 게시판별 작성자명 String nickname = forumService.getNicknameByForum(forum, profile); // 게시판별 멤버id - Long processedMemberId = forumService.processMemberIdByForum(forum, - writing.getMember().getId()); + String processedMemberId = ForumCode.from(forum.getName()).equals(ForumCode.EXCHANGE) ? + AES256Util.encrypt(writing.getMember().getId().toString()) : + AES256Util.encrypt(writing.getMember().getId().toString(), article.getId().toString()); // 게시판별 작성자 학교이름 - String schoolName = forumService.getSchoolNameByForum(forum, writing.getMember().getSchool()); + String schoolName = writing.getMember().isDeleted() ? "(알수없음)" : + forumService.getSchoolNameByForum(forum, writing.getMember().getSchool()); boolean isMine = writingUtil.isMine(writing); return ProcessedPersonalInformation.of(nickname, processedMemberId, schoolName, isMine); } diff --git a/wingle/src/main/java/kr/co/wingle/community/util/ProcessedPersonalInformation.java b/wingle/src/main/java/kr/co/wingle/community/util/ProcessedPersonalInformation.java index 793becae..f7b368f0 100644 --- a/wingle/src/main/java/kr/co/wingle/community/util/ProcessedPersonalInformation.java +++ b/wingle/src/main/java/kr/co/wingle/community/util/ProcessedPersonalInformation.java @@ -8,11 +8,11 @@ @AllArgsConstructor(access = AccessLevel.PROTECTED) public class ProcessedPersonalInformation { private String nickname; - private Long processedMemberId; + private String processedMemberId; private String schoolName; private boolean isMine; - public static ProcessedPersonalInformation of(String nickname, Long processedMemberId, String schoolName, + public static ProcessedPersonalInformation of(String nickname, String processedMemberId, String schoolName, boolean isMine) { return new ProcessedPersonalInformation(nickname, processedMemberId, schoolName, isMine); } diff --git a/wingle/src/main/java/kr/co/wingle/member/AuthController.java b/wingle/src/main/java/kr/co/wingle/member/AuthController.java index 8bb39d01..d81852cc 100644 --- a/wingle/src/main/java/kr/co/wingle/member/AuthController.java +++ b/wingle/src/main/java/kr/co/wingle/member/AuthController.java @@ -2,6 +2,7 @@ import javax.validation.Valid; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -78,6 +79,12 @@ public ApiResponse logout(@RequestBody @Valid LogoutRequestDto logoutReq return ApiResponse.success(SuccessCode.LOGOUT_SUCCESS, null); } + @DeleteMapping("/withdrawal") + public ApiResponse withdrawal() { + authService.withdrawal(); + return ApiResponse.success(SuccessCode.LOGOUT_SUCCESS, null); + } + @PostMapping("/email") public ApiResponse sendCodeMail(@RequestBody @Valid EmailRequestDto emailRequestDto) { EmailResponseDto response = authService.sendCodeMail(emailRequestDto); diff --git a/wingle/src/main/java/kr/co/wingle/member/service/AuthService.java b/wingle/src/main/java/kr/co/wingle/member/service/AuthService.java index f5913e1a..505dc1d9 100644 --- a/wingle/src/main/java/kr/co/wingle/member/service/AuthService.java +++ b/wingle/src/main/java/kr/co/wingle/member/service/AuthService.java @@ -194,6 +194,12 @@ public void logout(LogoutRequestDto logoutRequestDto) { redisUtil.setDataExpire(RedisUtil.PREFIX_LOGOUT + accessToken, "logout", TokenInfo.ACCESS_TOKEN_EXPIRE_TIME); } + @Transactional + public void withdrawal() { + Member member = findAcceptedLoggedInMember(); + member.softDelete(); + } + public EmailResponseDto sendCodeMail(EmailRequestDto emailRequestDto) { String to = emailRequestDto.getEmail(); if (!isSignupAvailableEmail(to)) { diff --git a/wingle/src/main/java/kr/co/wingle/message/dto/RoomMemberDto.java b/wingle/src/main/java/kr/co/wingle/message/dto/RoomMemberDto.java index 2a6f2b89..b6a98151 100644 --- a/wingle/src/main/java/kr/co/wingle/message/dto/RoomMemberDto.java +++ b/wingle/src/main/java/kr/co/wingle/message/dto/RoomMemberDto.java @@ -16,9 +16,10 @@ public class RoomMemberDto { private String email; private int permission; private String schoolName; + private boolean isDeleted; public static RoomMemberDto of(Long roomId, OriginType originType, Long memberId, String name, String email, - int permission, String schoolName) { + int permission, String schoolName, boolean isDeleted) { return RoomMemberDto.builder() .roomId(roomId) .originType(originType) @@ -27,6 +28,7 @@ public static RoomMemberDto of(Long roomId, OriginType originType, Long memberId .email(email) .permission(permission) .schoolName(schoolName) + .isDeleted(isDeleted) .build(); } } \ No newline at end of file diff --git a/wingle/src/main/java/kr/co/wingle/message/mapper/MessageMapper.java b/wingle/src/main/java/kr/co/wingle/message/mapper/MessageMapper.java index babd11c0..cdae5d9a 100644 --- a/wingle/src/main/java/kr/co/wingle/message/mapper/MessageMapper.java +++ b/wingle/src/main/java/kr/co/wingle/message/mapper/MessageMapper.java @@ -25,7 +25,8 @@ public MessageResponseDto toResponseDto(Message message) { boolean isMine = writingUtil.isMine(message); Member member = authService.findAcceptedLoggedInMember(); - Profile profile = profileService.getProfileByMemberId(message.getMember().getId()); + Profile profile = message.getMember().isDeleted() ? Profile.createDummyProfile(message.getMember()) : + profileService.getProfileByMemberId(message.getMember().getId()); // 메세지 송신자가 나 자신일 경우 닉네임 대신 null 반환 return MessageResponseDto.of( diff --git a/wingle/src/main/java/kr/co/wingle/message/service/MessageService.java b/wingle/src/main/java/kr/co/wingle/message/service/MessageService.java index b98567bb..c7a23342 100644 --- a/wingle/src/main/java/kr/co/wingle/message/service/MessageService.java +++ b/wingle/src/main/java/kr/co/wingle/message/service/MessageService.java @@ -21,7 +21,6 @@ import kr.co.wingle.message.mapper.MessageMapper; import kr.co.wingle.message.repository.MessageRepository; import kr.co.wingle.profile.ProfileService; -import kr.co.wingle.profile.dto.ProfileGetResponseDto; import kr.co.wingle.writing.WritingService; import lombok.RequiredArgsConstructor; @@ -56,8 +55,6 @@ public MessageResponseWithRecipentDto getListByRoom(Long roomId, int page, int s Pageable pageable = PageRequest.of(page, size); List pages = messageRepository.findByRoomIdAndIsDeletedOrderByCreatedTimeDesc(roomId, false, pageable); - ProfileGetResponseDto profile = profileService.getProfile(recipient.getMemberId()); - if (pages.isEmpty()) { return MessageResponseWithRecipentDto.of(); } @@ -68,8 +65,8 @@ public MessageResponseWithRecipentDto getListByRoom(Long roomId, int page, int s return MessageResponseWithRecipentDto.of( AES256Util.encrypt(recipient.getMemberId().toString()), - profile.getImage(), - recipient.getSchoolName(), + recipient.isDeleted() ? "" : profileService.getProfile(recipient.getMemberId()).getImage(), + recipient.isDeleted() ? "(알수없음)" : recipient.getSchoolName(), messages ); } diff --git a/wingle/src/main/java/kr/co/wingle/message/service/RoomService.java b/wingle/src/main/java/kr/co/wingle/message/service/RoomService.java index 7d07553d..c4a8b8d9 100644 --- a/wingle/src/main/java/kr/co/wingle/message/service/RoomService.java +++ b/wingle/src/main/java/kr/co/wingle/message/service/RoomService.java @@ -157,7 +157,8 @@ public List getMyList(int page, int size) { Member otherMember = roomMemberRepository.findAllByRoomIdAndIsDeleted(room.getId(), false) .stream().filter(x -> x.getMember().getId() != member.getId()).collect(Collectors.toList()) .get(0).getMember(); - Profile otherProfile = profileService.getProfileByMemberId(otherMember.getId()); + Profile otherProfile = otherMember.isDeleted() ? Profile.createDummyProfile(otherMember) : + profileService.getProfileByMemberId(otherMember.getId()); MessageResponseDto recent = null; // messageService.getListByRoom 이용하고 싶은데 순환구조 생김 // List messages = messageService.getListByRoom(room.getId(), 0, 1); @@ -170,7 +171,8 @@ public List getMyList(int page, int size) { if (messages.size() > 0) recent = messages.get(0); result.add( - RoomResponseDto.roomPreview(room.getId(), otherProfile, recent, otherMember.getSchool().getName())); + RoomResponseDto.roomPreview(room.getId(), otherProfile, recent, + otherMember.isDeleted() ? "(알수없음)" : otherMember.getSchool().getName())); } // 최신메시지순 @@ -191,7 +193,8 @@ public RoomMemberDto getRecipient(Long roomId, Long userId) { dto = RoomMemberDto.of(room.getId(), room.getOriginType(), member.getId(), member.getName(), member.getEmail(), member.getPermission(), - member.getSchool().getName()); + member.getSchool().getName(), + member.isDeleted()); } } diff --git a/wingle/src/main/java/kr/co/wingle/profile/ProfileService.java b/wingle/src/main/java/kr/co/wingle/profile/ProfileService.java index 878893bb..0ab58154 100644 --- a/wingle/src/main/java/kr/co/wingle/profile/ProfileService.java +++ b/wingle/src/main/java/kr/co/wingle/profile/ProfileService.java @@ -12,7 +12,6 @@ import kr.co.wingle.common.constants.ErrorCode; import kr.co.wingle.common.exception.DuplicateException; import kr.co.wingle.common.exception.NotFoundException; -import kr.co.wingle.common.util.AES256Util; import kr.co.wingle.common.util.S3Util; import kr.co.wingle.member.entity.Member; import kr.co.wingle.member.service.AuthService; @@ -47,7 +46,6 @@ public class ProfileService { private final InterestRepository interestRepository; private final SnsRepository snsRepository; private final S3Util s3Util; - private final AES256Util aes; private final ProfileUtil profileUtil; @Transactional @@ -147,9 +145,15 @@ private Profile getProfileEntity(Member member) { } public Profile getProfileByMemberId(Long memberId) { - return profileRepository.findByMemberId(memberId) + Profile profile = profileRepository.findByMemberId(memberId) .orElseThrow(() -> new NotFoundException( ErrorCode.NO_PROFILE)); + + if (profile.getMember().isDeleted()) { + return Profile.createDummyProfile(profile.getMember()); + } else { + return profile; + } } private String uploadProfileImage(MultipartFile profileImage) { @@ -197,9 +201,10 @@ public ProfileGetResponseDto getProfile(Member member) { public ProfileGetResponseDto getProfile(Long id) { Member member = memberService.findMemberByMemberId(id); + if (member.isDeleted()) + throw new NotFoundException(ErrorCode.ALREADY_WITHDRAWN); ProfileGetResponseDto response = getProfile(member); - return response; } diff --git a/wingle/src/main/java/kr/co/wingle/profile/entity/Profile.java b/wingle/src/main/java/kr/co/wingle/profile/entity/Profile.java index a5672875..e085928f 100644 --- a/wingle/src/main/java/kr/co/wingle/profile/entity/Profile.java +++ b/wingle/src/main/java/kr/co/wingle/profile/entity/Profile.java @@ -69,4 +69,11 @@ public static Profile copyProfile(Profile from, Profile to) { return to; } + public static Profile createDummyProfile(Member member) { + Profile profile = new Profile(); + profile.member = member; + profile.nickname = "(알수없음)"; + profile.nation = "(알수없음)"; + return profile; + } } \ No newline at end of file