Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import com.asyncgate.user_server.domain.Member;
import com.asyncgate.user_server.dto.response.FriendResponse;
import com.asyncgate.user_server.dto.response.FriendsResponse;
import com.asyncgate.user_server.dto.response.MemberResponse;
import com.asyncgate.user_server.dto.response.UserClientInfoResponses.UserClientInfoResponse;
import com.asyncgate.user_server.security.annotation.MemberID;
import com.asyncgate.user_server.support.response.SuccessResponse;
import com.asyncgate.user_server.usecase.FriendUseCase;
Expand All @@ -24,10 +24,10 @@ public class FriendController implements FriendControllerDocs {
*/
@Override
@GetMapping
public SuccessResponse<MemberResponse> searchTarget(final @RequestParam String email) {
public SuccessResponse<UserClientInfoResponse> searchTarget(final @RequestParam String email) {
Member findMember = friendUseCase.getByEmail(email);
return SuccessResponse.ok(
MemberResponse.from(findMember)
UserClientInfoResponse.from(findMember)
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.asyncgate.user_server.dto.response.FriendResponse;
import com.asyncgate.user_server.dto.response.FriendsResponse;
import com.asyncgate.user_server.dto.response.MemberResponse;
import com.asyncgate.user_server.dto.response.UserClientInfoResponses;
import com.asyncgate.user_server.security.annotation.MemberID;
import com.asyncgate.user_server.support.response.SuccessResponse;
import io.swagger.v3.oas.annotations.Operation;
Expand All @@ -18,7 +18,7 @@ public interface FriendControllerDocs {
@ApiResponse(responseCode = "200", description = "정상적으로 조회되었습니다.")
})
@GetMapping
SuccessResponse<MemberResponse> searchTarget(
SuccessResponse<UserClientInfoResponses.UserClientInfoResponse> searchTarget(
@Parameter(description = "검색할 회원의 이메일", required = true)
@RequestParam String email
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,18 +21,25 @@ private Friend(String id, String userId1, String userId2, String requestedBy, Fr
}

public static Friend create(String requestUserId, String toUserId) {
// 두 사용자 ID를 사전 순으로 정렬하여 저장
if (requestUserId.compareTo(toUserId) < 0) {
return new Friend(UUID.randomUUID().toString(), requestUserId, toUserId, requestUserId, FriendStatus.PENDING);
} else {
return new Friend(UUID.randomUUID().toString(), toUserId, requestUserId, requestUserId, FriendStatus.PENDING);
}
String lowerUserId = getLowerUserId(requestUserId, toUserId);
String higherUserId = getHigherUserId(requestUserId, toUserId);
// 요청을 보낸 쪽의 ID는 요청자(requestedBy)로 설정합니다.
return new Friend(UUID.randomUUID().toString(), lowerUserId, higherUserId, requestUserId, FriendStatus.PENDING);
}

public static Friend of(String id, String userId1, String userId2, String requestedBy, FriendStatus status) {
return new Friend(id, userId1, userId2, requestedBy, status);
}

public static String getLowerUserId(String userId1, String userId2) {
return userId1.compareTo(userId2) < 0 ? userId1 : userId2;
}

public static String getHigherUserId(String userId1, String userId2) {
return userId1.compareTo(userId2) < 0 ? userId2 : userId1;
}


public void accept() {
this.status = FriendStatus.ACCEPTED;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,8 @@
public enum FriendStatus {
PENDING,
ACCEPTED,
REJECTED
REJECTED,

// 실제 데이터 미사용 x 프론트 반환 전용
RECEIVED,
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public class FriendEntity extends BaseEntity {

@Enumerated(EnumType.STRING)
@Column(name = "status", nullable = false)
private FriendStatus status;
private FriendStatus status = FriendStatus.PENDING;

@Builder
public FriendEntity(String id, String userId1, String userId2, String requestedBy, FriendStatus status) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,16 @@ public enum FailType {

// Friend
FRIEND_NOT_FOUND(HttpStatus.NOT_FOUND, "Friend_4001", "친구 정보가 존재하지 않습니다."),
UNAUTHORIZED_ACCESS(HttpStatus.FORBIDDEN, "Friend_40300", "현재 사용자는 해당 친구 관계에 대한 권한이 없습니다."),
UNAUTHORIZED_ACTION(HttpStatus.FORBIDDEN, "Friend_40301", "본인의 친구 요청에 대해서는 해당 작업을 수행할 수 없습니다.");;
FRIEND_PENDING_NOT_FOUND(HttpStatus.NOT_FOUND, "Friend_4002", "친구 요청한 기록이 없습니다."),
UNAUTHORIZED_ACCESS(HttpStatus.FORBIDDEN, "Friend_4030", "현재 사용자는 해당 친구 관계에 대한 권한이 없습니다."),
UNAUTHORIZED_ACTION(HttpStatus.FORBIDDEN, "Friend_4031", "본인의 친구 요청에 대해서는 해당 작업을 수행할 수 없습니다."),

FRIEND_ALREADY_PENDING_EXISTS(HttpStatus.BAD_REQUEST, "Friend_4003", "이미 친구요청을 한 상태입니다."),
FRIEND_IS_NOT_PENDING(HttpStatus.BAD_REQUEST, "Friend_4003", "친구 상태가 친구 요청 상태가 아닙니다."),
FRIEND_ALREADY_ACCEPTED_EXISTS(HttpStatus.BAD_REQUEST, "Friend_4004", "이미 친구인 관계입니다."),
FRIEND_ALREADY_REJECTED_EXISTS(HttpStatus.BAD_REQUEST, "Friend_4005", "이미 친구 신청을 거절당했습니다."),

;

private final HttpStatus status;
private final String errorCode;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
package com.asyncgate.user_server.repository;

import com.asyncgate.user_server.domain.Friend;
import com.asyncgate.user_server.domain.FriendStatus;
import com.asyncgate.user_server.entity.FriendEntity;
import com.asyncgate.user_server.entity.QFriendEntity;
import com.asyncgate.user_server.exception.FailType;
import com.asyncgate.user_server.exception.UserServerException;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

@Repository
@RequiredArgsConstructor
Expand Down Expand Up @@ -75,4 +79,54 @@ public List<String> findFriendsIdByUserId(final String userId) {

return transFriendIds(userId, friendEntities);
}

public void validNotExists(final String userId1, final String userId2) {
String lowerUserId = Friend.getLowerUserId(userId1, userId2);
String higherUserId = Friend.getHigherUserId(userId1, userId2);

Optional<FriendEntity> optionalFindEntity = Optional.ofNullable(
jpaQueryFactory.select(friendEntity)
.from(friendEntity)
.where(
friendEntity.userId1.eq(lowerUserId),
friendEntity.userId2.eq(higherUserId),
friendEntity.deleted.isFalse()
)
.fetchOne()
);

if (optionalFindEntity.isEmpty()) {
return;
}

FriendEntity findFriendEntity = optionalFindEntity.get();

if (findFriendEntity.getStatus().equals(FriendStatus.ACCEPTED)) {
throw new UserServerException(FailType.FRIEND_ALREADY_ACCEPTED_EXISTS);
}
if (findFriendEntity.getStatus().equals(FriendStatus.PENDING)) {
throw new UserServerException(FailType.FRIEND_ALREADY_PENDING_EXISTS);
}
if (findFriendEntity.getStatus().equals(FriendStatus.REJECTED)) {
throw new UserServerException(FailType.FRIEND_ALREADY_REJECTED_EXISTS);
}
}

public FriendEntity findByIdAndPending(final String friendId) {
FriendEntity findFriendEntity = Optional.ofNullable(
jpaQueryFactory.select(friendEntity)
.from(friendEntity)
.where(
friendEntity.id.eq(friendId),
friendEntity.status.eq(FriendStatus.PENDING),
friendEntity.deleted.isFalse()
)
.fetchOne()
).orElseThrow(() -> new UserServerException(FailType.FRIEND_PENDING_NOT_FOUND));

if (!findFriendEntity.getStatus().equals(FriendStatus.PENDING)) {
throw new UserServerException(FailType.FRIEND_IS_NOT_PENDING);
}
return findFriendEntity;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,8 @@ public interface FriendRepository {
List<String> findReceivedFriendRequests(String userId);

List<String> findFriendIdsByUserId(String userId);

void validNotExists(String userId1, String userId2);

Friend findIdAndPending(String friendId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,16 @@ public List<String> findReceivedFriendRequests(final String userId) {
public List<String> findFriendIdsByUserId(final String userId) {
return queryDslRepository.findFriendsIdByUserId(userId);
}

@Override
public void validNotExists(final String userId1, final String userId2) {
queryDslRepository.validNotExists(userId1, userId2);
}

@Override
public Friend findIdAndPending(final String friendId) {
return DomainUtil.FriendMapper.toDomain(
queryDslRepository.findByIdAndPending(friendId)
);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.asyncgate.user_server.repository;

import com.asyncgate.user_server.domain.Member;
import com.asyncgate.user_server.entity.MemberEntity;
import com.asyncgate.user_server.entity.QMemberEntity;
import com.querydsl.jpa.impl.JPAQueryFactory;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package com.asyncgate.user_server.repository;

import com.asyncgate.user_server.domain.Member;
import com.asyncgate.user_server.entity.MemberEntity;
import com.asyncgate.user_server.exception.FailType;
import com.asyncgate.user_server.exception.UserServerException;
import com.asyncgate.user_server.support.utility.DomainUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -21,9 +18,9 @@ public class MemberRepositoryImpl implements MemberRepository {

@Override
public void save(final Member member) {
MemberEntity memberEntity = DomainUtil.MemberMapper.toEntity(member);

memberJpaRepository.save(memberEntity);
memberJpaRepository.save(
DomainUtil.MemberMapper.toEntity(member)
);
}

@Override
Expand All @@ -33,7 +30,7 @@ public void softDeleteById(final String id) {
}

@Override
public List<Member> getByMemberIds(List<String> memberIds) {
public List<Member> getByMemberIds(final List<String> memberIds) {
return queryDslRepository.getByMemberIds(memberIds).stream()
.map(DomainUtil.MemberMapper::toDomain)
.toList();
Expand All @@ -60,14 +57,4 @@ public boolean isExistByEmail(final String email) {
public boolean isExistById(final String id) {
return memberJpaRepository.findById(id).isPresent();
}

private MemberEntity findMemberEntityByEmail(final String email) {
return memberJpaRepository.findByNotDeletedEmail(email)
.orElseThrow(() -> new UserServerException(FailType.MEMBER_NOT_EXIST_EMAIL));
}

private MemberEntity findMemberEntityById(final String id) {
return memberJpaRepository.findByNotDeletedId(id)
.orElseThrow(() -> new UserServerException(FailType.MEMBER_NOT_FOUND));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ public Member getByEmail(final String email) {
@Override
@Transactional
public Friend registerFriend(final String requestUserId, final String toUserId) {
friendRepository.validNotExists(requestUserId, toUserId);
Friend friend = Friend.create(requestUserId, toUserId);
friendRepository.save(friend);
return friend;
Expand All @@ -40,7 +41,7 @@ public Friend registerFriend(final String requestUserId, final String toUserId)
@Override
@Transactional
public Friend acceptFriend(final String userId, final String friendId) {
Friend friend = friendRepository.findById(friendId);
Friend friend = friendRepository.findIdAndPending(friendId);
validEditPermission(userId, friend);
friend.accept();
friendRepository.save(friend);
Expand All @@ -65,7 +66,7 @@ private void validDeletePermission(String userId, Friend friend) {
@Override
@Transactional
public Friend rejectFriend(final String userId, final String friendId) {
Friend friend = friendRepository.findById(friendId);
Friend friend = friendRepository.findIdAndPending(friendId);
validEditPermission(userId, friend);
friend.reject();
friendRepository.save(friend);
Expand All @@ -92,7 +93,7 @@ public FriendsResponse getSentFriendRequests(final String userId) {
public FriendsResponse getReceivedFriendRequests(final String userId) {
List<String> receivedFriendIds = friendRepository.findReceivedFriendRequests(userId);
return FriendsResponse.of(
memberRepository.getByMemberIds(receivedFriendIds), FriendStatus.PENDING
memberRepository.getByMemberIds(receivedFriendIds), FriendStatus.RECEIVED
);
}

Expand Down
Loading