From a2efd32ea7e02d2b28c73c886ef0077c9b5bb512 Mon Sep 17 00:00:00 2001 From: mybloom Date: Fri, 30 Dec 2022 14:28:15 +0900 Subject: [PATCH 01/10] =?UTF-8?q?=F0=9F=93=91=20::=20GroupUserRepository.f?= =?UTF-8?q?indByGroupAndUser()=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 그룹원인지 확인 용도 --- .../group/domain/repository/GroupUserRepository.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/github/depromeet/knockknockbackend/domain/group/domain/repository/GroupUserRepository.java b/src/main/java/io/github/depromeet/knockknockbackend/domain/group/domain/repository/GroupUserRepository.java index dc4d7ccc..7872054d 100644 --- a/src/main/java/io/github/depromeet/knockknockbackend/domain/group/domain/repository/GroupUserRepository.java +++ b/src/main/java/io/github/depromeet/knockknockbackend/domain/group/domain/repository/GroupUserRepository.java @@ -1,8 +1,14 @@ package io.github.depromeet.knockknockbackend.domain.group.domain.repository; +import io.github.depromeet.knockknockbackend.domain.group.domain.Group; import io.github.depromeet.knockknockbackend.domain.group.domain.GroupUser; +import io.github.depromeet.knockknockbackend.domain.user.domain.User; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; public interface GroupUserRepository - extends JpaRepository, CustomGroupUserRepository {} + extends JpaRepository, CustomGroupUserRepository { + + Optional findByGroupAndUser(Group group, User user); +} From 31edc06705d4a066764874637523997a24b8e4d6 Mon Sep 17 00:00:00 2001 From: mybloom Date: Fri, 30 Dec 2022 14:29:41 +0900 Subject: [PATCH 02/10] =?UTF-8?q?=F0=9F=93=91=20::=20=ED=91=B8=EC=89=AC?= =?UTF-8?q?=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=A0=84=EC=86=A1=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=EC=97=90=20=EC=A0=84=EC=86=A1=20=EA=B0=80=EB=8A=A5=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9E=90=EC=9D=B8=EC=A7=80=20=EC=9C=A0?= =?UTF-8?q?=ED=9A=A8=EC=84=B1=20=ED=99=95=EC=9D=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/NotificationService.java | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/service/NotificationService.java b/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/service/NotificationService.java index d5558924..26ac6fb1 100644 --- a/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/service/NotificationService.java +++ b/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/service/NotificationService.java @@ -2,7 +2,11 @@ import io.github.depromeet.knockknockbackend.domain.group.domain.Group; +import io.github.depromeet.knockknockbackend.domain.group.domain.GroupType; +import io.github.depromeet.knockknockbackend.domain.group.domain.repository.GroupUserRepository; +import io.github.depromeet.knockknockbackend.domain.group.exception.NotMemberException; import io.github.depromeet.knockknockbackend.domain.group.presentation.dto.response.GroupInfoForNotificationDto; +import io.github.depromeet.knockknockbackend.domain.group.service.GroupService; import io.github.depromeet.knockknockbackend.domain.notification.domain.*; import io.github.depromeet.knockknockbackend.domain.notification.domain.Notification; import io.github.depromeet.knockknockbackend.domain.notification.domain.repository.DeviceTokenRepository; @@ -38,11 +42,13 @@ public class NotificationService implements NotificationUtils { private static final boolean CREATED_DELETED_STATUS = false; private final EntityManager entityManager; private final FcmService fcmService; + private final GroupService groupService; private final NotificationRepository notificationRepository; private final DeviceTokenRepository deviceTokenRepository; private final NotificationReactionRepository notificationReactionRepository; private final ReservationRepository reservationRepository; private final NotificationExperienceRepository notificationExperienceRepository; + private final GroupUserRepository groupUserRepository; @Transactional(readOnly = true) public QueryNotificationListLatestResponse queryListLatest() { @@ -168,9 +174,11 @@ public void registerFcmToken(RegisterFcmTokenRequest request) { @Transactional public void sendInstance(SendInstanceRequest request) { - Long sendUserId = SecurityUtils.getCurrentUserId(); + Long currentUserId = SecurityUtils.getCurrentUserId(); + validateSendNotificationPermission( + groupService.queryGroup((request.getGroupId())), currentUserId); - List deviceTokens = getDeviceTokens(request.getGroupId(), sendUserId); + List deviceTokens = getDeviceTokens(request.getGroupId(), currentUserId); List tokens = getFcmTokens(deviceTokens); if (tokens.isEmpty()) { return; @@ -185,7 +193,7 @@ public void sendInstance(SendInstanceRequest request) { request.getContent(), request.getImageUrl(), Group.of(request.getGroupId()), - User.of(sendUserId), + User.of(currentUserId), null); } @@ -241,6 +249,18 @@ private void validateDeletePermission(Notification notification) { } } + private void validateSendNotificationPermission(Group group, Long userId) { + // 홀로외침방이면 방장인지 + if (GroupType.OPEN.equals(group.getGroupType())) group.validUserIsHost(userId); + // 친구방이면 그룹 소속원인지 + if (GroupType.FRIEND.equals(group.getGroupType())) { + // group.validUserIsMemberOfGroup(userId); //todo: 해당 부분 호춣시 불필요한 쿼리 발생. + groupUserRepository + .findByGroupAndUser(group, User.of(userId)) + .orElseThrow(() -> NotMemberException.EXCEPTION); + } + } + @Override public Notification queryNotificationById(Long notificationId) { return notificationRepository From db7882b185a0df6882991a6d909deeac4ef4aa98 Mon Sep 17 00:00:00 2001 From: mybloom Date: Fri, 30 Dec 2022 15:10:01 +0900 Subject: [PATCH 03/10] =?UTF-8?q?=F0=9F=93=91=20::=20ReservationAlreadyExi?= =?UTF-8?q?stException=20ErrorCode=EC=99=80=20=EC=9D=B5=EC=85=89=EC=85=98?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 해당 그룹에 해당 사용자가 이미 예약 등록시 익셉션 --- .../exception/ReservationAlreadyExistException.java | 13 +++++++++++++ .../global/error/exception/ErrorCode.java | 8 ++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 src/main/java/io/github/depromeet/knockknockbackend/domain/notification/exception/ReservationAlreadyExistException.java diff --git a/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/exception/ReservationAlreadyExistException.java b/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/exception/ReservationAlreadyExistException.java new file mode 100644 index 00000000..8d79d513 --- /dev/null +++ b/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/exception/ReservationAlreadyExistException.java @@ -0,0 +1,13 @@ +package io.github.depromeet.knockknockbackend.domain.notification.exception; + + +import io.github.depromeet.knockknockbackend.global.error.exception.ErrorCode; +import io.github.depromeet.knockknockbackend.global.error.exception.KnockException; + +public class ReservationAlreadyExistException extends KnockException { + public static final KnockException EXCEPTION = new ReservationAlreadyExistException(); + + private ReservationAlreadyExistException() { + super(ErrorCode.RESERVATION_ALREADY_EXIST); + } +} diff --git a/src/main/java/io/github/depromeet/knockknockbackend/global/error/exception/ErrorCode.java b/src/main/java/io/github/depromeet/knockknockbackend/global/error/exception/ErrorCode.java index b6ba08b3..447aeec4 100644 --- a/src/main/java/io/github/depromeet/knockknockbackend/global/error/exception/ErrorCode.java +++ b/src/main/java/io/github/depromeet/knockknockbackend/global/error/exception/ErrorCode.java @@ -62,12 +62,16 @@ public enum ErrorCode { NOTIFICATION_FCM_FAIL_SEND( HttpStatus.INTERNAL_SERVER_ERROR.value(), "NOTIFICATION-500-1", "FCM ERROR"), - RESERVATION_NOT_FOUND( - HttpStatus.NOT_FOUND.value(), "RESERVATION-404-1", "Reservation Not Found"), RESERVATION_FORBIDDEN( HttpStatus.FORBIDDEN.value(), "RESERVATION-403-1", "The user has no access to the reservation"), + RESERVATION_ALREADY_EXIST( + HttpStatus.FORBIDDEN.value(), + "RESERVATION-403-2", + "The user already registered reservation"), + RESERVATION_NOT_FOUND( + HttpStatus.NOT_FOUND.value(), "RESERVATION-404-1", "Reservation Not Found"), STORAGE_FORBIDDEN( HttpStatus.FORBIDDEN.value(), "STORAGE-403-1", "The user has no access to the storage"), From 856d91198eddd2fe487f125eb460947f9f6dbf07 Mon Sep 17 00:00:00 2001 From: mybloom Date: Fri, 30 Dec 2022 15:10:49 +0900 Subject: [PATCH 04/10] =?UTF-8?q?=E2=99=BB=20::=20findByGroupAndSendUserOr?= =?UTF-8?q?derBySendAtAsc=20->=20findByGroupAndSendUser=20=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 예약은 그룹에 해당 사용자 한 건만 가능하므로 List에서 Optional로 수정 --- .../repository/ReservationRepository.java | 3 ++- .../QueryNotificationListResponse.java | 3 +-- .../service/NotificationService.java | 19 +++++++++---------- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/domain/repository/ReservationRepository.java b/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/domain/repository/ReservationRepository.java index 0373eac1..32853b7f 100644 --- a/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/domain/repository/ReservationRepository.java +++ b/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/domain/repository/ReservationRepository.java @@ -6,13 +6,14 @@ import io.github.depromeet.knockknockbackend.domain.user.domain.User; import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; public interface ReservationRepository extends CrudRepository { - List findByGroupAndSendUserOrderBySendAtAsc(Group group, User sendUser); + Optional findByGroupAndSendUser(Group group, User sendUser); List findBySendAtLessThan(LocalDateTime sendAt); diff --git a/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/presentation/dto/response/QueryNotificationListResponse.java b/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/presentation/dto/response/QueryNotificationListResponse.java index cacd8572..3c78a408 100644 --- a/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/presentation/dto/response/QueryNotificationListResponse.java +++ b/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/presentation/dto/response/QueryNotificationListResponse.java @@ -1,7 +1,6 @@ package io.github.depromeet.knockknockbackend.domain.notification.presentation.dto.response; -import java.util.List; import lombok.AllArgsConstructor; import lombok.Getter; import org.springframework.data.domain.Slice; @@ -10,6 +9,6 @@ @AllArgsConstructor public class QueryNotificationListResponse { - private final List reservations; + private final QueryReservationListResponseElement reservations; private final Slice notifications; } diff --git a/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/service/NotificationService.java b/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/service/NotificationService.java index 26ac6fb1..2f173639 100644 --- a/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/service/NotificationService.java +++ b/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/service/NotificationService.java @@ -85,11 +85,10 @@ public QueryNotificationListResponse queryListByGroupId(Pageable pageable, Long getQueryNotificationListResponseElements( notification, myNotificationReactions)); - List reservations = - reservationRepository.findByGroupAndSendUserOrderBySendAtAsc( - Group.of(groupId), User.of(SecurityUtils.getCurrentUserId())); - List queryReservationListResponseElements = - reservations.stream() + QueryReservationListResponseElement queryReservationListResponseElement = + reservationRepository + .findByGroupAndSendUser( + Group.of(groupId), User.of(SecurityUtils.getCurrentUserId())) .map( reservation -> QueryReservationListResponseElement.builder() @@ -99,10 +98,10 @@ public QueryNotificationListResponse queryListByGroupId(Pageable pageable, Long .imageUrl(reservation.getImageUrl()) .sendAt(reservation.getSendAt()) .build()) - .collect(Collectors.toList()); + .orElse(null); return new QueryNotificationListResponse( - queryReservationListResponseElements, queryNotificationListResponseElements); + queryReservationListResponseElement, queryNotificationListResponseElements); } public QueryNotificationListResponseElement getQueryNotificationListResponseElements( @@ -175,8 +174,7 @@ public void registerFcmToken(RegisterFcmTokenRequest request) { @Transactional public void sendInstance(SendInstanceRequest request) { Long currentUserId = SecurityUtils.getCurrentUserId(); - validateSendNotificationPermission( - groupService.queryGroup((request.getGroupId())), currentUserId); + validateSendNotificationPermission(request.getGroupId(), currentUserId); List deviceTokens = getDeviceTokens(request.getGroupId(), currentUserId); List tokens = getFcmTokens(deviceTokens); @@ -249,7 +247,8 @@ private void validateDeletePermission(Notification notification) { } } - private void validateSendNotificationPermission(Group group, Long userId) { + public void validateSendNotificationPermission(Long groupId, Long userId) { + Group group = groupService.queryGroup(groupId); // 홀로외침방이면 방장인지 if (GroupType.OPEN.equals(group.getGroupType())) group.validUserIsHost(userId); // 친구방이면 그룹 소속원인지 From 74d8a89f14673dafca81aa79d3010f1ddd2e5734 Mon Sep 17 00:00:00 2001 From: mybloom Date: Fri, 30 Dec 2022 15:12:48 +0900 Subject: [PATCH 05/10] =?UTF-8?q?=F0=9F=93=91=20::=20Reservation=20?= =?UTF-8?q?=EC=97=94=ED=8B=B0=ED=8B=B0=EC=97=90=20unique=20=EC=A0=9C?= =?UTF-8?q?=EC=95=BD=EC=A1=B0=EA=B1=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - group_id", "send_user_id" 통합 유니크 제약조건 --- .../domain/notification/domain/Reservation.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/domain/Reservation.java b/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/domain/Reservation.java index 18b0ac63..5fc82470 100644 --- a/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/domain/Reservation.java +++ b/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/domain/Reservation.java @@ -14,7 +14,9 @@ @AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PROTECTED) @DynamicUpdate -@Table(name = "tbl_reservation") +@Table( + name = "tbl_reservation", + uniqueConstraints = {@UniqueConstraint(columnNames = {"group_id", "send_user_id"})}) @Entity public class Reservation extends BaseTimeEntity { From 8d4b51063b096dd38b0a987db70a1591a872fd07 Mon Sep 17 00:00:00 2001 From: mybloom Date: Fri, 30 Dec 2022 15:13:24 +0900 Subject: [PATCH 06/10] =?UTF-8?q?=E2=99=BB=20::=20=EC=98=88=EC=95=BD?= =?UTF-8?q?=EC=8B=9C=20=ED=95=B4=EB=8B=B9=20=EA=B7=B8=EB=A3=B9,=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9E=90=20=ED=95=9C=20=EA=B1=B4=EB=A7=8C=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=9C=A0?= =?UTF-8?q?=ED=9A=A8=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notification/service/ReservationService.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/service/ReservationService.java b/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/service/ReservationService.java index 4825fe0d..d1d16c2c 100644 --- a/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/service/ReservationService.java +++ b/src/main/java/io/github/depromeet/knockknockbackend/domain/notification/service/ReservationService.java @@ -5,6 +5,7 @@ import io.github.depromeet.knockknockbackend.domain.notification.domain.DeviceToken; import io.github.depromeet.knockknockbackend.domain.notification.domain.Reservation; import io.github.depromeet.knockknockbackend.domain.notification.domain.repository.ReservationRepository; +import io.github.depromeet.knockknockbackend.domain.notification.exception.ReservationAlreadyExistException; import io.github.depromeet.knockknockbackend.domain.notification.exception.ReservationForbiddenException; import io.github.depromeet.knockknockbackend.domain.notification.exception.ReservationNotFoundException; import io.github.depromeet.knockknockbackend.domain.notification.presentation.dto.request.ChangeSendAtReservationRequest; @@ -32,6 +33,16 @@ public class ReservationService { public void sendReservation(SendReservationRequest request) { Long currentUserId = SecurityUtils.getCurrentUserId(); + notificationService.validateSendNotificationPermission(request.getGroupId(), currentUserId); + Reservation reservation = + reservationRepository + .findByGroupAndSendUser( + Group.of(request.getGroupId()), User.of(currentUserId)) + .orElse(null); + + if (reservation != null) { + throw ReservationAlreadyExistException.EXCEPTION; + } reservationRepository.save( Reservation.of( From 933f448bc43a9a54d3ec39f5c3f55a2f163417ff Mon Sep 17 00:00:00 2001 From: Leeseojune Date: Sat, 31 Dec 2022 19:22:08 +0900 Subject: [PATCH 07/10] =?UTF-8?q?=F0=9F=93=91=20::=20NotFriendRelationExce?= =?UTF-8?q?ption?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/NotFriendRelationException.java | 14 ++++++++++++++ .../global/error/exception/ErrorCode.java | 1 + 2 files changed, 15 insertions(+) create mode 100644 src/main/java/io/github/depromeet/knockknockbackend/domain/relation/exception/NotFriendRelationException.java diff --git a/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/exception/NotFriendRelationException.java b/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/exception/NotFriendRelationException.java new file mode 100644 index 00000000..9e1d30ce --- /dev/null +++ b/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/exception/NotFriendRelationException.java @@ -0,0 +1,14 @@ +package io.github.depromeet.knockknockbackend.domain.relation.exception; + +import io.github.depromeet.knockknockbackend.global.error.exception.ErrorCode; +import io.github.depromeet.knockknockbackend.global.error.exception.KnockException; + +public class NotFriendRelationException extends KnockException { + + public static final KnockException EXCEPTION = new NotFriendRelationException(); + + private NotFriendRelationException() { + super(ErrorCode.NOT_FRIEND_RELATION); + } + +} diff --git a/src/main/java/io/github/depromeet/knockknockbackend/global/error/exception/ErrorCode.java b/src/main/java/io/github/depromeet/knockknockbackend/global/error/exception/ErrorCode.java index 9a34d359..e24d7277 100644 --- a/src/main/java/io/github/depromeet/knockknockbackend/global/error/exception/ErrorCode.java +++ b/src/main/java/io/github/depromeet/knockknockbackend/global/error/exception/ErrorCode.java @@ -28,6 +28,7 @@ public enum ErrorCode { ALREADY_SEND_REQUEST(400, "RELATION-400-1", "Already Send Request."), ALREADY_FRIEND_REQUEST(400, "RELATION-400-1", "Already Friend Request."), FRIEND_REQUEST_NOT_FOUND(404, "RELATION-404-1", "Friend Request Not Found."), + NOT_FRIEND_RELATION(404, "RELATION-404-2", "Not Friend Relation."), OPTION_NOT_FOUND(404, "OPTION-404-1", "Option Not Found."), From ca4e2f881885f90031592add8a23f150c9bc9c74 Mon Sep 17 00:00:00 2001 From: Leeseojune Date: Sat, 31 Dec 2022 19:22:29 +0900 Subject: [PATCH 08/10] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20=20getRelationI?= =?UTF-8?q?dByUserId?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/repository/CustomRelationRepository.java | 2 ++ .../repository/CustomRelationRepositoryImpl.java | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/domain/repository/CustomRelationRepository.java b/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/domain/repository/CustomRelationRepository.java index 3accd30f..b194bc4f 100644 --- a/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/domain/repository/CustomRelationRepository.java +++ b/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/domain/repository/CustomRelationRepository.java @@ -12,4 +12,6 @@ Optional findRelationBySendUserIdAndReceiveUserId( Long sendUserId, Long receiveUserId); boolean isFriend(Long currentUserId, Long userId); + + Long getRelationIdByUserId(Long currentUserId, Long userId); } diff --git a/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/domain/repository/CustomRelationRepositoryImpl.java b/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/domain/repository/CustomRelationRepositoryImpl.java index 353a9a8b..f8457837 100644 --- a/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/domain/repository/CustomRelationRepositoryImpl.java +++ b/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/domain/repository/CustomRelationRepositoryImpl.java @@ -55,6 +55,17 @@ public boolean isFriend(Long currentUserId, Long userId) { .fetchFirst(); } + @Override + public Long getRelationIdByUserId(Long currentUserId, Long userId) { + return queryFactory + .select(relation.id) + .from(relation) + .where( + friendPredicated(currentUserId, userId) + .or(friendPredicated(userId, currentUserId))) + .fetchFirst(); + } + private BooleanExpression friendPredicated(Long senderUserId, Long receiveUserId) { return relation.sendUser.id.eq(senderUserId).and(relation.receiveUser.id.eq(receiveUserId)); } From fa546527df450a46084aba700eea845ce5b21be1 Mon Sep 17 00:00:00 2001 From: Leeseojune Date: Sat, 31 Dec 2022 19:22:42 +0900 Subject: [PATCH 09/10] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20=20deleteRelati?= =?UTF-8?q?on?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../relation/presentation/RelationController.java | 7 +++++++ .../domain/relation/service/RelationService.java | 13 +++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/presentation/RelationController.java b/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/presentation/RelationController.java index 92508b55..ac770d9f 100644 --- a/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/presentation/RelationController.java +++ b/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/presentation/RelationController.java @@ -40,6 +40,13 @@ public ResponseEntity sendUserRequest(@RequestBody @Valid FriendRequest re return new ResponseEntity<>(relationService.sendFriendRequest(request)); } + @Operation(summary = "친구를 삭제하는 Api입니다. - 친구목록") + @ResponseStatus(HttpStatus.NO_CONTENT) + @DeleteMapping + public void deleteRelation(@RequestBody @Valid FriendRequest request) { + relationService.deleteRelation(request); + } + @Operation(summary = "친구 요청을 수락하는 Api입니다. - 메인 알림") @ResponseStatus(HttpStatus.CREATED) @PostMapping("/requests") diff --git a/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/service/RelationService.java b/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/service/RelationService.java index 59a4e2c9..3bb7e80b 100644 --- a/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/service/RelationService.java +++ b/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/service/RelationService.java @@ -6,6 +6,7 @@ import io.github.depromeet.knockknockbackend.domain.relation.exception.AlreadyFriendException; import io.github.depromeet.knockknockbackend.domain.relation.exception.AlreadySendRequestException; import io.github.depromeet.knockknockbackend.domain.relation.exception.FriendRequestNotFoundException; +import io.github.depromeet.knockknockbackend.domain.relation.exception.NotFriendRelationException; import io.github.depromeet.knockknockbackend.domain.relation.presentation.dto.request.FriendRequest; import io.github.depromeet.knockknockbackend.domain.relation.presentation.dto.response.QueryFriendListResponse; import io.github.depromeet.knockknockbackend.domain.relation.presentation.dto.response.QueryFriendListResponseElement; @@ -77,6 +78,14 @@ public HttpStatus sendFriendRequest(FriendRequest request) { return HttpStatus.CREATED; } + public void deleteRelation(FriendRequest request) { + if(!getIsFriend(request.getUserId())) { + throw NotFriendRelationException.EXCEPTION; + } + + relationRepository.deleteById(getRelationId(request.getUserId())); + } + public void acceptRequest(FriendRequest request) { updateIsFriendWithValidate(request, true); } @@ -89,6 +98,10 @@ public boolean getIsFriend(Long userId) { return relationRepository.isFriend(SecurityUtils.getCurrentUserId(), userId); } + private Long getRelationId(Long userId) { + return relationRepository.getRelationIdByUserId(SecurityUtils.getCurrentUserId(), userId); + } + private void updateIsFriendWithValidate(FriendRequest request, boolean isFriend) { if (!getIsFriend(request.getUserId())) { throw AlreadyFriendException.EXCEPTION; From b66e91bccc93d42200b9aca220f62b2e09f2e347 Mon Sep 17 00:00:00 2001 From: Leeseojune Date: Sat, 31 Dec 2022 19:25:38 +0900 Subject: [PATCH 10/10] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20::=20format?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/relation/exception/NotFriendRelationException.java | 2 +- .../domain/relation/service/RelationService.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/exception/NotFriendRelationException.java b/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/exception/NotFriendRelationException.java index 9e1d30ce..cc446cc9 100644 --- a/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/exception/NotFriendRelationException.java +++ b/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/exception/NotFriendRelationException.java @@ -1,5 +1,6 @@ package io.github.depromeet.knockknockbackend.domain.relation.exception; + import io.github.depromeet.knockknockbackend.global.error.exception.ErrorCode; import io.github.depromeet.knockknockbackend.global.error.exception.KnockException; @@ -10,5 +11,4 @@ public class NotFriendRelationException extends KnockException { private NotFriendRelationException() { super(ErrorCode.NOT_FRIEND_RELATION); } - } diff --git a/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/service/RelationService.java b/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/service/RelationService.java index 3bb7e80b..2a4649ee 100644 --- a/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/service/RelationService.java +++ b/src/main/java/io/github/depromeet/knockknockbackend/domain/relation/service/RelationService.java @@ -79,7 +79,7 @@ public HttpStatus sendFriendRequest(FriendRequest request) { } public void deleteRelation(FriendRequest request) { - if(!getIsFriend(request.getUserId())) { + if (!getIsFriend(request.getUserId())) { throw NotFriendRelationException.EXCEPTION; }