From 86191eaf9eb4292dc0c6fddbec54826e4d58091d Mon Sep 17 00:00:00 2001 From: minjikim Date: Mon, 21 Aug 2023 02:37:08 +0900 Subject: [PATCH 1/4] =?UTF-8?q?[fix]=20=EB=9D=BC=EC=9D=B8=20=EC=88=9C?= =?UTF-8?q?=EC=84=9C=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EC=A4=91=EB=B3=B5?= =?UTF-8?q?=EB=AC=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wingle/community/article/ArticleMapper.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) 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 ed698aa..1627648 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 @@ -25,13 +25,12 @@ 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) { @@ -43,7 +42,9 @@ public ArticleResponseDto toResponseDto(Article article, List images) { 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(); } From 7a8cce99ec1249a9d7db143fe9d9c41813b08b83 Mon Sep 17 00:00:00 2001 From: minjikim Date: Mon, 21 Aug 2023 02:39:58 +0900 Subject: [PATCH 2/4] =?UTF-8?q?[fix]=20=EC=9D=B5=EB=AA=85=EA=B2=8C?= =?UTF-8?q?=EC=8B=9C=ED=8C=90=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EA=B5=AC?= =?UTF-8?q?=EB=B6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 익명 게시판인 경우에만 salt값을 포함한 암호화 진행하도록 수정. --- .../co/wingle/community/article/ArticleMapper.java | 5 +---- .../co/wingle/community/comment/CommentMapper.java | 4 +--- .../kr/co/wingle/community/util/CommunityUtil.java | 14 +++++++++++--- .../util/ProcessedPersonalInformation.java | 4 ++-- 4 files changed, 15 insertions(+), 12 deletions(-) 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 1627648..30797c8 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; @@ -36,9 +35,7 @@ public ArticleResponseDto toResponseDto(Article article, 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()); 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 1c77455..df5267e 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 1614ca3..4b35d4b 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 793beca..f7b368f 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); } From 9d5160a5098f1bed74e5bdbe926d8c46dc0dbff5 Mon Sep 17 00:00:00 2001 From: minjikim Date: Mon, 21 Aug 2023 02:44:59 +0900 Subject: [PATCH 3/4] =?UTF-8?q?[feat]=20=ED=9A=8C=EC=9B=90=ED=83=88?= =?UTF-8?q?=ED=87=B4=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 회원탈퇴한 작성자가 쓴 게시글, 댓글, 쪽지 조회 시 "(알수없음)" 처리 추가 회원탈퇴한 사용자의 프로필 조회 시 404 에러 리턴 --- .../java/kr/co/wingle/member/AuthController.java | 7 +++++++ .../kr/co/wingle/member/service/AuthService.java | 6 ++++++ .../kr/co/wingle/message/dto/RoomMemberDto.java | 4 +++- .../kr/co/wingle/message/mapper/MessageMapper.java | 3 ++- .../co/wingle/message/service/MessageService.java | 7 ++----- .../kr/co/wingle/message/service/RoomService.java | 9 ++++++--- .../java/kr/co/wingle/profile/ProfileService.java | 13 +++++++++---- .../java/kr/co/wingle/profile/entity/Profile.java | 7 +++++++ 8 files changed, 42 insertions(+), 14 deletions(-) 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 8bb39d0..d81852c 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 f5913e1..505dc1d 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 2a6f2b8..b6a9815 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 babd11c..cdae5d9 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 b98567b..a354ec0 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() ? null : 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 7d07553..c4a8b8d 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 878893b..0ab5815 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 a567287..e085928 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 From cfc73f9adefc7d4d5b8909f1ba1f98c5d7c7e651 Mon Sep 17 00:00:00 2001 From: minjikim Date: Mon, 21 Aug 2023 21:51:24 +0900 Subject: [PATCH 4/4] =?UTF-8?q?[refactor]=20=EA=B0=92=EC=9D=B4=20=EC=97=86?= =?UTF-8?q?=EC=9D=84=20=EB=95=8C=20null=20=EB=8C=80=EC=8B=A0=20""=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/kr/co/wingle/message/service/MessageService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 a354ec0..c7a2334 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 @@ -65,7 +65,7 @@ public MessageResponseWithRecipentDto getListByRoom(Long roomId, int page, int s return MessageResponseWithRecipentDto.of( AES256Util.encrypt(recipient.getMemberId().toString()), - recipient.isDeleted() ? null : profileService.getProfile(recipient.getMemberId()).getImage(), + recipient.isDeleted() ? "" : profileService.getProfile(recipient.getMemberId()).getImage(), recipient.isDeleted() ? "(알수없음)" : recipient.getSchoolName(), messages );