diff --git a/README.md b/README.md index b8e45af..76f9e11 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ -# backend -도서 성취도 기록 서비스 backend 저장소입니다. +# backend +도서 성취도 기록 서비스 backend 저장소입니다. diff --git a/src/main/java/com/bookmile/backend/domain/group/controller/GroupController.java b/src/main/java/com/bookmile/backend/domain/group/controller/GroupController.java index 9a98fb0..bd30e54 100644 --- a/src/main/java/com/bookmile/backend/domain/group/controller/GroupController.java +++ b/src/main/java/com/bookmile/backend/domain/group/controller/GroupController.java @@ -6,11 +6,12 @@ import com.bookmile.backend.domain.group.service.GroupService; import com.bookmile.backend.domain.group.service.Impl.GroupMemberServiceImpl; import com.bookmile.backend.global.common.CommonResponse; -import com.bookmile.backend.domain.user.entity.User; import io.swagger.v3.oas.annotations.Operation; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.security.core.userdetails.UserDetails; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -33,13 +34,12 @@ public class GroupController { @PostMapping public ResponseEntity> createGroup( @RequestBody @Valid GroupCreateRequestDto requestDto, - @RequestParam Long userId // userId를 직접 받음 + @AuthenticationPrincipal UserDetails userDetails ) { - // User 정보를 UserRepository에서 조회 - User user = groupService.getUserById(userId); + String userEmail = userDetails.getUsername(); // 그룹 생성 요청 처리 - GroupCreateResponseDto responseDto = groupService.createGroup(requestDto, user); + GroupCreateResponseDto responseDto = groupService.createGroup(requestDto, userEmail); return ResponseEntity.status(GROUP_CREATE.getStatus()) .body(CommonResponse.from(GROUP_CREATE.getMessage(), responseDto)); } @@ -47,12 +47,13 @@ public ResponseEntity> createGroup( @Operation(summary = "그룹 참여하기", description = "이미 존재하는 그룹에 참여합니다. 참여한 유저는 자동으로 MEMBER 역할을 부여받으며 비공개 그룹의 경우 비밀번호가 필요합니다.
" + "공개 그룹의 경우 비밀번호를 null 값이 아닌 공백(그냥 띄어쓰기 한 칸)으로 입력해주세요") @PostMapping("/{groupId}") - public ResponseEntity> joinGroup( + public ResponseEntity> joinGroup( @RequestBody @Valid GroupJoinRequestDto requestDto, - @RequestHeader("user_id") Long userId + @AuthenticationPrincipal UserDetails userDetails ) { - groupJoinService.joinGroup(userId, requestDto); - return ResponseEntity.ok(CommonResponse.from(GROUP_JOIN.getMessage(), null)); + String userEmail = userDetails.getUsername(); + GroupJoinResponseDto responseDto = groupJoinService.joinGroup(userEmail, requestDto); + return ResponseEntity.ok(CommonResponse.from(GROUP_JOIN.getMessage(), responseDto)); } @Operation(summary = "그룹 멤버 조회" @@ -67,9 +68,12 @@ public ResponseEntity> getMembers(@PathVariable Lon , description = "그룹 상태를 변경합니다. 그룹장만이 변경할 수 있습니다.") @PatchMapping("/{groupId}") public ResponseEntity updateGroupStatus( - @PathVariable Long groupId,@RequestBody @Valid GroupStatusUpdateRequestDto requestDto + @PathVariable Long groupId, + @RequestBody @Valid GroupStatusUpdateRequestDto requestDto, + @AuthenticationPrincipal UserDetails userDetails ) { - GroupStatusUpdateResponseDto responseDto = groupService.updateGroupStatus(groupId, requestDto, requestDto.getUserId()); + String userEmail = userDetails.getUsername(); + GroupStatusUpdateResponseDto responseDto = groupService.updateGroupStatus(groupId, requestDto, userEmail); return ResponseEntity.ok(responseDto); } @@ -115,9 +119,11 @@ public ResponseEntity getGroupDetail(@PathVariable Long @Operation(summary = "그룹 공개/비공개 전환", description = "그룹장은 그룹 공개여부를 변경할 수 있습니다.") public ResponseEntity> updateGroupVisibility( @PathVariable Long groupId, - @RequestBody @Valid GroupPrivateRequestDto requestDto + @RequestBody @Valid GroupPrivateRequestDto requestDto, + @AuthenticationPrincipal UserDetails userDetails ) { - groupService.updateGroupPrivate(groupId, requestDto.getIsOpen(), requestDto.getUserId()); + String userEmail = userDetails.getUsername(); + groupService.updateGroupPrivate(groupId, requestDto.getIsOpen(), userEmail); return ResponseEntity.ok(CommonResponse.from(GROUP_PRIVATE_UPDATE.getMessage())); } } diff --git a/src/main/java/com/bookmile/backend/domain/group/dto/req/GroupPrivateRequestDto.java b/src/main/java/com/bookmile/backend/domain/group/dto/req/GroupPrivateRequestDto.java index 10d978f..a5f5d5d 100644 --- a/src/main/java/com/bookmile/backend/domain/group/dto/req/GroupPrivateRequestDto.java +++ b/src/main/java/com/bookmile/backend/domain/group/dto/req/GroupPrivateRequestDto.java @@ -6,6 +6,5 @@ @Getter @NoArgsConstructor public class GroupPrivateRequestDto { - private Long userId; private Boolean isOpen; } \ No newline at end of file diff --git a/src/main/java/com/bookmile/backend/domain/group/dto/req/GroupStatusUpdateRequestDto.java b/src/main/java/com/bookmile/backend/domain/group/dto/req/GroupStatusUpdateRequestDto.java index 27aef2b..2e8617c 100644 --- a/src/main/java/com/bookmile/backend/domain/group/dto/req/GroupStatusUpdateRequestDto.java +++ b/src/main/java/com/bookmile/backend/domain/group/dto/req/GroupStatusUpdateRequestDto.java @@ -13,6 +13,4 @@ public class GroupStatusUpdateRequestDto { @Schema(description = "그룹 상태 (RECRUITING, IN_PROGRESS, COMPLETED)", example = "IN_PROGRESS") @NotNull(message = "변경할 상태는 필수입니다.") private GroupStatus status; - - private Long userId; } diff --git a/src/main/java/com/bookmile/backend/domain/group/service/GroupJoinService.java b/src/main/java/com/bookmile/backend/domain/group/service/GroupJoinService.java index 10169e4..109ee09 100644 --- a/src/main/java/com/bookmile/backend/domain/group/service/GroupJoinService.java +++ b/src/main/java/com/bookmile/backend/domain/group/service/GroupJoinService.java @@ -4,5 +4,5 @@ import com.bookmile.backend.domain.group.dto.res.GroupJoinResponseDto; public interface GroupJoinService { - GroupJoinResponseDto joinGroup(Long userId, GroupJoinRequestDto groupJoinRequestDto); + GroupJoinResponseDto joinGroup(String userEmail, GroupJoinRequestDto requestDto); } diff --git a/src/main/java/com/bookmile/backend/domain/group/service/GroupService.java b/src/main/java/com/bookmile/backend/domain/group/service/GroupService.java index e7b6938..4b5a5fa 100644 --- a/src/main/java/com/bookmile/backend/domain/group/service/GroupService.java +++ b/src/main/java/com/bookmile/backend/domain/group/service/GroupService.java @@ -1,7 +1,6 @@ package com.bookmile.backend.domain.group.service; import com.bookmile.backend.domain.group.dto.req.GroupCreateRequestDto; -import com.bookmile.backend.domain.group.dto.req.GroupSearchRequestDto; import com.bookmile.backend.domain.group.dto.req.GroupStatusUpdateRequestDto; import com.bookmile.backend.domain.group.dto.res.GroupCreateResponseDto; import com.bookmile.backend.domain.group.dto.res.GroupDetailResponseDto; @@ -13,8 +12,8 @@ public interface GroupService { User getUserById(Long userId); // User 정보 조회 - GroupCreateResponseDto createGroup(GroupCreateRequestDto requestDto, User user); - GroupStatusUpdateResponseDto updateGroupStatus(Long groupId, GroupStatusUpdateRequestDto requestDto, Long userId); + GroupCreateResponseDto createGroup(GroupCreateRequestDto requestDto, String userEmail); + GroupStatusUpdateResponseDto updateGroupStatus(Long groupId, GroupStatusUpdateRequestDto requestDto, String userEmail); List getRecruitingGroups(String isbn13); List getInProgressGroups(String isbn13); @@ -22,5 +21,5 @@ public interface GroupService { GroupDetailResponseDto getGroupDetail(Long groupId); - void updateGroupPrivate(Long groupId, Boolean isOpen, Long userId); + void updateGroupPrivate(Long groupId, Boolean isOpen, String userEmail); } diff --git a/src/main/java/com/bookmile/backend/domain/group/service/Impl/GroupJoinServiceImpl.java b/src/main/java/com/bookmile/backend/domain/group/service/Impl/GroupJoinServiceImpl.java index 6fe0200..44b6c12 100644 --- a/src/main/java/com/bookmile/backend/domain/group/service/Impl/GroupJoinServiceImpl.java +++ b/src/main/java/com/bookmile/backend/domain/group/service/Impl/GroupJoinServiceImpl.java @@ -6,6 +6,7 @@ import com.bookmile.backend.domain.group.repository.GroupRepository; import com.bookmile.backend.domain.group.service.GroupJoinService; import com.bookmile.backend.domain.user.entity.User; +import com.bookmile.backend.domain.user.repository.UserRepository; import com.bookmile.backend.domain.userGroup.entity.Role; import com.bookmile.backend.domain.userGroup.entity.UserGroup; import com.bookmile.backend.domain.userGroup.repository.UserGroupRepository; @@ -20,18 +21,20 @@ public class GroupJoinServiceImpl implements GroupJoinService { private final GroupRepository groupRepository; private final UserGroupRepository userGroupRepository; + private final UserRepository userRepository; @Override - public GroupJoinResponseDto joinGroup(Long userId, GroupJoinRequestDto groupJoinRequestDto) { + public GroupJoinResponseDto joinGroup(String userEmail, GroupJoinRequestDto requestDto) { + User user = validateUserByEmail(userEmail); - Group group = findGroup(groupJoinRequestDto.getGroupId()); + Group group = findGroup(requestDto.getGroupId()); - checkUserAlreadyJoined(userId, group.getId()); + checkUserAlreadyJoined(user.getId(), group.getId()); checkGroupCapacity(group); - checkGroupPassword(group, groupJoinRequestDto.getPassword()); + checkGroupPassword(group, requestDto.getPassword()); UserGroup userGroup = UserGroup.builder() - .user(new User(userId)) + .user(user) .group(group) .role(Role.MEMBER) .build(); @@ -64,4 +67,9 @@ private void checkGroupPassword(Group group, String password) { throw new CustomException(StatusCode.INVALID_GROUP_PASSWORD); } } + + private User validateUserByEmail(String email) { + return userRepository.findByEmail(email) + .orElseThrow(() -> new CustomException(StatusCode.USER_NOT_FOUND)); + } } diff --git a/src/main/java/com/bookmile/backend/domain/group/service/Impl/GroupServiceImpl.java b/src/main/java/com/bookmile/backend/domain/group/service/Impl/GroupServiceImpl.java index 9a29755..8fb28ea 100644 --- a/src/main/java/com/bookmile/backend/domain/group/service/Impl/GroupServiceImpl.java +++ b/src/main/java/com/bookmile/backend/domain/group/service/Impl/GroupServiceImpl.java @@ -20,6 +20,7 @@ import com.bookmile.backend.domain.userGroup.entity.UserGroup; import com.bookmile.backend.domain.userGroup.entity.Role; import com.bookmile.backend.domain.userGroup.repository.UserGroupRepository; +import com.bookmile.backend.global.common.StatusCode; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import com.bookmile.backend.global.exception.CustomException; @@ -48,7 +49,9 @@ public User getUserById(Long userId) { @Override @Transactional - public GroupCreateResponseDto createGroup(GroupCreateRequestDto requestDto, User user) { + public GroupCreateResponseDto createGroup(GroupCreateRequestDto requestDto, String userEmail) { + User user = validateUserByEmail(userEmail); + Book book = bookService.saveBook(requestDto.getIsbn13()); Template template = checkTemplate(requestDto); @@ -57,7 +60,7 @@ public GroupCreateResponseDto createGroup(GroupCreateRequestDto requestDto, User Group group = groupRepository.save(requestDto.toEntity(book, goalType, goalContent)); - Long templateId; + Long templateId = null; if (requestDto.getTemplateId() == null) { template = Template.builder() .group(group) @@ -65,7 +68,7 @@ public GroupCreateResponseDto createGroup(GroupCreateRequestDto requestDto, User .goalContent(goalContent) .isTemplate(true) .build(); - templateId = template.getId(); + templateRepository.save(template); } else { templateId = requestDto.getTemplateId(); } @@ -76,16 +79,17 @@ public GroupCreateResponseDto createGroup(GroupCreateRequestDto requestDto, User @Override @Transactional - public GroupStatusUpdateResponseDto updateGroupStatus(Long groupId, GroupStatusUpdateRequestDto requestDto, Long userId) { + public GroupStatusUpdateResponseDto updateGroupStatus(Long groupId, GroupStatusUpdateRequestDto requestDto, String userEmail) { + User user = validateUserByEmail(userEmail); + Group group = findGroupById(groupId); - UserGroup userGroup = findUserGroupById(userId, groupId); + UserGroup userGroup = findUserGroupById(user.getId(), groupId); validateGroupMaster(userGroup); updateGroupStatus(group, requestDto.getStatus()); return GroupStatusUpdateResponseDto.toDto(group); } - private List findGroupsByStatus(String isbn13, GroupStatus status, boolean isRecent) { List groups; if (isRecent) { @@ -131,10 +135,11 @@ public GroupDetailResponseDto getGroupDetail(Long groupId) { @Override @Transactional - public void updateGroupPrivate(Long groupId, Boolean isOpen, Long userId) { + public void updateGroupPrivate(Long groupId, Boolean isOpen, String userEmail) { + User user = validateUserByEmail(userEmail); Group group = findGroupById(groupId); - UserGroup userGroup = findUserGroupById(userId, groupId); + UserGroup userGroup = findUserGroupById(user.getId(), groupId); validateGroupMaster(userGroup); group.setIsOpen(isOpen); @@ -145,6 +150,11 @@ private Group findGroupById(Long groupId) { .orElseThrow(() -> new CustomException(GROUP_NOT_FOUND)); } + private User validateUserByEmail(String email) { + return userRepository.findByEmail(email) + .orElseThrow(() -> new CustomException(StatusCode.USER_NOT_FOUND)); + } + private UserGroup findUserGroupById(Long userId, Long groupId) { return userGroupRepository.findByUserIdAndGroupId(userId, groupId) .orElseThrow(() -> new CustomException(NOT_MEMBER)); diff --git a/src/main/java/com/bookmile/backend/domain/userGroup/repository/UserGroupRepository.java b/src/main/java/com/bookmile/backend/domain/userGroup/repository/UserGroupRepository.java index 1231322..7488d24 100644 --- a/src/main/java/com/bookmile/backend/domain/userGroup/repository/UserGroupRepository.java +++ b/src/main/java/com/bookmile/backend/domain/userGroup/repository/UserGroupRepository.java @@ -16,7 +16,7 @@ public interface UserGroupRepository extends JpaRepository { List findByGroupId(Long groupId); - Optional findByUserIdAndGroupId(Long userId, Long groupId); + Optional findByUserIdAndGroupId(Long groupId, Long userId); @Query("SELECT ug FROM UserGroup ug WHERE ug.group.id = :groupId AND ug.role = 'MASTER'") Optional findMasterByGroupId(@Param("groupId") Long groupId);