Skip to content

Commit

Permalink
Merge pull request #396 from depromeet/develop
Browse files Browse the repository at this point in the history
deploy: ์„œ๋ฒ„ ๋ฐฐํฌ
  • Loading branch information
ywonchae1 authored Sep 7, 2024
2 parents f967bb6 + 8c48045 commit 31deeb2
Show file tree
Hide file tree
Showing 31 changed files with 227 additions and 129 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,6 @@ public interface BlacklistQueryUseCase {
BlacklistPage getBlackMembers(Long memberId, Long cursorId);

Set<Long> getBlackMemberIds(Long memberId);

Boolean checkBlockOrBlocked(Long loginMemberId, Long memberId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,6 @@ public interface BlacklistPersistencePort {
List<Long> findBlackMemberIdsByMemberId(Long memberId);

List<Long> findMemberIdsWhoBlockedMe(Long memberId);

Boolean isBlockOrBlocked(Long loginMemberId, Long memberId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,11 @@ public Set<Long> getBlackMemberIds(Long memberId) {
return new HashSet<>(blackMemberIds);
}

@Override
public Boolean checkBlockOrBlocked(Long loginMemberId, Long memberId) {
return blacklistPersistencePort.isBlockOrBlocked(loginMemberId, memberId);
}

private List<Long> getBlackMemberIdsByMemberId(Long memberId) {
return blacklistPersistencePort.findBlackMemberIdsByMemberId(memberId);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package com.depromeet.friend.port.in.command;

public record DeleteFollowCommand(Long requesterId, Long blackMemberId) {}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.depromeet.friend.port.in;
package com.depromeet.friend.port.in.usecase;

import com.depromeet.friend.domain.vo.*;
import com.depromeet.friend.port.in.command.DeleteFollowCommand;
import com.depromeet.member.domain.Member;
import java.util.List;

Expand All @@ -22,4 +23,6 @@ public interface FollowUseCase {
void deleteByMemberId(Long memberId);

List<FollowCheck> checkFollowingState(Long memberId, List<Long> targetIds);

void deleteBlackMemberInFollowList(DeleteFollowCommand deleteFollowCommand);
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ public interface FriendPersistencePort {

void deleteByMemberIdAndFollowingId(Long memberId, Long followingId);

void deleteFollowerFollowingByMemberIdAndFollowingId(Long memberId, Long followingId);

List<Following> findFollowingsByMemberIdAndCursorId(Long memberId, Long cursorId);

List<Follower> findFollowersByMemberIdAndCursorId(Long memberId, Long cursorId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
import com.depromeet.exception.BadRequestException;
import com.depromeet.friend.domain.Friend;
import com.depromeet.friend.domain.vo.*;
import com.depromeet.friend.port.in.FollowUseCase;
import com.depromeet.friend.port.in.command.DeleteFollowCommand;
import com.depromeet.friend.port.in.usecase.FollowUseCase;
import com.depromeet.friend.port.out.persistence.FriendPersistencePort;
import com.depromeet.member.domain.Member;
import com.depromeet.type.friend.FollowErrorType;
Expand All @@ -12,7 +13,10 @@
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.event.TransactionPhase;
import org.springframework.transaction.event.TransactionalEventListener;

@Service
@RequiredArgsConstructor
Expand Down Expand Up @@ -107,4 +111,14 @@ public void deleteByMemberId(Long memberId) {
public List<FollowCheck> checkFollowingState(Long memberId, List<Long> targetIds) {
return friendPersistencePort.findByMemberIdAndFollowingIds(memberId, targetIds);
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void deleteBlackMemberInFollowList(DeleteFollowCommand deleteFollowCommand) {
Long requesterId = deleteFollowCommand.requesterId();
Long blackMemberId = deleteFollowCommand.blackMemberId();

friendPersistencePort.deleteFollowerFollowingByMemberIdAndFollowingId(
requesterId, blackMemberId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,20 +12,14 @@ public class MemberSearchInfo {
private String nickname;
private String profileImageUrl;
private String introduction;
private boolean hasFollowed;

@Builder
public MemberSearchInfo(
Long memberId,
String nickname,
String profileImageUrl,
String introduction,
boolean hasFollowed) {
Long memberId, String nickname, String profileImageUrl, String introduction) {
this.memberId = memberId;
this.nickname = nickname;
this.profileImageUrl = profileImageUrl;
this.introduction = introduction;
this.hasFollowed = hasFollowed;
}

public String getProfileImageUrl(String profileImageOrigin) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,12 @@
@NoArgsConstructor
public class MemberSearchPage {
private List<MemberSearchInfo> members;
private int pageSize;
private Long cursorId;
private boolean hasNext;

@Builder
public MemberSearchPage(
List<MemberSearchInfo> members, int pageSize, Long cursorId, boolean hasNext) {
public MemberSearchPage(List<MemberSearchInfo> members, Long cursorId, boolean hasNext) {
this.members = members;
this.pageSize = pageSize;
this.cursorId = cursorId;
this.hasNext = hasNext;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@
import com.depromeet.member.domain.Member;
import com.depromeet.member.domain.MemberGender;
import com.depromeet.member.domain.vo.MemberIdAndNickname;
import com.depromeet.member.domain.vo.MemberSearchPage;
import com.depromeet.member.domain.vo.MemberSearchInfo;
import com.depromeet.member.port.in.command.UpdateMemberCommand;
import java.util.List;
import java.util.Optional;

public interface MemberPersistencePort {
Expand All @@ -24,7 +25,7 @@ public interface MemberPersistencePort {

void deleteById(Long id);

MemberSearchPage searchByNameQuery(Long memberId, String nameQuery, Long cursorId);
List<MemberSearchInfo> searchByNameQuery(Long memberId, String nameQuery, Long cursorId);

Optional<Member> updateLatestViewedFollowingLogAt(Long memberId);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import com.depromeet.member.domain.MemberGender;
import com.depromeet.member.domain.MemberRole;
import com.depromeet.member.domain.vo.MemberIdAndNickname;
import com.depromeet.member.domain.vo.MemberSearchInfo;
import com.depromeet.member.domain.vo.MemberSearchPage;
import com.depromeet.member.port.in.command.SocialMemberCommand;
import com.depromeet.member.port.in.command.UpdateMemberCommand;
Expand All @@ -16,6 +17,8 @@
import com.depromeet.member.port.in.usecase.MemberUseCase;
import com.depromeet.member.port.out.persistence.MemberPersistencePort;
import com.depromeet.type.member.MemberErrorType;
import java.util.ArrayList;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Service;
Expand Down Expand Up @@ -62,7 +65,22 @@ public void deleteById(Long id) {

@Override
public MemberSearchPage searchMemberByName(Long memberId, String nameQuery, Long cursorId) {
return memberPersistencePort.searchByNameQuery(memberId, nameQuery, cursorId);
List<MemberSearchInfo> memberSearchInfos =
memberPersistencePort.searchByNameQuery(memberId, nameQuery, cursorId);

boolean hasNext = false;
Long nextCursorId = null;
if (memberSearchInfos.size() > 10) {
memberSearchInfos = new ArrayList<>(memberSearchInfos);
memberSearchInfos.removeLast();
hasNext = true;
nextCursorId = memberSearchInfos.getLast().getMemberId();
}
return MemberSearchPage.builder()
.members(memberSearchInfos)
.cursorId(nextCursorId)
.hasNext(hasNext)
.build();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
public enum ReportReasonCode implements CodedEnum<String> {
REPORT_REASON_1("์ŠคํŒธ, ๊ด‘๊ณ "),
REPORT_REASON_2("ํญ๋ ฅ์ ์ธ ๋ฐœ์–ธ"),
REPORT_REASON_3("์Œ๋ž€์„ฑ, ์„ ์ • ๋‚ด์šฉ"),
REPORT_REASON_3("์Œ๋ž€์„ฑ, ์„ ์ •์„ฑ ๋‚ด์šฉ"),
REPORT_REASON_4("๊ฐœ์ธ์ •๋ณด ๋…ธ์ถœ"),
REPORT_REASON_5("์ฃผ์ œ์™€ ๋ฌด๊ด€");
REPORT_REASON_5("์ˆ˜์˜๊ณผ ๋ฌด๊ด€ํ•œ ๋‚ด์šฉ");

private String value;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,9 @@ public void deleteByMemberIdAndFollowingId(Long memberId, Long followingId) {
&& item.getFollowing().getId().equals(followingId));
}

@Override
public void deleteFollowerFollowingByMemberIdAndFollowingId(Long memberId, Long followingId) {}

@Override
public List<Following> findFollowingsByMemberIdAndCursorId(Long memberId, Long cursorId) {
return friends.stream()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import com.depromeet.member.domain.Member;
import com.depromeet.member.domain.MemberGender;
import com.depromeet.member.domain.vo.MemberIdAndNickname;
import com.depromeet.member.domain.vo.MemberSearchPage;
import com.depromeet.member.domain.vo.MemberSearchInfo;
import com.depromeet.member.port.in.command.UpdateMemberCommand;
import com.depromeet.member.port.out.persistence.MemberPersistencePort;
import java.util.ArrayList;
Expand Down Expand Up @@ -87,7 +87,8 @@ public void deleteById(Long id) {
}

@Override
public MemberSearchPage searchByNameQuery(Long memberId, String nameQuery, Long cursorId) {
public List<MemberSearchInfo> searchByNameQuery(
Long memberId, String nameQuery, Long cursorId) {
return null;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
public enum FollowErrorType implements ErrorType {
NOT_FOUND("FOLLOW_1", "ํŒ”๋กœ์ž‰ ์œ ์ €๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค"),
SELF_FOLLOWING_NOT_ALLOWED("FOLLOW_2", "์ž๊ธฐ ์ž์‹ ์„ ํŒ”๋กœ์ž‰ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค"),
INVALID_FOLLOW_TYPE("FOLLOW_3", "์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ํŒ”๋กœ์šฐ ํƒ€์ž…์ž…๋‹ˆ๋‹ค");
INVALID_FOLLOW_TYPE("FOLLOW_3", "์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ํŒ”๋กœ์šฐ ํƒ€์ž…์ž…๋‹ˆ๋‹ค"),
CANNOT_FOLLOW_BLACK("FOLLOW_4", "์ฐจ๋‹จํ•œ ์‚ฌ๋žŒ์„ ํŒ”๋กœ์šฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค"),
CANNOT_FOLLOW_MEMBER_WHO_BLOCKED_YOU("FOLLOW_5", "๋ณธ์ธ์„ ์ฐจ๋‹จํ•œ ์‚ฌ๋žŒ์„ ํŒ”๋กœ์šฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค");

private final String code;
private final String message;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ public enum MemberErrorType implements ErrorType {
UPDATE_FAILED("MEMBER_7", "๋ฉค๋ฒ„์˜ ์ •๋ณด ์ˆ˜์ •์— ์‹คํŒจํ•˜์˜€์Šต๋‹ˆ๋‹ค"),
UPDATE_PROFILE_IMAGE_FAILED("MEMBER_8", "๋ฉค๋ฒ„์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ์ˆ˜์ •์— ์‹คํŒจํ•˜์˜€์Šต๋‹ˆ๋‹ค"),
UPDATE_LAST_VIEWED_FOLLOWING_LOG_AT("MEMBER_9", "๋ฉค๋ฒ„์˜ ์ตœ๊ทผ ํŒ”๋กœ์ž‰ ์†Œ์‹ ์กฐํšŒ ์‹œ๊ฐ„ ๋ณ€๊ฒฝ์— ์‹คํŒจํ•˜์˜€์Šต๋‹ˆ๋‹ค"),
NOT_FOUND_FROM_ID_LIST("MEMBER_10", "์š”์ฒญ๋œ ๋ฉค๋ฒ„ ID ์ค‘ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฉค๋ฒ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค");
NOT_FOUND_FROM_ID_LIST("MEMBER_10", "์š”์ฒญ๋œ ๋ฉค๋ฒ„ ID ์ค‘ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฉค๋ฒ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค"),
MEMBER_BLOCK_OR_BLOCKED("MEMBER_11", "๋ฉค๋ฒ„๋ฅผ ์ฐจ๋‹จํ–ˆ๊ฑฐ๋‚˜ ๋ฉค๋ฒ„์—๊ฒŒ ์ฐจ๋‹จ ๋‹นํ–ˆ์Šต๋‹ˆ๋‹ค");

private final String code;
private final String message;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ public class BlacklistRepository implements BlacklistPersistencePort {
private final JPAQueryFactory queryFactory;
private final BlacklistJpaRepository blacklistJpaRepository;

QMemberEntity member = new QMemberEntity("member"); // ์ฒซ ๋ฒˆ์งธ ๋ณ„์นญ "member"
QMemberEntity blackMember = new QMemberEntity("blackMember");

@Override
public Blacklist save(Blacklist blacklist) {
return blacklistJpaRepository.save(BlacklistEntity.from(blacklist)).toModel();
Expand All @@ -38,9 +41,6 @@ public void unblackMember(Long memberId, Long blackMemberId) {

@Override
public List<Member> findBlackMembers(Long memberId, Long cursorId) {
QMemberEntity member = new QMemberEntity("member"); // ์ฒซ ๋ฒˆ์งธ ๋ณ„์นญ "member"
QMemberEntity blackMember = new QMemberEntity("blackMember");

return queryFactory
.select(
Projections.constructor(
Expand All @@ -57,20 +57,6 @@ public List<Member> findBlackMembers(Long memberId, Long cursorId) {
.fetch();
}

private static BooleanExpression memberEq(Long memberId) {
if (memberId == null) {
return null;
}
return blacklistEntity.member.id.eq(memberId);
}

private BooleanExpression blacklistIdLoe(Long cursorId) {
if (cursorId == null) {
return null;
}
return blacklistEntity.blackMember.id.loe(cursorId);
}

@Override
public List<Long> findBlackMemberIdsByMemberId(Long memberId) {
return queryFactory
Expand All @@ -85,7 +71,40 @@ public List<Long> findMemberIdsWhoBlockedMe(Long memberId) {
return queryFactory
.select(blacklistEntity.member.id)
.from(blacklistEntity)
.where(blacklistEntity.blackMember.id.eq(memberId))
.where(blackMemberEq(memberId))
.fetch();
}

@Override
public Boolean isBlockOrBlocked(Long loginMemberId, Long memberId) {
return !queryFactory
.select(blacklistEntity.id)
.from(blacklistEntity)
.join(blacklistEntity.member, member)
.join(blacklistEntity.blackMember, blackMember)
.where(
memberEq(loginMemberId)
.and(blackMemberEq(memberId))
.or(memberEq(memberId).and(blackMemberEq(loginMemberId))))
.fetch()
.isEmpty();
}

private static BooleanExpression memberEq(Long memberId) {
if (memberId == null) {
return null;
}
return blacklistEntity.member.id.eq(memberId);
}

private static BooleanExpression blackMemberEq(Long memberId) {
return blacklistEntity.blackMember.id.eq(memberId);
}

private BooleanExpression blacklistIdLoe(Long cursorId) {
if (cursorId == null) {
return null;
}
return blacklistEntity.blackMember.id.loe(cursorId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,18 @@ public void deleteByMemberIdAndFollowingId(Long memberId, Long followingId) {
.execute();
}

@Override
public void deleteFollowerFollowingByMemberIdAndFollowingId(Long memberId, Long followingId) {
queryFactory
.delete(friend)
.where(checkFollow(memberId, followingId).or(checkFollow(followingId, memberId)))
.execute();
}

private BooleanExpression checkFollow(Long memberId, Long followingId) {
return friend.member.id.eq(memberId).and(friend.following.id.eq(followingId));
}

@Override
public List<Following> findFollowingsByMemberIdAndCursorId(Long memberId, Long cursorId) {
return queryFactory
Expand Down
Loading

0 comments on commit 31deeb2

Please sign in to comment.