diff --git a/src/main/java/com/back/catchmate/domain/enroll/controller/EnrollController.java b/src/main/java/com/back/catchmate/domain/enroll/controller/EnrollController.java index 8e217f5..9eebb22 100644 --- a/src/main/java/com/back/catchmate/domain/enroll/controller/EnrollController.java +++ b/src/main/java/com/back/catchmate/domain/enroll/controller/EnrollController.java @@ -3,8 +3,10 @@ import com.back.catchmate.domain.enroll.dto.EnrollRequest.CreateEnrollRequest; import com.back.catchmate.domain.enroll.dto.EnrollResponse.CancelEnrollInfo; import com.back.catchmate.domain.enroll.dto.EnrollResponse.CreateEnrollInfo; +import com.back.catchmate.domain.enroll.dto.EnrollResponse.NewEnrollCountInfo; import com.back.catchmate.domain.enroll.dto.EnrollResponse.PagedEnrollReceiveInfo; import com.back.catchmate.domain.enroll.dto.EnrollResponse.PagedEnrollRequestInfo; +import com.back.catchmate.domain.enroll.dto.EnrollResponse.UpdateEnrollInfo; import com.back.catchmate.domain.enroll.service.EnrollService; import com.back.catchmate.global.jwt.JwtValidation; import io.swagger.v3.oas.annotations.Operation; @@ -17,6 +19,7 @@ import org.springframework.data.web.PageableDefault; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -68,4 +71,24 @@ public PagedEnrollReceiveInfo getReceiveEnrollListByBoardId(@JwtValidation Long @Parameter(hidden = true) Pageable pageable) { return enrollService.getReceiveEnrollListByBoardId(userId, boardId, pageable); } + + @GetMapping("/new-count") + @Operation(summary = "내가 작성한 게시글에 대한 새로운 직관 신청 갯수 반환 API", description = "내가 작성한 게시글에 대한 새로윤 직관 신청 갯수를 반환하는 API 입니다.") + public NewEnrollCountInfo getNewEnrollmentListCount(@JwtValidation Long userId) { + return enrollService.getNewEnrollListCount(userId); + } + + @PatchMapping("/{enrollId}/accept") + @Operation(summary = "받은 직관 신청 수락 API", description = "내가 받은 직관 신청을 수락하는 API 입니다.") + public UpdateEnrollInfo acceptEnroll(@PathVariable Long enrollId, + @JwtValidation Long userId) { + return enrollService.acceptEnroll(enrollId, userId); + } + + @PatchMapping("/{enrollId}/reject") + @Operation(summary = "받은 직관 신청 거절 API", description = "내가 받은 직관 신청을 거절하는 API 입니다.") + public UpdateEnrollInfo rejectEnroll(@PathVariable Long enrollId, + @JwtValidation Long userId) { + return enrollService.rejectEnroll(enrollId, userId); + } } diff --git a/src/main/java/com/back/catchmate/domain/enroll/converter/EnrollConverter.java b/src/main/java/com/back/catchmate/domain/enroll/converter/EnrollConverter.java index 8e17211..360f7bd 100644 --- a/src/main/java/com/back/catchmate/domain/enroll/converter/EnrollConverter.java +++ b/src/main/java/com/back/catchmate/domain/enroll/converter/EnrollConverter.java @@ -4,12 +4,15 @@ import com.back.catchmate.domain.board.dto.BoardResponse.BoardInfo; import com.back.catchmate.domain.board.entity.Board; import com.back.catchmate.domain.enroll.dto.EnrollRequest.CreateEnrollRequest; +import com.back.catchmate.domain.enroll.dto.EnrollResponse; import com.back.catchmate.domain.enroll.dto.EnrollResponse.CancelEnrollInfo; import com.back.catchmate.domain.enroll.dto.EnrollResponse.CreateEnrollInfo; import com.back.catchmate.domain.enroll.dto.EnrollResponse.EnrollReceiveInfo; import com.back.catchmate.domain.enroll.dto.EnrollResponse.EnrollRequestInfo; +import com.back.catchmate.domain.enroll.dto.EnrollResponse.NewEnrollCountInfo; import com.back.catchmate.domain.enroll.dto.EnrollResponse.PagedEnrollReceiveInfo; import com.back.catchmate.domain.enroll.dto.EnrollResponse.PagedEnrollRequestInfo; +import com.back.catchmate.domain.enroll.dto.EnrollResponse.UpdateEnrollInfo; import com.back.catchmate.domain.enroll.entity.AcceptStatus; import com.back.catchmate.domain.enroll.entity.Enroll; import com.back.catchmate.domain.user.converter.UserConverter; @@ -106,4 +109,17 @@ public EnrollReceiveInfo toEnrollReceiveInfo(Enroll enroll, UserInfo userInfo, B .boardInfo(boardInfo) .build(); } + + public NewEnrollCountInfo toNewEnrollCountResponse(int enrollListCount) { + return NewEnrollCountInfo.builder() + .newEnrollCount(enrollListCount) + .build(); + } + + public UpdateEnrollInfo toUpdateEnrollInfo(Enroll enroll, AcceptStatus acceptStatus) { + return UpdateEnrollInfo.builder() + .enrollId(enroll.getId()) + .acceptStatus(acceptStatus) + .build(); + } } diff --git a/src/main/java/com/back/catchmate/domain/enroll/repository/EnrollRepository.java b/src/main/java/com/back/catchmate/domain/enroll/repository/EnrollRepository.java index c66f116..6af044d 100644 --- a/src/main/java/com/back/catchmate/domain/enroll/repository/EnrollRepository.java +++ b/src/main/java/com/back/catchmate/domain/enroll/repository/EnrollRepository.java @@ -18,4 +18,7 @@ public interface EnrollRepository extends JpaRepository { Page findEnrollListByBoardWriter(@Param("userId") Long userId, Pageable pageable); Page findByBoardId(Long boardId, Pageable pageable); + + @Query("SELECT COUNT(e) FROM Enroll e JOIN e.board b WHERE e.isNew = true AND b.user.id = :userId") + int countNewEnrollListByUserId(@Param("userId") Long userId); } diff --git a/src/main/java/com/back/catchmate/domain/enroll/service/EnrollService.java b/src/main/java/com/back/catchmate/domain/enroll/service/EnrollService.java index 7abd6ba..160a376 100644 --- a/src/main/java/com/back/catchmate/domain/enroll/service/EnrollService.java +++ b/src/main/java/com/back/catchmate/domain/enroll/service/EnrollService.java @@ -1,12 +1,17 @@ package com.back.catchmate.domain.enroll.service; import com.back.catchmate.domain.enroll.dto.EnrollRequest.CreateEnrollRequest; +import com.back.catchmate.domain.enroll.dto.EnrollResponse; import com.back.catchmate.domain.enroll.dto.EnrollResponse.CancelEnrollInfo; import com.back.catchmate.domain.enroll.dto.EnrollResponse.CreateEnrollInfo; +import com.back.catchmate.domain.enroll.dto.EnrollResponse.NewEnrollCountInfo; import com.back.catchmate.domain.enroll.dto.EnrollResponse.PagedEnrollReceiveInfo; import com.back.catchmate.domain.enroll.dto.EnrollResponse.PagedEnrollRequestInfo; +import com.back.catchmate.domain.enroll.dto.EnrollResponse.UpdateEnrollInfo; import org.springframework.data.domain.Pageable; +import java.io.IOException; + public interface EnrollService { CreateEnrollInfo requestEnroll(CreateEnrollRequest request, Long boardId, Long userId); @@ -18,4 +23,9 @@ public interface EnrollService { PagedEnrollReceiveInfo getReceiveEnrollListByBoardId(Long userId, Long boardId, Pageable pageable); + NewEnrollCountInfo getNewEnrollListCount(Long userId); + + UpdateEnrollInfo acceptEnroll(Long enrollId, Long userId); + + UpdateEnrollInfo rejectEnroll(Long enrollId, Long userId); } diff --git a/src/main/java/com/back/catchmate/domain/enroll/service/EnrollServiceImpl.java b/src/main/java/com/back/catchmate/domain/enroll/service/EnrollServiceImpl.java index 66e0a88..3478b39 100644 --- a/src/main/java/com/back/catchmate/domain/enroll/service/EnrollServiceImpl.java +++ b/src/main/java/com/back/catchmate/domain/enroll/service/EnrollServiceImpl.java @@ -5,7 +5,12 @@ import com.back.catchmate.domain.enroll.converter.EnrollConverter; import com.back.catchmate.domain.enroll.dto.EnrollRequest.CreateEnrollRequest; import com.back.catchmate.domain.enroll.dto.EnrollResponse; +import com.back.catchmate.domain.enroll.dto.EnrollResponse.CancelEnrollInfo; import com.back.catchmate.domain.enroll.dto.EnrollResponse.CreateEnrollInfo; +import com.back.catchmate.domain.enroll.dto.EnrollResponse.PagedEnrollReceiveInfo; +import com.back.catchmate.domain.enroll.dto.EnrollResponse.PagedEnrollRequestInfo; +import com.back.catchmate.domain.enroll.dto.EnrollResponse.UpdateEnrollInfo; +import com.back.catchmate.domain.enroll.entity.AcceptStatus; import com.back.catchmate.domain.enroll.entity.Enroll; import com.back.catchmate.domain.enroll.repository.EnrollRepository; import com.back.catchmate.domain.user.entity.User; @@ -16,6 +21,7 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor @@ -26,6 +32,7 @@ public class EnrollServiceImpl implements EnrollService { private final EnrollConverter enrollConverter; @Override + @Transactional public CreateEnrollInfo requestEnroll(CreateEnrollRequest request, Long boardId, Long userId) { User user = userRepository.findById(userId) .orElseThrow(() -> new BaseException(ErrorCode.USER_NOT_FOUND)); @@ -48,7 +55,8 @@ public CreateEnrollInfo requestEnroll(CreateEnrollRequest request, Long boardId, } @Override - public EnrollResponse.CancelEnrollInfo cancelEnroll(Long enrollId, Long userId) { + @Transactional + public CancelEnrollInfo cancelEnroll(Long enrollId, Long userId) { User user = userRepository.findById(userId) .orElseThrow(() -> new BaseException(ErrorCode.USER_NOT_FOUND)); @@ -65,7 +73,8 @@ public EnrollResponse.CancelEnrollInfo cancelEnroll(Long enrollId, Long userId) } @Override - public EnrollResponse.PagedEnrollRequestInfo getRequestEnrollList(Long userId, Pageable pageable) { + @Transactional(readOnly = true) + public PagedEnrollRequestInfo getRequestEnrollList(Long userId, Pageable pageable) { User user = userRepository.findById(userId) .orElseThrow(() -> new BaseException(ErrorCode.USER_NOT_FOUND)); @@ -74,7 +83,8 @@ public EnrollResponse.PagedEnrollRequestInfo getRequestEnrollList(Long userId, P } @Override - public EnrollResponse.PagedEnrollReceiveInfo getReceiveEnrollList(Long userId, Pageable pageable) { + @Transactional(readOnly = true) + public PagedEnrollReceiveInfo getReceiveEnrollList(Long userId, Pageable pageable) { User user = userRepository.findById(userId) .orElseThrow(() -> new BaseException(ErrorCode.USER_NOT_FOUND)); @@ -83,7 +93,8 @@ public EnrollResponse.PagedEnrollReceiveInfo getReceiveEnrollList(Long userId, P } @Override - public EnrollResponse.PagedEnrollReceiveInfo getReceiveEnrollListByBoardId(Long userId, Long boardId, Pageable pageable) { + @Transactional(readOnly = true) + public PagedEnrollReceiveInfo getReceiveEnrollListByBoardId(Long userId, Long boardId, Pageable pageable) { User user = userRepository.findById(userId) .orElseThrow(() -> new BaseException(ErrorCode.USER_NOT_FOUND)); @@ -99,4 +110,55 @@ public EnrollResponse.PagedEnrollReceiveInfo getReceiveEnrollListByBoardId(Long Page enrollList = enrollRepository.findByBoardId(boardId, pageable); return enrollConverter.toPagedEnrollReceiveInfo(enrollList); } + + @Override + @Transactional(readOnly = true) + public EnrollResponse.NewEnrollCountInfo getNewEnrollListCount(Long userId) { + int enrollListCount = enrollRepository.countNewEnrollListByUserId(userId); + return enrollConverter.toNewEnrollCountResponse(enrollListCount); + } + + @Override + @Transactional + public UpdateEnrollInfo acceptEnroll(Long enrollId, Long userId) { + User loginUser = userRepository.findById(userId) + .orElseThrow(() -> new BaseException(ErrorCode.USER_NOT_FOUND)); + + Enroll enroll = enrollRepository.findById(enrollId) + .orElseThrow(() -> new BaseException(ErrorCode.ENROLL_NOT_FOUND)); + + User boardWriter = enroll.getBoard().getUser(); + User enrollApplicant = userRepository.findById(enroll.getUser().getId()) + .orElseThrow(() -> new BaseException(ErrorCode.USER_NOT_FOUND)); + + // 게시글 작성자와 로그인한 사용자가 다를 경우 예외 발생 + if (loginUser.isDifferentUserFrom(boardWriter)) { + throw new BaseException(ErrorCode.ENROLL_ACCEPT_INVALID); + } + + enroll.setAcceptStatus(AcceptStatus.ACCEPTED); + return enrollConverter.toUpdateEnrollInfo(enroll, AcceptStatus.ACCEPTED); + } + + @Override + @Transactional + public UpdateEnrollInfo rejectEnroll(Long enrollId, Long userId) { + User loginUser = userRepository.findById(userId) + .orElseThrow(() -> new BaseException(ErrorCode.USER_NOT_FOUND)); + + Enroll enroll = enrollRepository.findById(enrollId) + .orElseThrow(() -> new BaseException(ErrorCode.ENROLL_NOT_FOUND)); + + User boardWriter = enroll.getBoard().getUser(); + User enrollApplicant = userRepository.findById(enroll.getUser().getId()) + .orElseThrow(() -> new BaseException(ErrorCode.USER_NOT_FOUND)); + + // 게시글 작성자와 로그인한 사용자가 다를 경우 예외 발생 + if (loginUser.isDifferentUserFrom(boardWriter)) { + throw new BaseException(ErrorCode.ENROLL_REJECT_INVALID); + } + + enroll.setAcceptStatus(AcceptStatus.REJECTED); + return enrollConverter.toUpdateEnrollInfo(enroll, AcceptStatus.REJECTED); + } } diff --git a/src/main/java/com/back/catchmate/domain/user/entity/User.java b/src/main/java/com/back/catchmate/domain/user/entity/User.java index 3bbb03d..8eed50c 100644 --- a/src/main/java/com/back/catchmate/domain/user/entity/User.java +++ b/src/main/java/com/back/catchmate/domain/user/entity/User.java @@ -141,4 +141,8 @@ public void updateFcmToken(String fcmToken) { public void deleteFcmToken() { this.fcmToken = null; } + + public boolean isDifferentUserFrom(User boardWriter) { + return !this.equals(boardWriter); + } }