Skip to content

Commit

Permalink
feat(#94): 그룹 가입 요청 handler 구현
Browse files Browse the repository at this point in the history
  • Loading branch information
jusung-c committed Nov 2, 2023
1 parent 46ba348 commit 60bab9f
Show file tree
Hide file tree
Showing 6 changed files with 95 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.heachi.admin.common.response.JsonResult;
import com.heachi.external.clients.auth.response.UserInfoResponse;
import com.heachi.housework.api.controller.group.info.request.GroupInfoRegisterRequest;
import com.heachi.housework.api.service.auth.AuthExternalService;
import com.heachi.housework.api.service.group.info.GroupInfoService;
import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -62,4 +63,15 @@ public JsonResult<?> joinGroupInfo(@RequestHeader(name = "Authorization") String

return JsonResult.successOf("성공적으로 그룹에 가입했습니다.");
}

// 그룹 가입 요청 처리
@PostMapping("/register")
public JsonResult<?> joinGroupRequestHandler(@RequestHeader(name = "Authorization") String authorization,
@Valid @RequestBody GroupInfoRegisterRequest request) {
// Auth 서버에서 사용자 인증
UserInfoResponse userInfo = authExternalService.userAuthenticate(authorization);
groupInfoService.joinRequestHandler(userInfo.getEmail(), request);

return JsonResult.successOf("그룹 가입 요청을 성공적으로 수행했습니다.");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.heachi.housework.api.controller.group.info.request;

import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class GroupInfoRegisterRequest {
private Long groupMemberId;
private Long groupId;
@NotEmpty
private boolean status;
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import com.heachi.admin.common.exception.ExceptionMessage;
import com.heachi.admin.common.exception.group.info.GroupInfoException;
import com.heachi.admin.common.exception.group.member.GroupMemberException;
import com.heachi.housework.api.controller.group.info.request.GroupInfoRegisterRequest;
import com.heachi.housework.api.service.group.info.response.GroupInfoUserGroupServiceResponse;
import com.heachi.mysql.define.group.info.repository.GroupInfoRepository;
import com.heachi.mysql.define.group.info.repository.response.GroupInfoUserGroupResponse;
Expand All @@ -28,6 +30,9 @@
import java.util.Optional;
import java.util.stream.Collectors;

import static com.heachi.mysql.define.group.info.QGroupInfo.groupInfo;
import static com.heachi.mysql.define.user.QUser.user;

@Slf4j
@Service
@Transactional(readOnly = true)
Expand Down Expand Up @@ -156,4 +161,55 @@ public void joinGroupInfo(String email, String joinCode) {
}

}

@Transactional
public void joinRequestHandler(String adminEmail, GroupInfoRegisterRequest request) {
// 그룹 정보 조회
GroupInfo groupInfo = groupInfoRepository.findById(request.getGroupId()).orElseThrow(() -> {
log.warn(">>>> 해당 groupId를 가진 그룹이 존재하지 않습니다 : [{}]", request.getGroupId());

throw new GroupInfoException(ExceptionMessage.GROUP_INFO_NOT_FOUND);
});

// 그룹 가입 요청자 조회
GroupMember requestGroupMember = groupMemberRepository.findByIdAndGroupInfo(request.getGroupMemberId(), groupInfo).orElseThrow(() -> {

This comment has been minimized.

Copy link
@ghdcksgml1

ghdcksgml1 Nov 3, 2023

Owner

groupMemberId, groupInfoId를 모두 조건 걸어서 한번의 쿼리로 줄일 수 있지 않을까요??

log.warn(">>>> Group Member Not Found : [{}]", request.getGroupMemberId());

throw new GroupMemberException(ExceptionMessage.GROUP_MEMBER_NOT_FOUND);
});

// 그룹 가입 요청자 상태 확인: WAITING 상태가 아닐경우 예외처리
if (requestGroupMember.getStatus() != GroupMemberStatus.WAITING) {
log.warn(">>>> Group Member's Status Is Not WAITING : [{}]", requestGroupMember.getStatus());

throw new GroupMemberException(ExceptionMessage.GROUP_MEMBER_STATUS_NOT_WAITING);
}

// adminEmail로 User 정보 조회
User adminUser = userRepository.findByEmail(adminEmail).orElseThrow(() -> {
log.warn(">>>> USER NOT FOUND : [{}]", adminEmail);

throw new UserException(ExceptionMessage.USER_NOT_FOUND);
});

// User 정보와 GroupInfo 정보로 GROUP_MEMBER 조회
GroupMember adminGroupMember = groupMemberRepository.findByUserAndGroupInfo(adminUser, groupInfo).orElseThrow(() -> {

This comment has been minimized.

Copy link
@ghdcksgml1

ghdcksgml1 Nov 3, 2023

Owner

join User를 통해 두개의 쿼리를 하나로 줄일 수 있어 보입니다!

+추가로, 그룹 가입 요청자 조회보다 권한 체크가 선행작업이 돼야할 것 같아요

log.warn(">>>> 해당 그룹의 구성원이 아닙니다. : [{}]", adminEmail);

throw new GroupMemberException(ExceptionMessage.GROUP_MEMBER_NOT_FOUND);
});

// role이 GROUP_ADMIN(그룹장)인지 확인
if (adminGroupMember.getRole() != GroupMemberRole.GROUP_ADMIN) {
log.warn(">>>> 해당 그룹의 그룹장이 아닙니다. : [role: {}]", adminGroupMember.getRole());

throw new GroupMemberException(ExceptionMessage.GROUP_MEMBER_ROLE_NOT_ADMIN);
}

// status에 따른 그룹 가입 요청 핸들링
GroupMemberStatus updateStatus = request.isStatus() ? GroupMemberStatus.ACCEPT : GroupMemberStatus.WAITING;

// requestGroupMember update
requestGroupMember.updateStatus(updateStatus);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,9 @@ public void rejoinGroup() {
this.role = GroupMemberRole.GROUP_MEMBER;
this.status = GroupMemberStatus.WAITING;
}

// 그룹 가입 요청 수락 여부에 따른 update
public void updateStatus(GroupMemberStatus status) {
this.status = status;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,6 @@ public interface GroupMemberRepository extends JpaRepository<GroupMember, Long>,
Optional<GroupMember> findByUser(User user);

Optional<GroupMember> findByUserAndGroupInfo(User user, GroupInfo groupInfo);

Optional<GroupMember> findByIdAndGroupInfo(Long id, GroupInfo groupInfo);
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ public enum ExceptionMessage {

// GroupMemberException
GROUP_MEMBER_NOT_FOUND("그룹 멤버를 찾지 못했습니다."),
GROUP_MEMBER_STATUS_NOT_WAITING("그룹 가입 요청 수락 대기자가 아닙니다."),
GROUP_MEMBER_ROLE_NOT_ADMIN("그룹의 그룹장이 아닙니다."),

// NotifyException
NOTIFY_NOT_FOUND("해당 아이디의 알림을 찾을 수 없습니다."),
Expand Down

0 comments on commit 60bab9f

Please sign in to comment.