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
Expand Up @@ -86,8 +86,8 @@ public ResponseEntity<ApiResponse<Void>> updateQnaSet(
@DeleteMapping("/{qnaSetId}")
public ResponseEntity<ApiResponse<Void>> deleteQnaSet(@PathVariable Long qnaSetId) {
qnaSetService.deleteQnaSet(qnaSetId);
var resposne = ApiResponse.success(COMMON204);
return ResponseEntity.ok(resposne);
var response = ApiResponse.success(COMMON204);
return ResponseEntity.ok(response);
}

@Operation(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ public Page<QnaSetScrapFolderResponse> getMyScrapFoldersWithQnaSetContainingInfo
return qnaSetScrapFolderRepository.findAllScrapFoldersWithQnaSetContainingInfo(requestUser, qnaSet, pageable);
}

// TODO: ID->Entity 변환기 별도로 분리 고려
private QnaSet getValidatedQnaSet(Long qnaSetId) {
QnaSet qnaSet = qnaSetRepository.findById(qnaSetId).orElseThrow(() -> new CustomException(QNA_SET_NOT_FOUND));
User requestUser = requestUserContext.getRequestUser();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
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.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
Expand Down Expand Up @@ -83,4 +84,24 @@ public ResponseEntity<ApiResponse<Void>> updateScrapFolderName(
var response = ApiResponse.success(COMMON200);
return ResponseEntity.ok(response);
}

// TODO: Integration Test 작성 필요
@Operation(summary = "주어진 스크랩 폴더에 지정한 질문 답변 세트를 추가합니다.", description = "이미 추가된 상태인 경우 아무 일도 발생하지 않습니다.")
@PutMapping("{scrapFolderId}/qna-set/{qnaSetId}")
public ResponseEntity<ApiResponse<Void>> addQnaSetToScrapFolder(
@PathVariable Long qnaSetId, @PathVariable Long scrapFolderId) {
scrapFolderService.addQnaSetToScrapFolder(qnaSetId, scrapFolderId);
var response = ApiResponse.success(COMMON200);
return ResponseEntity.ok(response);
}

// TODO: Integration Test 작성 필요
@Operation(summary = "주어진 스크랩 폴더에서 지정한 질문 답변 세트를 제거합니다.", description = "이미 제거된 상태인 경우 아무 일도 발생하지 않습니다.")
@DeleteMapping("{scrapFolderId}/qna-set/{qnaSetId}")
public ResponseEntity<ApiResponse<Void>> removeQnaSetFromScrapFolder(
@PathVariable Long qnaSetId, @PathVariable Long scrapFolderId) {
scrapFolderService.removeQnaSetFromScrapFolder(qnaSetId, scrapFolderId);
var response = ApiResponse.success(COMMON204);
return ResponseEntity.ok(response);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,19 @@
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import jakarta.persistence.UniqueConstraint;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Table(name = "qna_sets_scrap_folders")
@Table(
name = "qna_sets_scrap_folders",
uniqueConstraints =
@UniqueConstraint(
name = "uk_qna_set_scrap_folder",
columnNames = {"qna_set_id", "scrap_folder_id"}))
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class QnaSetScrapFolder extends BaseEntity {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,8 @@ Page<QnaSetScrapFolderResponse> findAllScrapFoldersWithQnaSetContainingInfo(
User user, QnaSet qnaSet, Pageable pageable);

void deleteAllByScrapFolder(ScrapFolder scrapFolder);

boolean existsByQnaSetAndScrapFolder(QnaSet qnaSet, ScrapFolder scrapFolder);

void deleteByQnaSetAndScrapFolder(QnaSet qnaSet, ScrapFolder scrapFolder);
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
package com.shyashyashya.refit.domain.scrapfolder.service;

import static com.shyashyashya.refit.global.exception.ErrorCode.QNA_SET_NOT_FOUND;
import static com.shyashyashya.refit.global.exception.ErrorCode.SCRAP_FOLDER_NOT_FOUND;

import com.shyashyashya.refit.domain.interview.service.validator.InterviewValidator;
import com.shyashyashya.refit.domain.qnaset.model.QnaSet;
import com.shyashyashya.refit.domain.qnaset.repository.QnaSetRepository;
import com.shyashyashya.refit.domain.scrapfolder.dto.response.ScrapFolderQnaSetResponse;
import com.shyashyashya.refit.domain.scrapfolder.dto.response.ScrapFolderResponse;
import com.shyashyashya.refit.domain.scrapfolder.model.QnaSetScrapFolder;
import com.shyashyashya.refit.domain.scrapfolder.model.ScrapFolder;
import com.shyashyashya.refit.domain.scrapfolder.repository.QnaSetScrapFolderRepository;
import com.shyashyashya.refit.domain.scrapfolder.repository.ScrapFolderRepository;
Expand All @@ -24,8 +29,10 @@ public class ScrapFolderService {

private final ScrapFolderRepository scrapFolderRepository;
private final QnaSetScrapFolderRepository qnaSetScrapFolderRepository;
private final QnaSetRepository qnaSetRepository;
private final RequestUserContext requestUserContext;
private final ScrapFolderValidator scrapFolderValidator;
private final InterviewValidator interviewValidator;

@Transactional(readOnly = true)
public Page<ScrapFolderResponse> getMyScrapFolders(Pageable pageable) {
Expand Down Expand Up @@ -83,4 +90,38 @@ public void updateScrapFolderName(Long scrapFolderId, String scrapFolderName) {
scrapFolderValidator.validateScrapFolderOwner(scrapFolder, user);
scrapFolder.updateName(scrapFolderName);
}

@Transactional
public void addQnaSetToScrapFolder(Long qnaSetId, Long scrapFolderId) {
ScrapFolder scrapFolder = scrapFolderRepository
.findById(scrapFolderId)
.orElseThrow(() -> new CustomException(SCRAP_FOLDER_NOT_FOUND));
QnaSet qnaSet = getValidatedQnaSet(qnaSetId);
scrapFolderValidator.validateScrapFolderOwner(
scrapFolder, qnaSet.getInterview().getUser());

if (!qnaSetScrapFolderRepository.existsByQnaSetAndScrapFolder(qnaSet, scrapFolder)) {
qnaSetScrapFolderRepository.save(QnaSetScrapFolder.create(qnaSet, scrapFolder));
}
}

@Transactional
public void removeQnaSetFromScrapFolder(Long qnaSetId, Long scrapFolderId) {
ScrapFolder scrapFolder = scrapFolderRepository
.findById(scrapFolderId)
.orElseThrow(() -> new CustomException(SCRAP_FOLDER_NOT_FOUND));
QnaSet qnaSet = getValidatedQnaSet(qnaSetId);
scrapFolderValidator.validateScrapFolderOwner(
scrapFolder, qnaSet.getInterview().getUser());

qnaSetScrapFolderRepository.deleteByQnaSetAndScrapFolder(qnaSet, scrapFolder);
}

// TODO: ID->Entity 변환기 별도로 분리 고려
private QnaSet getValidatedQnaSet(Long qnaSetId) {
QnaSet qnaSet = qnaSetRepository.findById(qnaSetId).orElseThrow(() -> new CustomException(QNA_SET_NOT_FOUND));
User requestUser = requestUserContext.getRequestUser();
interviewValidator.validateInterviewOwner(qnaSet.getInterview(), requestUser);
return qnaSet;
}
}
Loading