Skip to content

Commit

Permalink
Merge branch 'main' of https://github.com/DSM-Repo/Whopper
Browse files Browse the repository at this point in the history
  • Loading branch information
ori0o0p committed Aug 8, 2024
2 parents f7e5d79 + bafe2dd commit 12cd59f
Show file tree
Hide file tree
Showing 27 changed files with 230 additions and 155 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,6 @@ private StudentEntity createAndSaveNewStudent(XquareUserResponse xquareUserRespo
.name(xquareUserResponse.getName())
.classInfo(xquareUserResponse.toClassInfo())
.profileImagePath(xquareUserResponse.getProfileImgUrl())
.majorId("")
.build());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,17 @@
import com.example.whopper.domain.document.application.usecase.*;
import com.example.whopper.domain.document.domain.detail.CompletionElementLevel;
import com.example.whopper.domain.document.domain.element.*;
import com.example.whopper.domain.document.dto.request.ProjectElementRequest;
import com.example.whopper.domain.document.dto.request.SearchDocumentRequest;
import com.example.whopper.domain.document.dto.request.UpdateListRequest;
import com.example.whopper.domain.document.dto.request.UpdateWriterInfoRequest;
import com.example.whopper.domain.document.dto.response.DocumentResponse;
import com.example.whopper.domain.document.dto.response.FullDocumentResponse;
import com.example.whopper.domain.document.dto.response.ReleasedDocumentResponse;
import com.example.whopper.domain.document.dto.response.SearchDocumentResponse;
import com.example.whopper.global.utils.DataResponseInfo;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

@RestController
@RequiredArgsConstructor
Expand All @@ -29,12 +27,28 @@ public class DocumentController {
private final FindDocumentUseCase findDocumentUseCase;
private final SubmitMyDocumentUseCase submitMyDocumentUseCase;
private final CancelSubmitMyDocumentUseCase cancelSubmitMyDocumentUseCase;
private final ReleaseDocumentUseCase releaseDocumentUseCase;
private final CancelReleaseDocumentUseCase cancelReleaseDocumentUseCase;

@ResponseStatus(HttpStatus.NO_CONTENT)
@PostMapping("/release/{documentId}")
public void release(@PathVariable String documentId) {
releaseDocumentUseCase.release(documentId);
}

@ResponseStatus(HttpStatus.NO_CONTENT)
@PostMapping("/release/cancel/{documentId}")
public void cancelRelease(@PathVariable String documentId) {
cancelReleaseDocumentUseCase.cancel(documentId);
}

@ResponseStatus(HttpStatus.NO_CONTENT)
@PatchMapping("/submit")
public void submit() {
submitMyDocumentUseCase.submit();
}

@ResponseStatus(HttpStatus.NO_CONTENT)
@PatchMapping("/submit/cancel")
public void cancelSubmit() {
cancelSubmitMyDocumentUseCase.cancel();
Expand All @@ -45,44 +59,61 @@ public DataResponseInfo<SearchDocumentResponse> search(@ModelAttribute SearchDoc
return findDocumentUseCase.searchDocument(request);
}

@GetMapping("/release")
public DataResponseInfo<ReleasedDocumentResponse> getReleasedDocuments() {
return findDocumentUseCase.getReleasedDocuments();
}

@GetMapping("/release/{documentId}")
public FullDocumentResponse findReleasedDocument(@PathVariable String documentId) {
return findDocumentUseCase.findReleasedDocument(documentId);
}

@GetMapping("/student/{documentId}")
public FullDocumentResponse getSubmittedDocument(@PathVariable String documentId) {
return findDocumentUseCase.getSubmittedDocument(documentId);
}

@GetMapping("/completion")
public CompletionElementLevel getCompletionLevel() {
return findDocumentUseCase.getCurrentStudentDocumentCompletionLevel();
}

@GetMapping
public DocumentResponse getMainPageResponse() {
return findDocumentUseCase.getCurrentStudentDocumentMainPageResponse();
public DocumentResponse getIntroduceRecentlySharedDocuments() {
return findDocumentUseCase.getIntroduceRecentlySharedDocuments();
}

@GetMapping("/detail")
public FullDocumentResponse getCurrentDocument() {
return findDocumentUseCase.getCurrentStudentDocument();
}

@ResponseStatus(HttpStatus.NO_CONTENT)
@PatchMapping("/writer-info")
public void updateWriterInfo(@RequestBody UpdateWriterInfoRequest request) {
updateWriterInfoUseCase.update(request);
}

@ResponseStatus(HttpStatus.NO_CONTENT)
@PatchMapping("/introduce")
public void updateIntroduce(@RequestBody IntroduceElement request) {
updateIntroduceUseCase.update(request);
}

@ResponseStatus(HttpStatus.NO_CONTENT)
@PatchMapping("/project")
public void updateProjectList(
@RequestPart("projectList") UpdateListRequest<ProjectElementRequest> request,
@RequestPart("images") List<MultipartFile> images
) {
updateProjectListUseCase.update(request.list(), images);
public void updateProjectList(@RequestPart("projectList") UpdateListRequest<ProjectElement> request) {
updateProjectListUseCase.update(request.list());
}

@ResponseStatus(HttpStatus.NO_CONTENT)
@PatchMapping("/achievement")
public void updateAchievementList(@RequestBody UpdateListRequest<AchievementElement> request) {
updateAchievementListUseCase.update(request.list());
}

@ResponseStatus(HttpStatus.NO_CONTENT)
@PatchMapping("/activity")
public void updateActivityList(@RequestBody UpdateListRequest<ActivityElement> request) {
updateActivityListUseCase.update(request.list());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.example.whopper.domain.document.application.impl;

import com.example.whopper.domain.document.application.usecase.CancelReleaseDocumentUseCase;
import com.example.whopper.domain.document.dao.DocumentRepository;
import com.example.whopper.domain.document.domain.DocumentEntity;
import com.example.whopper.domain.document.domain.element.DocumentStatus;
import com.example.whopper.domain.document.exception.DocumentIllegalStatusException;
import com.example.whopper.domain.document.exception.DocumentNotFoundException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class CancelReleaseDocumentService implements CancelReleaseDocumentUseCase {
private final DocumentRepository documentRepository;

@Override
public void cancel(String documentId) {
var document = validateDocumentIdAndGetDocumentEntity(documentId);

document.submit();

documentRepository.save(document);
}

private DocumentEntity validateDocumentIdAndGetDocumentEntity(String documentId) {
var document = documentRepository.findById(documentId)
.orElseThrow(() -> DocumentNotFoundException.EXCEPTION);

if(!document.getStatus().equals(DocumentStatus.RELEASED)) {
throw DocumentIllegalStatusException.EXCEPTION;
}
return document;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public void cancel() {
}

private void updateDocumentStatusAndSave(DocumentEntity document) {
document.updateDocumentStatus(DocumentStatus.ONGOING);
document.onGoing();
documentRepository.save(document);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,15 @@
import com.example.whopper.domain.document.application.usecase.FindDocumentUseCase;
import com.example.whopper.domain.document.dao.DocumentRepository;
import com.example.whopper.domain.document.domain.detail.CompletionElementLevel;
import com.example.whopper.domain.document.domain.element.DocumentStatus;
import com.example.whopper.domain.document.dto.request.SearchDocumentRequest;
import com.example.whopper.domain.document.dto.response.DocumentResponse;
import com.example.whopper.domain.document.dto.response.FullDocumentResponse;
import com.example.whopper.domain.document.dto.response.ReleasedDocumentResponse;
import com.example.whopper.domain.document.dto.response.SearchDocumentResponse;
import com.example.whopper.domain.document.exception.DocumentIllegalStatusException;
import com.example.whopper.domain.document.exception.DocumentNotFoundException;
import com.example.whopper.domain.major.dao.MajorRepository;
import com.example.whopper.domain.feedback.dao.FeedbackMongoRepository;
import com.example.whopper.global.utils.current.CurrentStudent;
import com.example.whopper.global.utils.DataResponseInfo;
import lombok.RequiredArgsConstructor;
Expand All @@ -20,11 +23,11 @@
@RequiredArgsConstructor
public class FindDocumentService implements FindDocumentUseCase {
private final DocumentRepository documentRepository;
private final MajorRepository majorRepository;
private final FeedbackMongoRepository feedbackMongoRepository;
private final CurrentStudent currentStudent;

@Override
public DocumentResponse getCurrentStudentDocumentMainPageResponse() {
public DocumentResponse getIntroduceRecentlySharedDocuments() {
var currentStudentDocument = currentStudent.getDocument();

return DocumentResponse.of(
Expand All @@ -37,9 +40,9 @@ public DocumentResponse getCurrentStudentDocumentMainPageResponse() {
public FullDocumentResponse getCurrentStudentDocument() {
var currentStudentDocument = currentStudent.getDocument();
var student = currentStudentDocument.getStudent();
var major = majorRepository.getById(student.getMajorId());
var major = student.getMajor();

return FullDocumentResponse.of(currentStudentDocument, student, major.name());
return FullDocumentResponse.of(currentStudentDocument, major.name());
}

@Override
Expand All @@ -48,16 +51,19 @@ public FullDocumentResponse getSubmittedDocument(String documentId) {
.orElseThrow(() -> DocumentNotFoundException.EXCEPTION);

var student = document.getStudent();
var major = majorRepository.getById(student.getMajorId());
var major = student.getMajor();

return FullDocumentResponse.of(document, student, major.name());
return FullDocumentResponse.of(document, major.name());
}

@Override
public DataResponseInfo<SearchDocumentResponse> searchDocument(SearchDocumentRequest request) {
return DataResponseInfo.of(
documentRepository.searchDocument(request)
.map(SearchDocumentResponse::of)
.map(document -> SearchDocumentResponse.of(
document,
feedbackMongoRepository.countByDocument(document)
))
.toList()
);
}
Expand All @@ -68,4 +74,25 @@ public CompletionElementLevel getCurrentStudentDocumentCompletionLevel() {

return CompletionElementLevel.of(currentStudentDocument);
}

@Override
public DataResponseInfo<ReleasedDocumentResponse> getReleasedDocuments() {
return DataResponseInfo.of(
documentRepository.getReleasedDocuments()
.map(ReleasedDocumentResponse::of)
.toList()
);
}

@Override
public FullDocumentResponse findReleasedDocument(String documentId) {
var document = documentRepository.findById(documentId)
.orElseThrow(() -> DocumentNotFoundException.EXCEPTION);

if (!document.getStatus().equals(DocumentStatus.RELEASED)) {
throw DocumentIllegalStatusException.EXCEPTION;
}

return FullDocumentResponse.of(document, document.getStudent().getMajor().name());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.example.whopper.domain.document.application.impl;

import com.example.whopper.domain.document.application.usecase.ReleaseDocumentUseCase;
import com.example.whopper.domain.document.dao.DocumentRepository;
import com.example.whopper.domain.document.domain.DocumentEntity;
import com.example.whopper.domain.document.domain.element.DocumentStatus;
import com.example.whopper.domain.document.exception.DocumentIllegalStatusException;
import com.example.whopper.domain.document.exception.DocumentNotFoundException;
import com.example.whopper.domain.feedback.dao.FeedbackMongoRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class ReleaseDocumentService implements ReleaseDocumentUseCase {
private final DocumentRepository documentRepository;
private final FeedbackMongoRepository feedbackMongoRepository;

@Override
public void release(String documentId) {
var document = validateDocumentIdAndGetDocumentEntity(documentId);

document.release();

deleteFeedback(document);

documentRepository.save(document);
}

private void deleteFeedback(DocumentEntity document) {
feedbackMongoRepository.deleteAllByDocument(document);
}

private DocumentEntity validateDocumentIdAndGetDocumentEntity(String documentId) {
var document = documentRepository.findById(documentId)
.orElseThrow(() -> DocumentNotFoundException.EXCEPTION);

if(!document.getStatus().equals(DocumentStatus.SUBMITTED)) {
throw DocumentIllegalStatusException.EXCEPTION;
}
return document;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public void submit() {
}

private void updateDocumentStatusAndSave(DocumentEntity doc) {
doc.updateDocumentStatus(DocumentStatus.SUBMITTED);
doc.submit();
documentRepository.save(doc);
}
}
Original file line number Diff line number Diff line change
@@ -1,60 +1,23 @@
package com.example.whopper.domain.document.application.impl;

import com.example.whopper.domain.document.application.base.AbstractUpdateElementServiceBase;
import com.example.whopper.domain.document.application.usecase.UpdateProjectListUseCase;
import com.example.whopper.domain.document.dao.DocumentRepository;
import com.example.whopper.domain.document.domain.DocumentEntity;
import com.example.whopper.domain.document.domain.element.DocumentStatus;
import com.example.whopper.domain.document.domain.element.ProjectElement;
import com.example.whopper.domain.document.dto.request.ProjectElementRequest;
import com.example.whopper.domain.document.exception.DocumentModificationException;
import com.example.whopper.domain.document.exception.ImageRequestSizeMismatchException;
import com.example.whopper.global.utils.current.CurrentStudent;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.stream.IntStream;

@Service
@RequiredArgsConstructor
public class UpdateProjectListService implements UpdateProjectListUseCase {
private final DocumentRepository documentRepository;
private final CurrentStudent currentStudent;

private void updateDocument(DocumentEntity document, List<ProjectElement> list) {
document.updateProjectList(list);
public class UpdateProjectListService extends AbstractUpdateElementServiceBase<List<ProjectElement>> implements UpdateProjectListUseCase {
public UpdateProjectListService(DocumentRepository documentRepository, CurrentStudent currentUser) {
super(documentRepository, currentUser);
}

@Override
public void update(List<ProjectElementRequest> request, List<MultipartFile> images) {
if (images.size() != request.size()) {
throw ImageRequestSizeMismatchException.EXCEPTION;
}

var document = currentStudent.getDocument();

if (!document.getStatus().equals(DocumentStatus.ONGOING)) {
throw DocumentModificationException.EXCEPTION;
}

List<String> imagePathList = images.stream()
.map(img -> {
if (img.isEmpty()) {
return "";
}
return "image path"; // 저장 후 접근 가능한 URL
}).toList(); // TODO: 7/27/24 이미지 저장에 대해 생각해야함
// if (images.get() == null) => ""

var projectElementList = IntStream.range(0, request.size())
.mapToObj(i -> ProjectElement.fromProjectElementRequest(
request.get(i),
imagePathList.get(i))
)
.toList();

updateDocument(document, projectElementList);
documentRepository.save(document);
protected void updateDocument(DocumentEntity document, List<ProjectElement> list) {
document.updateProjectList(list);
}
}
Loading

0 comments on commit 12cd59f

Please sign in to comment.