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
@@ -0,0 +1,13 @@
package com.back.catchmate.domain.board.converter;

import com.back.catchmate.domain.board.dto.BoardResponse.BoardInfo;
import com.back.catchmate.domain.board.entity.Board;
import org.springframework.stereotype.Component;

@Component
public class BoardConverter {
public BoardInfo toBoardInfo(Board board) {
return BoardInfo.builder()
.title(board.getTitle()).build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ public class Board extends BaseTimeEntity {
@Column(name = "board_id")
private Long id;

@Column(nullable = false)
private String title;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
private User user;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,27 @@
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.PagedEnrollReceiveInfo;
import com.back.catchmate.domain.enroll.dto.EnrollResponse.PagedEnrollRequestInfo;
import com.back.catchmate.domain.enroll.service.EnrollService;
import com.back.catchmate.global.jwt.JwtValidation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
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.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;

@Tag(name = "직관 신청 관련 API")
@RestController
@RequestMapping("/enroll")
Expand All @@ -27,10 +33,10 @@ public class EnrollController {

@PostMapping("/{boardId}")
@Operation(summary = "직관 신청 API", description = "직관 신청을 요청하는 API 입니다.")
public CreateEnrollInfo createEnroll(@Valid @RequestBody CreateEnrollRequest createEnrollRequest,
@PathVariable Long boardId,
@JwtValidation Long userId) throws IOException {
return enrollService.createEnroll(createEnrollRequest, boardId, userId);
public CreateEnrollInfo requestEnroll(@Valid @RequestBody CreateEnrollRequest createEnrollRequest,
@PathVariable Long boardId,
@JwtValidation Long userId) {
return enrollService.requestEnroll(createEnrollRequest, boardId, userId);
}

@DeleteMapping("/cancel/{enrollId}")
Expand All @@ -39,4 +45,27 @@ public CancelEnrollInfo cancelEnroll(@PathVariable Long enrollId,
@JwtValidation Long userId) {
return enrollService.cancelEnroll(enrollId, userId);
}

@GetMapping("/request")
@Operation(summary = "내가 보낸 직관 신청 목록 조회 API", description = "내가 보낸 직관 신청 목록을 조회하는 API 입니다.")
public PagedEnrollRequestInfo getRequestEnrollList(@JwtValidation Long userId,
@PageableDefault(sort = "createdAt", direction = Sort.Direction.DESC)
@Parameter(hidden = true) Pageable pageable) {
return enrollService.getRequestEnrollList(userId, pageable);
}

@GetMapping("/receive/all")
@Operation(summary = "내가 작성한 게시글에 대한 직관 신청 목록 전체 조회 API", description = "내가 작성한 게시글에 대한 직관 신청 목록을 전체 조회하는 API 입니다.")
public PagedEnrollReceiveInfo getReceiveEnrollList(@JwtValidation Long userId,
@Parameter(hidden = true) Pageable pageable) {
return enrollService.getReceiveEnrollList(userId, pageable);
}

@GetMapping("/receive")
@Operation(summary = "내가 작성한 게시글에 대한 직관 신청 목록 조회 API", description = "내가 작성한 게시글에 대한 직관 신청 목록을 조회하는 API 입니다.")
public PagedEnrollReceiveInfo getReceiveEnrollListByBoardId(@JwtValidation Long userId,
@RequestParam Long boardId,
@Parameter(hidden = true) Pageable pageable) {
return enrollService.getReceiveEnrollListByBoardId(userId, boardId, pageable);
}
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,33 @@
package com.back.catchmate.domain.enroll.converter;

import com.back.catchmate.domain.board.converter.BoardConverter;
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.PagedEnrollReceiveInfo;
import com.back.catchmate.domain.enroll.dto.EnrollResponse.PagedEnrollRequestInfo;
import com.back.catchmate.domain.enroll.entity.AcceptStatus;
import com.back.catchmate.domain.enroll.entity.Enroll;
import com.back.catchmate.domain.user.converter.UserConverter;
import com.back.catchmate.domain.user.dto.UserResponse.UserInfo;
import com.back.catchmate.domain.user.entity.User;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;

@Component
@RequiredArgsConstructor
public class EnrollConverter {
private final UserConverter userConverter;
private final BoardConverter boardConverter;

public Enroll toEntity(CreateEnrollRequest createEnrollRequest, User user, Board board) {
return Enroll.builder()
.user(user)
Expand All @@ -37,4 +51,59 @@ public CancelEnrollInfo toCancelEnrollInfo(Enroll enroll) {
.deletedAt(enroll.getUpdatedAt())
.build();
}

public PagedEnrollRequestInfo toPagedEnrollRequestInfo(Page<Enroll> enrollList) {
List<EnrollRequestInfo> enrollRequestInfoList = enrollList.stream()
.map(enroll -> {
UserInfo userInfo = userConverter.toUserInfo(enroll.getUser());
BoardInfo boardInfo = boardConverter.toBoardInfo(enroll.getBoard());
return toEnrollRequestInfo(enroll, userInfo, boardInfo);
})
.collect(Collectors.toList());

return PagedEnrollRequestInfo.builder()
.enrollInfoList(enrollRequestInfoList)
.totalPages(enrollList.getTotalPages())
.totalElements(enrollList.getTotalElements())
.build();
}

public EnrollRequestInfo toEnrollRequestInfo(Enroll enroll, UserInfo userInfo, BoardInfo boardInfo) {
return EnrollRequestInfo.builder()
.enrollId(enroll.getId())
.acceptStatus(enroll.getAcceptStatus())
.description(enroll.getDescription())
.requestDate(enroll.getCreatedAt())
.userInfo(userInfo)
.boardInfo(boardInfo)
.build();
}

public PagedEnrollReceiveInfo toPagedEnrollReceiveInfo(Page<Enroll> enrollList) {
List<EnrollReceiveInfo> enrollRequestInfoList = enrollList.stream()
.map(enroll -> {
UserInfo userInfo = userConverter.toUserInfo(enroll.getUser());
BoardInfo boardInfo = boardConverter.toBoardInfo(enroll.getBoard());
return toEnrollReceiveInfo(enroll, userInfo, boardInfo);
})
.collect(Collectors.toList());

return PagedEnrollReceiveInfo.builder()
.enrollInfoList(enrollRequestInfoList)
.totalPages(enrollList.getTotalPages())
.totalElements(enrollList.getTotalElements())
.build();
}

public EnrollReceiveInfo toEnrollReceiveInfo(Enroll enroll, UserInfo userInfo, BoardInfo boardInfo) {
return EnrollReceiveInfo.builder()
.enrollId(enroll.getId())
.acceptStatus(enroll.getAcceptStatus())
.description(enroll.getDescription())
.receiveDate(enroll.getCreatedAt())
.isNew(enroll.isNew())
.userInfo(userInfo)
.boardInfo(boardInfo)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.back.catchmate.domain.enroll.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,60 @@
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.List;

public abstract class EnrollResponse {
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class EnrollInfo {
public static class EnrollRequestInfo {
private Long enrollId;
private AcceptStatus acceptStatus;
private String description;
private LocalDateTime requestDate;
private UserInfo userInfo;
private BoardInfo boardInfo;
}

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class EnrollReceiveInfo {
private Long enrollId;
private AcceptStatus acceptStatus;
private String description;
private LocalDateTime receiveDate;
private boolean isNew;
private UserInfo userInfo;
private BoardInfo boardInfo;
}

@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public static class PagedEnrollRequestInfo {
private List<EnrollRequestInfo> enrollInfoList;
private Integer totalPages;
private Long totalElements;
private Boolean isFirst;
private Boolean isLast;
}

@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public static class PagedEnrollReceiveInfo {
private List<EnrollReceiveInfo> enrollInfoList;
private Integer totalPages;
private Long totalElements;
private Boolean isFirst;
private Boolean isLast;
}

@Getter
@Builder
@NoArgsConstructor
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,21 @@
package com.back.catchmate.domain.enroll.repository;

import com.back.catchmate.domain.enroll.entity.Enroll;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.Optional;

public interface EnrollRepository extends JpaRepository<Enroll, Long> {
Optional<Enroll> findByUserIdAndBoardId(Long userId, Long boardId);

Page<Enroll> findByUserId(Long userId, Pageable pageable);

@Query("SELECT e FROM Enroll e WHERE e.board.user.id = :userId")
Page<Enroll> findEnrollListByBoardWriter(@Param("userId") Long userId, Pageable pageable);

Page<Enroll> findByBoardId(Long boardId, Pageable pageable);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,19 @@
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 java.io.IOException;
import com.back.catchmate.domain.enroll.dto.EnrollResponse.PagedEnrollReceiveInfo;
import com.back.catchmate.domain.enroll.dto.EnrollResponse.PagedEnrollRequestInfo;
import org.springframework.data.domain.Pageable;

public interface EnrollService {
CreateEnrollInfo createEnroll(CreateEnrollRequest request, Long boardId, Long userId) throws IOException;
CreateEnrollInfo requestEnroll(CreateEnrollRequest request, Long boardId, Long userId);

CancelEnrollInfo cancelEnroll(Long enrollId, Long userId);

PagedEnrollRequestInfo getRequestEnrollList(Long userId, Pageable pageable);

PagedEnrollReceiveInfo getReceiveEnrollList(Long userId, Pageable pageable);

PagedEnrollReceiveInfo getReceiveEnrollListByBoardId(Long userId, Long boardId, Pageable pageable);

}
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@
import com.back.catchmate.global.error.ErrorCode;
import com.back.catchmate.global.error.exception.BaseException;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import java.io.IOException;

@Service
@RequiredArgsConstructor
public class EnrollServiceImpl implements EnrollService {
Expand All @@ -26,7 +26,7 @@ public class EnrollServiceImpl implements EnrollService {
private final EnrollConverter enrollConverter;

@Override
public CreateEnrollInfo createEnroll(CreateEnrollRequest request, Long boardId, Long userId) throws IOException {
public CreateEnrollInfo requestEnroll(CreateEnrollRequest request, Long boardId, Long userId) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new BaseException(ErrorCode.USER_NOT_FOUND));

Expand All @@ -39,8 +39,8 @@ public CreateEnrollInfo createEnroll(CreateEnrollRequest request, Long boardId,

enrollRepository.findByUserIdAndBoardId(user.getId(), board.getId())
.ifPresent(enroll -> {
throw new BaseException(ErrorCode.ENROLL_ALREADY_EXIST);
});
throw new BaseException(ErrorCode.ENROLL_ALREADY_EXIST);
});

Enroll enroll = enrollConverter.toEntity(request, user, board);
enrollRepository.save(enroll);
Expand All @@ -63,4 +63,40 @@ public EnrollResponse.CancelEnrollInfo cancelEnroll(Long enrollId, Long userId)
enrollRepository.delete(enroll);
return enrollConverter.toCancelEnrollInfo(enroll);
}

@Override
public EnrollResponse.PagedEnrollRequestInfo getRequestEnrollList(Long userId, Pageable pageable) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new BaseException(ErrorCode.USER_NOT_FOUND));

Page<Enroll> enrollList = enrollRepository.findByUserId(user.getId(), pageable);
return enrollConverter.toPagedEnrollRequestInfo(enrollList);
}

@Override
public EnrollResponse.PagedEnrollReceiveInfo getReceiveEnrollList(Long userId, Pageable pageable) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new BaseException(ErrorCode.USER_NOT_FOUND));

Page<Enroll> enrollList = enrollRepository.findEnrollListByBoardWriter(user.getId(), pageable);
return enrollConverter.toPagedEnrollReceiveInfo(enrollList);
}

@Override
public EnrollResponse.PagedEnrollReceiveInfo getReceiveEnrollListByBoardId(Long userId, Long boardId, Pageable pageable) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new BaseException(ErrorCode.USER_NOT_FOUND));

Board board = boardRepository.findById(boardId)
.orElseThrow(() -> new BaseException(ErrorCode.BOARD_NOT_FOUND));

// 게시글 작성자가 맞는지 확인
if (!board.getUser().equals(user)) {
throw new BaseException(ErrorCode.ENROLL_GET_INVALID);
}

// 게시글에 신청된 목록 조회
Page<Enroll> enrollList = enrollRepository.findByBoardId(boardId, pageable);
return enrollConverter.toPagedEnrollReceiveInfo(enrollList);
}
}
Loading
Loading