Skip to content

Commit

Permalink
Merge pull request #56 from Team-BomBomBom/feat/vote_assignment#BBB-127
Browse files Browse the repository at this point in the history
Feat: #BBB-126 ๊ณผ์ œ๋ชฉ๋ก ์‚ญ์ œ,  #BBB-127 ๊ณผ์ œ ํˆฌํ‘œ, #BBB-128 ํˆฌํ‘œ ์ง‘๊ณ„, #BBB-129 ๊ธฐ์ˆ ์„œ์  ์Šคํ„ฐ๋”” ์ง„ํ–‰ํ˜„ํ™ฉ
  • Loading branch information
msjang4 authored Sep 30, 2024
2 parents fba9e91 + 7986ec4 commit 703150a
Show file tree
Hide file tree
Showing 53 changed files with 4,836 additions and 1,271 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.bombombom.devs.external.study.service.dto.result;
package com.bombombom.devs.external.algo.service.dto.result;

import com.bombombom.devs.algo.model.AlgorithmProblem;
import com.bombombom.devs.core.enums.AlgoTag;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.bombombom.devs.external.study.service.dto.result;
package com.bombombom.devs.external.algo.service.dto.result;

import com.bombombom.devs.study.model.AlgorithmProblemSolveHistory;
import java.time.LocalDateTime;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,21 @@
import com.bombombom.devs.core.exception.DetailedErrorResponse;
import com.bombombom.devs.core.exception.ErrorCode;
import com.bombombom.devs.core.exception.ErrorResponse;
import com.bombombom.devs.core.exception.ServerInternalException;
import com.fasterxml.jackson.core.JsonProcessingException;
import io.jsonwebtoken.lang.Assert;
import java.util.HashMap;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

@ExceptionHandler(AbstractException.class)
Expand All @@ -28,6 +32,15 @@ protected ResponseEntity<ErrorResponse> handle(AbstractException e) {
return new ResponseEntity<>(e.errorResponse(), httpStatus);
}

@ExceptionHandler(RuntimeException.class)
protected ResponseEntity<ErrorResponse> handle(RuntimeException runtimeException) {
log.error("Unexpected Error Occur: ", runtimeException);

ServerInternalException e = new ServerInternalException(ErrorCode.UNEXPECTED_EXCEPTION);

return new ResponseEntity<>(e.errorResponse(), HttpStatus.INTERNAL_SERVER_ERROR);
}

@ExceptionHandler(MethodArgumentNotValidException.class)
protected ResponseEntity<DetailedErrorResponse> handleInvalidDtoField(
MethodArgumentNotValidException e) throws JsonProcessingException {
Expand All @@ -44,4 +57,15 @@ protected ResponseEntity<DetailedErrorResponse> handleInvalidDtoField(
);
return ResponseEntity.badRequest().body(detailedErrorResponse);
}

@ExceptionHandler(MethodArgumentTypeMismatchException.class)
protected ResponseEntity<ErrorResponse> handleDtoFieldTypeMismatch(
MethodArgumentTypeMismatchException e) {

ErrorResponse errorResponse = new ErrorResponse(
HttpStatus.BAD_REQUEST.value(),
e.getPropertyName() + " " + e.getErrorCode()
);
return ResponseEntity.badRequest().body(errorResponse);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
.requestMatchers(HttpMethod.GET, "/api/v1/users/**").authenticated()
.requestMatchers(HttpMethod.POST, "/api/v1/users/**").permitAll()
.requestMatchers(HttpMethod.POST, "/api/v1/studies/**").authenticated()
.requestMatchers(HttpMethod.PUT, "/api/v1/studies/**").authenticated()
.requestMatchers(HttpMethod.DELETE, "/api/v1/studies/**").authenticated()
.requestMatchers(HttpMethod.PATCH, "/api/v1/studies/**").authenticated()
.requestMatchers(HttpMethod.GET, "/api/v1/books/**").authenticated()
.requestMatchers(HttpMethod.POST, "/api/v1/books/**").authenticated()
.anyRequest().permitAll())
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.bombombom.devs.external.problem.service.dto.result;

public record ProblemResult() {

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,15 @@
import com.bombombom.devs.external.algo.controller.dto.request.FeedbackAlgorithmProblemRequest;
import com.bombombom.devs.external.global.web.LoginUser;
import com.bombombom.devs.external.study.controller.dto.request.AddAssignmentRequest;
import com.bombombom.devs.external.study.controller.dto.request.ConfigureStudyRequest;
import com.bombombom.devs.external.study.controller.dto.request.DeleteAssignmentRequest;
import com.bombombom.devs.external.study.controller.dto.request.EditAssignmentRequest;
import com.bombombom.devs.external.study.controller.dto.request.GetAssignmentRequest;
import com.bombombom.devs.external.study.controller.dto.request.EditAssignmentRequest.AssignmentInfo;
import com.bombombom.devs.external.study.controller.dto.request.JoinStudyRequest;
import com.bombombom.devs.external.study.controller.dto.request.RegisterAlgorithmStudyRequest;
import com.bombombom.devs.external.study.controller.dto.request.RegisterBookStudyRequest;
import com.bombombom.devs.external.study.controller.dto.request.StartStudyRequest;
import com.bombombom.devs.external.study.controller.dto.request.VoteAssignmentRequest;
import com.bombombom.devs.external.study.controller.dto.response.AlgorithmStudyResponse;
import com.bombombom.devs.external.study.controller.dto.response.BookStudyResponse;
import com.bombombom.devs.external.study.controller.dto.response.StudyDetailsResponse;
Expand All @@ -20,11 +23,14 @@
import com.bombombom.devs.external.study.service.StudyService;
import com.bombombom.devs.external.study.service.dto.result.AlgorithmStudyResult;
import com.bombombom.devs.external.study.service.dto.result.AssignmentResult;
import com.bombombom.devs.external.study.service.dto.result.AssignmentVoteResult;
import com.bombombom.devs.external.study.service.dto.result.BookStudyResult;
import com.bombombom.devs.external.study.service.dto.result.StudyDetailsResult;
import com.bombombom.devs.external.study.service.dto.result.StudyProgressResult;
import com.bombombom.devs.security.AppUserDetails;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import java.net.URI;
import java.util.List;
import lombok.RequiredArgsConstructor;
Expand All @@ -34,7 +40,9 @@
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.ResponseEntity;
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.PutMapping;
Expand Down Expand Up @@ -118,7 +126,8 @@ public ResponseEntity<Void> joinStudy(
public ResponseEntity<StudyDetailsResponse> getStudyDetails(@PathVariable("id") Long studyId) {
StudyDetailsResult studyDetailsResult = studyService.findStudyDetails(studyId);

return ResponseEntity.ok().body(StudyDetailsResponse.fromResult(studyDetailsResult));
return ResponseEntity.ok()
.body(StudyDetailsResponse.fromResult(studyDetailsResult));
}

@GetMapping("/progress/{id}")
Expand Down Expand Up @@ -152,6 +161,16 @@ public ResponseEntity<Void> start(
return ResponseEntity.ok().build();
}

@PostMapping("/{id}/start-voting")
public ResponseEntity<Void> startVoting(
@LoginUser AppUserDetails userDetails,
@PathVariable("id") Long studyId) {

studyService.startVoting(userDetails.getId(), studyId);

return ResponseEntity.ok().build();
}

@PutMapping("/{id}/assignments")
public ResponseEntity<List<AssignmentResult>> editAssignments(
@LoginUser AppUserDetails userDetails,
Expand All @@ -165,17 +184,58 @@ public ResponseEntity<List<AssignmentResult>> editAssignments(
return ResponseEntity.ok().body(assignmentResults);
}

@GetMapping("/{id}/assignments")
public ResponseEntity<List<AssignmentResult>> getAssignments(
@PatchMapping("/{id}/config")
public ResponseEntity<Void> configureStudy(
@LoginUser AppUserDetails userDetails,
@PathVariable("id") Long studyId,
@Valid @RequestBody ConfigureStudyRequest configureStudyRequest) {

studyService.configure(
userDetails.getId(),
studyId,
configureStudyRequest.toServiceDto());

return ResponseEntity.noContent().build();
}


@PutMapping("/{id}/vote")
public ResponseEntity<AssignmentVoteResult> voteAssignment(
@LoginUser AppUserDetails userDetails,
@PathVariable("id") Long studyId,
@Valid @RequestBody GetAssignmentRequest getAssignmentRequest) {
@Valid @RequestBody VoteAssignmentRequest voteAssignmentRequest) {

List<AssignmentResult> assignmentResults =
bookStudyService.getAssignments(studyId, getAssignmentRequest.roundIdx());
AssignmentVoteResult assignmentResults = bookStudyService.voteAssignment(
userDetails.getId(), studyId,
voteAssignmentRequest.toServiceDto());

return ResponseEntity.ok().body(assignmentResults);
}

@DeleteMapping("/{id}/assignments")
public ResponseEntity<List<Long>> deleteAssignments(
@LoginUser AppUserDetails userDetails,
@PathVariable("id") Long studyId,
@Valid @RequestBody DeleteAssignmentRequest deleteAssignmentRequest) {

bookStudyService.removeAssignments(userDetails.getId(), studyId,
deleteAssignmentRequest.toServiceDto());

return ResponseEntity.ok().build();
}

@GetMapping("/{id}/assignments")
public ResponseEntity<List<AssignmentInfo>> getAssignments(
@PathVariable("id") Long studyId,
@RequestParam @NotNull @Min(0) Integer roundIdx) {

List<AssignmentResult> assignments =
bookStudyService.getAssignments(studyId, roundIdx);

return ResponseEntity.ok().body(assignments.stream().map(
AssignmentInfo::fromResult).toList());
}


@PostMapping("/{id}/assignments")
public ResponseEntity<List<AssignmentResult>> createAssignments(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.bombombom.devs.external.study.controller.dto.request;

import com.bombombom.devs.external.study.service.dto.command.ConfigureStudyCommand;

public record ConfigureStudyRequest(
Boolean duplicated
) {


public ConfigureStudyCommand toServiceDto() {
return ConfigureStudyCommand.builder()
.duplicated(duplicated)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.bombombom.devs.external.study.controller.dto.request;

import com.bombombom.devs.external.study.service.dto.command.DeleteAssignmentCommand;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import java.util.List;
import lombok.Builder;

@Builder
public record DeleteAssignmentRequest(
@NotNull @Min(0) Integer roundIdx,
@NotEmpty List<Long> assignmentIds

) {

public DeleteAssignmentCommand toServiceDto() {
return DeleteAssignmentCommand.builder()
.roundIdx(roundIdx)
.assignmentIds(assignmentIds)
.build();

}


}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.bombombom.devs.external.study.controller.dto.request;

import com.bombombom.devs.external.study.service.dto.command.EditAssignmentCommand;
import com.bombombom.devs.external.study.service.dto.result.AssignmentResult;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
Expand All @@ -12,7 +13,7 @@
@Builder
public record EditAssignmentRequest(
@NotNull @Min(0) Integer roundIdx,
@Valid @Size(max = 20) List<AssignmentInfo> assignments
@Valid List<AssignmentInfo> assignments
) {

@Builder
Expand All @@ -24,6 +25,17 @@ public record AssignmentInfo(
@Min(0) Integer pageEnd
) {

public static AssignmentInfo fromResult(AssignmentResult assignmentResult) {
return AssignmentInfo.builder()
.id(assignmentResult.id())
.title(assignmentResult.title())
.description(assignmentResult.description())
.pageStart(assignmentResult.pageStart())
.pageEnd(assignmentResult.pageEnd())
.build();

}

}

public EditAssignmentCommand toServiceDto() {
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.bombombom.devs.external.study.controller.dto.request;

import com.bombombom.devs.external.study.service.dto.command.VoteAssignmentCommand;
import jakarta.validation.constraints.NotNull;

public record VoteAssignmentRequest(
@NotNull Long first,
Long second
) {

public VoteAssignmentCommand toServiceDto() {
return VoteAssignmentCommand.builder()
.first(first)
.second(second)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.bombombom.devs.external.study.controller.dto.response;

import com.bombombom.devs.core.enums.AlgoTag;
import com.bombombom.devs.external.study.service.dto.result.AlgorithmProblemResult;
import com.bombombom.devs.external.algo.service.dto.result.AlgorithmProblemResult;
import com.bombombom.devs.external.study.service.dto.result.StudyProgressResult;
import com.bombombom.devs.external.study.service.dto.result.progress.AlgorithmStudyProgress;
import com.bombombom.devs.external.user.service.dto.UserProfileResult;
Expand Down
Loading

0 comments on commit 703150a

Please sign in to comment.