From d45b53089f3852430e293bc3a78155b51d821058 Mon Sep 17 00:00:00 2001 From: Haeyul Date: Sat, 2 Aug 2025 22:57:13 +0900 Subject: [PATCH 01/22] =?UTF-8?q?feat(#5):=20API=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EB=82=98=EB=88=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yaml | 14 +- .../domain/assignment/domain/Assignment.java | 10 +- .../domain/assignment/domain/SubmitType.java | 7 - .../AssignmentAttachmentRepository.java | 13 - .../repository/AssignmentCheckRepository.java | 24 -- .../AssignmentContentRepository.java | 7 - .../repository/AssignmentRepository.java | 2 + .../presentation/AssignmentController.java | 143 +++----- .../request/AssignmentCreateRequestDto.java | 12 +- .../request/AssignmentModifyRequestDto.java | 14 + .../response/AssignmentAttachmentFile.java | 8 + .../response/AssignmentAttachmentLink.java | 5 + .../dto/response/AssignmentSubmissionDto.java | 13 + .../AssignmentSubmissionStatusDto.java | 14 + .../dto/response/StudentAssignmentRemain.java | 14 +- .../presentation/dto/response/file.java | 7 + .../assignment/service/AssignmentService.java | 346 +++++++----------- .../domain/AssignmentAttachment.java | 27 +- .../domain/AttachmentDocument.java | 28 ++ .../domain/AttachmentLink.java | 19 + .../AssignmentAttachmentRepository.java | 9 + .../AssignmentAttachmentController.java | 44 +++ .../dto/request/AssignmentUploadFileDto.java | 11 + .../service/AssignmentAttachmentService.java | 69 ++++ .../file/presentation/FileController.java | 47 +++ .../service/FileService.java | 40 +- .../domain/Submission.java} | 27 +- .../repository/SubmissionRepository.java | 29 ++ .../presentation/SubmissionController.java | 4 + .../submission/service/SubmissionService.java | 29 ++ .../domain/SubmissionDocument.java | 26 ++ .../domain/SubmissionFile.java} | 35 +- .../submissionFile/domain/SubmissionLink.java | 14 + .../domain/repository/SubmissionFile.java | 11 + .../SubmissionFileController.java | 4 + .../service/SubmissionFileService.java | 4 + .../domain/user/domain/UserEntity.java | 1 - src/main/resources/application.yaml | 2 +- 38 files changed, 705 insertions(+), 428 deletions(-) delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/domain/SubmitType.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/domain/repository/AssignmentAttachmentRepository.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/domain/repository/AssignmentCheckRepository.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/domain/repository/AssignmentContentRepository.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/presentation/dto/request/AssignmentModifyRequestDto.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentAttachmentFile.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentAttachmentLink.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentSubmissionDto.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentSubmissionStatusDto.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/file.java rename src/main/java/hello/cluebackend/domain/{assignment => assignmentAttachment}/domain/AssignmentAttachment.java (57%) create mode 100644 src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AttachmentDocument.java create mode 100644 src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AttachmentLink.java create mode 100644 src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/repository/AssignmentAttachmentRepository.java create mode 100644 src/main/java/hello/cluebackend/domain/assignmentAttachment/presentation/AssignmentAttachmentController.java create mode 100644 src/main/java/hello/cluebackend/domain/assignmentAttachment/presentation/dto/request/AssignmentUploadFileDto.java create mode 100644 src/main/java/hello/cluebackend/domain/assignmentAttachment/service/AssignmentAttachmentService.java create mode 100644 src/main/java/hello/cluebackend/domain/file/presentation/FileController.java rename src/main/java/hello/cluebackend/domain/{assignment => file}/service/FileService.java (54%) rename src/main/java/hello/cluebackend/domain/{assignment/domain/AssignmentCheck.java => submission/domain/Submission.java} (54%) create mode 100644 src/main/java/hello/cluebackend/domain/submission/domain/repository/SubmissionRepository.java create mode 100644 src/main/java/hello/cluebackend/domain/submission/presentation/SubmissionController.java create mode 100644 src/main/java/hello/cluebackend/domain/submission/service/SubmissionService.java create mode 100644 src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionDocument.java rename src/main/java/hello/cluebackend/domain/{assignment/domain/AssignmentContent.java => submissionFile/domain/SubmissionFile.java} (53%) create mode 100644 src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionLink.java create mode 100644 src/main/java/hello/cluebackend/domain/submissionFile/domain/repository/SubmissionFile.java create mode 100644 src/main/java/hello/cluebackend/domain/submissionFile/presentation/SubmissionFileController.java create mode 100644 src/main/java/hello/cluebackend/domain/submissionFile/service/SubmissionFileService.java diff --git a/docker-compose.yaml b/docker-compose.yaml index 4fd70c9c..04ed7088 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,11 +1,11 @@ services: - spring: - build: . - container_name: paletto - networks: - - web-net - ports: - - 8080:8080 +# spring: +# build: . +# container_name: paletto +# networks: +# - web-net +# ports: +# - 8080:8080 postgres: image: postgres:15 diff --git a/src/main/java/hello/cluebackend/domain/assignment/domain/Assignment.java b/src/main/java/hello/cluebackend/domain/assignment/domain/Assignment.java index 6907ded3..ad4d4cb8 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/domain/Assignment.java +++ b/src/main/java/hello/cluebackend/domain/assignment/domain/Assignment.java @@ -8,7 +8,7 @@ import java.time.LocalDateTime; @Entity -@Table(name = "assignments") +@Table(name = "Assignment") @Getter @Setter @AllArgsConstructor @NoArgsConstructor @@ -19,11 +19,11 @@ public class Assignment { private Long assignmentId; @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "class_room_id") + @JoinColumn(name = "classroom_id") private ClassRoom classRoom; @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "creator_id") + @JoinColumn(name = "user_id") private UserEntity user; @Column(name = "title") @@ -35,6 +35,6 @@ public class Assignment { @Column(name = "start_date") private LocalDateTime startDate; - @Column(name = "due_date") - private LocalDateTime dueDate; + @Column(name = "end_date") + private LocalDateTime endDate; } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/domain/SubmitType.java b/src/main/java/hello/cluebackend/domain/assignment/domain/SubmitType.java deleted file mode 100644 index 285d5015..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/domain/SubmitType.java +++ /dev/null @@ -1,7 +0,0 @@ -package hello.cluebackend.domain.assignment.domain; - -public enum SubmitType { - FILE, - LINK, - IMAGE -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/domain/repository/AssignmentAttachmentRepository.java b/src/main/java/hello/cluebackend/domain/assignment/domain/repository/AssignmentAttachmentRepository.java deleted file mode 100644 index 507ef691..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/domain/repository/AssignmentAttachmentRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package hello.cluebackend.domain.assignment.domain.repository; - -import hello.cluebackend.domain.assignment.domain.Assignment; -import hello.cluebackend.domain.assignment.domain.AssignmentAttachment; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public interface AssignmentAttachmentRepository extends JpaRepository { - List findAllByAssignment(Assignment assignment); -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/domain/repository/AssignmentCheckRepository.java b/src/main/java/hello/cluebackend/domain/assignment/domain/repository/AssignmentCheckRepository.java deleted file mode 100644 index f6a74981..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/domain/repository/AssignmentCheckRepository.java +++ /dev/null @@ -1,24 +0,0 @@ -package hello.cluebackend.domain.assignment.domain.repository; - -import hello.cluebackend.domain.assignment.domain.Assignment; -import hello.cluebackend.domain.assignment.domain.AssignmentCheck; -import io.lettuce.core.dynamic.annotation.Param; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public interface AssignmentCheckRepository extends JpaRepository { - @Query(""" -SELECT ac.assignment -FROM AssignmentCheck ac -JOIN ac.assignment a -JOIN a.classRoom cr -JOIN cr.classRoomUserList cru -WHERE ac.user.userId = :userId - AND ac.isSubmitted = false -""") - List findUnsubmittedAssignmentsByUserId(@Param("userId") Long userId); -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/domain/repository/AssignmentContentRepository.java b/src/main/java/hello/cluebackend/domain/assignment/domain/repository/AssignmentContentRepository.java deleted file mode 100644 index 74711fc7..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/domain/repository/AssignmentContentRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package hello.cluebackend.domain.assignment.domain.repository; - -import hello.cluebackend.domain.assignment.domain.AssignmentContent; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface AssignmentContentRepository extends JpaRepository { -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/domain/repository/AssignmentRepository.java b/src/main/java/hello/cluebackend/domain/assignment/domain/repository/AssignmentRepository.java index 90da6c70..238ce2c0 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/domain/repository/AssignmentRepository.java +++ b/src/main/java/hello/cluebackend/domain/assignment/domain/repository/AssignmentRepository.java @@ -2,9 +2,11 @@ import hello.cluebackend.domain.assignment.domain.Assignment; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; import java.util.List; +@Repository public interface AssignmentRepository extends JpaRepository { List findAllByClassRoom_ClassRoomId(Long classId); } diff --git a/src/main/java/hello/cluebackend/domain/assignment/presentation/AssignmentController.java b/src/main/java/hello/cluebackend/domain/assignment/presentation/AssignmentController.java index b8b4d6a7..96a85a4b 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/presentation/AssignmentController.java +++ b/src/main/java/hello/cluebackend/domain/assignment/presentation/AssignmentController.java @@ -1,28 +1,16 @@ package hello.cluebackend.domain.assignment.presentation; - -import hello.cluebackend.domain.assignment.domain.AssignmentAttachment; -import hello.cluebackend.domain.assignment.exception.AssignmentNotFoundException; -import hello.cluebackend.domain.assignment.exception.UnauthorizedException; import hello.cluebackend.domain.assignment.presentation.dto.request.AssignmentCreateRequestDto; -import hello.cluebackend.domain.assignment.presentation.dto.response.GetAssignmentResponseDto; -import hello.cluebackend.domain.assignment.presentation.dto.response.StudentAssignmentRemain; import hello.cluebackend.domain.assignment.service.AssignmentService; -import hello.cluebackend.domain.assignment.service.FileService; -import hello.cluebackend.domain.user.domain.UserEntity; import hello.cluebackend.global.config.JWTUtil; -import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -import org.springframework.core.io.Resource; -import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; -import java.util.List; +import java.util.Map; @RestController @RequiredArgsConstructor @@ -30,103 +18,72 @@ public class AssignmentController { private final AssignmentService assignmentService; private final JWTUtil jWTUtil; - private final FileService fileService; - - private Long jwtTokenTaker(HttpServletRequest request){ - String token = jWTUtil.getToken(request); - Long userId = jWTUtil.getUserId(token); - return userId; - } - - // 교실 전체 과제 조회하기 - @GetMapping("/{classId}") - public ResponseEntity> getAllAssignment( - HttpServletRequest request, - @PathVariable Long classId - ){ - Long userId = jwtTokenTaker(request); - return ResponseEntity.ok(assignmentService.getAllAssignment(classId, userId)); - } - // 과제 생성하기 - @PostMapping("/{classId}") + // 선생님 과제 생성하기 + @PostMapping("/create/{classId}") public ResponseEntity createAssignment( HttpServletRequest request, @PathVariable Long classId, - @RequestPart("metadata") AssignmentCreateRequestDto requestDto, - @RequestPart("files") List files - ){ - Long userId = jwtTokenTaker(request); - assignmentService.createAssignment(userId, classId, requestDto, files); - return ResponseEntity.status(HttpStatus.CREATED).body("과제 생성 완료"); - } - - // 선생님 첨부 파일 다운 받기 - @GetMapping("/attachment/{attachmentId}") - public ResponseEntity downloadAttachment( - @PathVariable Long attachmentId, - HttpServletRequest request - ){ - Long userId = jwtTokenTaker(request); - - Resource file = fileService.downloadFile(attachmentId, userId); - - return ResponseEntity.ok() - .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"downloaded-file\"") - .contentType(MediaType.APPLICATION_OCTET_STREAM) - .body(file); - } - - - // 학생 메인 페이지 과제 남은 일수 - @GetMapping("/check") - public ResponseEntity> getStudentRemainCard ( - HttpServletRequest request + @Valid @RequestBody AssignmentCreateRequestDto requestDto ){ - Long userId = jwtTokenTaker(request); - List remains = assignmentService.getUnsubmittedAssignments(userId); - return ResponseEntity.ok(remains); + try{ + String token = jWTUtil.getToken(request); + Long userId = jWTUtil.getUserId(token); + assignmentService.createAssignment(userId, classId, requestDto); + return ResponseEntity.status(HttpStatus.CREATED).body(Map.of("message","과제가 성공적으로 생성되었습니다.")); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of("message","과제 생성중 오류가 발했습니다.")); + } } - - -// -// @DeleteMapping("/{classId}") -// public ResponseEntity deleteAssignment( -// HttpServletRequest request, -// @PathVariable Long classId, -// @RequestParam("assignmentId") Long assignmentId -// ) { +// // 미제출 과제 전체 조회(학생) +// @GetMapping("/") +// public ResponseEntity> getStudentRemainCard (HttpServletRequest request){ // String token = jWTUtil.getToken(request); // Long userId = jWTUtil.getUserId(token); // -// try { -// assignmentService.deleteAssignment(classId, assignmentId, userId); -// return ResponseEntity.noContent().build(); -// } catch (AssignmentNotFoundException e) { -// return ResponseEntity.status(HttpStatus.NOT_FOUND).body(null); -// } catch (UnauthorizedException e) { -// return ResponseEntity.status(HttpStatus.FORBIDDEN).body(null); -// } +// return ResponseEntity.ok(assignmentService.getUnsubmittedAssignments(userId)); // } // +// // 교실 전체 과제 조회하기 // @GetMapping("/{classId}") -// public ResponseEntity getAssignmentList( -// HttpServletRequest request, -// @PathVariable Long classId -// ) { +// public ResponseEntity> getAllAssignment(HttpServletRequest request, @PathVariable Long classId){ +// String token = jWTUtil.getToken(request); +// Long userId = jWTUtil.getUserId(token); +// +// return ResponseEntity.ok(assignmentService.getAllAssignment(classId, userId)); +// } +// +// // 특정 교실의 학생들의 과제 제출 여부 +// @GetMapping("/{assignmentId}/submissions") +// public ResponseEntity> getAssignmentSubmissionStatus(HttpServletRequest request, @PathVariable Long assignmentId){ // String token = jWTUtil.getToken(request); // Long userId = jWTUtil.getUserId(token); // -// return ResponseEntity.ok(assignmentService.getAssignmentList(classId)); +// return ResponseEntity.ok(assignmentService.checkAssignments(assignmentId)); +// } +// +// // 특정 수업에 학생들의 단일 과제 제출 여부 확인 API +// @GetMapping("/assignments/classroom/{assignmentId}/{userId}") +// public ResponseEntity getAssignmentSubmissionPerson(HttpServletRequest request, @PathVariable Long assignmentId, @PathVariable Long userId) { +// String token = jWTUtil.getToken(request); +// Long userId = jWTUtil.getUserId(token); +// +// return ResponseEntity.ok(assignmentService.checkAssignment(assignmentId,userId)); // } +// //과제 내용 수정 +// @PatchMapping("/api/assignments/{assignmentId}") +// public ResponseEntity modifyAssignment(HttpServletRequest request, @PathVariable Long assignmentId, @RequestBody AssignmentModifyRequestDto assignmentModifyRequestDto){ +// jwtTokenTaker(request); +// +// return ResponseEntity.ok(assignmentService.modifyAssignment(assignmentId,assignmentModifyRequestDto)); +// } -// @GetMapping("{classId}") -// public ResponseEntity> getAllAssignments( -// @PathVariable Long classId, -// @RequestParam Long userId -// ){ -// return ResponseEntity.ok(assignmentService.getAssignmentsForStudent(classId, userId)); +// // 과제 삭제 +// @DeleteMapping("/api/assignments/{assignmentId}") +// public ResponseEntity deleteAssignment(HttpServlet request, @PathVariable Long assignmentId){ +// jwtTokenTaker(request); +// return ResponseEntity.ok(assignmentService.deleteAssignment(assignmentId)); // } } diff --git a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/request/AssignmentCreateRequestDto.java b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/request/AssignmentCreateRequestDto.java index 9441d343..fc96c8dd 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/request/AssignmentCreateRequestDto.java +++ b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/request/AssignmentCreateRequestDto.java @@ -1,14 +1,24 @@ package hello.cluebackend.domain.assignment.presentation.dto.request; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; import java.time.LocalDateTime; +import java.util.List; @Getter @Setter public class AssignmentCreateRequestDto { + @NotBlank(message = "과제 제목은 필수입니다.") private String title; + + private String content; + + @NotBlank(message = "시작 일자는 필수입니다.") private LocalDateTime startData; - private LocalDateTime dueDate; + + @NotBlank(message = "마감일은 필수입니다.") + private LocalDateTime endDate; } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/request/AssignmentModifyRequestDto.java b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/request/AssignmentModifyRequestDto.java new file mode 100644 index 00000000..4930cdbe --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/request/AssignmentModifyRequestDto.java @@ -0,0 +1,14 @@ +package hello.cluebackend.domain.assignment.presentation.dto.request; + +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Getter @Setter +public class AssignmentModifyRequestDto { + private String title; + private String Content; + private LocalDateTime startDate; + private LocalDateTime endDate; +} diff --git a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentAttachmentFile.java b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentAttachmentFile.java new file mode 100644 index 00000000..d7246a2e --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentAttachmentFile.java @@ -0,0 +1,8 @@ +package hello.cluebackend.domain.assignment.presentation.dto.response; + +public record AssignmentAttachmentFile( + String OriginalFileName, + String StoredFileName, + String FilePath, + int FileSize +) { } diff --git a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentAttachmentLink.java b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentAttachmentLink.java new file mode 100644 index 00000000..69694057 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentAttachmentLink.java @@ -0,0 +1,5 @@ +package hello.cluebackend.domain.assignment.presentation.dto.response; + +public record AssignmentAttachmentLink( + String Link +) {} diff --git a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentSubmissionDto.java b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentSubmissionDto.java new file mode 100644 index 00000000..d61903fe --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentSubmissionDto.java @@ -0,0 +1,13 @@ +package hello.cluebackend.domain.assignment.presentation.dto.response; + +import java.time.LocalDateTime; +import java.util.List; + +public record AssignmentSubmissionDto( + Long userId, + int studentNumber, + String userName, + Boolean isSubmitted, + LocalDateTime submittedAt, + List assignmentAttachmentIds +) {} diff --git a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentSubmissionStatusDto.java b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentSubmissionStatusDto.java new file mode 100644 index 00000000..a3aee580 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentSubmissionStatusDto.java @@ -0,0 +1,14 @@ +package hello.cluebackend.domain.assignment.presentation.dto.response; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.time.LocalDateTime; + +public record AssignmentSubmissionStatusDto( + int studentNumber, // 학번 + String userName, // 학생 이름 + boolean isSubmitted, // 제출 여부 + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss") + LocalDateTime submittedAt, // 제출 날짜 (ISO-8601 String으로 변환됨) + Long userId, // 학생 아이디 + Long contentId // 과제 아이디 +) {} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/StudentAssignmentRemain.java b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/StudentAssignmentRemain.java index ce105dc1..428ccdba 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/StudentAssignmentRemain.java +++ b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/StudentAssignmentRemain.java @@ -1,7 +1,15 @@ package hello.cluebackend.domain.assignment.presentation.dto.response; +import java.time.LocalDateTime; +import java.util.List; + public record StudentAssignmentRemain( - String title, - String duration, - Long assignmentId + Long assignmentId, // 과제 아이디 + String title, // 과제 제목 + LocalDateTime endDate, // 과제 마감일 + String remainingTime, // 마감까지 남은 시간 + Boolean IsSubmitted, // 과제 제출 여부 + String Content, // 과제 내용 + List studentFiles, // 학생이 이때까지 제출한 과제 + List teacherFiles // 선생님이 첨부한 파일 ) {} diff --git a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/file.java b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/file.java new file mode 100644 index 00000000..934e9ae8 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/file.java @@ -0,0 +1,7 @@ +package hello.cluebackend.domain.assignment.presentation.dto.response; + +public record file( + Long fileId, + String fileName, + int fileSize +) {} diff --git a/src/main/java/hello/cluebackend/domain/assignment/service/AssignmentService.java b/src/main/java/hello/cluebackend/domain/assignment/service/AssignmentService.java index ecfc10b2..4b36c19d 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/service/AssignmentService.java +++ b/src/main/java/hello/cluebackend/domain/assignment/service/AssignmentService.java @@ -1,52 +1,29 @@ package hello.cluebackend.domain.assignment.service; -import com.amazonaws.services.s3.model.GetObjectRequest; -import com.amazonaws.services.s3.model.S3Object; -import com.amazonaws.services.s3.model.S3ObjectInputStream; -import com.amazonaws.util.IOUtils; -import com.zaxxer.hikari.pool.HikariProxyCallableStatement; import hello.cluebackend.domain.assignment.domain.Assignment; -import hello.cluebackend.domain.assignment.domain.AssignmentAttachment; -import hello.cluebackend.domain.assignment.domain.AssignmentCheck; -import hello.cluebackend.domain.assignment.domain.SubmitType; -import hello.cluebackend.domain.assignment.domain.repository.AssignmentAttachmentRepository; -import hello.cluebackend.domain.assignment.domain.repository.AssignmentContentRepository; import hello.cluebackend.domain.assignment.domain.repository.AssignmentRepository; -import hello.cluebackend.domain.assignment.domain.repository.AssignmentCheckRepository; import hello.cluebackend.domain.assignment.presentation.dto.request.AssignmentCreateRequestDto; -import hello.cluebackend.domain.assignment.presentation.dto.response.AssignmentDuration; -import hello.cluebackend.domain.assignment.presentation.dto.response.Assignmentfile; -import hello.cluebackend.domain.assignment.presentation.dto.response.GetAssignmentResponseDto; -import hello.cluebackend.domain.assignment.presentation.dto.response.StudentAssignmentRemain; +import hello.cluebackend.domain.assignmentAttachment.domain.repository.AssignmentAttachmentRepository; +import hello.cluebackend.domain.assignmentAttachment.service.AssignmentAttachmentService; import hello.cluebackend.domain.classroom.domain.ClassRoom; import hello.cluebackend.domain.classroom.domain.repository.ClassRoomRepository; import hello.cluebackend.domain.classroomuser.domain.ClassRoomUser; import hello.cluebackend.domain.classroomuser.domain.repository.ClassRoomUserRepository; +import hello.cluebackend.domain.submission.domain.Submission; +import hello.cluebackend.domain.submission.domain.repository.SubmissionRepository; +import hello.cluebackend.domain.submission.service.SubmissionService; import hello.cluebackend.domain.user.domain.Role; import hello.cluebackend.domain.user.domain.UserEntity; import hello.cluebackend.domain.user.domain.repository.UserRepository; import jakarta.persistence.EntityNotFoundException; -import jakarta.servlet.http.HttpServlet; -import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; -import org.springframework.core.io.InputStreamResource; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; import org.springframework.security.access.AccessDeniedException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.multipart.MultipartFile; -import java.io.UnsupportedEncodingException; import java.time.Duration; import java.time.LocalDateTime; import java.util.List; -import java.util.UUID; -import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -54,93 +31,15 @@ public class AssignmentService { private final UserRepository userRepository; private final ClassRoomUserRepository classRoomUserRepository; private final AssignmentRepository assignmentRepository; - private final AssignmentContentRepository assignmentContentRepository; - private final AssignmentAttachmentRepository assignmentAttachmentRepository; - private final AssignmentCheckRepository assignmentCheckRepository; private final ClassRoomRepository classRoomRepository; + private final SubmissionService submissionService; - private final FileService fileService; - private HikariProxyCallableStatement amazonS3; - - - private UserEntity validated(Long userId, Long classId){ - UserEntity user = userRepository.findById(userId) - .orElseThrow(() -> new EntityNotFoundException("해당 유저를 찾을수 없습니다.")); - - if(!Role.TEACHER.equals(user.getRole())) { - throw new AccessDeniedException("권한이 부족한 사용자 입니다."); - } - - List classRoomUsers = classRoomUserRepository.findByUser_UserId(userId); - - boolean isMemberOfClass = classRoomUsers.stream() - .anyMatch(classRoomUser -> classRoomUser.getClassRoom().getClassRoomId().equals(classId)); - - if (!isMemberOfClass) { - throw new AccessDeniedException("해당 수업에 속하지 않은 사용자입니다."); - } - return user; - } - - private String calculateRemainingTime(LocalDateTime now, LocalDateTime dueDate) { - Duration duration = Duration.between(now, dueDate); - long days = duration.toDays(); - long hours = duration.minusDays(days).toHours(); - - if (duration.isNegative()) { - return "마감됨"; - } - - return days + "일 " + hours + "시간 남음"; - } - - public String generateUniqueFileName(String originalFileName) { - String extension = ""; - - int dotIndex = originalFileName.lastIndexOf("."); - if (dotIndex > 0) { - extension = originalFileName.substring(dotIndex); // 확장자 포함 - } - - String uuid = UUID.randomUUID().toString(); - - return uuid + extension; - } - - public List getAllAssignment(Long classId, Long userId) { - - UserEntity user = validated(classId, userId); - - List assignments = assignmentRepository.findAllByClassRoom_ClassRoomId(classId); - - return assignments.stream().map(assignment -> { - List attachments = assignmentAttachmentRepository.findAllByAssignment(assignment); - - List fileDtos = attachments.stream() - .map(attachment -> new Assignmentfile( - attachment.getAssignmentAttachmentId(), - attachment.getOriginalFileName(), - attachment.getFileSize() - )) - .toList(); - - String remainingTime = calculateRemainingTime(LocalDateTime.now(), assignment.getDueDate()); - - return new GetAssignmentResponseDto( - assignment.getAssignmentId(), - assignment.getTitle(), - assignment.getDueDate(), - remainingTime, - fileDtos - ); - }).toList(); - } - - @Transactional - public void createAssignment(Long userId, Long classId, AssignmentCreateRequestDto requestDto, List files) { + public void createAssignment(Long userId, Long classId, AssignmentCreateRequestDto requestDto) { UserEntity user = validated(classId, userId); ClassRoom classRoom = classRoomRepository.findById(classId) - .orElseThrow(() -> new EntityNotFoundException("해당 반을 찾을 수 없습니다.")); + .orElseThrow(() -> new EntityNotFoundException("해당 수업은 찾을수 없습니다.")); + + validateAssignmentDates(requestDto.getStartData(), requestDto.getEndDate()); Assignment assignment = Assignment.builder() .classRoom(classRoom) @@ -148,125 +47,160 @@ public void createAssignment(Long userId, Long classId, AssignmentCreateRequestD .title(requestDto.getTitle()) .content(requestDto.getContent()) .startDate(requestDto.getStartData()) - .dueDate(requestDto.getDueDate()) + .endDate(requestDto.getEndDate()) .build(); - assignmentRepository.save(assignment); - if (files != null && !files.isEmpty()) { - for (MultipartFile file : files) { - String storedFileName = fileService.storeFile(file); - AssignmentAttachment attachment = AssignmentAttachment.builder() - .assignment(assignment) - .user(user) - .originalFileName(file.getOriginalFilename()) - .storedFileName(storedFileName) - .filePath("/uploads/" + storedFileName) - .fileSize((int) file.getSize()) - .submitType(SubmitType.FILE) - .updateDate(LocalDateTime.now()) - .build(); - - assignmentAttachmentRepository.save(attachment); - } - } - List students = classRoomUserRepository.findAllStudentsByClassRoomId(classId); - for (UserEntity student : students) { - AssignmentCheck check = AssignmentCheck.builder() - .assignment(assignment) - .user(student) - .isSubmitted(false) - .submittedAt(null) - .build(); - assignmentCheckRepository.save(check); - } + submissionService.createSubmissionsForStudents(assignment, students); } - public List getUnsubmittedAssignments(Long userId) { - UserEntity user = userRepository.findById(userId) - .orElseThrow(() -> new EntityNotFoundException("해당 학생을 찾을수 없습니다.")); - - List assignments = assignmentCheckRepository.findUnsubmittedAssignmentsByUserId(userId); - - return assignments.stream() - .map(a -> new StudentAssignmentRemain( - a.getTitle(), - new AssignmentDuration(a.getStartDate(), a.getDueDate()).toString(), - a.getAssignmentId() - )).collect(Collectors.toList()); - } - -// public void createAssignment(Long userId, Long classId, AssignmentCreateRequestDto requestDto, MultipartFile file) { -// UserEntity user = userRepository.findById(userId) -// .orElseThrow(() -> new EntityNotFoundException("해당 사용자를 찾을 수 없습니다.")); // -// if (user.getRole() != Role.TEACHER) { -// throw new AccessDeniedException("과제를 생성할 권한이 없습니다."); -// } +// public List checkAssignments(Long assignmentId) { +// Optional assignment = assignmentRepository.findById(assignmentId); +// List assignmentChecks = assignmentCheckRepository.findAllByAssignment(assignment.orElse(null)); // -// Assignment assignment = Assignment.builder() -// .creator(user) -// .classRoom(ClassRoom.builder().classRoomId(classId).build()) -// .title(requestDto.getTitle()) -// .content(requestDto.getContent()) -// .startDate(requestDto.getStartData()) -// .dueDate(requestDto.getDueDate()) -// .build(); +// List dtoList = null; // -// assignmentRepository.save(assignment); +// for (Submission assignmentCheck : assignmentChecks) { +// UserEntity user = assignmentCheck.getUser(); // -// // 파일이 있는 경우에만 첨부 정보 저장 -// if (file != null && !file.isEmpty()) { -// // 실제 파일 저장 처리 (ex: S3, 로컬, etc) -// String storedFileName = generateUniqueFileName(file.getOriginalFilename()); -// String filePath = "TeacherAssignment/" + storedFileName; +// AssignmentSubmissionStatusDto dto = new AssignmentSubmissionStatusDto( +// user.getClassCode(), // 학번 +// user.getUsername(), // 학생 이름 +// assignmentCheck.getIsSubmitted(), // 제출 여부 +// assignmentCheck.getSubmittedAt(), // 제출 날짜 +// user.getUserId(), // 유저 아이디 +// assignment.get().getAssignmentId() // 과제 아아디 +// ); +// dtoList.add(dto); +// } +// return dtoList; +// } // -// // 예: S3Uploader.upload(file, storedFileName) -// AssignmentAttachment attachment = AssignmentAttachment.builder() -// .user(user) -// .assignment(assignment) -// .originalFileName(file.getOriginalFilename()) -// .storedFileName(storedFileName) -// .filePath(filePath) -// .fileSize((int) file.getSize()) -// .submitType(2) // 예시: 2 = 일반 업로드, 1 = 링크 저장 -// .updateDate(LocalDateTime.now()) -// .build(); +// public String generateUniqueFileName(String originalFileName) { +// String extension = ""; // -// assignmentAttachmentRepository.save(attachment); +// int dotIndex = originalFileName.lastIndexOf("."); +// if (dotIndex > 0) { +// extension = originalFileName.substring(dotIndex); // 확장자 포함 // } +// +// String uuid = UUID.randomUUID().toString(); +// +// return uuid + extension; +// } +// +// public List getAllAssignment(Long classId, Long userId) { +// +// UserEntity user = validated(classId, userId); +// +// List assignments = assignmentRepository.findAllByClassRoom_ClassRoomId(classId); +// +// return assignments.stream().map(assignment -> { +// List attachments = assignmentAttachmentRepository.findAllByAssignment(assignment); +// +// List fileDtos = attachments.stream() +// .map(attachment -> new Assignmentfile( +// attachment.getAssignmentAttachmentId(), +// attachment.getOriginalFileName(), +// attachment.getFileSize() +// )) +// .toList(); +// +// String remainingTime = calculateRemainingTime(LocalDateTime.now(), assignment.getDueDate()); +// +// return new GetAssignmentResponseDto( +// assignment.getAssignmentId(), +// assignment.getTitle(), +// assignment.getDueDate(), +// remainingTime, +// fileDtos +// ); +// }).toList(); // } -// public void deleteAssignment(Long userId, Long assignmentId, Long classRoomId) { +// public List getUnsubmittedAssignments(Long userId) { // UserEntity user = userRepository.findById(userId) -// .orElseThrow(() -> new EntityNotFoundException("해당 사용자를 찾을 수 없습니다.")); +// .orElseThrow(() -> new EntityNotFoundException("해당 학생을 찾을수 없습니다.")); // -// if (user.getRole() != Role.TEACHER) { -// throw new UnauthorizedException("삭제 권한이 없습니다."); -// } +// List assignments = assignmentCheckRepository.findUnsubmittedAssignmentsByUserId(userId); + +// return assignments.stream() +// .filter(assignment -> assignmentCheckRepository.getAssignmentCheckByAssignmentAndUser((assignment,user).) +// .map(a -> new StudentAssignmentRemain( +// a.getAssignmentId(), +// a.getTitle(), +// a.getDueDate(), +// new AssignmentDuration(a.getStartDate(), a.getDueDate()).toString(), // -// Assignment assignment = assignmentRepository.findById(assignmentId) -// .orElseThrow(() -> new EntityNotFoundException("해당 과제를 찾을 수 없습니다.")); // -// if (!assignment.getClassRoom().getClassRoomId().equals(classRoomId)) { -// throw new IllegalArgumentException("해당 과제는 이 반에 속하지 않습니다."); -// } +// assignmentCheck.getIsSubmitted(), // -// assignmentRepository.delete(assignment); +// a.getContent(), +// +// )).collect(Collectors.toList()); // } + +// public AssignmentSubmissionDto checkAssignment(Long assignmentId, Long userId) { +// UserEntity user = userRepository.findById(userId) +// .orElseThrow(() -> new EntityNotFoundException("해당 학생을 찾을 수 없습니다.")); // +// Submission assignmentCheck = (Submission) Optional.ofNullable( +// assignmentCheckRepository.findUnsubmittedAssignmentByUserIdAndAssignmentId(assignmentId, userId) +// ).orElseThrow(() -> new EntityNotFoundException("제출 정보가 존재하지 않습니다.")); // +// List contents = assignmentContentRepository.findAllByUserId(userId); // -// public Object getSubmissionStatus(Long classId, Long assignmentId) { -// List checks = assignmentCheckRepository.findAllByAssignment_AssignmentId(assignmentId); +// List contentIds = contents.stream() +// .map(hello.cluebackend.domain.submissionFile.domain.SubmissionFile::getAssignmentContentId) +// .collect(Collectors.toList()); // -// return checks.stream().map(check -> new AssignmentSubmitStatusDto( -// check.getUser().getUsername(), -// check.getIsSubmitted(), -// check.getSubmittedAt(), -// check.getUser().getUserId(), -// check.getAssignment().getAssignmentId() -// )).toList(); +// return new AssignmentSubmissionDto( +// userId, +// user.getClassCode(), +// user.getUsername(), +// assignmentCheck.getIsSubmitted(), +// assignmentCheck.getSubmittedAt(), +// contentIds +// ); // } + + private UserEntity validated(Long userId, Long classId){ + UserEntity user = userRepository.findById(userId) + .orElseThrow(() -> new EntityNotFoundException("해당 유저를 찾을수 없습니다.")); + + if(!Role.TEACHER.equals(user.getRole())) { + throw new AccessDeniedException("권한이 부족한 사용자 입니다."); + } + + List classRoomUsers = classRoomUserRepository.findByUser_UserId(userId); + + boolean isMemberOfClass = classRoomUsers.stream() + .anyMatch(classRoomUser -> classRoomUser.getClassRoom().getClassRoomId().equals(classId)); + + if (!isMemberOfClass) { + throw new AccessDeniedException("해당 수업에 속하지 않은 사용자입니다."); + } + return user; + } + + private void validateAssignmentDates(LocalDateTime start, LocalDateTime end) { + if (end.isBefore(start)) { + throw new IllegalArgumentException("마감일은 시작일보다 앞설 수 없습니다."); + } + } + + private String calculateRemainingTime(LocalDateTime now, LocalDateTime dueDate) { + Duration duration = Duration.between(now, dueDate); + long days = duration.toDays(); + long hours = duration.minusDays(days).toHours(); + + if (duration.isNegative()) { + return "마감됨"; + } + + return days + "d" + hours + "h"; + } + } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment.java b/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AssignmentAttachment.java similarity index 57% rename from src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment.java rename to src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AssignmentAttachment.java index fe8f4775..bf134461 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment.java +++ b/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AssignmentAttachment.java @@ -1,19 +1,24 @@ -package hello.cluebackend.domain.assignment.domain; +package hello.cluebackend.domain.assignmentAttachment.domain; +import hello.cluebackend.domain.assignment.domain.Assignment; import hello.cluebackend.domain.user.domain.UserEntity; import jakarta.persistence.*; import lombok.*; +import lombok.experimental.SuperBuilder; import java.time.LocalDateTime; @Entity @Table(name = "assignment_attachment") +@Inheritance(strategy = InheritanceType.JOINED) +@DiscriminatorColumn(name = "DTYPE") @Getter @Setter @AllArgsConstructor @NoArgsConstructor -@Builder -public class AssignmentAttachment { +@SuperBuilder +public abstract class AssignmentAttachment { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "assignment_attachment_id") private Long assignmentAttachmentId; @ManyToOne(fetch = FetchType.LAZY) @@ -24,22 +29,6 @@ public class AssignmentAttachment { @JoinColumn(name = "user_id") private UserEntity user; - @Column(name = "original_file_name") - private String originalFileName; - - @Column(name = "stored_file_name") - private String storedFileName; - - @Column(name = "file_path") - private String filePath; - - @Column(name = "file_size") - private Integer fileSize; - - @Enumerated(EnumType.STRING) - @Column(name = "submit_type") - private SubmitType submitType; - @Column(name = "update_date") private LocalDateTime updateDate; } diff --git a/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AttachmentDocument.java b/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AttachmentDocument.java new file mode 100644 index 00000000..5a7734f3 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AttachmentDocument.java @@ -0,0 +1,28 @@ +package hello.cluebackend.domain.assignmentAttachment.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; + +@Entity +@SuperBuilder +@DiscriminatorValue("DOCUMENT") +@Getter @Setter +@NoArgsConstructor +public class AttachmentDocument extends AssignmentAttachment{ + @Column(name = "original_file_name", length = 255) + private String originalFileName; + + @Column(name = "stored_file_name", length = 255) + private String storedFileName; + + @Column(name = "file_path", length = 2000) + private String filePath; + + @Column(name = "file_size") + private long fileSize; +} diff --git a/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AttachmentLink.java b/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AttachmentLink.java new file mode 100644 index 00000000..fba2af48 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AttachmentLink.java @@ -0,0 +1,19 @@ +package hello.cluebackend.domain.assignmentAttachment.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; + +@Entity +@SuperBuilder +@DiscriminatorValue("Link") +@Getter @Setter +@NoArgsConstructor +public class AttachmentLink extends AssignmentAttachment{ + @Column(name = "url", length = 2000) + private String url; +} diff --git a/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/repository/AssignmentAttachmentRepository.java b/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/repository/AssignmentAttachmentRepository.java new file mode 100644 index 00000000..da4db9b0 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/repository/AssignmentAttachmentRepository.java @@ -0,0 +1,9 @@ +package hello.cluebackend.domain.assignmentAttachment.domain.repository; + +import hello.cluebackend.domain.assignmentAttachment.domain.AssignmentAttachment; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface AssignmentAttachmentRepository extends JpaRepository { +} diff --git a/src/main/java/hello/cluebackend/domain/assignmentAttachment/presentation/AssignmentAttachmentController.java b/src/main/java/hello/cluebackend/domain/assignmentAttachment/presentation/AssignmentAttachmentController.java new file mode 100644 index 00000000..04f7bdeb --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignmentAttachment/presentation/AssignmentAttachmentController.java @@ -0,0 +1,44 @@ +package hello.cluebackend.domain.assignmentAttachment.presentation; + +import hello.cluebackend.domain.assignmentAttachment.presentation.dto.request.AssignmentUploadFileDto; +import hello.cluebackend.domain.assignmentAttachment.service.AssignmentAttachmentService; +import hello.cluebackend.global.config.JWTUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import lombok.AllArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/api/assignment/attachment") +@AllArgsConstructor +public class AssignmentAttachmentController { + private final AssignmentAttachmentService assignmentAttachmentService; + private final JWTUtil jwtUtil; + + // 다수의 링크 업로드 API + + + // 다수의 파일 업로드 API + @PostMapping("/upload/{assignmentId}") + public ResponseEntity uploadFiles( + HttpServletRequest request, + @PathVariable Long assignmentId, + @Valid @RequestPart(value = "metadata", required = false) AssignmentUploadFileDto requestDto, + @RequestPart(value = "files", required = false) List files + ){ + try{ + String token = jwtUtil.getToken(request); + Long userId = jwtUtil.getUserId(token); + assignmentAttachmentService.uploadFile(userId,assignmentId,requestDto, files); + return ResponseEntity.status(HttpStatus.CREATED).body(Map.of("message","파일이 성공적으로 업로드 되었습니다.")); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of("message","파일 업로드중 오류가 발생했습니다.")); + } + } +} diff --git a/src/main/java/hello/cluebackend/domain/assignmentAttachment/presentation/dto/request/AssignmentUploadFileDto.java b/src/main/java/hello/cluebackend/domain/assignmentAttachment/presentation/dto/request/AssignmentUploadFileDto.java new file mode 100644 index 00000000..8b9b54c8 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignmentAttachment/presentation/dto/request/AssignmentUploadFileDto.java @@ -0,0 +1,11 @@ +package hello.cluebackend.domain.assignmentAttachment.presentation.dto.request; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter @Setter +public class AssignmentUploadFileDto { + private List urls; +} diff --git a/src/main/java/hello/cluebackend/domain/assignmentAttachment/service/AssignmentAttachmentService.java b/src/main/java/hello/cluebackend/domain/assignmentAttachment/service/AssignmentAttachmentService.java new file mode 100644 index 00000000..aec9e2e2 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignmentAttachment/service/AssignmentAttachmentService.java @@ -0,0 +1,69 @@ +package hello.cluebackend.domain.assignmentAttachment.service; + +import hello.cluebackend.domain.assignment.domain.Assignment; +import hello.cluebackend.domain.assignment.domain.repository.AssignmentRepository; +import hello.cluebackend.domain.assignmentAttachment.domain.AttachmentDocument; +import hello.cluebackend.domain.assignmentAttachment.domain.AttachmentLink; +import hello.cluebackend.domain.assignmentAttachment.domain.repository.AssignmentAttachmentRepository; +import hello.cluebackend.domain.assignmentAttachment.presentation.dto.request.AssignmentUploadFileDto; +import hello.cluebackend.domain.file.service.FileService; +import hello.cluebackend.domain.user.domain.UserEntity; +import hello.cluebackend.domain.user.domain.repository.UserRepository; +import jakarta.persistence.EntityNotFoundException; +import jakarta.validation.Valid; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.time.LocalDateTime; +import java.util.List; + +@Service +public class AssignmentAttachmentService { + private UserRepository userRepository; + private AssignmentRepository assignmentRepository; + private AssignmentAttachmentRepository assignmentAttachmentRepository; + + private FileService fileService; + + public void uploadFile( + Long userId, + Long assignmentId, + @Valid AssignmentUploadFileDto requestDto, + List files + ) { + UserEntity user = userRepository.findById(userId) + .orElseThrow(() -> new EntityNotFoundException("해당 사용자를 찾을수 없습니다.")); + + Assignment assignment = assignmentRepository.findById(assignmentId) + .orElseThrow(() -> new EntityNotFoundException("해당 과제를 찾을수 없습니다.")); + + if (files != null && !files.isEmpty()) { // 파일 일때 + for (MultipartFile sfile : files) { + String storedFileName = fileService.storeFile(sfile); + AttachmentDocument document = AttachmentDocument.builder() + .assignment(assignment) + .user(user) + .originalFileName(sfile.getOriginalFilename()) + .storedFileName(storedFileName) + .filePath("/uploads/assignmentAttachment" + assignment.getClassRoom().getName() + storedFileName) + .fileSize(sfile.getSize()) + .updateDate(LocalDateTime.now()) + .build(); + + assignmentAttachmentRepository.save(document); + } + } + + if(requestDto.getUrls() != null && !requestDto.getUrls().isEmpty()){ // url 일떄 + for (String url : requestDto.getUrls()) { + AttachmentLink link = AttachmentLink.builder() + .assignment(assignment) + .user(user) + .updateDate(LocalDateTime.now()) + .url(url) + .build(); + assignmentAttachmentRepository.save(link); + } + } + } +} diff --git a/src/main/java/hello/cluebackend/domain/file/presentation/FileController.java b/src/main/java/hello/cluebackend/domain/file/presentation/FileController.java new file mode 100644 index 00000000..be15984e --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/file/presentation/FileController.java @@ -0,0 +1,47 @@ +package hello.cluebackend.domain.file.presentation; + +import hello.cluebackend.domain.file.service.FileService; +import hello.cluebackend.global.config.JWTUtil; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.core.io.Resource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping(name = "/api/file") +public class FileController { + + + private final FileService fileService; + private final JWTUtil jWTUtil; + + private Long jwtTokenTaker(HttpServletRequest request){ + String token = jWTUtil.getToken(request); + Long userId = jWTUtil.getUserId(token); + + return userId; + } + + // 선생님 과제 첨부 파일 다운 받기 +// @GetMapping("/attachment/{attachmentId}") +// public ResponseEntity downloadAttachment(@PathVariable Long attachmentId, HttpServletRequest request){ +// Long userId = jwtTokenTaker(request); +// +// Resource file = fileService.downloadFile(attachmentId, userId); +// +// return ResponseEntity.ok() +// .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"downloaded-file\"") +// .contentType(MediaType.APPLICATION_OCTET_STREAM) +// .body(file); +// } + + // 학생 제출 과제 관련 파일 다운 받기 + +} diff --git a/src/main/java/hello/cluebackend/domain/assignment/service/FileService.java b/src/main/java/hello/cluebackend/domain/file/service/FileService.java similarity index 54% rename from src/main/java/hello/cluebackend/domain/assignment/service/FileService.java rename to src/main/java/hello/cluebackend/domain/file/service/FileService.java index 44266083..310078aa 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/service/FileService.java +++ b/src/main/java/hello/cluebackend/domain/file/service/FileService.java @@ -1,11 +1,12 @@ -package hello.cluebackend.domain.assignment.service; +package hello.cluebackend.domain.file.service; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.ObjectMetadata; import com.amazonaws.services.s3.model.PutObjectRequest; import com.amazonaws.services.s3.model.S3Object; -import hello.cluebackend.domain.assignment.domain.AssignmentAttachment; -import hello.cluebackend.domain.assignment.domain.repository.AssignmentAttachmentRepository; +import hello.cluebackend.domain.assignmentAttachment.domain.AssignmentAttachment; +import hello.cluebackend.domain.assignmentAttachment.domain.repository.AssignmentAttachmentRepository; +import jakarta.persistence.EntityNotFoundException; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.InputStreamResource; @@ -47,14 +48,33 @@ public String storeFile(MultipartFile file) { } } - public Resource downloadFile(Long attachmentId, Long userId) { - AssignmentAttachment attachment = assignmentAttachmentRepository.findById(attachmentId) - .orElseThrow(() -> new RuntimeException("파일을 찾을 수 없습니다.")); + // 선생님 과제 첨부 - String filePath = attachment.getFilePath(); - S3Object s3Object = amazonS3Client.getObject(bucket, filePath); + // 선생님 첨부 파일 다운로드 +// public Resource downloadFile(Long attachmentId, Long userId) { +// AssignmentAttachment attachment = assignmentAttachmentRepository.findById(attachmentId) +// .orElseThrow(() -> new RuntimeException("파일을 찾을 수 없습니다.")); +// +// String filePath = attachment.getFilePath(); +// +// S3Object s3Object = amazonS3Client.getObject(bucket, filePath); +// +// return new InputStreamResource(s3Object.getObjectContent()); +// } - return new InputStreamResource(s3Object.getObjectContent()); - } + // 학생 과제 파일 첨부 + + + // 과제 아이디를 가지고 해당 과제 파일 다운로드 +// public Resource downloadStudentAssignmentFile(Long attachmentId, Long userId){ +// AssignmentAttachment attachment = assignmentAttachmentRepository.findById(attachmentId) +// .orElseThrow(() -> new EntityNotFoundException("파일을 찾을 수 없습니다.")); +// +// String filePath = attachment.(); +// +// S3Object s3Object = amazonS3Client.getObject(bucket, filePath); +// +// return new InputStreamResource(s3Object.getObjectContent()); +// } } diff --git a/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentCheck.java b/src/main/java/hello/cluebackend/domain/submission/domain/Submission.java similarity index 54% rename from src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentCheck.java rename to src/main/java/hello/cluebackend/domain/submission/domain/Submission.java index b83ee612..6e9162da 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentCheck.java +++ b/src/main/java/hello/cluebackend/domain/submission/domain/Submission.java @@ -1,32 +1,39 @@ -package hello.cluebackend.domain.assignment.domain; +package hello.cluebackend.domain.submission.domain; +import hello.cluebackend.domain.assignment.domain.Assignment; +import hello.cluebackend.domain.submissionFile.domain.SubmissionFile; import hello.cluebackend.domain.user.domain.UserEntity; import jakarta.persistence.*; import lombok.*; import java.time.LocalDateTime; +import java.util.List; @Entity -@Table(name="assignment_check") +@Table(name = "Submission") @Getter @Setter @AllArgsConstructor @NoArgsConstructor @Builder -public class AssignmentCheck { +public class Submission { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long assignmentCheckId; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id") - private UserEntity user; + @Column(name = "submission_id") + private Long submissionId; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "assignment_id") private Assignment assignment; - @Column(name="is_submitted") + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private UserEntity user; + + @Column(name = "is_submitted") private Boolean isSubmitted; - @Column(name="submitted_at") + @Column(name = "submitted_at") private LocalDateTime submittedAt; + + @OneToMany + private List assignmentContents; } diff --git a/src/main/java/hello/cluebackend/domain/submission/domain/repository/SubmissionRepository.java b/src/main/java/hello/cluebackend/domain/submission/domain/repository/SubmissionRepository.java new file mode 100644 index 00000000..2ecada8a --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/submission/domain/repository/SubmissionRepository.java @@ -0,0 +1,29 @@ +package hello.cluebackend.domain.submission.domain.repository; + +import hello.cluebackend.domain.assignment.domain.Assignment; +import hello.cluebackend.domain.submission.domain.Submission; +import hello.cluebackend.domain.user.domain.UserEntity; +import io.lettuce.core.dynamic.annotation.Param; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface SubmissionRepository extends JpaRepository { + @Query(""" +SELECT s.assignment +FROM Submission s +JOIN s.assignment a +JOIN a.classRoom cr +JOIN cr.classRoomUserList cru +WHERE s.user.userId = :userId + AND s.isSubmitted = false +""") + + List findUnsubmittedAssignmentsByUserId(@Param("userId") Long userId); + List findAllByAssignment(Assignment assignment); + List user(UserEntity user); + Object findUnsubmittedAssignmentByUserIdAndAssignmentId(Long assignmentId, Long userId); +} diff --git a/src/main/java/hello/cluebackend/domain/submission/presentation/SubmissionController.java b/src/main/java/hello/cluebackend/domain/submission/presentation/SubmissionController.java new file mode 100644 index 00000000..f6e95382 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/submission/presentation/SubmissionController.java @@ -0,0 +1,4 @@ +package hello.cluebackend.domain.submission.presentation; + +public class SubmissionController { +} diff --git a/src/main/java/hello/cluebackend/domain/submission/service/SubmissionService.java b/src/main/java/hello/cluebackend/domain/submission/service/SubmissionService.java new file mode 100644 index 00000000..c27a7909 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/submission/service/SubmissionService.java @@ -0,0 +1,29 @@ +package hello.cluebackend.domain.submission.service; + +import hello.cluebackend.domain.assignment.domain.Assignment; +import hello.cluebackend.domain.submission.domain.Submission; +import hello.cluebackend.domain.submission.domain.repository.SubmissionRepository; +import hello.cluebackend.domain.user.domain.UserEntity; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class SubmissionService { + private SubmissionRepository submissionRepository; + + // 학생에게 과제 할당하는 메서드 + public void createSubmissionsForStudents(Assignment assignment, List students) { + List submissions = students.stream() + .map(student -> Submission.builder() + .assignment(assignment) + .user(student) + .isSubmitted(false) + .submittedAt(null) + .build()) + .toList(); + + submissionRepository.saveAll(submissions); + } + +} diff --git a/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionDocument.java b/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionDocument.java new file mode 100644 index 00000000..249604bb --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionDocument.java @@ -0,0 +1,26 @@ +package hello.cluebackend.domain.submissionFile.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; +import jakarta.persistence.JoinColumn; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@Entity +@DiscriminatorValue("Document") +@SuperBuilder +@NoArgsConstructor +public class SubmissionDocument extends SubmissionFile { + @JoinColumn(name="original_file_name") + private String originalFileName; + + @Column(name="stored_file_name") + private String storedFileName; + + @Column(name="file_path") + private String filePath; + + @Column(name="file_size") + private int fileSize; +} diff --git a/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentContent.java b/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionFile.java similarity index 53% rename from src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentContent.java rename to src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionFile.java index e85b0357..eadc0487 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentContent.java +++ b/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionFile.java @@ -1,46 +1,39 @@ -package hello.cluebackend.domain.assignment.domain; +package hello.cluebackend.domain.submissionFile.domain; +import hello.cluebackend.domain.assignment.domain.Assignment; +import hello.cluebackend.domain.submission.domain.Submission; import hello.cluebackend.domain.user.domain.UserEntity; import jakarta.persistence.*; import lombok.*; +import lombok.experimental.SuperBuilder; import java.time.LocalDateTime; @Entity @Table(name = "assignment_content") +@Inheritance(strategy = InheritanceType.JOINED) +@DiscriminatorColumn(name = "DTYPE") @Getter @Setter @AllArgsConstructor @NoArgsConstructor -@Builder -public class AssignmentContent { +@SuperBuilder +public abstract class SubmissionFile { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name="assignment_content_id") + @Column(name="submission_file_id") private Long assignmentContentId; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="user_id") private UserEntity user; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name="submission_id") + private Submission assignmentCheck; + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="assignment_id") private Assignment assignment; - @JoinColumn(name="original_file_name") - private String originalFileName; - - @Column(name="stored_file_name") - private String storedFileName; - - @Column(name="file_path") - private String filePath; - - @Column(name="file_size") - private int fileSize; - - @Enumerated(EnumType.STRING) - @Column(name = "submit_type") - private SubmitType submitType; // 1. 랑크 , 2. 파일 - @Column(name="update_date") private LocalDateTime updateDate; -} +} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionLink.java b/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionLink.java new file mode 100644 index 00000000..a73382e6 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionLink.java @@ -0,0 +1,14 @@ +package hello.cluebackend.domain.submissionFile.domain; + +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@Entity +@DiscriminatorValue("Link") +@SuperBuilder +@NoArgsConstructor +public class SubmissionLink extends SubmissionFile { + private String url; +} diff --git a/src/main/java/hello/cluebackend/domain/submissionFile/domain/repository/SubmissionFile.java b/src/main/java/hello/cluebackend/domain/submissionFile/domain/repository/SubmissionFile.java new file mode 100644 index 00000000..df9fcf16 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/submissionFile/domain/repository/SubmissionFile.java @@ -0,0 +1,11 @@ +package hello.cluebackend.domain.submissionFile.domain.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface SubmissionFile extends JpaRepository { + List findAllByUserId(Long userId); +} diff --git a/src/main/java/hello/cluebackend/domain/submissionFile/presentation/SubmissionFileController.java b/src/main/java/hello/cluebackend/domain/submissionFile/presentation/SubmissionFileController.java new file mode 100644 index 00000000..69cd0f42 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/submissionFile/presentation/SubmissionFileController.java @@ -0,0 +1,4 @@ +package hello.cluebackend.domain.submissionFile.presentation; + +public class SubmissionFileController { +} diff --git a/src/main/java/hello/cluebackend/domain/submissionFile/service/SubmissionFileService.java b/src/main/java/hello/cluebackend/domain/submissionFile/service/SubmissionFileService.java new file mode 100644 index 00000000..a99b876e --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/submissionFile/service/SubmissionFileService.java @@ -0,0 +1,4 @@ +package hello.cluebackend.domain.submissionFile.service; + +public class SubmissionFileService { +} diff --git a/src/main/java/hello/cluebackend/domain/user/domain/UserEntity.java b/src/main/java/hello/cluebackend/domain/user/domain/UserEntity.java index 9cbc1177..5593b7be 100644 --- a/src/main/java/hello/cluebackend/domain/user/domain/UserEntity.java +++ b/src/main/java/hello/cluebackend/domain/user/domain/UserEntity.java @@ -57,7 +57,6 @@ public UserEntity(int classCode, String username, String email, Role role) { } public UserDto toUserDTO() { -// return new UserDto(userId, email, role, username, classCode); return UserDto.builder() .userId(userId) .classCode(classCode) diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 0fdbda49..6230c292 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -11,7 +11,7 @@ spring: database-platform: org.hibernate.dialect.PostgreSQLDialect show-sql: true hibernate: - ddl-auto: update + ddl-auto: create data: redis: # host: my_redis From 4c6e0e277072c2ca3c7ee1af0f22fa9e4fbe4a4b Mon Sep 17 00:00:00 2001 From: Haeyul Date: Sun, 3 Aug 2025 01:04:43 +0900 Subject: [PATCH 02/22] =?UTF-8?q?feat(#5):=20=EA=B3=BC=EC=A0=9C=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20API=20=EC=A0=9C=EC=9E=91=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/assignment/domain/Assignment.java | 8 +- .../repository/AssignmentRepository.java | 3 - .../presentation/AssignmentController.java | 11 +- .../dto/AssignmentAttachmentDto.java | 8 +- .../request/AssignmentCreateRequestDto.java | 20 ++- .../request/AssignmentModifyRequestDto.java | 14 -- .../request/AssignmentSubmitStatusDto.java | 12 -- .../assignment/service/AssignmentService.java | 21 +-- .../domain/AssignmentAttachment.java | 68 ++++---- .../domain/AttachmentDocument.java | 56 +++---- .../domain/AttachmentLink.java | 38 ++--- .../AssignmentAttachmentRepository.java | 18 +-- .../AssignmentAttachmentController.java | 88 +++++------ .../service/AssignmentAttachmentService.java | 138 ++++++++--------- .../presentation/ClassRoomController.java | 2 - .../file/presentation/FileController.java | 92 +++++------ .../domain/file/service/FileService.java | 146 +++++++++--------- .../domain/submission/domain/Submission.java | 78 +++++----- .../repository/SubmissionRepository.java | 58 +++---- .../presentation/SubmissionController.java | 13 +- .../submission/service/SubmissionService.java | 58 +++---- .../domain/SubmissionDocument.java | 52 +++---- .../submissionFile/domain/SubmissionFile.java | 78 +++++----- .../submissionFile/domain/SubmissionLink.java | 28 ++-- .../domain/repository/SubmissionFile.java | 22 +-- .../SubmissionFileController.java | 13 +- .../service/SubmissionFileService.java | 11 +- .../domain/user/domain/UserEntity.java | 2 +- src/main/resources/application.yaml | 6 +- 29 files changed, 570 insertions(+), 592 deletions(-) delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/presentation/dto/request/AssignmentModifyRequestDto.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/presentation/dto/request/AssignmentSubmitStatusDto.java diff --git a/src/main/java/hello/cluebackend/domain/assignment/domain/Assignment.java b/src/main/java/hello/cluebackend/domain/assignment/domain/Assignment.java index 88a42b69..d9c7a989 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/domain/Assignment.java +++ b/src/main/java/hello/cluebackend/domain/assignment/domain/Assignment.java @@ -1,6 +1,5 @@ package hello.cluebackend.domain.assignment.domain; -import hello.cluebackend.domain.assignment.presentation.dto.AssignmentAttachmentDto; import hello.cluebackend.domain.classroom.domain.ClassRoom; import hello.cluebackend.domain.user.domain.UserEntity; import jakarta.persistence.*; @@ -11,19 +10,18 @@ @Entity @Table(name = "Assignment") @Getter @Setter -@AllArgsConstructor -@NoArgsConstructor +@AllArgsConstructor @NoArgsConstructor @Builder public class Assignment { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "assignment_id") private Long assignmentId; - @ManyToOne(fetch = FetchType.LAZY) + @ManyToOne @JoinColumn(name = "classroom_id") private ClassRoom classRoom; - @ManyToOne(fetch = FetchType.LAZY) + @ManyToOne @JoinColumn(name = "user_id") private UserEntity user; diff --git a/src/main/java/hello/cluebackend/domain/assignment/domain/repository/AssignmentRepository.java b/src/main/java/hello/cluebackend/domain/assignment/domain/repository/AssignmentRepository.java index 238ce2c0..bd82e90d 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/domain/repository/AssignmentRepository.java +++ b/src/main/java/hello/cluebackend/domain/assignment/domain/repository/AssignmentRepository.java @@ -4,9 +4,6 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; -import java.util.List; - @Repository public interface AssignmentRepository extends JpaRepository { - List findAllByClassRoom_ClassRoomId(Long classId); } diff --git a/src/main/java/hello/cluebackend/domain/assignment/presentation/AssignmentController.java b/src/main/java/hello/cluebackend/domain/assignment/presentation/AssignmentController.java index 96a85a4b..10b4e33f 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/presentation/AssignmentController.java +++ b/src/main/java/hello/cluebackend/domain/assignment/presentation/AssignmentController.java @@ -1,5 +1,6 @@ package hello.cluebackend.domain.assignment.presentation; +import hello.cluebackend.domain.assignment.domain.Assignment; import hello.cluebackend.domain.assignment.presentation.dto.request.AssignmentCreateRequestDto; import hello.cluebackend.domain.assignment.service.AssignmentService; import hello.cluebackend.global.config.JWTUtil; @@ -10,7 +11,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import java.util.Map; @RestController @RequiredArgsConstructor @@ -21,7 +21,7 @@ public class AssignmentController { // 선생님 과제 생성하기 @PostMapping("/create/{classId}") - public ResponseEntity createAssignment( + public ResponseEntity createAssignment( HttpServletRequest request, @PathVariable Long classId, @Valid @RequestBody AssignmentCreateRequestDto requestDto @@ -29,10 +29,11 @@ public ResponseEntity createAssignment( try{ String token = jWTUtil.getToken(request); Long userId = jWTUtil.getUserId(token); - assignmentService.createAssignment(userId, classId, requestDto); - return ResponseEntity.status(HttpStatus.CREATED).body(Map.of("message","과제가 성공적으로 생성되었습니다.")); + Assignment createAssignment = assignmentService.createAssignment(userId, classId, requestDto); + return new ResponseEntity<>(createAssignment, HttpStatus.CREATED); } catch (Exception e) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of("message","과제 생성중 오류가 발했습니다.")); + e.printStackTrace(); + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } } diff --git a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/AssignmentAttachmentDto.java b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/AssignmentAttachmentDto.java index 0114b0d6..1dcdee86 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/AssignmentAttachmentDto.java +++ b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/AssignmentAttachmentDto.java @@ -1,16 +1,13 @@ package hello.cluebackend.domain.assignment.presentation.dto; import hello.cluebackend.domain.assignment.domain.Assignment; -import hello.cluebackend.domain.assignment.domain.SubmitType; import hello.cluebackend.domain.user.domain.UserEntity; import lombok.*; import java.time.LocalDateTime; -@Getter -@Setter -@ToString -@Builder +@Getter @Setter +@ToString @Builder @NoArgsConstructor @AllArgsConstructor public class AssignmentAttachmentDto { @@ -21,6 +18,5 @@ public class AssignmentAttachmentDto { private String storedFileName; private String filePath; private Integer fileSize; - private SubmitType submitType; private LocalDateTime updateDate; } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/request/AssignmentCreateRequestDto.java b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/request/AssignmentCreateRequestDto.java index fc96c8dd..bf22b2aa 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/request/AssignmentCreateRequestDto.java +++ b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/request/AssignmentCreateRequestDto.java @@ -2,23 +2,29 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; +import lombok.Builder; import lombok.Getter; -import lombok.Setter; import java.time.LocalDateTime; -import java.util.List; -@Getter @Setter +@Getter public class AssignmentCreateRequestDto { @NotBlank(message = "과제 제목은 필수입니다.") private String title; - private String content; - @NotBlank(message = "시작 일자는 필수입니다.") - private LocalDateTime startData; + @NotNull(message = "시작 일자는 필수입니다.") + private LocalDateTime startDate; - @NotBlank(message = "마감일은 필수입니다.") + @NotNull(message = "마감일은 필수입니다.") private LocalDateTime endDate; + + @Builder + public AssignmentCreateRequestDto(String title, String content, LocalDateTime startDate, LocalDateTime endDate){ + this.title = title; + this.content = content; + this.startDate = startDate; + this.endDate = endDate; + } } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/request/AssignmentModifyRequestDto.java b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/request/AssignmentModifyRequestDto.java deleted file mode 100644 index 4930cdbe..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/request/AssignmentModifyRequestDto.java +++ /dev/null @@ -1,14 +0,0 @@ -package hello.cluebackend.domain.assignment.presentation.dto.request; - -import lombok.Getter; -import lombok.Setter; - -import java.time.LocalDateTime; - -@Getter @Setter -public class AssignmentModifyRequestDto { - private String title; - private String Content; - private LocalDateTime startDate; - private LocalDateTime endDate; -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/request/AssignmentSubmitStatusDto.java b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/request/AssignmentSubmitStatusDto.java deleted file mode 100644 index 71c2b38a..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/request/AssignmentSubmitStatusDto.java +++ /dev/null @@ -1,12 +0,0 @@ -package hello.cluebackend.domain.assignment.presentation.dto.request; - -import java.time.LocalDateTime; - -public record AssignmentSubmitStatusDto( - String userName, - boolean isSubmitted, - LocalDateTime submittedAt, - Long userId, - Long assignmentId -) { -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/service/AssignmentService.java b/src/main/java/hello/cluebackend/domain/assignment/service/AssignmentService.java index 4b36c19d..5ca0e6f5 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/service/AssignmentService.java +++ b/src/main/java/hello/cluebackend/domain/assignment/service/AssignmentService.java @@ -3,15 +3,10 @@ import hello.cluebackend.domain.assignment.domain.Assignment; import hello.cluebackend.domain.assignment.domain.repository.AssignmentRepository; import hello.cluebackend.domain.assignment.presentation.dto.request.AssignmentCreateRequestDto; -import hello.cluebackend.domain.assignmentAttachment.domain.repository.AssignmentAttachmentRepository; -import hello.cluebackend.domain.assignmentAttachment.service.AssignmentAttachmentService; import hello.cluebackend.domain.classroom.domain.ClassRoom; import hello.cluebackend.domain.classroom.domain.repository.ClassRoomRepository; import hello.cluebackend.domain.classroomuser.domain.ClassRoomUser; import hello.cluebackend.domain.classroomuser.domain.repository.ClassRoomUserRepository; -import hello.cluebackend.domain.submission.domain.Submission; -import hello.cluebackend.domain.submission.domain.repository.SubmissionRepository; -import hello.cluebackend.domain.submission.service.SubmissionService; import hello.cluebackend.domain.user.domain.Role; import hello.cluebackend.domain.user.domain.UserEntity; import hello.cluebackend.domain.user.domain.repository.UserRepository; @@ -19,7 +14,6 @@ import lombok.RequiredArgsConstructor; import org.springframework.security.access.AccessDeniedException; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.time.Duration; import java.time.LocalDateTime; @@ -32,27 +26,28 @@ public class AssignmentService { private final ClassRoomUserRepository classRoomUserRepository; private final AssignmentRepository assignmentRepository; private final ClassRoomRepository classRoomRepository; - private final SubmissionService submissionService; - public void createAssignment(Long userId, Long classId, AssignmentCreateRequestDto requestDto) { - UserEntity user = validated(classId, userId); + public Assignment createAssignment(Long userId, Long classId, AssignmentCreateRequestDto requestDto) { + UserEntity user = validated(userId, classId); ClassRoom classRoom = classRoomRepository.findById(classId) .orElseThrow(() -> new EntityNotFoundException("해당 수업은 찾을수 없습니다.")); - validateAssignmentDates(requestDto.getStartData(), requestDto.getEndDate()); + validateAssignmentDates(requestDto.getStartDate(), requestDto.getEndDate()); Assignment assignment = Assignment.builder() .classRoom(classRoom) .user(user) .title(requestDto.getTitle()) .content(requestDto.getContent()) - .startDate(requestDto.getStartData()) + .startDate(requestDto.getStartDate()) .endDate(requestDto.getEndDate()) .build(); assignmentRepository.save(assignment); - List students = classRoomUserRepository.findAllStudentsByClassRoomId(classId); - submissionService.createSubmissionsForStudents(assignment, students); + return assignment; + +// List students = classRoomUserRepository.findAllStudentsByClassRoomId(classId); +// submissionService.createSubmissionsForStudents(assignment, students); } // diff --git a/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AssignmentAttachment.java b/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AssignmentAttachment.java index bf134461..63594d83 100644 --- a/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AssignmentAttachment.java +++ b/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AssignmentAttachment.java @@ -1,34 +1,34 @@ -package hello.cluebackend.domain.assignmentAttachment.domain; - -import hello.cluebackend.domain.assignment.domain.Assignment; -import hello.cluebackend.domain.user.domain.UserEntity; -import jakarta.persistence.*; -import lombok.*; -import lombok.experimental.SuperBuilder; - -import java.time.LocalDateTime; - -@Entity -@Table(name = "assignment_attachment") -@Inheritance(strategy = InheritanceType.JOINED) -@DiscriminatorColumn(name = "DTYPE") -@Getter @Setter -@AllArgsConstructor -@NoArgsConstructor -@SuperBuilder -public abstract class AssignmentAttachment { - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "assignment_attachment_id") - private Long assignmentAttachmentId; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name="assignment_id") - private Assignment assignment; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id") - private UserEntity user; - - @Column(name = "update_date") - private LocalDateTime updateDate; -} +//package hello.cluebackend.domain.assignmentAttachment.domain; +// +//import hello.cluebackend.domain.assignment.domain.Assignment; +//import hello.cluebackend.domain.user.domain.UserEntity; +//import jakarta.persistence.*; +//import lombok.*; +//import lombok.experimental.SuperBuilder; +// +//import java.time.LocalDateTime; +// +//@Entity +//@Table(name = "assignment_attachment") +//@Inheritance(strategy = InheritanceType.JOINED) +//@DiscriminatorColumn(name = "DTYPE") +//@Getter @Setter +//@AllArgsConstructor +//@NoArgsConstructor +//@SuperBuilder +//public abstract class AssignmentAttachment { +// @Id @GeneratedValue(strategy = GenerationType.IDENTITY) +// @Column(name = "assignment_attachment_id") +// private Long assignmentAttachmentId; +// +// @ManyToOne(fetch = FetchType.LAZY) +// @JoinColumn(name="assignment_id") +// private Assignment assignment; +// +// @ManyToOne(fetch = FetchType.LAZY) +// @JoinColumn(name = "user_id") +// private UserEntity user; +// +// @Column(name = "update_date") +// private LocalDateTime updateDate; +//} diff --git a/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AttachmentDocument.java b/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AttachmentDocument.java index 5a7734f3..126aa71f 100644 --- a/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AttachmentDocument.java +++ b/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AttachmentDocument.java @@ -1,28 +1,28 @@ -package hello.cluebackend.domain.assignmentAttachment.domain; - -import jakarta.persistence.Column; -import jakarta.persistence.DiscriminatorValue; -import jakarta.persistence.Entity; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.experimental.SuperBuilder; - -@Entity -@SuperBuilder -@DiscriminatorValue("DOCUMENT") -@Getter @Setter -@NoArgsConstructor -public class AttachmentDocument extends AssignmentAttachment{ - @Column(name = "original_file_name", length = 255) - private String originalFileName; - - @Column(name = "stored_file_name", length = 255) - private String storedFileName; - - @Column(name = "file_path", length = 2000) - private String filePath; - - @Column(name = "file_size") - private long fileSize; -} +//package hello.cluebackend.domain.assignmentAttachment.domain; +// +//import jakarta.persistence.Column; +//import jakarta.persistence.DiscriminatorValue; +//import jakarta.persistence.Entity; +//import lombok.Getter; +//import lombok.NoArgsConstructor; +//import lombok.Setter; +//import lombok.experimental.SuperBuilder; +// +//@Entity +//@SuperBuilder +//@DiscriminatorValue("DOCUMENT") +//@Getter @Setter +//@NoArgsConstructor +//public class AttachmentDocument extends AssignmentAttachment{ +// @Column(name = "original_file_name", length = 255) +// private String originalFileName; +// +// @Column(name = "stored_file_name", length = 255) +// private String storedFileName; +// +// @Column(name = "file_path", length = 2000) +// private String filePath; +// +// @Column(name = "file_size") +// private long fileSize; +//} diff --git a/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AttachmentLink.java b/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AttachmentLink.java index fba2af48..59370138 100644 --- a/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AttachmentLink.java +++ b/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AttachmentLink.java @@ -1,19 +1,19 @@ -package hello.cluebackend.domain.assignmentAttachment.domain; - -import jakarta.persistence.Column; -import jakarta.persistence.DiscriminatorValue; -import jakarta.persistence.Entity; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.experimental.SuperBuilder; - -@Entity -@SuperBuilder -@DiscriminatorValue("Link") -@Getter @Setter -@NoArgsConstructor -public class AttachmentLink extends AssignmentAttachment{ - @Column(name = "url", length = 2000) - private String url; -} +//package hello.cluebackend.domain.assignmentAttachment.domain; +// +//import jakarta.persistence.Column; +//import jakarta.persistence.DiscriminatorValue; +//import jakarta.persistence.Entity; +//import lombok.Getter; +//import lombok.NoArgsConstructor; +//import lombok.Setter; +//import lombok.experimental.SuperBuilder; +// +//@Entity +//@SuperBuilder +//@DiscriminatorValue("Link") +//@Getter @Setter +//@NoArgsConstructor +//public class AttachmentLink extends AssignmentAttachment{ +// @Column(name = "url", length = 2000) +// private String url; +//} diff --git a/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/repository/AssignmentAttachmentRepository.java b/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/repository/AssignmentAttachmentRepository.java index da4db9b0..52d8d668 100644 --- a/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/repository/AssignmentAttachmentRepository.java +++ b/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/repository/AssignmentAttachmentRepository.java @@ -1,9 +1,9 @@ -package hello.cluebackend.domain.assignmentAttachment.domain.repository; - -import hello.cluebackend.domain.assignmentAttachment.domain.AssignmentAttachment; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface AssignmentAttachmentRepository extends JpaRepository { -} +//package hello.cluebackend.domain.assignmentAttachment.domain.repository; +// +//import hello.cluebackend.domain.assignmentAttachment.domain.AssignmentAttachment; +//import org.springframework.data.jpa.repository.JpaRepository; +//import org.springframework.stereotype.Repository; +// +//@Repository +//public interface AssignmentAttachmentRepository extends JpaRepository { +//} diff --git a/src/main/java/hello/cluebackend/domain/assignmentAttachment/presentation/AssignmentAttachmentController.java b/src/main/java/hello/cluebackend/domain/assignmentAttachment/presentation/AssignmentAttachmentController.java index 04f7bdeb..09bf6510 100644 --- a/src/main/java/hello/cluebackend/domain/assignmentAttachment/presentation/AssignmentAttachmentController.java +++ b/src/main/java/hello/cluebackend/domain/assignmentAttachment/presentation/AssignmentAttachmentController.java @@ -1,44 +1,44 @@ -package hello.cluebackend.domain.assignmentAttachment.presentation; - -import hello.cluebackend.domain.assignmentAttachment.presentation.dto.request.AssignmentUploadFileDto; -import hello.cluebackend.domain.assignmentAttachment.service.AssignmentAttachmentService; -import hello.cluebackend.global.config.JWTUtil; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.validation.Valid; -import lombok.AllArgsConstructor; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import java.util.List; -import java.util.Map; - -@RestController -@RequestMapping("/api/assignment/attachment") -@AllArgsConstructor -public class AssignmentAttachmentController { - private final AssignmentAttachmentService assignmentAttachmentService; - private final JWTUtil jwtUtil; - - // 다수의 링크 업로드 API - - - // 다수의 파일 업로드 API - @PostMapping("/upload/{assignmentId}") - public ResponseEntity uploadFiles( - HttpServletRequest request, - @PathVariable Long assignmentId, - @Valid @RequestPart(value = "metadata", required = false) AssignmentUploadFileDto requestDto, - @RequestPart(value = "files", required = false) List files - ){ - try{ - String token = jwtUtil.getToken(request); - Long userId = jwtUtil.getUserId(token); - assignmentAttachmentService.uploadFile(userId,assignmentId,requestDto, files); - return ResponseEntity.status(HttpStatus.CREATED).body(Map.of("message","파일이 성공적으로 업로드 되었습니다.")); - } catch (Exception e) { - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of("message","파일 업로드중 오류가 발생했습니다.")); - } - } -} +//package hello.cluebackend.domain.assignmentAttachment.presentation; +// +//import hello.cluebackend.domain.assignmentAttachment.presentation.dto.request.AssignmentUploadFileDto; +//import hello.cluebackend.domain.assignmentAttachment.service.AssignmentAttachmentService; +//import hello.cluebackend.global.config.JWTUtil; +//import jakarta.servlet.http.HttpServletRequest; +//import jakarta.validation.Valid; +//import lombok.AllArgsConstructor; +//import org.springframework.http.HttpStatus; +//import org.springframework.http.ResponseEntity; +//import org.springframework.web.bind.annotation.*; +//import org.springframework.web.multipart.MultipartFile; +// +//import java.util.List; +//import java.util.Map; +// +//@RestController +//@RequestMapping("/api/assignment/attachment") +//@AllArgsConstructor +//public class AssignmentAttachmentController { +// private final AssignmentAttachmentService assignmentAttachmentService; +// private final JWTUtil jwtUtil; +// +// // 다수의 링크 업로드 API +// +// +// // 다수의 파일 업로드 API +// @PostMapping("/upload/{assignmentId}") +// public ResponseEntity uploadFiles( +// HttpServletRequest request, +// @PathVariable Long assignmentId, +// @Valid @RequestPart(value = "metadata", required = false) AssignmentUploadFileDto requestDto, +// @RequestPart(value = "files", required = false) List files +// ){ +// try{ +// String token = jwtUtil.getToken(request); +// Long userId = jwtUtil.getUserId(token); +// assignmentAttachmentService.uploadFile(userId,assignmentId,requestDto, files); +// return ResponseEntity.status(HttpStatus.CREATED).body(Map.of("message","파일이 성공적으로 업로드 되었습니다.")); +// } catch (Exception e) { +// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of("message","파일 업로드중 오류가 발생했습니다.")); +// } +// } +//} diff --git a/src/main/java/hello/cluebackend/domain/assignmentAttachment/service/AssignmentAttachmentService.java b/src/main/java/hello/cluebackend/domain/assignmentAttachment/service/AssignmentAttachmentService.java index aec9e2e2..bbae6f20 100644 --- a/src/main/java/hello/cluebackend/domain/assignmentAttachment/service/AssignmentAttachmentService.java +++ b/src/main/java/hello/cluebackend/domain/assignmentAttachment/service/AssignmentAttachmentService.java @@ -1,69 +1,69 @@ -package hello.cluebackend.domain.assignmentAttachment.service; - -import hello.cluebackend.domain.assignment.domain.Assignment; -import hello.cluebackend.domain.assignment.domain.repository.AssignmentRepository; -import hello.cluebackend.domain.assignmentAttachment.domain.AttachmentDocument; -import hello.cluebackend.domain.assignmentAttachment.domain.AttachmentLink; -import hello.cluebackend.domain.assignmentAttachment.domain.repository.AssignmentAttachmentRepository; -import hello.cluebackend.domain.assignmentAttachment.presentation.dto.request.AssignmentUploadFileDto; -import hello.cluebackend.domain.file.service.FileService; -import hello.cluebackend.domain.user.domain.UserEntity; -import hello.cluebackend.domain.user.domain.repository.UserRepository; -import jakarta.persistence.EntityNotFoundException; -import jakarta.validation.Valid; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - -import java.time.LocalDateTime; -import java.util.List; - -@Service -public class AssignmentAttachmentService { - private UserRepository userRepository; - private AssignmentRepository assignmentRepository; - private AssignmentAttachmentRepository assignmentAttachmentRepository; - - private FileService fileService; - - public void uploadFile( - Long userId, - Long assignmentId, - @Valid AssignmentUploadFileDto requestDto, - List files - ) { - UserEntity user = userRepository.findById(userId) - .orElseThrow(() -> new EntityNotFoundException("해당 사용자를 찾을수 없습니다.")); - - Assignment assignment = assignmentRepository.findById(assignmentId) - .orElseThrow(() -> new EntityNotFoundException("해당 과제를 찾을수 없습니다.")); - - if (files != null && !files.isEmpty()) { // 파일 일때 - for (MultipartFile sfile : files) { - String storedFileName = fileService.storeFile(sfile); - AttachmentDocument document = AttachmentDocument.builder() - .assignment(assignment) - .user(user) - .originalFileName(sfile.getOriginalFilename()) - .storedFileName(storedFileName) - .filePath("/uploads/assignmentAttachment" + assignment.getClassRoom().getName() + storedFileName) - .fileSize(sfile.getSize()) - .updateDate(LocalDateTime.now()) - .build(); - - assignmentAttachmentRepository.save(document); - } - } - - if(requestDto.getUrls() != null && !requestDto.getUrls().isEmpty()){ // url 일떄 - for (String url : requestDto.getUrls()) { - AttachmentLink link = AttachmentLink.builder() - .assignment(assignment) - .user(user) - .updateDate(LocalDateTime.now()) - .url(url) - .build(); - assignmentAttachmentRepository.save(link); - } - } - } -} +//package hello.cluebackend.domain.assignmentAttachment.service; +// +//import hello.cluebackend.domain.assignment.domain.Assignment; +//import hello.cluebackend.domain.assignment.domain.repository.AssignmentRepository; +//import hello.cluebackend.domain.assignmentAttachment.domain.AttachmentDocument; +//import hello.cluebackend.domain.assignmentAttachment.domain.AttachmentLink; +//import hello.cluebackend.domain.assignmentAttachment.domain.repository.AssignmentAttachmentRepository; +//import hello.cluebackend.domain.assignmentAttachment.presentation.dto.request.AssignmentUploadFileDto; +//import hello.cluebackend.domain.file.service.FileService; +//import hello.cluebackend.domain.user.domain.UserEntity; +//import hello.cluebackend.domain.user.domain.repository.UserRepository; +//import jakarta.persistence.EntityNotFoundException; +//import jakarta.validation.Valid; +//import org.springframework.stereotype.Service; +//import org.springframework.web.multipart.MultipartFile; +// +//import java.time.LocalDateTime; +//import java.util.List; +// +//@Service +//public class AssignmentAttachmentService { +// private UserRepository userRepository; +// private AssignmentRepository assignmentRepository; +// private AssignmentAttachmentRepository assignmentAttachmentRepository; +// +// private FileService fileService; +// +// public void uploadFile( +// Long userId, +// Long assignmentId, +// @Valid AssignmentUploadFileDto requestDto, +// List files +// ) { +// UserEntity user = userRepository.findById(userId) +// .orElseThrow(() -> new EntityNotFoundException("해당 사용자를 찾을수 없습니다.")); +// +// Assignment assignment = assignmentRepository.findById(assignmentId) +// .orElseThrow(() -> new EntityNotFoundException("해당 과제를 찾을수 없습니다.")); +// +// if (files != null && !files.isEmpty()) { // 파일 일때 +// for (MultipartFile sfile : files) { +// String storedFileName = fileService.storeFile(sfile); +// AttachmentDocument document = AttachmentDocument.builder() +// .assignment(assignment) +// .user(user) +// .originalFileName(sfile.getOriginalFilename()) +// .storedFileName(storedFileName) +// .filePath("/uploads/assignmentAttachment" + assignment.getClassRoom().getName() + storedFileName) +// .fileSize(sfile.getSize()) +// .updateDate(LocalDateTime.now()) +// .build(); +// +// assignmentAttachmentRepository.save(document); +// } +// } +// +// if(requestDto.getUrls() != null && !requestDto.getUrls().isEmpty()){ // url 일떄 +// for (String url : requestDto.getUrls()) { +// AttachmentLink link = AttachmentLink.builder() +// .assignment(assignment) +// .user(user) +// .updateDate(LocalDateTime.now()) +// .url(url) +// .build(); +// assignmentAttachmentRepository.save(link); +// } +// } +// } +//} diff --git a/src/main/java/hello/cluebackend/domain/classroom/presentation/ClassRoomController.java b/src/main/java/hello/cluebackend/domain/classroom/presentation/ClassRoomController.java index a2d8b445..3a023274 100644 --- a/src/main/java/hello/cluebackend/domain/classroom/presentation/ClassRoomController.java +++ b/src/main/java/hello/cluebackend/domain/classroom/presentation/ClassRoomController.java @@ -4,8 +4,6 @@ import hello.cluebackend.domain.classroom.presentation.dto.ClassRoomDto; import hello.cluebackend.domain.classroom.service.ClassRoomService; import hello.cluebackend.domain.user.domain.Role; -import hello.cluebackend.domain.user.presentation.dto.UserDto; -import hello.cluebackend.domain.user.service.UserService; import hello.cluebackend.global.config.JWTUtil; import jakarta.persistence.EntityNotFoundException; import jakarta.servlet.http.HttpServletRequest; diff --git a/src/main/java/hello/cluebackend/domain/file/presentation/FileController.java b/src/main/java/hello/cluebackend/domain/file/presentation/FileController.java index be15984e..8101dc74 100644 --- a/src/main/java/hello/cluebackend/domain/file/presentation/FileController.java +++ b/src/main/java/hello/cluebackend/domain/file/presentation/FileController.java @@ -1,47 +1,47 @@ -package hello.cluebackend.domain.file.presentation; - -import hello.cluebackend.domain.file.service.FileService; -import hello.cluebackend.global.config.JWTUtil; -import jakarta.servlet.http.HttpServletRequest; -import lombok.RequiredArgsConstructor; -import org.springframework.core.io.Resource; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequiredArgsConstructor -@RequestMapping(name = "/api/file") -public class FileController { - - - private final FileService fileService; - private final JWTUtil jWTUtil; - - private Long jwtTokenTaker(HttpServletRequest request){ - String token = jWTUtil.getToken(request); - Long userId = jWTUtil.getUserId(token); - - return userId; - } - - // 선생님 과제 첨부 파일 다운 받기 -// @GetMapping("/attachment/{attachmentId}") -// public ResponseEntity downloadAttachment(@PathVariable Long attachmentId, HttpServletRequest request){ -// Long userId = jwtTokenTaker(request); -// -// Resource file = fileService.downloadFile(attachmentId, userId); -// -// return ResponseEntity.ok() -// .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"downloaded-file\"") -// .contentType(MediaType.APPLICATION_OCTET_STREAM) -// .body(file); +//package hello.cluebackend.domain.file.presentation; +// +//import hello.cluebackend.domain.file.service.FileService; +//import hello.cluebackend.global.config.JWTUtil; +//import jakarta.servlet.http.HttpServletRequest; +//import lombok.RequiredArgsConstructor; +//import org.springframework.core.io.Resource; +//import org.springframework.http.HttpHeaders; +//import org.springframework.http.MediaType; +//import org.springframework.http.ResponseEntity; +//import org.springframework.web.bind.annotation.GetMapping; +//import org.springframework.web.bind.annotation.PathVariable; +//import org.springframework.web.bind.annotation.RequestMapping; +//import org.springframework.web.bind.annotation.RestController; +// +//@RestController +//@RequiredArgsConstructor +//@RequestMapping(name = "/api/file") +//public class FileController { +// +// +// private final FileService fileService; +// private final JWTUtil jWTUtil; +// +// private Long jwtTokenTaker(HttpServletRequest request){ +// String token = jWTUtil.getToken(request); +// Long userId = jWTUtil.getUserId(token); +// +// return userId; // } - - // 학생 제출 과제 관련 파일 다운 받기 - -} +// +// // 선생님 과제 첨부 파일 다운 받기 +//// @GetMapping("/attachment/{attachmentId}") +//// public ResponseEntity downloadAttachment(@PathVariable Long attachmentId, HttpServletRequest request){ +//// Long userId = jwtTokenTaker(request); +//// +//// Resource file = fileService.downloadFile(attachmentId, userId); +//// +//// return ResponseEntity.ok() +//// .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"downloaded-file\"") +//// .contentType(MediaType.APPLICATION_OCTET_STREAM) +//// .body(file); +//// } +// +// // 학생 제출 과제 관련 파일 다운 받기 +// +//} diff --git a/src/main/java/hello/cluebackend/domain/file/service/FileService.java b/src/main/java/hello/cluebackend/domain/file/service/FileService.java index 42513f45..b74e4164 100644 --- a/src/main/java/hello/cluebackend/domain/file/service/FileService.java +++ b/src/main/java/hello/cluebackend/domain/file/service/FileService.java @@ -1,80 +1,80 @@ -package hello.cluebackend.domain.file.service; - -import com.amazonaws.services.s3.AmazonS3Client; -import com.amazonaws.services.s3.model.ObjectMetadata; -import com.amazonaws.services.s3.model.PutObjectRequest; -import com.amazonaws.services.s3.model.S3Object; -import hello.cluebackend.domain.assignmentAttachment.domain.AssignmentAttachment; -import hello.cluebackend.domain.assignmentAttachment.domain.repository.AssignmentAttachmentRepository; -import jakarta.persistence.EntityNotFoundException; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.io.InputStreamResource; -import org.springframework.core.io.Resource; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.util.UUID; - -@Service -@RequiredArgsConstructor -public class FileService { - private final AmazonS3Client amazonS3Client; - private final AssignmentAttachmentRepository assignmentAttachmentRepository; - - @Value("${cloud.aws.s3.bucket}") - private String bucket; - - public String storeFile(MultipartFile file) { - String originalFilename = file.getOriginalFilename(); - String extension = ""; - if (originalFilename != null && originalFilename.contains(".")) { - extension = originalFilename.substring(originalFilename.lastIndexOf(".")); - } - String storedFileName = UUID.randomUUID().toString() + extension; - - ObjectMetadata metadata = new ObjectMetadata(); - metadata.setContentLength(file.getSize()); - metadata.setContentType(file.getContentType()); - - try { - amazonS3Client.putObject(new PutObjectRequest(bucket, storedFileName, file.getInputStream(), metadata)); // 공개 권한 설정 - -// return amazonS3Client.getUrl(bucket, storedFileName).toString(); - return storedFileName; - } catch (IOException e) { - throw new RuntimeException("파일 업로드에 실패했습니다.", e); - } - } - - // 선생님 과제 첨부 - - - // 선생님 첨부 파일 다운로드 -// public Resource downloadFile(Long attachmentId, Long userId) { -// AssignmentAttachment attachment = assignmentAttachmentRepository.findById(attachmentId) -// .orElseThrow(() -> new RuntimeException("파일을 찾을 수 없습니다.")); +//package hello.cluebackend.domain.file.service; // -// String filePath = attachment.getFilePath(); +//import com.amazonaws.services.s3.AmazonS3Client; +//import com.amazonaws.services.s3.model.ObjectMetadata; +//import com.amazonaws.services.s3.model.PutObjectRequest; +//import com.amazonaws.services.s3.model.S3Object; +//import hello.cluebackend.domain.assignmentAttachment.domain.AssignmentAttachment; +//import hello.cluebackend.domain.assignmentAttachment.domain.repository.AssignmentAttachmentRepository; +//import jakarta.persistence.EntityNotFoundException; +//import lombok.RequiredArgsConstructor; +//import org.springframework.beans.factory.annotation.Value; +//import org.springframework.core.io.InputStreamResource; +//import org.springframework.core.io.Resource; +//import org.springframework.stereotype.Service; +//import org.springframework.web.multipart.MultipartFile; // -// S3Object s3Object = amazonS3Client.getObject(bucket, filePath); +//import java.io.IOException; +//import java.util.UUID; // -// return new InputStreamResource(s3Object.getObjectContent()); -// } - - // 학생 과제 파일 첨부 - - - // 과제 아이디를 가지고 해당 과제 파일 다운로드 -// public Resource downloadStudentAssignmentFile(Long attachmentId, Long userId){ -// AssignmentAttachment attachment = assignmentAttachmentRepository.findById(attachmentId) -// .orElseThrow(() -> new EntityNotFoundException("파일을 찾을 수 없습니다.")); +//@Service +//@RequiredArgsConstructor +//public class FileService { +// private final AmazonS3Client amazonS3Client; +// private final AssignmentAttachmentRepository assignmentAttachmentRepository; +// +// @Value("${cloud.aws.s3.bucket}") +// private String bucket; +// +// public String storeFile(MultipartFile file) { +// String originalFilename = file.getOriginalFilename(); +// String extension = ""; +// if (originalFilename != null && originalFilename.contains(".")) { +// extension = originalFilename.substring(originalFilename.lastIndexOf(".")); +// } +// String storedFileName = UUID.randomUUID().toString() + extension; // -// String filePath = attachment.(); +// ObjectMetadata metadata = new ObjectMetadata(); +// metadata.setContentLength(file.getSize()); +// metadata.setContentType(file.getContentType()); // -// S3Object s3Object = amazonS3Client.getObject(bucket, filePath); +// try { +// amazonS3Client.putObject(new PutObjectRequest(bucket, storedFileName, file.getInputStream(), metadata)); // 공개 권한 설정 // -// return new InputStreamResource(s3Object.getObjectContent()); +//// return amazonS3Client.getUrl(bucket, storedFileName).toString(); +// return storedFileName; +// } catch (IOException e) { +// throw new RuntimeException("파일 업로드에 실패했습니다.", e); +// } // } -} +// +// // 선생님 과제 첨부 +// +// +// // 선생님 첨부 파일 다운로드 +//// public Resource downloadFile(Long attachmentId, Long userId) { +//// AssignmentAttachment attachment = assignmentAttachmentRepository.findById(attachmentId) +//// .orElseThrow(() -> new RuntimeException("파일을 찾을 수 없습니다.")); +//// +//// String filePath = attachment.getFilePath(); +//// +//// S3Object s3Object = amazonS3Client.getObject(bucket, filePath); +//// +//// return new InputStreamResource(s3Object.getObjectContent()); +//// } +// +// // 학생 과제 파일 첨부 +// +// +// // 과제 아이디를 가지고 해당 과제 파일 다운로드 +//// public Resource downloadStudentAssignmentFile(Long attachmentId, Long userId){ +//// AssignmentAttachment attachment = assignmentAttachmentRepository.findById(attachmentId) +//// .orElseThrow(() -> new EntityNotFoundException("파일을 찾을 수 없습니다.")); +//// +//// String filePath = attachment.(); +//// +//// S3Object s3Object = amazonS3Client.getObject(bucket, filePath); +//// +//// return new InputStreamResource(s3Object.getObjectContent()); +//// } +//} diff --git a/src/main/java/hello/cluebackend/domain/submission/domain/Submission.java b/src/main/java/hello/cluebackend/domain/submission/domain/Submission.java index 6e9162da..dcd4e7be 100644 --- a/src/main/java/hello/cluebackend/domain/submission/domain/Submission.java +++ b/src/main/java/hello/cluebackend/domain/submission/domain/Submission.java @@ -1,39 +1,39 @@ -package hello.cluebackend.domain.submission.domain; - -import hello.cluebackend.domain.assignment.domain.Assignment; -import hello.cluebackend.domain.submissionFile.domain.SubmissionFile; -import hello.cluebackend.domain.user.domain.UserEntity; -import jakarta.persistence.*; -import lombok.*; - -import java.time.LocalDateTime; -import java.util.List; - -@Entity -@Table(name = "Submission") -@Getter @Setter -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class Submission { - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "submission_id") - private Long submissionId; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "assignment_id") - private Assignment assignment; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id") - private UserEntity user; - - @Column(name = "is_submitted") - private Boolean isSubmitted; - - @Column(name = "submitted_at") - private LocalDateTime submittedAt; - - @OneToMany - private List assignmentContents; -} +//package hello.cluebackend.domain.submission.domain; +// +//import hello.cluebackend.domain.assignment.domain.Assignment; +//import hello.cluebackend.domain.submissionFile.domain.SubmissionFile; +//import hello.cluebackend.domain.user.domain.UserEntity; +//import jakarta.persistence.*; +//import lombok.*; +// +//import java.time.LocalDateTime; +//import java.util.List; +// +//@Entity +//@Table(name = "Submission") +//@Getter @Setter +//@AllArgsConstructor +//@NoArgsConstructor +//@Builder +//public class Submission { +// @Id @GeneratedValue(strategy = GenerationType.IDENTITY) +// @Column(name = "submission_id") +// private Long submissionId; +// +// @ManyToOne(fetch = FetchType.LAZY) +// @JoinColumn(name = "assignment_id") +// private Assignment assignment; +// +// @ManyToOne(fetch = FetchType.LAZY) +// @JoinColumn(name = "user_id") +// private UserEntity user; +// +// @Column(name = "is_submitted") +// private Boolean isSubmitted; +// +// @Column(name = "submitted_at") +// private LocalDateTime submittedAt; +// +// @OneToMany +// private List assignmentContents; +//} diff --git a/src/main/java/hello/cluebackend/domain/submission/domain/repository/SubmissionRepository.java b/src/main/java/hello/cluebackend/domain/submission/domain/repository/SubmissionRepository.java index 2ecada8a..866b3d81 100644 --- a/src/main/java/hello/cluebackend/domain/submission/domain/repository/SubmissionRepository.java +++ b/src/main/java/hello/cluebackend/domain/submission/domain/repository/SubmissionRepository.java @@ -1,29 +1,29 @@ -package hello.cluebackend.domain.submission.domain.repository; - -import hello.cluebackend.domain.assignment.domain.Assignment; -import hello.cluebackend.domain.submission.domain.Submission; -import hello.cluebackend.domain.user.domain.UserEntity; -import io.lettuce.core.dynamic.annotation.Param; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public interface SubmissionRepository extends JpaRepository { - @Query(""" -SELECT s.assignment -FROM Submission s -JOIN s.assignment a -JOIN a.classRoom cr -JOIN cr.classRoomUserList cru -WHERE s.user.userId = :userId - AND s.isSubmitted = false -""") - - List findUnsubmittedAssignmentsByUserId(@Param("userId") Long userId); - List findAllByAssignment(Assignment assignment); - List user(UserEntity user); - Object findUnsubmittedAssignmentByUserIdAndAssignmentId(Long assignmentId, Long userId); -} +//package hello.cluebackend.domain.submission.domain.repository; +// +//import hello.cluebackend.domain.assignment.domain.Assignment; +//import hello.cluebackend.domain.submission.domain.Submission; +//import hello.cluebackend.domain.user.domain.UserEntity; +//import io.lettuce.core.dynamic.annotation.Param; +//import org.springframework.data.jpa.repository.JpaRepository; +//import org.springframework.data.jpa.repository.Query; +//import org.springframework.stereotype.Repository; +// +//import java.util.List; +// +//@Repository +//public interface SubmissionRepository extends JpaRepository { +// @Query(""" +//SELECT s.assignment +//FROM Submission s +//JOIN s.assignment a +//JOIN a.classRoom cr +//JOIN cr.classRoomUserList cru +//WHERE s.user.userId = :userId +// AND s.isSubmitted = false +//""") +// +// List findUnsubmittedAssignmentsByUserId(@Param("userId") Long userId); +// List findAllByAssignment(Assignment assignment); +// List user(UserEntity user); +// Object findUnsubmittedAssignmentByUserIdAndAssignmentId(Long assignmentId, Long userId); +//} diff --git a/src/main/java/hello/cluebackend/domain/submission/presentation/SubmissionController.java b/src/main/java/hello/cluebackend/domain/submission/presentation/SubmissionController.java index f6e95382..614c7560 100644 --- a/src/main/java/hello/cluebackend/domain/submission/presentation/SubmissionController.java +++ b/src/main/java/hello/cluebackend/domain/submission/presentation/SubmissionController.java @@ -1,4 +1,9 @@ -package hello.cluebackend.domain.submission.presentation; - -public class SubmissionController { -} +//package hello.cluebackend.domain.submission.presentation; +// +//import org.springframework.web.bind.annotation.RequestMapping; +//import org.springframework.web.bind.annotation.RestController; +// +//@RestController +//@RequestMapping("/api/assignment") +//public class SubmissionController { +//} diff --git a/src/main/java/hello/cluebackend/domain/submission/service/SubmissionService.java b/src/main/java/hello/cluebackend/domain/submission/service/SubmissionService.java index c27a7909..e2c331fe 100644 --- a/src/main/java/hello/cluebackend/domain/submission/service/SubmissionService.java +++ b/src/main/java/hello/cluebackend/domain/submission/service/SubmissionService.java @@ -1,29 +1,29 @@ -package hello.cluebackend.domain.submission.service; - -import hello.cluebackend.domain.assignment.domain.Assignment; -import hello.cluebackend.domain.submission.domain.Submission; -import hello.cluebackend.domain.submission.domain.repository.SubmissionRepository; -import hello.cluebackend.domain.user.domain.UserEntity; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -public class SubmissionService { - private SubmissionRepository submissionRepository; - - // 학생에게 과제 할당하는 메서드 - public void createSubmissionsForStudents(Assignment assignment, List students) { - List submissions = students.stream() - .map(student -> Submission.builder() - .assignment(assignment) - .user(student) - .isSubmitted(false) - .submittedAt(null) - .build()) - .toList(); - - submissionRepository.saveAll(submissions); - } - -} +//package hello.cluebackend.domain.submission.service; +// +//import hello.cluebackend.domain.assignment.domain.Assignment; +//import hello.cluebackend.domain.submission.domain.Submission; +//import hello.cluebackend.domain.submission.domain.repository.SubmissionRepository; +//import hello.cluebackend.domain.user.domain.UserEntity; +//import org.springframework.stereotype.Service; +// +//import java.util.List; +// +//@Service +//public class SubmissionService { +// private SubmissionRepository submissionRepository; +// +// // 학생에게 과제 할당하는 메서드 +// public void createSubmissionsForStudents(Assignment assignment, List students) { +// List submissions = students.stream() +// .map(student -> Submission.builder() +// .assignment(assignment) +// .user(student) +// .isSubmitted(false) +// .submittedAt(null) +// .build()) +// .toList(); +// +// submissionRepository.saveAll(submissions); +// } +// +//} diff --git a/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionDocument.java b/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionDocument.java index 249604bb..a34111f4 100644 --- a/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionDocument.java +++ b/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionDocument.java @@ -1,26 +1,26 @@ -package hello.cluebackend.domain.submissionFile.domain; - -import jakarta.persistence.Column; -import jakarta.persistence.DiscriminatorValue; -import jakarta.persistence.Entity; -import jakarta.persistence.JoinColumn; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -@Entity -@DiscriminatorValue("Document") -@SuperBuilder -@NoArgsConstructor -public class SubmissionDocument extends SubmissionFile { - @JoinColumn(name="original_file_name") - private String originalFileName; - - @Column(name="stored_file_name") - private String storedFileName; - - @Column(name="file_path") - private String filePath; - - @Column(name="file_size") - private int fileSize; -} +//package hello.cluebackend.domain.submissionFile.domain; +// +//import jakarta.persistence.Column; +//import jakarta.persistence.DiscriminatorValue; +//import jakarta.persistence.Entity; +//import jakarta.persistence.JoinColumn; +//import lombok.NoArgsConstructor; +//import lombok.experimental.SuperBuilder; +// +//@Entity +//@DiscriminatorValue("Document") +//@SuperBuilder +//@NoArgsConstructor +//public class SubmissionDocument extends SubmissionFile { +// @JoinColumn(name="original_file_name") +// private String originalFileName; +// +// @Column(name="stored_file_name") +// private String storedFileName; +// +// @Column(name="file_path") +// private String filePath; +// +// @Column(name="file_size") +// private int fileSize; +//} diff --git a/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionFile.java b/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionFile.java index eadc0487..12d0571a 100644 --- a/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionFile.java +++ b/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionFile.java @@ -1,39 +1,39 @@ -package hello.cluebackend.domain.submissionFile.domain; - -import hello.cluebackend.domain.assignment.domain.Assignment; -import hello.cluebackend.domain.submission.domain.Submission; -import hello.cluebackend.domain.user.domain.UserEntity; -import jakarta.persistence.*; -import lombok.*; -import lombok.experimental.SuperBuilder; - -import java.time.LocalDateTime; - -@Entity -@Table(name = "assignment_content") -@Inheritance(strategy = InheritanceType.JOINED) -@DiscriminatorColumn(name = "DTYPE") -@Getter @Setter -@AllArgsConstructor -@NoArgsConstructor -@SuperBuilder -public abstract class SubmissionFile { - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name="submission_file_id") - private Long assignmentContentId; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name="user_id") - private UserEntity user; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name="submission_id") - private Submission assignmentCheck; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name="assignment_id") - private Assignment assignment; - - @Column(name="update_date") - private LocalDateTime updateDate; -} \ No newline at end of file +//package hello.cluebackend.domain.submissionFile.domain; +// +//import hello.cluebackend.domain.assignment.domain.Assignment; +//import hello.cluebackend.domain.submission.domain.Submission; +//import hello.cluebackend.domain.user.domain.UserEntity; +//import jakarta.persistence.*; +//import lombok.*; +//import lombok.experimental.SuperBuilder; +// +//import java.time.LocalDateTime; +// +//@Entity +//@Table(name = "assignment_content") +//@Inheritance(strategy = InheritanceType.JOINED) +//@DiscriminatorColumn(name = "DTYPE") +//@Getter @Setter +//@AllArgsConstructor +//@NoArgsConstructor +//@SuperBuilder +//public abstract class SubmissionFile { +// @Id @GeneratedValue(strategy = GenerationType.IDENTITY) +// @Column(name="submission_file_id") +// private Long assignmentContentId; +// +// @ManyToOne(fetch = FetchType.LAZY) +// @JoinColumn(name="user_id") +// private UserEntity user; +// +// @ManyToOne(fetch = FetchType.LAZY) +// @JoinColumn(name="submission_id") +// private Submission assignmentCheck; +// +// @ManyToOne(fetch = FetchType.LAZY) +// @JoinColumn(name="assignment_id") +// private Assignment assignment; +// +// @Column(name="update_date") +// private LocalDateTime updateDate; +//} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionLink.java b/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionLink.java index a73382e6..dd16b1c4 100644 --- a/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionLink.java +++ b/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionLink.java @@ -1,14 +1,14 @@ -package hello.cluebackend.domain.submissionFile.domain; - -import jakarta.persistence.DiscriminatorValue; -import jakarta.persistence.Entity; -import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; - -@Entity -@DiscriminatorValue("Link") -@SuperBuilder -@NoArgsConstructor -public class SubmissionLink extends SubmissionFile { - private String url; -} +//package hello.cluebackend.domain.submissionFile.domain; +// +//import jakarta.persistence.DiscriminatorValue; +//import jakarta.persistence.Entity; +//import lombok.NoArgsConstructor; +//import lombok.experimental.SuperBuilder; +// +//@Entity +//@DiscriminatorValue("Link") +//@SuperBuilder +//@NoArgsConstructor +//public class SubmissionLink extends SubmissionFile { +// private String url; +//} diff --git a/src/main/java/hello/cluebackend/domain/submissionFile/domain/repository/SubmissionFile.java b/src/main/java/hello/cluebackend/domain/submissionFile/domain/repository/SubmissionFile.java index df9fcf16..da829d03 100644 --- a/src/main/java/hello/cluebackend/domain/submissionFile/domain/repository/SubmissionFile.java +++ b/src/main/java/hello/cluebackend/domain/submissionFile/domain/repository/SubmissionFile.java @@ -1,11 +1,11 @@ -package hello.cluebackend.domain.submissionFile.domain.repository; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public interface SubmissionFile extends JpaRepository { - List findAllByUserId(Long userId); -} +//package hello.cluebackend.domain.submissionFile.domain.repository; +// +//import org.springframework.data.jpa.repository.JpaRepository; +//import org.springframework.stereotype.Repository; +// +//import java.util.List; +// +//@Repository +//public interface SubmissionFile extends JpaRepository { +// List findAllByUserId(Long userId); +//} diff --git a/src/main/java/hello/cluebackend/domain/submissionFile/presentation/SubmissionFileController.java b/src/main/java/hello/cluebackend/domain/submissionFile/presentation/SubmissionFileController.java index 69cd0f42..47054d3d 100644 --- a/src/main/java/hello/cluebackend/domain/submissionFile/presentation/SubmissionFileController.java +++ b/src/main/java/hello/cluebackend/domain/submissionFile/presentation/SubmissionFileController.java @@ -1,4 +1,9 @@ -package hello.cluebackend.domain.submissionFile.presentation; - -public class SubmissionFileController { -} +//package hello.cluebackend.domain.submissionFile.presentation; +// +//import org.springframework.web.bind.annotation.RequestMapping; +//import org.springframework.web.bind.annotation.RestController; +// +//@RestController +//@RequestMapping("/api/assignment") +//public class SubmissionFileController { +//} diff --git a/src/main/java/hello/cluebackend/domain/submissionFile/service/SubmissionFileService.java b/src/main/java/hello/cluebackend/domain/submissionFile/service/SubmissionFileService.java index a99b876e..5d9ea05c 100644 --- a/src/main/java/hello/cluebackend/domain/submissionFile/service/SubmissionFileService.java +++ b/src/main/java/hello/cluebackend/domain/submissionFile/service/SubmissionFileService.java @@ -1,4 +1,7 @@ -package hello.cluebackend.domain.submissionFile.service; - -public class SubmissionFileService { -} +//package hello.cluebackend.domain.submissionFile.service; +// +//import org.springframework.stereotype.Service; +// +//@Service +//public class SubmissionFileService { +//} diff --git a/src/main/java/hello/cluebackend/domain/user/domain/UserEntity.java b/src/main/java/hello/cluebackend/domain/user/domain/UserEntity.java index d720defc..b13c36f5 100644 --- a/src/main/java/hello/cluebackend/domain/user/domain/UserEntity.java +++ b/src/main/java/hello/cluebackend/domain/user/domain/UserEntity.java @@ -49,7 +49,7 @@ protected void onCreate() { @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) @Builder.Default - private List classRoomUserList = new ArrayList<>(); + private List classRoomUserList = new ArrayList<>(); // 해당 객체는 해당 table과의 연관성이 없음. public UserEntity(int classCode, String username, String email, Role role) { this.classCode = classCode; diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index afa54f58..b668d201 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -2,8 +2,8 @@ spring: application: name: CLUE-Backend datasource: -# url: jdbc:postgresql://localhost:5432/clue - url: ${POSTGRES_URL} + url: jdbc:postgresql://localhost:5432/clue +# url: ${POSTGRES_URL} username: ${POSTGRES_USER} password: ${POSTGRES_PASSWORD} driver-class-name: org.postgresql.Driver @@ -11,7 +11,7 @@ spring: database-platform: org.hibernate.dialect.PostgreSQLDialect show-sql: true hibernate: - ddl-auto: create + ddl-auto: update data: redis: # host: my_redis From 0d9cdf557056da76487e66b49e3cd711b902704c Mon Sep 17 00:00:00 2001 From: Haeyul Date: Fri, 8 Aug 2025 00:03:19 +0900 Subject: [PATCH 03/22] =?UTF-8?q?feat(#5):=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20DDD=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?=EB=B0=8F=20=ED=95=84=EC=9A=94=ED=95=9C=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assignment/api/AssignmentController.java | 160 ++++++++++++++++++ .../api/CommandAssignmentController.java | 42 +++++ .../api/QueryAssignmentController.java | 14 ++ .../request/AssignmentCreateRequestDto.java | 2 +- .../dto/request/AssignmentUploadFileDto.java | 2 +- .../api/dto/response/GetAllAssignment.java | 10 ++ .../response/GetAssignmentResponseDto.java | 7 +- .../application}/AssignmentService.java | 86 +++++++--- .../application/SubmissionFileService.java | 7 + .../application/SubmissionService.java | 35 ++++ .../command/CommandAssignmentService.java | 4 + .../command/CommandSubmissionService.java | 4 + .../query/QueryAssignmentService.java | 4 + .../query/QuerySubmissionService.java | 4 + .../assignment/domain/Assignment.java | 5 +- .../AssignmentAttachment.java | 34 ++++ .../AttachmentDocument.java | 28 +++ .../AssignmentAttachment/AttachmentLink.java | 19 +++ .../assignment/domain/Submission.java | 33 ++++ .../SubmissionDocument.java | 26 +++ .../SubmissionAttachment/SubmissionFile.java | 39 +++++ .../SubmissionAttachment/SubmissionLink.java | 14 ++ ...AssignmentManagementCommandController.java | 21 +++ .../AssignmentManagementQueryController.java | 23 +++ .../response/GetAllAssignmentResponse.java | 7 + ...ignmentParticipationCommandController.java | 19 +++ ...ssignmentParticipationQueryController.java | 21 +++ .../AssignmentAttachmentRepository.java | 8 + .../persistence}/AssignmentRepository.java | 7 +- .../persistence/SubmissionFile.java | 8 + .../persistence/SubmissionRepository.java | 9 + .../AssignmentNotFoundException.java | 15 -- .../exception/UnauthorizedException.java | 15 -- .../presentation/AssignmentController.java | 90 ---------- .../dto/AssignmentAttachmentDto.java | 22 --- .../response/AssignmentAttachmentFile.java | 8 - .../response/AssignmentAttachmentLink.java | 5 - .../dto/response/AssignmentDuration.java | 8 - .../dto/response/AssignmentSubmissionDto.java | 13 -- .../AssignmentSubmissionStatusDto.java | 14 -- .../dto/response/Assignmentfile.java | 7 - .../dto/response/StudentAssignmentRemain.java | 15 -- .../presentation/dto/response/file.java | 7 - .../domain/AssignmentAttachment.java | 34 ---- .../domain/AttachmentDocument.java | 28 --- .../domain/AttachmentLink.java | 19 --- .../AssignmentAttachmentRepository.java | 9 - .../AssignmentAttachmentController.java | 44 ----- .../service/AssignmentAttachmentService.java | 69 -------- .../repository/ClassRoomUserRepository.java | 2 +- .../domain/file/service/FileService.java | 2 + .../domain/submission/domain/Submission.java | 39 ----- .../repository/SubmissionRepository.java | 29 ---- .../presentation/SubmissionController.java | 9 - .../submission/service/SubmissionService.java | 29 ---- .../domain/SubmissionDocument.java | 26 --- .../submissionFile/domain/SubmissionFile.java | 39 ----- .../submissionFile/domain/SubmissionLink.java | 14 -- .../domain/repository/SubmissionFile.java | 11 -- .../SubmissionFileController.java | 9 - .../service/SubmissionFileService.java | 7 - .../global/common/response/ApiResponse.java | 39 +++++ .../global/common/response/ResponseCode.java | 46 +++++ .../cluebackend/global/config/TestConfig.java | 5 - src/main/resources/application.yaml | 2 +- 65 files changed, 752 insertions(+), 680 deletions(-) create mode 100644 src/main/java/hello/cluebackend/assignment/api/AssignmentController.java create mode 100644 src/main/java/hello/cluebackend/assignment/api/CommandAssignmentController.java create mode 100644 src/main/java/hello/cluebackend/assignment/api/QueryAssignmentController.java rename src/main/java/hello/cluebackend/{domain/assignment/presentation => assignment/api}/dto/request/AssignmentCreateRequestDto.java (91%) rename src/main/java/hello/cluebackend/{domain/assignmentAttachment/presentation => assignment/api}/dto/request/AssignmentUploadFileDto.java (66%) create mode 100644 src/main/java/hello/cluebackend/assignment/api/dto/response/GetAllAssignment.java rename src/main/java/hello/cluebackend/{domain/assignment/presentation => assignment/api}/dto/response/GetAssignmentResponseDto.java (50%) rename src/main/java/hello/cluebackend/{domain/assignment/service => assignment/application}/AssignmentService.java (73%) create mode 100644 src/main/java/hello/cluebackend/assignment/application/SubmissionFileService.java create mode 100644 src/main/java/hello/cluebackend/assignment/application/SubmissionService.java create mode 100644 src/main/java/hello/cluebackend/assignment/application/command/CommandAssignmentService.java create mode 100644 src/main/java/hello/cluebackend/assignment/application/command/CommandSubmissionService.java create mode 100644 src/main/java/hello/cluebackend/assignment/application/query/QueryAssignmentService.java create mode 100644 src/main/java/hello/cluebackend/assignment/application/query/QuerySubmissionService.java rename src/main/java/hello/cluebackend/{domain => }/assignment/domain/Assignment.java (87%) create mode 100644 src/main/java/hello/cluebackend/assignment/domain/AssignmentAttachment/AssignmentAttachment.java create mode 100644 src/main/java/hello/cluebackend/assignment/domain/AssignmentAttachment/AttachmentDocument.java create mode 100644 src/main/java/hello/cluebackend/assignment/domain/AssignmentAttachment/AttachmentLink.java create mode 100644 src/main/java/hello/cluebackend/assignment/domain/Submission.java create mode 100644 src/main/java/hello/cluebackend/assignment/domain/SubmissionAttachment/SubmissionDocument.java create mode 100644 src/main/java/hello/cluebackend/assignment/domain/SubmissionAttachment/SubmissionFile.java create mode 100644 src/main/java/hello/cluebackend/assignment/domain/SubmissionAttachment/SubmissionLink.java create mode 100644 src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementCommandController.java create mode 100644 src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementQueryController.java create mode 100644 src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllAssignmentResponse.java create mode 100644 src/main/java/hello/cluebackend/assignment/participation/api/AssignmentParticipationCommandController.java create mode 100644 src/main/java/hello/cluebackend/assignment/participation/api/AssignmentParticipationQueryController.java create mode 100644 src/main/java/hello/cluebackend/assignment/persistence/AssignmentAttachmentRepository.java rename src/main/java/hello/cluebackend/{domain/assignment/domain/repository => assignment/persistence}/AssignmentRepository.java (57%) create mode 100644 src/main/java/hello/cluebackend/assignment/persistence/SubmissionFile.java create mode 100644 src/main/java/hello/cluebackend/assignment/persistence/SubmissionRepository.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/exception/AssignmentNotFoundException.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/exception/UnauthorizedException.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/presentation/AssignmentController.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/presentation/dto/AssignmentAttachmentDto.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentAttachmentFile.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentAttachmentLink.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentDuration.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentSubmissionDto.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentSubmissionStatusDto.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/Assignmentfile.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/StudentAssignmentRemain.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/file.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AssignmentAttachment.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AttachmentDocument.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AttachmentLink.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/repository/AssignmentAttachmentRepository.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignmentAttachment/presentation/AssignmentAttachmentController.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignmentAttachment/service/AssignmentAttachmentService.java delete mode 100644 src/main/java/hello/cluebackend/domain/submission/domain/Submission.java delete mode 100644 src/main/java/hello/cluebackend/domain/submission/domain/repository/SubmissionRepository.java delete mode 100644 src/main/java/hello/cluebackend/domain/submission/presentation/SubmissionController.java delete mode 100644 src/main/java/hello/cluebackend/domain/submission/service/SubmissionService.java delete mode 100644 src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionDocument.java delete mode 100644 src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionFile.java delete mode 100644 src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionLink.java delete mode 100644 src/main/java/hello/cluebackend/domain/submissionFile/domain/repository/SubmissionFile.java delete mode 100644 src/main/java/hello/cluebackend/domain/submissionFile/presentation/SubmissionFileController.java delete mode 100644 src/main/java/hello/cluebackend/domain/submissionFile/service/SubmissionFileService.java create mode 100644 src/main/java/hello/cluebackend/global/common/response/ApiResponse.java create mode 100644 src/main/java/hello/cluebackend/global/common/response/ResponseCode.java delete mode 100644 src/main/java/hello/cluebackend/global/config/TestConfig.java diff --git a/src/main/java/hello/cluebackend/assignment/api/AssignmentController.java b/src/main/java/hello/cluebackend/assignment/api/AssignmentController.java new file mode 100644 index 00000000..35de9c5a --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/api/AssignmentController.java @@ -0,0 +1,160 @@ +package hello.cluebackend.assignment.api; + +import hello.cluebackend.assignment.api.dto.request.AssignmentCreateRequestDto; +import hello.cluebackend.assignment.api.dto.response.GetAllAssignment; +import hello.cluebackend.assignment.api.dto.response.GetAssignmentResponseDto; +import hello.cluebackend.assignment.application.AssignmentService; +import hello.cluebackend.global.config.JWTUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@Slf4j +@RequiredArgsConstructor +public class AssignmentController { + private final JWTUtil jwtUtil; + private final AssignmentService assignmentService; + + // TODO : 수업실 과제 페이지 과제 젠체 조회 + @GetMapping("/get/{classId}") + public ResponseEntity> getClassroomAssignment( + HttpServletRequest request, + @PathVariable Long classId + ) { + try { + String token = jwtUtil.getToken(request); + Long userId = jwtUtil.getUserId(token); + + List assignments = assignmentService.findAllAssignment(userId, classId); +// List attachments = assignmentA + + return ResponseEntity.ok(assignments); + } catch (Exception e){ + log.error("Error while getting assignments", e); + return ResponseEntity.internalServerError().build(); + } + } + + // TODO : 과제 단일 조회 + + // TODO : 과제 생성 + @PostMapping("/create/{classId}") + public ResponseEntity createAssignment( + HttpServletRequest request, + @PathVariable Long classId, + @Valid @RequestBody AssignmentCreateRequestDto requestDto + ){ + try{ + String token = jwtUtil.getToken(request); + Long userId = jwtUtil.getUserId(token); + assignmentService.createAssignment(userId, classId, requestDto); + return ResponseEntity.ok().build(); + } catch (Exception e) { + log.error("Error while create assignment",e); + return ResponseEntity.internalServerError().build(); + } + } + + // TODO : 과제 수정 + // @PatchMapping("/api/assignments/{assignmentId}") + // public ResponseEntity modifyAssignment(HttpServletRequest request, @PathVariable Long assignmentId, @RequestBody AssignmentModifyRequestDto assignmentModifyRequestDto){ + // jwtTokenTaker(request); + + // return ResponseEntity.ok(assignmentService.modifyAssignment(assignmentId,assignmentModifyRequestDto)); + // } + + // TODO : 과제 삭제 + @DeleteMapping("/delete/{classId}/{assignmentId}") + public ResponseEntity deleteAssignment( + HttpServletRequest request, + @PathVariable Long assignmentId, + @PathVariable Long classId + ){ + try{ + String token = jwtUtil.getToken(request); + Long userId = jwtUtil.getUserId(token); + assignmentService.deleteAssignment(userId,classId,assignmentId); + return ResponseEntity.noContent().build(); + }catch (Exception e){ + log.error("Error while delete assignment",e); + return ResponseEntity.internalServerError().build(); + } + } + + // TODO : 선생님 과제 제출 여부 조회 + + // TODO : 과제 첨부 파일 업로드 + // @PostMapping("/link/{assignmentId}") + // public ResponseEntity addLink( + // HttpServletRequest request, + // @PathVariable Long assignmentId + // ){ + // try{ + // String token = jwtUtil.getToken(request); + // Long userId = jwtUtil.getUserId(token); + // assignmentAttachmentService.addLink() + // }catch (Exception e){ + // return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of("message","링크 추가중 오류가 발생했습니다.")); + // } + // } + + + // // 파일 업로드 API + // @PostMapping("/upload/{assignmentId}") + // public ResponseEntity uploadFiles( + // HttpServletRequest request, + // @PathVariable Long assignmentId, + // @Valid @RequestPart(value = "metadata", required = false) AssignmentUploadFileDto requestDto, + // @RequestPart(value = "files", required = false) List files + // ){ + // try{ + // String token = jwtUtil.getToken(request); + // Long userId = jwtUtil.getUserId(token); + // assignmentAttachmentService.uploadFile(userId, assignmentId, requestDto, files); + // return new ResponseEntity<>(HttpStatus.CREATED); + // } catch (Exception e) { + // e.printStackTrace(); + // return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of("message","파일 업로드중 오류가 발생했습니다.")); + // } + // } + + // TODO : 과제 제출 파일 업로드 + + // TODO : 과제 제출 파일 삭제 + + // TODO : 과제 제출 + + // TODO : 과제 제출 취소 + + // TODO : 과제 단일 조회 + @GetMapping("/get/{classId}/{assignmentId}") + public ResponseEntity getClassRoomAssignment( + HttpServletRequest request, + @PathVariable Long classId, + @PathVariable Long assignmentId + ){ + try{ + String token = jwtUtil.getToken(request); + Long userId = jwtUtil.getUserId(token); + return ResponseEntity.ok().build(); + }catch (Exception e) { + log.error("Error while getting assignment",e); + return ResponseEntity.internalServerError().build(); + } + } + +// // 미제출 과제 전체 조회(학생) +// @GetMapping("/") +// public ResponseEntity> getStudentRemainCard (HttpServletRequest request){ +// String token = jWTUtil.getToken(request); +// Long userId = jWTUtil.getUserId(token); +// +// return ResponseEntity.ok(assignmentService.getUnsubmittedAssignments(userId)); +// } +} diff --git a/src/main/java/hello/cluebackend/assignment/api/CommandAssignmentController.java b/src/main/java/hello/cluebackend/assignment/api/CommandAssignmentController.java new file mode 100644 index 00000000..04ca4d77 --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/api/CommandAssignmentController.java @@ -0,0 +1,42 @@ +package hello.cluebackend.assignment.api; + +import hello.cluebackend.assignment.api.dto.response.GetAllAssignment; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/api/assignment") +@RequiredArgsConstructor +@Slf4j +public class CommandAssignmentController { + // TODO : 학생 미제출 과제 전체 조회 + + + // TODO : 학생 수업실 과제 페이지 과제 젠체 조회 + @GetMapping("/get/{classId}") + public ResponseEntity> getClassroomAssignment( + HttpServletRequest request, + @PathVariable Long classId + ) { + try { + String token = jwtUtil.getToken(request); + Long userId = jwtUtil.getUserId(token); + + List assignments = assignmentService.findAllAssignment(userId, classId); +// List attachments = assignmentA + + return ResponseEntity.ok(assignments); + } catch (Exception e){ + log.error("Error while getting assignments", e); + return ResponseEntity.internalServerError().build(); + } + } +} diff --git a/src/main/java/hello/cluebackend/assignment/api/QueryAssignmentController.java b/src/main/java/hello/cluebackend/assignment/api/QueryAssignmentController.java new file mode 100644 index 00000000..9ea136ff --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/api/QueryAssignmentController.java @@ -0,0 +1,14 @@ +package hello.cluebackend.assignment.api; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("api/assignment") +@RequiredArgsConstructor +@Slf4j +public class QueryAssignmentController { + +} diff --git a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/request/AssignmentCreateRequestDto.java b/src/main/java/hello/cluebackend/assignment/api/dto/request/AssignmentCreateRequestDto.java similarity index 91% rename from src/main/java/hello/cluebackend/domain/assignment/presentation/dto/request/AssignmentCreateRequestDto.java rename to src/main/java/hello/cluebackend/assignment/api/dto/request/AssignmentCreateRequestDto.java index bf22b2aa..adca1571 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/request/AssignmentCreateRequestDto.java +++ b/src/main/java/hello/cluebackend/assignment/api/dto/request/AssignmentCreateRequestDto.java @@ -1,4 +1,4 @@ -package hello.cluebackend.domain.assignment.presentation.dto.request; +package hello.cluebackend.assignment.api.dto.request; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; diff --git a/src/main/java/hello/cluebackend/domain/assignmentAttachment/presentation/dto/request/AssignmentUploadFileDto.java b/src/main/java/hello/cluebackend/assignment/api/dto/request/AssignmentUploadFileDto.java similarity index 66% rename from src/main/java/hello/cluebackend/domain/assignmentAttachment/presentation/dto/request/AssignmentUploadFileDto.java rename to src/main/java/hello/cluebackend/assignment/api/dto/request/AssignmentUploadFileDto.java index 8b9b54c8..de6a8efd 100644 --- a/src/main/java/hello/cluebackend/domain/assignmentAttachment/presentation/dto/request/AssignmentUploadFileDto.java +++ b/src/main/java/hello/cluebackend/assignment/api/dto/request/AssignmentUploadFileDto.java @@ -1,4 +1,4 @@ -package hello.cluebackend.domain.assignmentAttachment.presentation.dto.request; +package hello.cluebackend.assignment.api.dto.request; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/hello/cluebackend/assignment/api/dto/response/GetAllAssignment.java b/src/main/java/hello/cluebackend/assignment/api/dto/response/GetAllAssignment.java new file mode 100644 index 00000000..249ee58b --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/api/dto/response/GetAllAssignment.java @@ -0,0 +1,10 @@ +package hello.cluebackend.assignment.api.dto.response; + +import java.time.LocalDateTime; + +public record GetAllAssignment( + Long assignmentId, + String title, + LocalDateTime endDate, + String duringTime +){} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/GetAssignmentResponseDto.java b/src/main/java/hello/cluebackend/assignment/api/dto/response/GetAssignmentResponseDto.java similarity index 50% rename from src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/GetAssignmentResponseDto.java rename to src/main/java/hello/cluebackend/assignment/api/dto/response/GetAssignmentResponseDto.java index f417079b..203708a9 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/GetAssignmentResponseDto.java +++ b/src/main/java/hello/cluebackend/assignment/api/dto/response/GetAssignmentResponseDto.java @@ -1,12 +1,11 @@ -package hello.cluebackend.domain.assignment.presentation.dto.response; +package hello.cluebackend.assignment.api.dto.response; import java.time.LocalDateTime; -import java.util.List; public record GetAssignmentResponseDto( Long assignmentId, String title, + String content, LocalDateTime endDate, - String duringDate, - List files + String duringTime ) {} diff --git a/src/main/java/hello/cluebackend/domain/assignment/service/AssignmentService.java b/src/main/java/hello/cluebackend/assignment/application/AssignmentService.java similarity index 73% rename from src/main/java/hello/cluebackend/domain/assignment/service/AssignmentService.java rename to src/main/java/hello/cluebackend/assignment/application/AssignmentService.java index 5ca0e6f5..825a0ba6 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/service/AssignmentService.java +++ b/src/main/java/hello/cluebackend/assignment/application/AssignmentService.java @@ -1,8 +1,9 @@ -package hello.cluebackend.domain.assignment.service; +package hello.cluebackend.assignment.application; -import hello.cluebackend.domain.assignment.domain.Assignment; -import hello.cluebackend.domain.assignment.domain.repository.AssignmentRepository; -import hello.cluebackend.domain.assignment.presentation.dto.request.AssignmentCreateRequestDto; +import hello.cluebackend.assignment.domain.Assignment; +import hello.cluebackend.assignment.repository.AssignmentRepository; +import hello.cluebackend.assignment.api.dto.request.AssignmentCreateRequestDto; +import hello.cluebackend.assignment.api.dto.response.GetAllAssignment; import hello.cluebackend.domain.classroom.domain.ClassRoom; import hello.cluebackend.domain.classroom.domain.repository.ClassRoomRepository; import hello.cluebackend.domain.classroomuser.domain.ClassRoomUser; @@ -26,28 +27,60 @@ public class AssignmentService { private final ClassRoomUserRepository classRoomUserRepository; private final AssignmentRepository assignmentRepository; private final ClassRoomRepository classRoomRepository; + private final SubmissionService submissionService; + + public List findAllAssignment(Long userId, Long classId) { + try{ + validated(userId, classId); + List assignments = assignmentRepository.findAllByclassId(classId); + List result = assignments.stream() + .map(a -> new GetAllAssignment( + a.getAssignmentId(), + a.getTitle(), + a.getStartDate(), + calculateRemainingTime(a.getStartDate(),a.getEndDate()) + )) + .toList(); + + return result; + }catch (Exception e){ + throw new RuntimeException(e); + } + } - public Assignment createAssignment(Long userId, Long classId, AssignmentCreateRequestDto requestDto) { - UserEntity user = validated(userId, classId); - ClassRoom classRoom = classRoomRepository.findById(classId) - .orElseThrow(() -> new EntityNotFoundException("해당 수업은 찾을수 없습니다.")); - - validateAssignmentDates(requestDto.getStartDate(), requestDto.getEndDate()); - - Assignment assignment = Assignment.builder() - .classRoom(classRoom) - .user(user) - .title(requestDto.getTitle()) - .content(requestDto.getContent()) - .startDate(requestDto.getStartDate()) - .endDate(requestDto.getEndDate()) - .build(); - assignmentRepository.save(assignment); - - return assignment; + public void createAssignment(Long userId, Long classId, AssignmentCreateRequestDto requestDto) { + try{ + UserEntity user = validated(userId, classId); + ClassRoom classRoom = classRoomRepository.findById(classId) + .orElseThrow(() -> new EntityNotFoundException("해당 수업은 찾을수 없습니다.")); + + validateAssignmentDates(requestDto.getStartDate(), requestDto.getEndDate()); + + Assignment assignment = Assignment.builder() + .classRoom(classRoom) + .user(user) + .title(requestDto.getTitle()) + .content(requestDto.getContent()) + .startDate(requestDto.getStartDate()) + .endDate(requestDto.getEndDate()) + .build(); + assignmentRepository.save(assignment); + + List students = classRoomUserRepository.findAllStudentsByClassRoomId(classId); + submissionService.createSubmissionsForStudents(assignment, students); + + } catch (Exception e) { + throw new RuntimeException(e); + } + } -// List students = classRoomUserRepository.findAllStudentsByClassRoomId(classId); -// submissionService.createSubmissionsForStudents(assignment, students); + public void deleteAssignment(Long userId,Long classId, Long assignmentId) { + try{ + UserEntity user = validated(userId, classId); + assignmentRepository.deleteById(assignmentId); + }catch (Exception e){ + throw new RuntimeException(e); + } } // @@ -186,8 +219,8 @@ private void validateAssignmentDates(LocalDateTime start, LocalDateTime end) { } } - private String calculateRemainingTime(LocalDateTime now, LocalDateTime dueDate) { - Duration duration = Duration.between(now, dueDate); + private String calculateRemainingTime(LocalDateTime startDate, LocalDateTime dueDate) { + Duration duration = Duration.between(startDate, dueDate); long days = duration.toDays(); long hours = duration.minusDays(days).toHours(); @@ -197,5 +230,4 @@ private String calculateRemainingTime(LocalDateTime now, LocalDateTime dueDate) return days + "d" + hours + "h"; } - } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/assignment/application/SubmissionFileService.java b/src/main/java/hello/cluebackend/assignment/application/SubmissionFileService.java new file mode 100644 index 00000000..6987f13c --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/application/SubmissionFileService.java @@ -0,0 +1,7 @@ +package hello.cluebackend.assignment.application; + +import org.springframework.stereotype.Service; + +@Service +public class SubmissionFileService { +} diff --git a/src/main/java/hello/cluebackend/assignment/application/SubmissionService.java b/src/main/java/hello/cluebackend/assignment/application/SubmissionService.java new file mode 100644 index 00000000..8291c94e --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/application/SubmissionService.java @@ -0,0 +1,35 @@ +package hello.cluebackend.assignment.application; + +import hello.cluebackend.assignment.domain.Assignment; +import hello.cluebackend.assignment.domain.Submission; +import hello.cluebackend.assignment.persistence.SubmissionRepository; +import hello.cluebackend.domain.user.domain.UserEntity; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class SubmissionService { + private final SubmissionRepository submissionRepository; + + + // 학생에게 과제 할당하는 메서드 + private Submission createDefaultSubmission(Assignment assignment, UserEntity student) { + return Submission.builder() + .assignment(assignment) + .user(student) + .isSubmitted(false) + .submittedAt(null) + .build(); + } + + public void createSubmissionsForStudents(Assignment assignment, List students) { + List submissions = students.stream() + .map(user -> createDefaultSubmission(assignment, user)) + .collect(Collectors.toList()); + submissionRepository.saveAll(submissions); + } +} diff --git a/src/main/java/hello/cluebackend/assignment/application/command/CommandAssignmentService.java b/src/main/java/hello/cluebackend/assignment/application/command/CommandAssignmentService.java new file mode 100644 index 00000000..705299be --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/application/command/CommandAssignmentService.java @@ -0,0 +1,4 @@ +package hello.cluebackend.assignment.application.command; + +public class CommandAssignmentService { +} diff --git a/src/main/java/hello/cluebackend/assignment/application/command/CommandSubmissionService.java b/src/main/java/hello/cluebackend/assignment/application/command/CommandSubmissionService.java new file mode 100644 index 00000000..0f08bd55 --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/application/command/CommandSubmissionService.java @@ -0,0 +1,4 @@ +package hello.cluebackend.assignment.application.command; + +public class CommandSubmissionService { +} diff --git a/src/main/java/hello/cluebackend/assignment/application/query/QueryAssignmentService.java b/src/main/java/hello/cluebackend/assignment/application/query/QueryAssignmentService.java new file mode 100644 index 00000000..ef085231 --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/application/query/QueryAssignmentService.java @@ -0,0 +1,4 @@ +package hello.cluebackend.assignment.application.query; + +public class QueryAssignmentService { +} diff --git a/src/main/java/hello/cluebackend/assignment/application/query/QuerySubmissionService.java b/src/main/java/hello/cluebackend/assignment/application/query/QuerySubmissionService.java new file mode 100644 index 00000000..fd34f75a --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/application/query/QuerySubmissionService.java @@ -0,0 +1,4 @@ +package hello.cluebackend.assignment.application.query; + +public class QuerySubmissionService { +} diff --git a/src/main/java/hello/cluebackend/domain/assignment/domain/Assignment.java b/src/main/java/hello/cluebackend/assignment/domain/Assignment.java similarity index 87% rename from src/main/java/hello/cluebackend/domain/assignment/domain/Assignment.java rename to src/main/java/hello/cluebackend/assignment/domain/Assignment.java index d9c7a989..de656236 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/domain/Assignment.java +++ b/src/main/java/hello/cluebackend/assignment/domain/Assignment.java @@ -1,4 +1,4 @@ -package hello.cluebackend.domain.assignment.domain; +package hello.cluebackend.assignment.domain; import hello.cluebackend.domain.classroom.domain.ClassRoom; import hello.cluebackend.domain.user.domain.UserEntity; @@ -10,8 +10,9 @@ @Entity @Table(name = "Assignment") @Getter @Setter -@AllArgsConstructor @NoArgsConstructor @Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class Assignment { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "assignment_id") diff --git a/src/main/java/hello/cluebackend/assignment/domain/AssignmentAttachment/AssignmentAttachment.java b/src/main/java/hello/cluebackend/assignment/domain/AssignmentAttachment/AssignmentAttachment.java new file mode 100644 index 00000000..e8359c22 --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/domain/AssignmentAttachment/AssignmentAttachment.java @@ -0,0 +1,34 @@ +package hello.cluebackend.assignment.domain.AssignmentAttachment; + +import hello.cluebackend.assignment.domain.Assignment; +import hello.cluebackend.domain.user.domain.UserEntity; +import jakarta.persistence.*; +import lombok.*; +import lombok.experimental.SuperBuilder; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "assignment_attachment") +@Inheritance(strategy = InheritanceType.JOINED) +@DiscriminatorColumn(name = "DTYPE") +@Getter @Setter +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +public abstract class AssignmentAttachment { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "assignment_attachment_id") + private Long assignmentAttachmentId; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name="assignment_id") + private Assignment assignment; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private UserEntity user; + + @Column(name = "update_date") + private LocalDateTime updateDate; +} diff --git a/src/main/java/hello/cluebackend/assignment/domain/AssignmentAttachment/AttachmentDocument.java b/src/main/java/hello/cluebackend/assignment/domain/AssignmentAttachment/AttachmentDocument.java new file mode 100644 index 00000000..655e3a0c --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/domain/AssignmentAttachment/AttachmentDocument.java @@ -0,0 +1,28 @@ +package hello.cluebackend.assignment.domain.AssignmentAttachment; + +import jakarta.persistence.Column; +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; + +@Entity +@SuperBuilder +@DiscriminatorValue("DOCUMENT") +@Getter @Setter +@NoArgsConstructor +public class AttachmentDocument extends AssignmentAttachment{ + @Column(name = "original_file_name", length = 255) + private String originalFileName; + + @Column(name = "stored_file_name", length = 255) + private String storedFileName; + + @Column(name = "file_path", length = 2000) + private String filePath; + + @Column(name = "file_size") + private long fileSize; +} diff --git a/src/main/java/hello/cluebackend/assignment/domain/AssignmentAttachment/AttachmentLink.java b/src/main/java/hello/cluebackend/assignment/domain/AssignmentAttachment/AttachmentLink.java new file mode 100644 index 00000000..eed9639f --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/domain/AssignmentAttachment/AttachmentLink.java @@ -0,0 +1,19 @@ +package hello.cluebackend.assignment.domain.AssignmentAttachment; + +import jakarta.persistence.Column; +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.SuperBuilder; + +@Entity +@SuperBuilder +@DiscriminatorValue("Link") +@Getter @Setter +@NoArgsConstructor +public class AttachmentLink extends AssignmentAttachment{ + @Column(name = "url", length = 2000) + private String url; +} diff --git a/src/main/java/hello/cluebackend/assignment/domain/Submission.java b/src/main/java/hello/cluebackend/assignment/domain/Submission.java new file mode 100644 index 00000000..c05539b8 --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/domain/Submission.java @@ -0,0 +1,33 @@ +package hello.cluebackend.assignment.domain; + +import hello.cluebackend.domain.user.domain.UserEntity; +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "Submission") +@Getter @Setter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class Submission { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "submission_id") + private Long submissionId; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "assignment_id") + private Assignment assignment; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private UserEntity user; + + @Column(name = "is_submitted") + private Boolean isSubmitted; + + @Column(name = "submitted_at", nullable = true) + private LocalDateTime submittedAt; +} diff --git a/src/main/java/hello/cluebackend/assignment/domain/SubmissionAttachment/SubmissionDocument.java b/src/main/java/hello/cluebackend/assignment/domain/SubmissionAttachment/SubmissionDocument.java new file mode 100644 index 00000000..809d4fd9 --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/domain/SubmissionAttachment/SubmissionDocument.java @@ -0,0 +1,26 @@ +package hello.cluebackend.assignment.domain.SubmissionAttachment; + +import jakarta.persistence.Column; +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; +import jakarta.persistence.JoinColumn; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@Entity +@DiscriminatorValue("Document") +@SuperBuilder +@NoArgsConstructor +public class SubmissionDocument extends SubmissionFile { + @JoinColumn(name="original_file_name") + private String originalFileName; + + @Column(name="stored_file_name") + private String storedFileName; + + @Column(name="file_path") + private String filePath; + + @Column(name="file_size") + private int fileSize; +} diff --git a/src/main/java/hello/cluebackend/assignment/domain/SubmissionAttachment/SubmissionFile.java b/src/main/java/hello/cluebackend/assignment/domain/SubmissionAttachment/SubmissionFile.java new file mode 100644 index 00000000..d6b93b5a --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/domain/SubmissionAttachment/SubmissionFile.java @@ -0,0 +1,39 @@ +package hello.cluebackend.assignment.domain.SubmissionAttachment; + +import hello.cluebackend.assignment.domain.Assignment; +import hello.cluebackend.assignment.domain.Submission; +import hello.cluebackend.domain.user.domain.UserEntity; +import jakarta.persistence.*; +import lombok.*; +import lombok.experimental.SuperBuilder; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "assignment_content") +@Inheritance(strategy = InheritanceType.JOINED) +@DiscriminatorColumn(name = "DTYPE") +@Getter @Setter +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +public abstract class SubmissionFile { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name="submission_file_id") + private Long assignmentContentId; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name="user_id") + private UserEntity user; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name="submission_id") + private Submission assignmentCheck; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name="assignment_id") + private Assignment assignment; + + @Column(name="update_date") + private LocalDateTime updateDate; +} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/assignment/domain/SubmissionAttachment/SubmissionLink.java b/src/main/java/hello/cluebackend/assignment/domain/SubmissionAttachment/SubmissionLink.java new file mode 100644 index 00000000..13f1cf6b --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/domain/SubmissionAttachment/SubmissionLink.java @@ -0,0 +1,14 @@ +package hello.cluebackend.assignment.domain.SubmissionAttachment; + +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@Entity +@DiscriminatorValue("Link") +@SuperBuilder +@NoArgsConstructor +public class SubmissionLink extends SubmissionDocument { + private String url; +} diff --git a/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementCommandController.java b/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementCommandController.java new file mode 100644 index 00000000..5a74af8e --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementCommandController.java @@ -0,0 +1,21 @@ +package hello.cluebackend.assignment.management.api; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/assignment") +@RequiredArgsConstructor +@Slf4j +public class AssignmentManagementCommandController { + // TODO : 메인 페이지 제작한 과제 전체 조회 + + // TODO : 학습실 과제 전체 조회, 학습실 - 과제(T) + + // TODO : 특정 과제 학생 제출 여부 전체 조회, 학습실 - 과제 - 확인(T) + + // TODO : 개인 제출 과제 보기, 학습실 - 과제 - 채점(T) + +} diff --git a/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementQueryController.java b/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementQueryController.java new file mode 100644 index 00000000..4af5db3d --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementQueryController.java @@ -0,0 +1,23 @@ +package hello.cluebackend.assignment.management.api; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/assignment/teacher") +@RequiredArgsConstructor +@Slf4j +public class AssignmentManagementQueryController { + // TODO : 과제 생성하기, 과제생성/수정 + + // TODO : 과제 첨부 파일 넣기, 과제생성/수정 + + // TODO : 과제 첨부 삭제하기, 과제생성/수정 + + // TODO : 과제 수정하기, 과제생성/수정 + + // TODO : 과제 삭제하기, 학습실 - 과제 (T) + +} diff --git a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllAssignmentResponse.java b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllAssignmentResponse.java new file mode 100644 index 00000000..23b1e110 --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllAssignmentResponse.java @@ -0,0 +1,7 @@ +package hello.cluebackend.assignment.management.api.dto.response; + +public class GetAllAssignmentResponse { + private Long AssignmentId; // 과제 아이디 + private String duringTime; // 과제 마감까지 남은 시간 + private String title; // 과제 제목 +} diff --git a/src/main/java/hello/cluebackend/assignment/participation/api/AssignmentParticipationCommandController.java b/src/main/java/hello/cluebackend/assignment/participation/api/AssignmentParticipationCommandController.java new file mode 100644 index 00000000..e1233fc3 --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/participation/api/AssignmentParticipationCommandController.java @@ -0,0 +1,19 @@ +package hello.cluebackend.assignment.participation.api; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/assignment/student") +@RequiredArgsConstructor +@Slf4j +public class AssignmentParticipationCommandController { + // TODO : 메인 페이지 학생 미제출 과제 전체 조회, 메인 + + // TODO : 수업실 과제 전체 조회 및 학생 첨부 파일 전체 조회, 학습실 - 과제 + + // TODO : 수업실 과제 단일 세부 조회 및 학생,선생 첨부 파일 전체 조회 , 학습실 - 과제세부확인 + +} diff --git a/src/main/java/hello/cluebackend/assignment/participation/api/AssignmentParticipationQueryController.java b/src/main/java/hello/cluebackend/assignment/participation/api/AssignmentParticipationQueryController.java new file mode 100644 index 00000000..889fc2e7 --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/participation/api/AssignmentParticipationQueryController.java @@ -0,0 +1,21 @@ +package hello.cluebackend.assignment.participation.api; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/assignment/student") +@RequiredArgsConstructor +@Slf4j +public class AssignmentParticipationQueryController { + // TODO : 과제 파일 업로드 하기 + + // TODO : 과제 첨부 파일 삭제하기 + + // TODO : 과제 제출하기 + + // TODO : 과제 제출 취소하기 + +} diff --git a/src/main/java/hello/cluebackend/assignment/persistence/AssignmentAttachmentRepository.java b/src/main/java/hello/cluebackend/assignment/persistence/AssignmentAttachmentRepository.java new file mode 100644 index 00000000..e568ba1a --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/persistence/AssignmentAttachmentRepository.java @@ -0,0 +1,8 @@ +package hello.cluebackend.assignment.persistence; + +import hello.cluebackend.assignment.domain.AssignmentAttachment.AssignmentAttachment; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface AssignmentAttachmentRepository extends JpaRepository { } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/domain/repository/AssignmentRepository.java b/src/main/java/hello/cluebackend/assignment/persistence/AssignmentRepository.java similarity index 57% rename from src/main/java/hello/cluebackend/domain/assignment/domain/repository/AssignmentRepository.java rename to src/main/java/hello/cluebackend/assignment/persistence/AssignmentRepository.java index bd82e90d..2da4a997 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/domain/repository/AssignmentRepository.java +++ b/src/main/java/hello/cluebackend/assignment/persistence/AssignmentRepository.java @@ -1,9 +1,8 @@ -package hello.cluebackend.domain.assignment.domain.repository; +package hello.cluebackend.assignment.persistence; -import hello.cluebackend.domain.assignment.domain.Assignment; +import hello.cluebackend.assignment.domain.Assignment; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository -public interface AssignmentRepository extends JpaRepository { -} +public interface AssignmentRepository extends JpaRepository { } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/assignment/persistence/SubmissionFile.java b/src/main/java/hello/cluebackend/assignment/persistence/SubmissionFile.java new file mode 100644 index 00000000..571a23b2 --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/persistence/SubmissionFile.java @@ -0,0 +1,8 @@ +package hello.cluebackend.assignment.persistence; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + + +@Repository +public interface SubmissionFile extends JpaRepository { } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/assignment/persistence/SubmissionRepository.java b/src/main/java/hello/cluebackend/assignment/persistence/SubmissionRepository.java new file mode 100644 index 00000000..8c841a04 --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/persistence/SubmissionRepository.java @@ -0,0 +1,9 @@ +package hello.cluebackend.assignment.persistence; + +import hello.cluebackend.assignment.domain.Submission; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + + +@Repository +public interface SubmissionRepository extends JpaRepository { } diff --git a/src/main/java/hello/cluebackend/domain/assignment/exception/AssignmentNotFoundException.java b/src/main/java/hello/cluebackend/domain/assignment/exception/AssignmentNotFoundException.java deleted file mode 100644 index 48ed0c42..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/exception/AssignmentNotFoundException.java +++ /dev/null @@ -1,15 +0,0 @@ -package hello.cluebackend.domain.assignment.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(HttpStatus.NOT_FOUND) // 404 Not Found 응답 -public class AssignmentNotFoundException extends RuntimeException { - public AssignmentNotFoundException() { - super("해당 과제를 찾을 수 없습니다."); - } - - public AssignmentNotFoundException(String message) { - super(message); - } -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/exception/UnauthorizedException.java b/src/main/java/hello/cluebackend/domain/assignment/exception/UnauthorizedException.java deleted file mode 100644 index eb04b19a..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/exception/UnauthorizedException.java +++ /dev/null @@ -1,15 +0,0 @@ -package hello.cluebackend.domain.assignment.exception; - -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ResponseStatus; - -@ResponseStatus(HttpStatus.FORBIDDEN) // 403 Forbidden 응답 -public class UnauthorizedException extends RuntimeException { - public UnauthorizedException() { - super("접근 권한이 없습니다."); - } - - public UnauthorizedException(String message) { - super(message); - } -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/presentation/AssignmentController.java b/src/main/java/hello/cluebackend/domain/assignment/presentation/AssignmentController.java deleted file mode 100644 index 10b4e33f..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/presentation/AssignmentController.java +++ /dev/null @@ -1,90 +0,0 @@ -package hello.cluebackend.domain.assignment.presentation; - -import hello.cluebackend.domain.assignment.domain.Assignment; -import hello.cluebackend.domain.assignment.presentation.dto.request.AssignmentCreateRequestDto; -import hello.cluebackend.domain.assignment.service.AssignmentService; -import hello.cluebackend.global.config.JWTUtil; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - - -@RestController -@RequiredArgsConstructor -@RequestMapping("/api/assignments") -public class AssignmentController { - private final AssignmentService assignmentService; - private final JWTUtil jWTUtil; - - // 선생님 과제 생성하기 - @PostMapping("/create/{classId}") - public ResponseEntity createAssignment( - HttpServletRequest request, - @PathVariable Long classId, - @Valid @RequestBody AssignmentCreateRequestDto requestDto - ){ - try{ - String token = jWTUtil.getToken(request); - Long userId = jWTUtil.getUserId(token); - Assignment createAssignment = assignmentService.createAssignment(userId, classId, requestDto); - return new ResponseEntity<>(createAssignment, HttpStatus.CREATED); - } catch (Exception e) { - e.printStackTrace(); - return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); - } - } - -// // 미제출 과제 전체 조회(학생) -// @GetMapping("/") -// public ResponseEntity> getStudentRemainCard (HttpServletRequest request){ -// String token = jWTUtil.getToken(request); -// Long userId = jWTUtil.getUserId(token); -// -// return ResponseEntity.ok(assignmentService.getUnsubmittedAssignments(userId)); -// } -// -// // 교실 전체 과제 조회하기 -// @GetMapping("/{classId}") -// public ResponseEntity> getAllAssignment(HttpServletRequest request, @PathVariable Long classId){ -// String token = jWTUtil.getToken(request); -// Long userId = jWTUtil.getUserId(token); -// -// return ResponseEntity.ok(assignmentService.getAllAssignment(classId, userId)); -// } -// -// // 특정 교실의 학생들의 과제 제출 여부 -// @GetMapping("/{assignmentId}/submissions") -// public ResponseEntity> getAssignmentSubmissionStatus(HttpServletRequest request, @PathVariable Long assignmentId){ -// String token = jWTUtil.getToken(request); -// Long userId = jWTUtil.getUserId(token); -// -// return ResponseEntity.ok(assignmentService.checkAssignments(assignmentId)); -// } -// -// // 특정 수업에 학생들의 단일 과제 제출 여부 확인 API -// @GetMapping("/assignments/classroom/{assignmentId}/{userId}") -// public ResponseEntity getAssignmentSubmissionPerson(HttpServletRequest request, @PathVariable Long assignmentId, @PathVariable Long userId) { -// String token = jWTUtil.getToken(request); -// Long userId = jWTUtil.getUserId(token); -// -// return ResponseEntity.ok(assignmentService.checkAssignment(assignmentId,userId)); -// } - -// //과제 내용 수정 -// @PatchMapping("/api/assignments/{assignmentId}") -// public ResponseEntity modifyAssignment(HttpServletRequest request, @PathVariable Long assignmentId, @RequestBody AssignmentModifyRequestDto assignmentModifyRequestDto){ -// jwtTokenTaker(request); -// -// return ResponseEntity.ok(assignmentService.modifyAssignment(assignmentId,assignmentModifyRequestDto)); -// } - -// // 과제 삭제 -// @DeleteMapping("/api/assignments/{assignmentId}") -// public ResponseEntity deleteAssignment(HttpServlet request, @PathVariable Long assignmentId){ -// jwtTokenTaker(request); -// return ResponseEntity.ok(assignmentService.deleteAssignment(assignmentId)); -// } -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/AssignmentAttachmentDto.java b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/AssignmentAttachmentDto.java deleted file mode 100644 index 1dcdee86..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/AssignmentAttachmentDto.java +++ /dev/null @@ -1,22 +0,0 @@ -package hello.cluebackend.domain.assignment.presentation.dto; - -import hello.cluebackend.domain.assignment.domain.Assignment; -import hello.cluebackend.domain.user.domain.UserEntity; -import lombok.*; - -import java.time.LocalDateTime; - -@Getter @Setter -@ToString @Builder -@NoArgsConstructor -@AllArgsConstructor -public class AssignmentAttachmentDto { - private Long assignmentAttachmentId; - private Assignment assignment; - private UserEntity user; - private String originalFileName; - private String storedFileName; - private String filePath; - private Integer fileSize; - private LocalDateTime updateDate; -} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentAttachmentFile.java b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentAttachmentFile.java deleted file mode 100644 index d7246a2e..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentAttachmentFile.java +++ /dev/null @@ -1,8 +0,0 @@ -package hello.cluebackend.domain.assignment.presentation.dto.response; - -public record AssignmentAttachmentFile( - String OriginalFileName, - String StoredFileName, - String FilePath, - int FileSize -) { } diff --git a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentAttachmentLink.java b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentAttachmentLink.java deleted file mode 100644 index 69694057..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentAttachmentLink.java +++ /dev/null @@ -1,5 +0,0 @@ -package hello.cluebackend.domain.assignment.presentation.dto.response; - -public record AssignmentAttachmentLink( - String Link -) {} diff --git a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentDuration.java b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentDuration.java deleted file mode 100644 index c8ccd5db..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentDuration.java +++ /dev/null @@ -1,8 +0,0 @@ -package hello.cluebackend.domain.assignment.presentation.dto.response; - -import java.time.LocalDateTime; - -public record AssignmentDuration( - LocalDateTime startDate, - LocalDateTime endDate -){} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentSubmissionDto.java b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentSubmissionDto.java deleted file mode 100644 index d61903fe..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentSubmissionDto.java +++ /dev/null @@ -1,13 +0,0 @@ -package hello.cluebackend.domain.assignment.presentation.dto.response; - -import java.time.LocalDateTime; -import java.util.List; - -public record AssignmentSubmissionDto( - Long userId, - int studentNumber, - String userName, - Boolean isSubmitted, - LocalDateTime submittedAt, - List assignmentAttachmentIds -) {} diff --git a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentSubmissionStatusDto.java b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentSubmissionStatusDto.java deleted file mode 100644 index a3aee580..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/AssignmentSubmissionStatusDto.java +++ /dev/null @@ -1,14 +0,0 @@ -package hello.cluebackend.domain.assignment.presentation.dto.response; - -import com.fasterxml.jackson.annotation.JsonFormat; -import java.time.LocalDateTime; - -public record AssignmentSubmissionStatusDto( - int studentNumber, // 학번 - String userName, // 학생 이름 - boolean isSubmitted, // 제출 여부 - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss") - LocalDateTime submittedAt, // 제출 날짜 (ISO-8601 String으로 변환됨) - Long userId, // 학생 아이디 - Long contentId // 과제 아이디 -) {} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/Assignmentfile.java b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/Assignmentfile.java deleted file mode 100644 index 214c782e..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/Assignmentfile.java +++ /dev/null @@ -1,7 +0,0 @@ -package hello.cluebackend.domain.assignment.presentation.dto.response; - -public record Assignmentfile( - Long fileId, - String fileName, - int fileSize -) {} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/StudentAssignmentRemain.java b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/StudentAssignmentRemain.java deleted file mode 100644 index 428ccdba..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/StudentAssignmentRemain.java +++ /dev/null @@ -1,15 +0,0 @@ -package hello.cluebackend.domain.assignment.presentation.dto.response; - -import java.time.LocalDateTime; -import java.util.List; - -public record StudentAssignmentRemain( - Long assignmentId, // 과제 아이디 - String title, // 과제 제목 - LocalDateTime endDate, // 과제 마감일 - String remainingTime, // 마감까지 남은 시간 - Boolean IsSubmitted, // 과제 제출 여부 - String Content, // 과제 내용 - List studentFiles, // 학생이 이때까지 제출한 과제 - List teacherFiles // 선생님이 첨부한 파일 -) {} diff --git a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/file.java b/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/file.java deleted file mode 100644 index 934e9ae8..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/presentation/dto/response/file.java +++ /dev/null @@ -1,7 +0,0 @@ -package hello.cluebackend.domain.assignment.presentation.dto.response; - -public record file( - Long fileId, - String fileName, - int fileSize -) {} diff --git a/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AssignmentAttachment.java b/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AssignmentAttachment.java deleted file mode 100644 index 63594d83..00000000 --- a/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AssignmentAttachment.java +++ /dev/null @@ -1,34 +0,0 @@ -//package hello.cluebackend.domain.assignmentAttachment.domain; -// -//import hello.cluebackend.domain.assignment.domain.Assignment; -//import hello.cluebackend.domain.user.domain.UserEntity; -//import jakarta.persistence.*; -//import lombok.*; -//import lombok.experimental.SuperBuilder; -// -//import java.time.LocalDateTime; -// -//@Entity -//@Table(name = "assignment_attachment") -//@Inheritance(strategy = InheritanceType.JOINED) -//@DiscriminatorColumn(name = "DTYPE") -//@Getter @Setter -//@AllArgsConstructor -//@NoArgsConstructor -//@SuperBuilder -//public abstract class AssignmentAttachment { -// @Id @GeneratedValue(strategy = GenerationType.IDENTITY) -// @Column(name = "assignment_attachment_id") -// private Long assignmentAttachmentId; -// -// @ManyToOne(fetch = FetchType.LAZY) -// @JoinColumn(name="assignment_id") -// private Assignment assignment; -// -// @ManyToOne(fetch = FetchType.LAZY) -// @JoinColumn(name = "user_id") -// private UserEntity user; -// -// @Column(name = "update_date") -// private LocalDateTime updateDate; -//} diff --git a/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AttachmentDocument.java b/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AttachmentDocument.java deleted file mode 100644 index 126aa71f..00000000 --- a/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AttachmentDocument.java +++ /dev/null @@ -1,28 +0,0 @@ -//package hello.cluebackend.domain.assignmentAttachment.domain; -// -//import jakarta.persistence.Column; -//import jakarta.persistence.DiscriminatorValue; -//import jakarta.persistence.Entity; -//import lombok.Getter; -//import lombok.NoArgsConstructor; -//import lombok.Setter; -//import lombok.experimental.SuperBuilder; -// -//@Entity -//@SuperBuilder -//@DiscriminatorValue("DOCUMENT") -//@Getter @Setter -//@NoArgsConstructor -//public class AttachmentDocument extends AssignmentAttachment{ -// @Column(name = "original_file_name", length = 255) -// private String originalFileName; -// -// @Column(name = "stored_file_name", length = 255) -// private String storedFileName; -// -// @Column(name = "file_path", length = 2000) -// private String filePath; -// -// @Column(name = "file_size") -// private long fileSize; -//} diff --git a/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AttachmentLink.java b/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AttachmentLink.java deleted file mode 100644 index 59370138..00000000 --- a/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/AttachmentLink.java +++ /dev/null @@ -1,19 +0,0 @@ -//package hello.cluebackend.domain.assignmentAttachment.domain; -// -//import jakarta.persistence.Column; -//import jakarta.persistence.DiscriminatorValue; -//import jakarta.persistence.Entity; -//import lombok.Getter; -//import lombok.NoArgsConstructor; -//import lombok.Setter; -//import lombok.experimental.SuperBuilder; -// -//@Entity -//@SuperBuilder -//@DiscriminatorValue("Link") -//@Getter @Setter -//@NoArgsConstructor -//public class AttachmentLink extends AssignmentAttachment{ -// @Column(name = "url", length = 2000) -// private String url; -//} diff --git a/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/repository/AssignmentAttachmentRepository.java b/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/repository/AssignmentAttachmentRepository.java deleted file mode 100644 index 52d8d668..00000000 --- a/src/main/java/hello/cluebackend/domain/assignmentAttachment/domain/repository/AssignmentAttachmentRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -//package hello.cluebackend.domain.assignmentAttachment.domain.repository; -// -//import hello.cluebackend.domain.assignmentAttachment.domain.AssignmentAttachment; -//import org.springframework.data.jpa.repository.JpaRepository; -//import org.springframework.stereotype.Repository; -// -//@Repository -//public interface AssignmentAttachmentRepository extends JpaRepository { -//} diff --git a/src/main/java/hello/cluebackend/domain/assignmentAttachment/presentation/AssignmentAttachmentController.java b/src/main/java/hello/cluebackend/domain/assignmentAttachment/presentation/AssignmentAttachmentController.java deleted file mode 100644 index 09bf6510..00000000 --- a/src/main/java/hello/cluebackend/domain/assignmentAttachment/presentation/AssignmentAttachmentController.java +++ /dev/null @@ -1,44 +0,0 @@ -//package hello.cluebackend.domain.assignmentAttachment.presentation; -// -//import hello.cluebackend.domain.assignmentAttachment.presentation.dto.request.AssignmentUploadFileDto; -//import hello.cluebackend.domain.assignmentAttachment.service.AssignmentAttachmentService; -//import hello.cluebackend.global.config.JWTUtil; -//import jakarta.servlet.http.HttpServletRequest; -//import jakarta.validation.Valid; -//import lombok.AllArgsConstructor; -//import org.springframework.http.HttpStatus; -//import org.springframework.http.ResponseEntity; -//import org.springframework.web.bind.annotation.*; -//import org.springframework.web.multipart.MultipartFile; -// -//import java.util.List; -//import java.util.Map; -// -//@RestController -//@RequestMapping("/api/assignment/attachment") -//@AllArgsConstructor -//public class AssignmentAttachmentController { -// private final AssignmentAttachmentService assignmentAttachmentService; -// private final JWTUtil jwtUtil; -// -// // 다수의 링크 업로드 API -// -// -// // 다수의 파일 업로드 API -// @PostMapping("/upload/{assignmentId}") -// public ResponseEntity uploadFiles( -// HttpServletRequest request, -// @PathVariable Long assignmentId, -// @Valid @RequestPart(value = "metadata", required = false) AssignmentUploadFileDto requestDto, -// @RequestPart(value = "files", required = false) List files -// ){ -// try{ -// String token = jwtUtil.getToken(request); -// Long userId = jwtUtil.getUserId(token); -// assignmentAttachmentService.uploadFile(userId,assignmentId,requestDto, files); -// return ResponseEntity.status(HttpStatus.CREATED).body(Map.of("message","파일이 성공적으로 업로드 되었습니다.")); -// } catch (Exception e) { -// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of("message","파일 업로드중 오류가 발생했습니다.")); -// } -// } -//} diff --git a/src/main/java/hello/cluebackend/domain/assignmentAttachment/service/AssignmentAttachmentService.java b/src/main/java/hello/cluebackend/domain/assignmentAttachment/service/AssignmentAttachmentService.java deleted file mode 100644 index bbae6f20..00000000 --- a/src/main/java/hello/cluebackend/domain/assignmentAttachment/service/AssignmentAttachmentService.java +++ /dev/null @@ -1,69 +0,0 @@ -//package hello.cluebackend.domain.assignmentAttachment.service; -// -//import hello.cluebackend.domain.assignment.domain.Assignment; -//import hello.cluebackend.domain.assignment.domain.repository.AssignmentRepository; -//import hello.cluebackend.domain.assignmentAttachment.domain.AttachmentDocument; -//import hello.cluebackend.domain.assignmentAttachment.domain.AttachmentLink; -//import hello.cluebackend.domain.assignmentAttachment.domain.repository.AssignmentAttachmentRepository; -//import hello.cluebackend.domain.assignmentAttachment.presentation.dto.request.AssignmentUploadFileDto; -//import hello.cluebackend.domain.file.service.FileService; -//import hello.cluebackend.domain.user.domain.UserEntity; -//import hello.cluebackend.domain.user.domain.repository.UserRepository; -//import jakarta.persistence.EntityNotFoundException; -//import jakarta.validation.Valid; -//import org.springframework.stereotype.Service; -//import org.springframework.web.multipart.MultipartFile; -// -//import java.time.LocalDateTime; -//import java.util.List; -// -//@Service -//public class AssignmentAttachmentService { -// private UserRepository userRepository; -// private AssignmentRepository assignmentRepository; -// private AssignmentAttachmentRepository assignmentAttachmentRepository; -// -// private FileService fileService; -// -// public void uploadFile( -// Long userId, -// Long assignmentId, -// @Valid AssignmentUploadFileDto requestDto, -// List files -// ) { -// UserEntity user = userRepository.findById(userId) -// .orElseThrow(() -> new EntityNotFoundException("해당 사용자를 찾을수 없습니다.")); -// -// Assignment assignment = assignmentRepository.findById(assignmentId) -// .orElseThrow(() -> new EntityNotFoundException("해당 과제를 찾을수 없습니다.")); -// -// if (files != null && !files.isEmpty()) { // 파일 일때 -// for (MultipartFile sfile : files) { -// String storedFileName = fileService.storeFile(sfile); -// AttachmentDocument document = AttachmentDocument.builder() -// .assignment(assignment) -// .user(user) -// .originalFileName(sfile.getOriginalFilename()) -// .storedFileName(storedFileName) -// .filePath("/uploads/assignmentAttachment" + assignment.getClassRoom().getName() + storedFileName) -// .fileSize(sfile.getSize()) -// .updateDate(LocalDateTime.now()) -// .build(); -// -// assignmentAttachmentRepository.save(document); -// } -// } -// -// if(requestDto.getUrls() != null && !requestDto.getUrls().isEmpty()){ // url 일떄 -// for (String url : requestDto.getUrls()) { -// AttachmentLink link = AttachmentLink.builder() -// .assignment(assignment) -// .user(user) -// .updateDate(LocalDateTime.now()) -// .url(url) -// .build(); -// assignmentAttachmentRepository.save(link); -// } -// } -// } -//} diff --git a/src/main/java/hello/cluebackend/domain/classroomuser/domain/repository/ClassRoomUserRepository.java b/src/main/java/hello/cluebackend/domain/classroomuser/domain/repository/ClassRoomUserRepository.java index 124c3f23..cc6f7701 100644 --- a/src/main/java/hello/cluebackend/domain/classroomuser/domain/repository/ClassRoomUserRepository.java +++ b/src/main/java/hello/cluebackend/domain/classroomuser/domain/repository/ClassRoomUserRepository.java @@ -21,7 +21,7 @@ public interface ClassRoomUserRepository extends JpaRepository findUsersByClassRoomId(@Param("classId") Long classId); - @Query("SELECT cru.user FROM ClassRoomUser cru WHERE cru.classRoom.classRoomId = :classRoomId") + @Query("SELECT cru.user FROM ClassRoomUser cru WHERE cru.classRoom.classRoomId = :classRoomId AND cru.user.role = hello.cluebackend.domain.user.domain.Role.STUDENT") List findAllStudentsByClassRoomId(Long classRoomId); List user(UserEntity user); diff --git a/src/main/java/hello/cluebackend/domain/file/service/FileService.java b/src/main/java/hello/cluebackend/domain/file/service/FileService.java index b74e4164..41b8a3e0 100644 --- a/src/main/java/hello/cluebackend/domain/file/service/FileService.java +++ b/src/main/java/hello/cluebackend/domain/file/service/FileService.java @@ -26,6 +26,7 @@ // @Value("${cloud.aws.s3.bucket}") // private String bucket; // +// // 파일 올리기 // public String storeFile(MultipartFile file) { // String originalFilename = file.getOriginalFilename(); // String extension = ""; @@ -51,6 +52,7 @@ // // 선생님 과제 첨부 // // +// // // 선생님 첨부 파일 다운로드 //// public Resource downloadFile(Long attachmentId, Long userId) { //// AssignmentAttachment attachment = assignmentAttachmentRepository.findById(attachmentId) diff --git a/src/main/java/hello/cluebackend/domain/submission/domain/Submission.java b/src/main/java/hello/cluebackend/domain/submission/domain/Submission.java deleted file mode 100644 index dcd4e7be..00000000 --- a/src/main/java/hello/cluebackend/domain/submission/domain/Submission.java +++ /dev/null @@ -1,39 +0,0 @@ -//package hello.cluebackend.domain.submission.domain; -// -//import hello.cluebackend.domain.assignment.domain.Assignment; -//import hello.cluebackend.domain.submissionFile.domain.SubmissionFile; -//import hello.cluebackend.domain.user.domain.UserEntity; -//import jakarta.persistence.*; -//import lombok.*; -// -//import java.time.LocalDateTime; -//import java.util.List; -// -//@Entity -//@Table(name = "Submission") -//@Getter @Setter -//@AllArgsConstructor -//@NoArgsConstructor -//@Builder -//public class Submission { -// @Id @GeneratedValue(strategy = GenerationType.IDENTITY) -// @Column(name = "submission_id") -// private Long submissionId; -// -// @ManyToOne(fetch = FetchType.LAZY) -// @JoinColumn(name = "assignment_id") -// private Assignment assignment; -// -// @ManyToOne(fetch = FetchType.LAZY) -// @JoinColumn(name = "user_id") -// private UserEntity user; -// -// @Column(name = "is_submitted") -// private Boolean isSubmitted; -// -// @Column(name = "submitted_at") -// private LocalDateTime submittedAt; -// -// @OneToMany -// private List assignmentContents; -//} diff --git a/src/main/java/hello/cluebackend/domain/submission/domain/repository/SubmissionRepository.java b/src/main/java/hello/cluebackend/domain/submission/domain/repository/SubmissionRepository.java deleted file mode 100644 index 866b3d81..00000000 --- a/src/main/java/hello/cluebackend/domain/submission/domain/repository/SubmissionRepository.java +++ /dev/null @@ -1,29 +0,0 @@ -//package hello.cluebackend.domain.submission.domain.repository; -// -//import hello.cluebackend.domain.assignment.domain.Assignment; -//import hello.cluebackend.domain.submission.domain.Submission; -//import hello.cluebackend.domain.user.domain.UserEntity; -//import io.lettuce.core.dynamic.annotation.Param; -//import org.springframework.data.jpa.repository.JpaRepository; -//import org.springframework.data.jpa.repository.Query; -//import org.springframework.stereotype.Repository; -// -//import java.util.List; -// -//@Repository -//public interface SubmissionRepository extends JpaRepository { -// @Query(""" -//SELECT s.assignment -//FROM Submission s -//JOIN s.assignment a -//JOIN a.classRoom cr -//JOIN cr.classRoomUserList cru -//WHERE s.user.userId = :userId -// AND s.isSubmitted = false -//""") -// -// List findUnsubmittedAssignmentsByUserId(@Param("userId") Long userId); -// List findAllByAssignment(Assignment assignment); -// List user(UserEntity user); -// Object findUnsubmittedAssignmentByUserIdAndAssignmentId(Long assignmentId, Long userId); -//} diff --git a/src/main/java/hello/cluebackend/domain/submission/presentation/SubmissionController.java b/src/main/java/hello/cluebackend/domain/submission/presentation/SubmissionController.java deleted file mode 100644 index 614c7560..00000000 --- a/src/main/java/hello/cluebackend/domain/submission/presentation/SubmissionController.java +++ /dev/null @@ -1,9 +0,0 @@ -//package hello.cluebackend.domain.submission.presentation; -// -//import org.springframework.web.bind.annotation.RequestMapping; -//import org.springframework.web.bind.annotation.RestController; -// -//@RestController -//@RequestMapping("/api/assignment") -//public class SubmissionController { -//} diff --git a/src/main/java/hello/cluebackend/domain/submission/service/SubmissionService.java b/src/main/java/hello/cluebackend/domain/submission/service/SubmissionService.java deleted file mode 100644 index e2c331fe..00000000 --- a/src/main/java/hello/cluebackend/domain/submission/service/SubmissionService.java +++ /dev/null @@ -1,29 +0,0 @@ -//package hello.cluebackend.domain.submission.service; -// -//import hello.cluebackend.domain.assignment.domain.Assignment; -//import hello.cluebackend.domain.submission.domain.Submission; -//import hello.cluebackend.domain.submission.domain.repository.SubmissionRepository; -//import hello.cluebackend.domain.user.domain.UserEntity; -//import org.springframework.stereotype.Service; -// -//import java.util.List; -// -//@Service -//public class SubmissionService { -// private SubmissionRepository submissionRepository; -// -// // 학생에게 과제 할당하는 메서드 -// public void createSubmissionsForStudents(Assignment assignment, List students) { -// List submissions = students.stream() -// .map(student -> Submission.builder() -// .assignment(assignment) -// .user(student) -// .isSubmitted(false) -// .submittedAt(null) -// .build()) -// .toList(); -// -// submissionRepository.saveAll(submissions); -// } -// -//} diff --git a/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionDocument.java b/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionDocument.java deleted file mode 100644 index a34111f4..00000000 --- a/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionDocument.java +++ /dev/null @@ -1,26 +0,0 @@ -//package hello.cluebackend.domain.submissionFile.domain; -// -//import jakarta.persistence.Column; -//import jakarta.persistence.DiscriminatorValue; -//import jakarta.persistence.Entity; -//import jakarta.persistence.JoinColumn; -//import lombok.NoArgsConstructor; -//import lombok.experimental.SuperBuilder; -// -//@Entity -//@DiscriminatorValue("Document") -//@SuperBuilder -//@NoArgsConstructor -//public class SubmissionDocument extends SubmissionFile { -// @JoinColumn(name="original_file_name") -// private String originalFileName; -// -// @Column(name="stored_file_name") -// private String storedFileName; -// -// @Column(name="file_path") -// private String filePath; -// -// @Column(name="file_size") -// private int fileSize; -//} diff --git a/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionFile.java b/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionFile.java deleted file mode 100644 index 12d0571a..00000000 --- a/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionFile.java +++ /dev/null @@ -1,39 +0,0 @@ -//package hello.cluebackend.domain.submissionFile.domain; -// -//import hello.cluebackend.domain.assignment.domain.Assignment; -//import hello.cluebackend.domain.submission.domain.Submission; -//import hello.cluebackend.domain.user.domain.UserEntity; -//import jakarta.persistence.*; -//import lombok.*; -//import lombok.experimental.SuperBuilder; -// -//import java.time.LocalDateTime; -// -//@Entity -//@Table(name = "assignment_content") -//@Inheritance(strategy = InheritanceType.JOINED) -//@DiscriminatorColumn(name = "DTYPE") -//@Getter @Setter -//@AllArgsConstructor -//@NoArgsConstructor -//@SuperBuilder -//public abstract class SubmissionFile { -// @Id @GeneratedValue(strategy = GenerationType.IDENTITY) -// @Column(name="submission_file_id") -// private Long assignmentContentId; -// -// @ManyToOne(fetch = FetchType.LAZY) -// @JoinColumn(name="user_id") -// private UserEntity user; -// -// @ManyToOne(fetch = FetchType.LAZY) -// @JoinColumn(name="submission_id") -// private Submission assignmentCheck; -// -// @ManyToOne(fetch = FetchType.LAZY) -// @JoinColumn(name="assignment_id") -// private Assignment assignment; -// -// @Column(name="update_date") -// private LocalDateTime updateDate; -//} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionLink.java b/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionLink.java deleted file mode 100644 index dd16b1c4..00000000 --- a/src/main/java/hello/cluebackend/domain/submissionFile/domain/SubmissionLink.java +++ /dev/null @@ -1,14 +0,0 @@ -//package hello.cluebackend.domain.submissionFile.domain; -// -//import jakarta.persistence.DiscriminatorValue; -//import jakarta.persistence.Entity; -//import lombok.NoArgsConstructor; -//import lombok.experimental.SuperBuilder; -// -//@Entity -//@DiscriminatorValue("Link") -//@SuperBuilder -//@NoArgsConstructor -//public class SubmissionLink extends SubmissionFile { -// private String url; -//} diff --git a/src/main/java/hello/cluebackend/domain/submissionFile/domain/repository/SubmissionFile.java b/src/main/java/hello/cluebackend/domain/submissionFile/domain/repository/SubmissionFile.java deleted file mode 100644 index da829d03..00000000 --- a/src/main/java/hello/cluebackend/domain/submissionFile/domain/repository/SubmissionFile.java +++ /dev/null @@ -1,11 +0,0 @@ -//package hello.cluebackend.domain.submissionFile.domain.repository; -// -//import org.springframework.data.jpa.repository.JpaRepository; -//import org.springframework.stereotype.Repository; -// -//import java.util.List; -// -//@Repository -//public interface SubmissionFile extends JpaRepository { -// List findAllByUserId(Long userId); -//} diff --git a/src/main/java/hello/cluebackend/domain/submissionFile/presentation/SubmissionFileController.java b/src/main/java/hello/cluebackend/domain/submissionFile/presentation/SubmissionFileController.java deleted file mode 100644 index 47054d3d..00000000 --- a/src/main/java/hello/cluebackend/domain/submissionFile/presentation/SubmissionFileController.java +++ /dev/null @@ -1,9 +0,0 @@ -//package hello.cluebackend.domain.submissionFile.presentation; -// -//import org.springframework.web.bind.annotation.RequestMapping; -//import org.springframework.web.bind.annotation.RestController; -// -//@RestController -//@RequestMapping("/api/assignment") -//public class SubmissionFileController { -//} diff --git a/src/main/java/hello/cluebackend/domain/submissionFile/service/SubmissionFileService.java b/src/main/java/hello/cluebackend/domain/submissionFile/service/SubmissionFileService.java deleted file mode 100644 index 5d9ea05c..00000000 --- a/src/main/java/hello/cluebackend/domain/submissionFile/service/SubmissionFileService.java +++ /dev/null @@ -1,7 +0,0 @@ -//package hello.cluebackend.domain.submissionFile.service; -// -//import org.springframework.stereotype.Service; -// -//@Service -//public class SubmissionFileService { -//} diff --git a/src/main/java/hello/cluebackend/global/common/response/ApiResponse.java b/src/main/java/hello/cluebackend/global/common/response/ApiResponse.java new file mode 100644 index 00000000..767d3909 --- /dev/null +++ b/src/main/java/hello/cluebackend/global/common/response/ApiResponse.java @@ -0,0 +1,39 @@ +//package hello.cluebackend.global.common.response; +// +//import hello.cluebackend.assignment.domain.Assignment; +//import lombok.*; +// +//import java.util.List; +// +//@Getter +//@Builder +//@AllArgsConstructor +//@NoArgsConstructor(access = AccessLevel.PROTECTED) +//public class ApiResponse { +// +// private static final String SUCCESS_STATUS = "success"; +// private static final String FAIL_STATUS = "fail"; +// private static final String ERROR_STATUS = "error"; +// +// private int code; +// private String message; +// private T data; +// +// public ApiResponse(int code, String message, T data){ +// this.code = code; +// this.message = message; +// this.data = data; +// } +// +// public static ApiResponse success(T data){ +// return new ApiResponse<>(, "요청 성공", data); +// } +// +// public static ApiResponse success(ResponseCode code){ +// return new ApiResponse<>(code); +// } +// +// public static List error(String message) { +// return new ApiResponse<>("ERROR", message, null); +// } +//} diff --git a/src/main/java/hello/cluebackend/global/common/response/ResponseCode.java b/src/main/java/hello/cluebackend/global/common/response/ResponseCode.java new file mode 100644 index 00000000..a0247555 --- /dev/null +++ b/src/main/java/hello/cluebackend/global/common/response/ResponseCode.java @@ -0,0 +1,46 @@ +//package hello.cluebackend.global.common.response; +// +//import org.springframework.http.HttpStatus; +//import org.springframework.http.ResponseEntity; +// +//public enum ResponseCode { +// //== 2xx: 성공 ==// +// SUCCESS(HttpStatus.OK, "요청이 성공적으로 처리되었습니다."), +// CREATED(HttpStatus.CREATED, "리소스가 성공적으로 생성되었습니다."), +// DELETED(HttpStatus.OK, "리소스가 성공적으로 삭제되었습니다."), +// +// //== 4xx: 클라이언트 오류 ==// +// BAD_REQUEST(HttpStatus.BAD_REQUEST, "잘못된 요청입니다."), +// UNAUTHORIZED(HttpStatus.UNAUTHORIZED, "인증이 필요합니다."), +// FORBIDDEN(HttpStatus.FORBIDDEN, "접근 권한이 없습니다."), +// NOT_FOUND(HttpStatus.NOT_FOUND, "리소스를 찾을 수 없습니다."), +// CONFLICT(HttpStatus.CONFLICT, "요청 충돌이 발생했습니다."), +// +// //== 5xx: 서버 오류 ==// +// INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "서버 내부 오류가 발생했습니다."), +// SERVICE_UNAVAILABLE(HttpStatus.SERVICE_UNAVAILABLE, "서비스를 이용할 수 없습니다."); +// +// private final HttpStatus httpStatus; +// private final String message; +// +// ResponseCode(HttpStatus httpStatus, String message){ +// this.httpStatus = httpStatus; +// this.message = message; +// } +// +// public HttpStatus getHttpStatus() { +// return httpStatus; +// } +// +// public String getMessage() { +// return message; +// } +// +// public int getStatusCode() { +// return httpStatus.value(); +// } +// +// public static ResponseEntity> buildResponse(ResponseCode code, T data){ +// return ResponseEntity.status(code.getHttpStatus()).body(ApiResponse.success(code, data)); +// } +//} diff --git a/src/main/java/hello/cluebackend/global/config/TestConfig.java b/src/main/java/hello/cluebackend/global/config/TestConfig.java deleted file mode 100644 index 45ca4bb0..00000000 --- a/src/main/java/hello/cluebackend/global/config/TestConfig.java +++ /dev/null @@ -1,5 +0,0 @@ -package hello.cluebackend.global.config; - - -public class TestConfig { -} diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index b668d201..98babe66 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -11,7 +11,7 @@ spring: database-platform: org.hibernate.dialect.PostgreSQLDialect show-sql: true hibernate: - ddl-auto: update + ddl-auto: create data: redis: # host: my_redis From cb9850f716710196099485ebec63ae73c19a6930 Mon Sep 17 00:00:00 2001 From: Haeyul Date: Fri, 8 Aug 2025 17:30:20 +0900 Subject: [PATCH 04/22] =?UTF-8?q?feat(#5):=20=EC=84=A0=EC=83=9D=EB=8B=98?= =?UTF-8?q?=20=EB=A9=94=EC=9D=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=A0=9C?= =?UTF-8?q?=EC=9E=91=ED=95=9C=20=EA=B3=BC=EC=A0=9C=20=EC=A0=84=EC=B2=B4=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assignment/api/AssignmentController.java | 160 ------------ .../api/CommandAssignmentController.java | 42 ---- .../api/QueryAssignmentController.java | 14 -- .../request/AssignmentCreateRequestDto.java | 30 --- .../dto/request/AssignmentUploadFileDto.java | 11 - .../api/dto/response/GetAllAssignment.java | 10 - .../response/GetAssignmentResponseDto.java | 11 - .../application/AssignmentService.java | 233 ------------------ .../application/SubmissionFileService.java | 7 - .../application/SubmissionService.java | 35 --- .../command/CommandAssignmentService.java | 4 - .../command/CommandSubmissionService.java | 4 - .../query/QueryAssignmentService.java | 4 - .../query/QuerySubmissionService.java | 4 - ...AssignmentManagementCommandController.java | 44 +++- .../response/GetAllAssignmentResponse.java | 14 +- .../GetAllAssignmentResponseResult.java | 10 + .../GetAllClassRoomAssignmentResponse.java | 19 ++ ...tAllClassRoomAssignmentResponseResult.java | 5 + ...entAttachmentManagementCommandService.java | 8 + .../AssignmentManagementCommandService.java | 28 +++ ...nmentAttachmentManagementQueryService.java | 7 + .../AssignmentManagementQueryService.java | 7 + .../{ => management}/domain/Assignment.java | 2 +- .../AssignmentAttachment.java | 4 +- .../AttachmentDocument.java | 2 +- .../AssignmentAttachment/AttachmentLink.java | 2 +- .../AssignmentAttachmentRepository.java | 10 + .../persistence/AssignmentRepository.java | 19 ++ .../domain/Submission.java | 3 +- .../SubmissionAttachment.java} | 8 +- .../SubmissionDocument.java | 4 +- .../SubmissionAttachment/SubmissionLink.java | 4 +- .../SubmissionAttachmentRepository.java | 9 + .../persistence/SubmissionRepository.java | 4 +- .../AssignmentAttachmentRepository.java | 8 - .../persistence/AssignmentRepository.java | 8 - .../persistence/SubmissionFile.java | 8 - .../global/common/response/ApiResponse.java | 2 +- 39 files changed, 193 insertions(+), 615 deletions(-) delete mode 100644 src/main/java/hello/cluebackend/assignment/api/AssignmentController.java delete mode 100644 src/main/java/hello/cluebackend/assignment/api/CommandAssignmentController.java delete mode 100644 src/main/java/hello/cluebackend/assignment/api/QueryAssignmentController.java delete mode 100644 src/main/java/hello/cluebackend/assignment/api/dto/request/AssignmentCreateRequestDto.java delete mode 100644 src/main/java/hello/cluebackend/assignment/api/dto/request/AssignmentUploadFileDto.java delete mode 100644 src/main/java/hello/cluebackend/assignment/api/dto/response/GetAllAssignment.java delete mode 100644 src/main/java/hello/cluebackend/assignment/api/dto/response/GetAssignmentResponseDto.java delete mode 100644 src/main/java/hello/cluebackend/assignment/application/AssignmentService.java delete mode 100644 src/main/java/hello/cluebackend/assignment/application/SubmissionFileService.java delete mode 100644 src/main/java/hello/cluebackend/assignment/application/SubmissionService.java delete mode 100644 src/main/java/hello/cluebackend/assignment/application/command/CommandAssignmentService.java delete mode 100644 src/main/java/hello/cluebackend/assignment/application/command/CommandSubmissionService.java delete mode 100644 src/main/java/hello/cluebackend/assignment/application/query/QueryAssignmentService.java delete mode 100644 src/main/java/hello/cluebackend/assignment/application/query/QuerySubmissionService.java create mode 100644 src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllAssignmentResponseResult.java create mode 100644 src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponse.java create mode 100644 src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponseResult.java create mode 100644 src/main/java/hello/cluebackend/assignment/management/application/command/AssignmentAttachmentManagementCommandService.java create mode 100644 src/main/java/hello/cluebackend/assignment/management/application/command/AssignmentManagementCommandService.java create mode 100644 src/main/java/hello/cluebackend/assignment/management/application/query/AssignmentAttachmentManagementQueryService.java create mode 100644 src/main/java/hello/cluebackend/assignment/management/application/query/AssignmentManagementQueryService.java rename src/main/java/hello/cluebackend/assignment/{ => management}/domain/Assignment.java (93%) rename src/main/java/hello/cluebackend/assignment/{ => management}/domain/AssignmentAttachment/AssignmentAttachment.java (85%) rename src/main/java/hello/cluebackend/assignment/{ => management}/domain/AssignmentAttachment/AttachmentDocument.java (90%) rename src/main/java/hello/cluebackend/assignment/{ => management}/domain/AssignmentAttachment/AttachmentLink.java (85%) create mode 100644 src/main/java/hello/cluebackend/assignment/management/persistence/AssignmentAttachmentRepository.java create mode 100644 src/main/java/hello/cluebackend/assignment/management/persistence/AssignmentRepository.java rename src/main/java/hello/cluebackend/assignment/{ => participation}/domain/Submission.java (85%) rename src/main/java/hello/cluebackend/assignment/{domain/SubmissionAttachment/SubmissionFile.java => participation/domain/SubmissionAttachment/SubmissionAttachment.java} (77%) rename src/main/java/hello/cluebackend/assignment/{ => participation}/domain/SubmissionAttachment/SubmissionDocument.java (79%) rename src/main/java/hello/cluebackend/assignment/{ => participation}/domain/SubmissionAttachment/SubmissionLink.java (64%) create mode 100644 src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionAttachmentRepository.java rename src/main/java/hello/cluebackend/assignment/{ => participation}/persistence/SubmissionRepository.java (60%) delete mode 100644 src/main/java/hello/cluebackend/assignment/persistence/AssignmentAttachmentRepository.java delete mode 100644 src/main/java/hello/cluebackend/assignment/persistence/AssignmentRepository.java delete mode 100644 src/main/java/hello/cluebackend/assignment/persistence/SubmissionFile.java diff --git a/src/main/java/hello/cluebackend/assignment/api/AssignmentController.java b/src/main/java/hello/cluebackend/assignment/api/AssignmentController.java deleted file mode 100644 index 35de9c5a..00000000 --- a/src/main/java/hello/cluebackend/assignment/api/AssignmentController.java +++ /dev/null @@ -1,160 +0,0 @@ -package hello.cluebackend.assignment.api; - -import hello.cluebackend.assignment.api.dto.request.AssignmentCreateRequestDto; -import hello.cluebackend.assignment.api.dto.response.GetAllAssignment; -import hello.cluebackend.assignment.api.dto.response.GetAssignmentResponseDto; -import hello.cluebackend.assignment.application.AssignmentService; -import hello.cluebackend.global.config.JWTUtil; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@RestController -@Slf4j -@RequiredArgsConstructor -public class AssignmentController { - private final JWTUtil jwtUtil; - private final AssignmentService assignmentService; - - // TODO : 수업실 과제 페이지 과제 젠체 조회 - @GetMapping("/get/{classId}") - public ResponseEntity> getClassroomAssignment( - HttpServletRequest request, - @PathVariable Long classId - ) { - try { - String token = jwtUtil.getToken(request); - Long userId = jwtUtil.getUserId(token); - - List assignments = assignmentService.findAllAssignment(userId, classId); -// List attachments = assignmentA - - return ResponseEntity.ok(assignments); - } catch (Exception e){ - log.error("Error while getting assignments", e); - return ResponseEntity.internalServerError().build(); - } - } - - // TODO : 과제 단일 조회 - - // TODO : 과제 생성 - @PostMapping("/create/{classId}") - public ResponseEntity createAssignment( - HttpServletRequest request, - @PathVariable Long classId, - @Valid @RequestBody AssignmentCreateRequestDto requestDto - ){ - try{ - String token = jwtUtil.getToken(request); - Long userId = jwtUtil.getUserId(token); - assignmentService.createAssignment(userId, classId, requestDto); - return ResponseEntity.ok().build(); - } catch (Exception e) { - log.error("Error while create assignment",e); - return ResponseEntity.internalServerError().build(); - } - } - - // TODO : 과제 수정 - // @PatchMapping("/api/assignments/{assignmentId}") - // public ResponseEntity modifyAssignment(HttpServletRequest request, @PathVariable Long assignmentId, @RequestBody AssignmentModifyRequestDto assignmentModifyRequestDto){ - // jwtTokenTaker(request); - - // return ResponseEntity.ok(assignmentService.modifyAssignment(assignmentId,assignmentModifyRequestDto)); - // } - - // TODO : 과제 삭제 - @DeleteMapping("/delete/{classId}/{assignmentId}") - public ResponseEntity deleteAssignment( - HttpServletRequest request, - @PathVariable Long assignmentId, - @PathVariable Long classId - ){ - try{ - String token = jwtUtil.getToken(request); - Long userId = jwtUtil.getUserId(token); - assignmentService.deleteAssignment(userId,classId,assignmentId); - return ResponseEntity.noContent().build(); - }catch (Exception e){ - log.error("Error while delete assignment",e); - return ResponseEntity.internalServerError().build(); - } - } - - // TODO : 선생님 과제 제출 여부 조회 - - // TODO : 과제 첨부 파일 업로드 - // @PostMapping("/link/{assignmentId}") - // public ResponseEntity addLink( - // HttpServletRequest request, - // @PathVariable Long assignmentId - // ){ - // try{ - // String token = jwtUtil.getToken(request); - // Long userId = jwtUtil.getUserId(token); - // assignmentAttachmentService.addLink() - // }catch (Exception e){ - // return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of("message","링크 추가중 오류가 발생했습니다.")); - // } - // } - - - // // 파일 업로드 API - // @PostMapping("/upload/{assignmentId}") - // public ResponseEntity uploadFiles( - // HttpServletRequest request, - // @PathVariable Long assignmentId, - // @Valid @RequestPart(value = "metadata", required = false) AssignmentUploadFileDto requestDto, - // @RequestPart(value = "files", required = false) List files - // ){ - // try{ - // String token = jwtUtil.getToken(request); - // Long userId = jwtUtil.getUserId(token); - // assignmentAttachmentService.uploadFile(userId, assignmentId, requestDto, files); - // return new ResponseEntity<>(HttpStatus.CREATED); - // } catch (Exception e) { - // e.printStackTrace(); - // return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(Map.of("message","파일 업로드중 오류가 발생했습니다.")); - // } - // } - - // TODO : 과제 제출 파일 업로드 - - // TODO : 과제 제출 파일 삭제 - - // TODO : 과제 제출 - - // TODO : 과제 제출 취소 - - // TODO : 과제 단일 조회 - @GetMapping("/get/{classId}/{assignmentId}") - public ResponseEntity getClassRoomAssignment( - HttpServletRequest request, - @PathVariable Long classId, - @PathVariable Long assignmentId - ){ - try{ - String token = jwtUtil.getToken(request); - Long userId = jwtUtil.getUserId(token); - return ResponseEntity.ok().build(); - }catch (Exception e) { - log.error("Error while getting assignment",e); - return ResponseEntity.internalServerError().build(); - } - } - -// // 미제출 과제 전체 조회(학생) -// @GetMapping("/") -// public ResponseEntity> getStudentRemainCard (HttpServletRequest request){ -// String token = jWTUtil.getToken(request); -// Long userId = jWTUtil.getUserId(token); -// -// return ResponseEntity.ok(assignmentService.getUnsubmittedAssignments(userId)); -// } -} diff --git a/src/main/java/hello/cluebackend/assignment/api/CommandAssignmentController.java b/src/main/java/hello/cluebackend/assignment/api/CommandAssignmentController.java deleted file mode 100644 index 04ca4d77..00000000 --- a/src/main/java/hello/cluebackend/assignment/api/CommandAssignmentController.java +++ /dev/null @@ -1,42 +0,0 @@ -package hello.cluebackend.assignment.api; - -import hello.cluebackend.assignment.api.dto.response.GetAllAssignment; -import jakarta.servlet.http.HttpServletRequest; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -@RestController -@RequestMapping("/api/assignment") -@RequiredArgsConstructor -@Slf4j -public class CommandAssignmentController { - // TODO : 학생 미제출 과제 전체 조회 - - - // TODO : 학생 수업실 과제 페이지 과제 젠체 조회 - @GetMapping("/get/{classId}") - public ResponseEntity> getClassroomAssignment( - HttpServletRequest request, - @PathVariable Long classId - ) { - try { - String token = jwtUtil.getToken(request); - Long userId = jwtUtil.getUserId(token); - - List assignments = assignmentService.findAllAssignment(userId, classId); -// List attachments = assignmentA - - return ResponseEntity.ok(assignments); - } catch (Exception e){ - log.error("Error while getting assignments", e); - return ResponseEntity.internalServerError().build(); - } - } -} diff --git a/src/main/java/hello/cluebackend/assignment/api/QueryAssignmentController.java b/src/main/java/hello/cluebackend/assignment/api/QueryAssignmentController.java deleted file mode 100644 index 9ea136ff..00000000 --- a/src/main/java/hello/cluebackend/assignment/api/QueryAssignmentController.java +++ /dev/null @@ -1,14 +0,0 @@ -package hello.cluebackend.assignment.api; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("api/assignment") -@RequiredArgsConstructor -@Slf4j -public class QueryAssignmentController { - -} diff --git a/src/main/java/hello/cluebackend/assignment/api/dto/request/AssignmentCreateRequestDto.java b/src/main/java/hello/cluebackend/assignment/api/dto/request/AssignmentCreateRequestDto.java deleted file mode 100644 index adca1571..00000000 --- a/src/main/java/hello/cluebackend/assignment/api/dto/request/AssignmentCreateRequestDto.java +++ /dev/null @@ -1,30 +0,0 @@ -package hello.cluebackend.assignment.api.dto.request; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Builder; -import lombok.Getter; - -import java.time.LocalDateTime; - -@Getter -public class AssignmentCreateRequestDto { - @NotBlank(message = "과제 제목은 필수입니다.") - private String title; - - private String content; - - @NotNull(message = "시작 일자는 필수입니다.") - private LocalDateTime startDate; - - @NotNull(message = "마감일은 필수입니다.") - private LocalDateTime endDate; - - @Builder - public AssignmentCreateRequestDto(String title, String content, LocalDateTime startDate, LocalDateTime endDate){ - this.title = title; - this.content = content; - this.startDate = startDate; - this.endDate = endDate; - } -} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/assignment/api/dto/request/AssignmentUploadFileDto.java b/src/main/java/hello/cluebackend/assignment/api/dto/request/AssignmentUploadFileDto.java deleted file mode 100644 index de6a8efd..00000000 --- a/src/main/java/hello/cluebackend/assignment/api/dto/request/AssignmentUploadFileDto.java +++ /dev/null @@ -1,11 +0,0 @@ -package hello.cluebackend.assignment.api.dto.request; - -import lombok.Getter; -import lombok.Setter; - -import java.util.List; - -@Getter @Setter -public class AssignmentUploadFileDto { - private List urls; -} diff --git a/src/main/java/hello/cluebackend/assignment/api/dto/response/GetAllAssignment.java b/src/main/java/hello/cluebackend/assignment/api/dto/response/GetAllAssignment.java deleted file mode 100644 index 249ee58b..00000000 --- a/src/main/java/hello/cluebackend/assignment/api/dto/response/GetAllAssignment.java +++ /dev/null @@ -1,10 +0,0 @@ -package hello.cluebackend.assignment.api.dto.response; - -import java.time.LocalDateTime; - -public record GetAllAssignment( - Long assignmentId, - String title, - LocalDateTime endDate, - String duringTime -){} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/assignment/api/dto/response/GetAssignmentResponseDto.java b/src/main/java/hello/cluebackend/assignment/api/dto/response/GetAssignmentResponseDto.java deleted file mode 100644 index 203708a9..00000000 --- a/src/main/java/hello/cluebackend/assignment/api/dto/response/GetAssignmentResponseDto.java +++ /dev/null @@ -1,11 +0,0 @@ -package hello.cluebackend.assignment.api.dto.response; - -import java.time.LocalDateTime; - -public record GetAssignmentResponseDto( - Long assignmentId, - String title, - String content, - LocalDateTime endDate, - String duringTime -) {} diff --git a/src/main/java/hello/cluebackend/assignment/application/AssignmentService.java b/src/main/java/hello/cluebackend/assignment/application/AssignmentService.java deleted file mode 100644 index 825a0ba6..00000000 --- a/src/main/java/hello/cluebackend/assignment/application/AssignmentService.java +++ /dev/null @@ -1,233 +0,0 @@ -package hello.cluebackend.assignment.application; - -import hello.cluebackend.assignment.domain.Assignment; -import hello.cluebackend.assignment.repository.AssignmentRepository; -import hello.cluebackend.assignment.api.dto.request.AssignmentCreateRequestDto; -import hello.cluebackend.assignment.api.dto.response.GetAllAssignment; -import hello.cluebackend.domain.classroom.domain.ClassRoom; -import hello.cluebackend.domain.classroom.domain.repository.ClassRoomRepository; -import hello.cluebackend.domain.classroomuser.domain.ClassRoomUser; -import hello.cluebackend.domain.classroomuser.domain.repository.ClassRoomUserRepository; -import hello.cluebackend.domain.user.domain.Role; -import hello.cluebackend.domain.user.domain.UserEntity; -import hello.cluebackend.domain.user.domain.repository.UserRepository; -import jakarta.persistence.EntityNotFoundException; -import lombok.RequiredArgsConstructor; -import org.springframework.security.access.AccessDeniedException; -import org.springframework.stereotype.Service; - -import java.time.Duration; -import java.time.LocalDateTime; -import java.util.List; - -@Service -@RequiredArgsConstructor -public class AssignmentService { - private final UserRepository userRepository; - private final ClassRoomUserRepository classRoomUserRepository; - private final AssignmentRepository assignmentRepository; - private final ClassRoomRepository classRoomRepository; - private final SubmissionService submissionService; - - public List findAllAssignment(Long userId, Long classId) { - try{ - validated(userId, classId); - List assignments = assignmentRepository.findAllByclassId(classId); - List result = assignments.stream() - .map(a -> new GetAllAssignment( - a.getAssignmentId(), - a.getTitle(), - a.getStartDate(), - calculateRemainingTime(a.getStartDate(),a.getEndDate()) - )) - .toList(); - - return result; - }catch (Exception e){ - throw new RuntimeException(e); - } - } - - public void createAssignment(Long userId, Long classId, AssignmentCreateRequestDto requestDto) { - try{ - UserEntity user = validated(userId, classId); - ClassRoom classRoom = classRoomRepository.findById(classId) - .orElseThrow(() -> new EntityNotFoundException("해당 수업은 찾을수 없습니다.")); - - validateAssignmentDates(requestDto.getStartDate(), requestDto.getEndDate()); - - Assignment assignment = Assignment.builder() - .classRoom(classRoom) - .user(user) - .title(requestDto.getTitle()) - .content(requestDto.getContent()) - .startDate(requestDto.getStartDate()) - .endDate(requestDto.getEndDate()) - .build(); - assignmentRepository.save(assignment); - - List students = classRoomUserRepository.findAllStudentsByClassRoomId(classId); - submissionService.createSubmissionsForStudents(assignment, students); - - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - public void deleteAssignment(Long userId,Long classId, Long assignmentId) { - try{ - UserEntity user = validated(userId, classId); - assignmentRepository.deleteById(assignmentId); - }catch (Exception e){ - throw new RuntimeException(e); - } - } - -// -// public List checkAssignments(Long assignmentId) { -// Optional assignment = assignmentRepository.findById(assignmentId); -// List assignmentChecks = assignmentCheckRepository.findAllByAssignment(assignment.orElse(null)); -// -// List dtoList = null; -// -// for (Submission assignmentCheck : assignmentChecks) { -// UserEntity user = assignmentCheck.getUser(); -// -// AssignmentSubmissionStatusDto dto = new AssignmentSubmissionStatusDto( -// user.getClassCode(), // 학번 -// user.getUsername(), // 학생 이름 -// assignmentCheck.getIsSubmitted(), // 제출 여부 -// assignmentCheck.getSubmittedAt(), // 제출 날짜 -// user.getUserId(), // 유저 아이디 -// assignment.get().getAssignmentId() // 과제 아아디 -// ); -// dtoList.add(dto); -// } -// return dtoList; -// } -// -// public String generateUniqueFileName(String originalFileName) { -// String extension = ""; -// -// int dotIndex = originalFileName.lastIndexOf("."); -// if (dotIndex > 0) { -// extension = originalFileName.substring(dotIndex); // 확장자 포함 -// } -// -// String uuid = UUID.randomUUID().toString(); -// -// return uuid + extension; -// } -// -// public List getAllAssignment(Long classId, Long userId) { -// -// UserEntity user = validated(classId, userId); -// -// List assignments = assignmentRepository.findAllByClassRoom_ClassRoomId(classId); -// -// return assignments.stream().map(assignment -> { -// List attachments = assignmentAttachmentRepository.findAllByAssignment(assignment); -// -// List fileDtos = attachments.stream() -// .map(attachment -> new Assignmentfile( -// attachment.getAssignmentAttachmentId(), -// attachment.getOriginalFileName(), -// attachment.getFileSize() -// )) -// .toList(); -// -// String remainingTime = calculateRemainingTime(LocalDateTime.now(), assignment.getDueDate()); -// -// return new GetAssignmentResponseDto( -// assignment.getAssignmentId(), -// assignment.getTitle(), -// assignment.getDueDate(), -// remainingTime, -// fileDtos -// ); -// }).toList(); -// } - -// public List getUnsubmittedAssignments(Long userId) { -// UserEntity user = userRepository.findById(userId) -// .orElseThrow(() -> new EntityNotFoundException("해당 학생을 찾을수 없습니다.")); -// -// List assignments = assignmentCheckRepository.findUnsubmittedAssignmentsByUserId(userId); - -// return assignments.stream() -// .filter(assignment -> assignmentCheckRepository.getAssignmentCheckByAssignmentAndUser((assignment,user).) -// .map(a -> new StudentAssignmentRemain( -// a.getAssignmentId(), -// a.getTitle(), -// a.getDueDate(), -// new AssignmentDuration(a.getStartDate(), a.getDueDate()).toString(), -// -// -// assignmentCheck.getIsSubmitted(), -// -// a.getContent(), -// -// )).collect(Collectors.toList()); -// } - -// public AssignmentSubmissionDto checkAssignment(Long assignmentId, Long userId) { -// UserEntity user = userRepository.findById(userId) -// .orElseThrow(() -> new EntityNotFoundException("해당 학생을 찾을 수 없습니다.")); -// -// Submission assignmentCheck = (Submission) Optional.ofNullable( -// assignmentCheckRepository.findUnsubmittedAssignmentByUserIdAndAssignmentId(assignmentId, userId) -// ).orElseThrow(() -> new EntityNotFoundException("제출 정보가 존재하지 않습니다.")); -// -// List contents = assignmentContentRepository.findAllByUserId(userId); -// -// List contentIds = contents.stream() -// .map(hello.cluebackend.domain.submissionFile.domain.SubmissionFile::getAssignmentContentId) -// .collect(Collectors.toList()); -// -// return new AssignmentSubmissionDto( -// userId, -// user.getClassCode(), -// user.getUsername(), -// assignmentCheck.getIsSubmitted(), -// assignmentCheck.getSubmittedAt(), -// contentIds -// ); -// } - - private UserEntity validated(Long userId, Long classId){ - UserEntity user = userRepository.findById(userId) - .orElseThrow(() -> new EntityNotFoundException("해당 유저를 찾을수 없습니다.")); - - if(!Role.TEACHER.equals(user.getRole())) { - throw new AccessDeniedException("권한이 부족한 사용자 입니다."); - } - - List classRoomUsers = classRoomUserRepository.findByUser_UserId(userId); - - boolean isMemberOfClass = classRoomUsers.stream() - .anyMatch(classRoomUser -> classRoomUser.getClassRoom().getClassRoomId().equals(classId)); - - if (!isMemberOfClass) { - throw new AccessDeniedException("해당 수업에 속하지 않은 사용자입니다."); - } - return user; - } - - private void validateAssignmentDates(LocalDateTime start, LocalDateTime end) { - if (end.isBefore(start)) { - throw new IllegalArgumentException("마감일은 시작일보다 앞설 수 없습니다."); - } - } - - private String calculateRemainingTime(LocalDateTime startDate, LocalDateTime dueDate) { - Duration duration = Duration.between(startDate, dueDate); - long days = duration.toDays(); - long hours = duration.minusDays(days).toHours(); - - if (duration.isNegative()) { - return "마감됨"; - } - - return days + "d" + hours + "h"; - } -} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/assignment/application/SubmissionFileService.java b/src/main/java/hello/cluebackend/assignment/application/SubmissionFileService.java deleted file mode 100644 index 6987f13c..00000000 --- a/src/main/java/hello/cluebackend/assignment/application/SubmissionFileService.java +++ /dev/null @@ -1,7 +0,0 @@ -package hello.cluebackend.assignment.application; - -import org.springframework.stereotype.Service; - -@Service -public class SubmissionFileService { -} diff --git a/src/main/java/hello/cluebackend/assignment/application/SubmissionService.java b/src/main/java/hello/cluebackend/assignment/application/SubmissionService.java deleted file mode 100644 index 8291c94e..00000000 --- a/src/main/java/hello/cluebackend/assignment/application/SubmissionService.java +++ /dev/null @@ -1,35 +0,0 @@ -package hello.cluebackend.assignment.application; - -import hello.cluebackend.assignment.domain.Assignment; -import hello.cluebackend.assignment.domain.Submission; -import hello.cluebackend.assignment.persistence.SubmissionRepository; -import hello.cluebackend.domain.user.domain.UserEntity; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.stream.Collectors; - -@Service -@RequiredArgsConstructor -public class SubmissionService { - private final SubmissionRepository submissionRepository; - - - // 학생에게 과제 할당하는 메서드 - private Submission createDefaultSubmission(Assignment assignment, UserEntity student) { - return Submission.builder() - .assignment(assignment) - .user(student) - .isSubmitted(false) - .submittedAt(null) - .build(); - } - - public void createSubmissionsForStudents(Assignment assignment, List students) { - List submissions = students.stream() - .map(user -> createDefaultSubmission(assignment, user)) - .collect(Collectors.toList()); - submissionRepository.saveAll(submissions); - } -} diff --git a/src/main/java/hello/cluebackend/assignment/application/command/CommandAssignmentService.java b/src/main/java/hello/cluebackend/assignment/application/command/CommandAssignmentService.java deleted file mode 100644 index 705299be..00000000 --- a/src/main/java/hello/cluebackend/assignment/application/command/CommandAssignmentService.java +++ /dev/null @@ -1,4 +0,0 @@ -package hello.cluebackend.assignment.application.command; - -public class CommandAssignmentService { -} diff --git a/src/main/java/hello/cluebackend/assignment/application/command/CommandSubmissionService.java b/src/main/java/hello/cluebackend/assignment/application/command/CommandSubmissionService.java deleted file mode 100644 index 0f08bd55..00000000 --- a/src/main/java/hello/cluebackend/assignment/application/command/CommandSubmissionService.java +++ /dev/null @@ -1,4 +0,0 @@ -package hello.cluebackend.assignment.application.command; - -public class CommandSubmissionService { -} diff --git a/src/main/java/hello/cluebackend/assignment/application/query/QueryAssignmentService.java b/src/main/java/hello/cluebackend/assignment/application/query/QueryAssignmentService.java deleted file mode 100644 index ef085231..00000000 --- a/src/main/java/hello/cluebackend/assignment/application/query/QueryAssignmentService.java +++ /dev/null @@ -1,4 +0,0 @@ -package hello.cluebackend.assignment.application.query; - -public class QueryAssignmentService { -} diff --git a/src/main/java/hello/cluebackend/assignment/application/query/QuerySubmissionService.java b/src/main/java/hello/cluebackend/assignment/application/query/QuerySubmissionService.java deleted file mode 100644 index fd34f75a..00000000 --- a/src/main/java/hello/cluebackend/assignment/application/query/QuerySubmissionService.java +++ /dev/null @@ -1,4 +0,0 @@ -package hello.cluebackend.assignment.application.query; - -public class QuerySubmissionService { -} diff --git a/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementCommandController.java b/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementCommandController.java index 5a74af8e..d3f41031 100644 --- a/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementCommandController.java +++ b/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementCommandController.java @@ -1,21 +1,61 @@ package hello.cluebackend.assignment.management.api; +import hello.cluebackend.assignment.management.api.dto.response.GetAllAssignmentResponse; +import hello.cluebackend.assignment.management.api.dto.response.GetAllAssignmentResponseResult; +import hello.cluebackend.assignment.management.application.command.AssignmentManagementCommandService; +import hello.cluebackend.domain.user.domain.UserEntity; +import hello.cluebackend.domain.user.domain.repository.UserRepository; +import hello.cluebackend.domain.user.service.UserService; +import hello.cluebackend.global.config.JWTUtil; +import io.jsonwebtoken.JwtException; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + @RestController -@RequestMapping("/api/assignment") +@RequestMapping("/api/assignment/teacher") @RequiredArgsConstructor @Slf4j public class AssignmentManagementCommandController { + private final JWTUtil jwtUtil; + private final UserService userService; + private final AssignmentManagementCommandService assignmentManagementCommandService; + private final UserRepository userRepository; + // TODO : 메인 페이지 제작한 과제 전체 조회 + @GetMapping("/getAllAssignments") + public ResponseEntity getAllAssignments(HttpServletRequest request){ + try { + String token = jwtUtil.getToken(request); + Long userId = jwtUtil.getUserId(token); - // TODO : 학습실 과제 전체 조회, 학습실 - 과제(T) + UserEntity user = userRepository.findById(userId) + .orElseThrow(() -> new UsernameNotFoundException("User not found.")); + + List assignments = assignmentManagementCommandService.findAllAssignment(user); + return ResponseEntity.ok(new GetAllAssignmentResponseResult(assignments)); + + } catch (JwtException | UsernameNotFoundException e) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); + } + } + + // TODO : 학습실 과제 전체 조회, 학습실 - 과제(T) + @GetMapping("/getAllAssignments/{classId}") + public ResponseEntity<> // TODO : 특정 과제 학생 제출 여부 전체 조회, 학습실 - 과제 - 확인(T) + //@GetMapping("{classId}/checkAssignment/{assignmentId}") // TODO : 개인 제출 과제 보기, 학습실 - 과제 - 채점(T) + //@GetMapping("/{classId}/{assignmentId}/getAssignment/{studentId}") } diff --git a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllAssignmentResponse.java b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllAssignmentResponse.java index 23b1e110..d173d394 100644 --- a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllAssignmentResponse.java +++ b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllAssignmentResponse.java @@ -1,7 +1,15 @@ package hello.cluebackend.assignment.management.api.dto.response; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor public class GetAllAssignmentResponse { - private Long AssignmentId; // 과제 아이디 - private String duringTime; // 과제 마감까지 남은 시간 + private Long assignmentId; // 과제 아이디 private String title; // 과제 제목 -} + private LocalDateTime startDate; // 과제 시작일 + private LocalDateTime endDate; // 남은 시간 +} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllAssignmentResponseResult.java b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllAssignmentResponseResult.java new file mode 100644 index 00000000..6a3815f7 --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllAssignmentResponseResult.java @@ -0,0 +1,10 @@ +package hello.cluebackend.assignment.management.api.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class GetAllAssignmentResponseResult { + private T assignments; +} diff --git a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponse.java b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponse.java new file mode 100644 index 00000000..b7565562 --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponse.java @@ -0,0 +1,19 @@ +package hello.cluebackend.assignment.management.api.dto.response; + +import hello.cluebackend.assignment.management.domain.AssignmentAttachment.AssignmentAttachment; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +@AllArgsConstructor +public class GetAllClassRoomAssignmentResponse { + private Long assignmentId; + private boolean allSubmit; + private String title; + private LocalDateTime startDate; + private LocalDateTime endDate; + private List files; +} diff --git a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponseResult.java b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponseResult.java new file mode 100644 index 00000000..3aaff86f --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponseResult.java @@ -0,0 +1,5 @@ +package hello.cluebackend.assignment.management.api.dto.response; + +public class GetAllClassRoomAssignmentResponseResult { + private T assignments; +} diff --git a/src/main/java/hello/cluebackend/assignment/management/application/command/AssignmentAttachmentManagementCommandService.java b/src/main/java/hello/cluebackend/assignment/management/application/command/AssignmentAttachmentManagementCommandService.java new file mode 100644 index 00000000..fcab972c --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/management/application/command/AssignmentAttachmentManagementCommandService.java @@ -0,0 +1,8 @@ +package hello.cluebackend.assignment.management.application.command; + +import org.springframework.stereotype.Service; + +@Service +public class AssignmentAttachmentManagementCommandService { + +} diff --git a/src/main/java/hello/cluebackend/assignment/management/application/command/AssignmentManagementCommandService.java b/src/main/java/hello/cluebackend/assignment/management/application/command/AssignmentManagementCommandService.java new file mode 100644 index 00000000..331f8235 --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/management/application/command/AssignmentManagementCommandService.java @@ -0,0 +1,28 @@ +package hello.cluebackend.assignment.management.application.command; + +import hello.cluebackend.assignment.management.api.dto.response.GetAllAssignmentResponse; +import hello.cluebackend.assignment.management.domain.Assignment; +import hello.cluebackend.assignment.management.persistence.AssignmentRepository; +import hello.cluebackend.domain.user.domain.UserEntity; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class AssignmentManagementCommandService { + private final AssignmentRepository assignmentRepository; + + // 해당 사용자가 속한 모든 과제 출력 (단, 마감이 된 과제는 반환하지 않는다.) + public List findAllAssignment(UserEntity user) { + List assignments = assignmentRepository.getAllByUser(user); + + return assignments.stream() + .map(a -> new GetAllAssignmentResponse(a.getAssignmentId(), a.getTitle(), a.getStartDate(), a.getEndDate())) + .toList(); + } + + // 해당 교실에 속한 모든 과제 출력( 마감이 된 과제도 반환한다.) + public List +} diff --git a/src/main/java/hello/cluebackend/assignment/management/application/query/AssignmentAttachmentManagementQueryService.java b/src/main/java/hello/cluebackend/assignment/management/application/query/AssignmentAttachmentManagementQueryService.java new file mode 100644 index 00000000..89d5e069 --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/management/application/query/AssignmentAttachmentManagementQueryService.java @@ -0,0 +1,7 @@ +package hello.cluebackend.assignment.management.application.query; + +import org.springframework.stereotype.Service; + +@Service +public class AssignmentAttachmentManagementQueryService { +} diff --git a/src/main/java/hello/cluebackend/assignment/management/application/query/AssignmentManagementQueryService.java b/src/main/java/hello/cluebackend/assignment/management/application/query/AssignmentManagementQueryService.java new file mode 100644 index 00000000..6f2705f9 --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/management/application/query/AssignmentManagementQueryService.java @@ -0,0 +1,7 @@ +package hello.cluebackend.assignment.management.application.query; + +import org.springframework.stereotype.Service; + +@Service +public class AssignmentManagementQueryService { +} diff --git a/src/main/java/hello/cluebackend/assignment/domain/Assignment.java b/src/main/java/hello/cluebackend/assignment/management/domain/Assignment.java similarity index 93% rename from src/main/java/hello/cluebackend/assignment/domain/Assignment.java rename to src/main/java/hello/cluebackend/assignment/management/domain/Assignment.java index de656236..e9080104 100644 --- a/src/main/java/hello/cluebackend/assignment/domain/Assignment.java +++ b/src/main/java/hello/cluebackend/assignment/management/domain/Assignment.java @@ -1,4 +1,4 @@ -package hello.cluebackend.assignment.domain; +package hello.cluebackend.assignment.management.domain; import hello.cluebackend.domain.classroom.domain.ClassRoom; import hello.cluebackend.domain.user.domain.UserEntity; diff --git a/src/main/java/hello/cluebackend/assignment/domain/AssignmentAttachment/AssignmentAttachment.java b/src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AssignmentAttachment.java similarity index 85% rename from src/main/java/hello/cluebackend/assignment/domain/AssignmentAttachment/AssignmentAttachment.java rename to src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AssignmentAttachment.java index e8359c22..d40fe8b2 100644 --- a/src/main/java/hello/cluebackend/assignment/domain/AssignmentAttachment/AssignmentAttachment.java +++ b/src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AssignmentAttachment.java @@ -1,6 +1,6 @@ -package hello.cluebackend.assignment.domain.AssignmentAttachment; +package hello.cluebackend.assignment.management.domain.AssignmentAttachment; -import hello.cluebackend.assignment.domain.Assignment; +import hello.cluebackend.assignment.management.domain.Assignment; import hello.cluebackend.domain.user.domain.UserEntity; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/hello/cluebackend/assignment/domain/AssignmentAttachment/AttachmentDocument.java b/src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AttachmentDocument.java similarity index 90% rename from src/main/java/hello/cluebackend/assignment/domain/AssignmentAttachment/AttachmentDocument.java rename to src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AttachmentDocument.java index 655e3a0c..237afc02 100644 --- a/src/main/java/hello/cluebackend/assignment/domain/AssignmentAttachment/AttachmentDocument.java +++ b/src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AttachmentDocument.java @@ -1,4 +1,4 @@ -package hello.cluebackend.assignment.domain.AssignmentAttachment; +package hello.cluebackend.assignment.management.domain.AssignmentAttachment; import jakarta.persistence.Column; import jakarta.persistence.DiscriminatorValue; diff --git a/src/main/java/hello/cluebackend/assignment/domain/AssignmentAttachment/AttachmentLink.java b/src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AttachmentLink.java similarity index 85% rename from src/main/java/hello/cluebackend/assignment/domain/AssignmentAttachment/AttachmentLink.java rename to src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AttachmentLink.java index eed9639f..587b5174 100644 --- a/src/main/java/hello/cluebackend/assignment/domain/AssignmentAttachment/AttachmentLink.java +++ b/src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AttachmentLink.java @@ -1,4 +1,4 @@ -package hello.cluebackend.assignment.domain.AssignmentAttachment; +package hello.cluebackend.assignment.management.domain.AssignmentAttachment; import jakarta.persistence.Column; import jakarta.persistence.DiscriminatorValue; diff --git a/src/main/java/hello/cluebackend/assignment/management/persistence/AssignmentAttachmentRepository.java b/src/main/java/hello/cluebackend/assignment/management/persistence/AssignmentAttachmentRepository.java new file mode 100644 index 00000000..db3aacfc --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/management/persistence/AssignmentAttachmentRepository.java @@ -0,0 +1,10 @@ +package hello.cluebackend.assignment.management.persistence; + +import hello.cluebackend.assignment.management.domain.AssignmentAttachment.AssignmentAttachment; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface AssignmentAttachmentRepository extends JpaRepository { + +} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/assignment/management/persistence/AssignmentRepository.java b/src/main/java/hello/cluebackend/assignment/management/persistence/AssignmentRepository.java new file mode 100644 index 00000000..534db896 --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/management/persistence/AssignmentRepository.java @@ -0,0 +1,19 @@ +package hello.cluebackend.assignment.management.persistence; + +import hello.cluebackend.assignment.management.domain.Assignment; +import hello.cluebackend.domain.user.domain.UserEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + + +@Repository +public interface AssignmentRepository extends JpaRepository { + @Query("select a from Assignment a " + + "join ClassRoomUser cru ON a.classRoom = cru.classRoom " + + "WHERE cru.user =:user") + List getAllByUser(@Param("user") UserEntity user); +} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/assignment/domain/Submission.java b/src/main/java/hello/cluebackend/assignment/participation/domain/Submission.java similarity index 85% rename from src/main/java/hello/cluebackend/assignment/domain/Submission.java rename to src/main/java/hello/cluebackend/assignment/participation/domain/Submission.java index c05539b8..7713d32f 100644 --- a/src/main/java/hello/cluebackend/assignment/domain/Submission.java +++ b/src/main/java/hello/cluebackend/assignment/participation/domain/Submission.java @@ -1,5 +1,6 @@ -package hello.cluebackend.assignment.domain; +package hello.cluebackend.assignment.participation.domain; +import hello.cluebackend.assignment.management.domain.Assignment; import hello.cluebackend.domain.user.domain.UserEntity; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/hello/cluebackend/assignment/domain/SubmissionAttachment/SubmissionFile.java b/src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionAttachment.java similarity index 77% rename from src/main/java/hello/cluebackend/assignment/domain/SubmissionAttachment/SubmissionFile.java rename to src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionAttachment.java index d6b93b5a..b427553e 100644 --- a/src/main/java/hello/cluebackend/assignment/domain/SubmissionAttachment/SubmissionFile.java +++ b/src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionAttachment.java @@ -1,7 +1,7 @@ -package hello.cluebackend.assignment.domain.SubmissionAttachment; +package hello.cluebackend.assignment.participation.domain.SubmissionAttachment; -import hello.cluebackend.assignment.domain.Assignment; -import hello.cluebackend.assignment.domain.Submission; +import hello.cluebackend.assignment.management.domain.Assignment; +import hello.cluebackend.assignment.participation.domain.Submission; import hello.cluebackend.domain.user.domain.UserEntity; import jakarta.persistence.*; import lombok.*; @@ -17,7 +17,7 @@ @AllArgsConstructor @NoArgsConstructor @SuperBuilder -public abstract class SubmissionFile { +public abstract class SubmissionAttachment { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="submission_file_id") private Long assignmentContentId; diff --git a/src/main/java/hello/cluebackend/assignment/domain/SubmissionAttachment/SubmissionDocument.java b/src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionDocument.java similarity index 79% rename from src/main/java/hello/cluebackend/assignment/domain/SubmissionAttachment/SubmissionDocument.java rename to src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionDocument.java index 809d4fd9..34c50881 100644 --- a/src/main/java/hello/cluebackend/assignment/domain/SubmissionAttachment/SubmissionDocument.java +++ b/src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionDocument.java @@ -1,4 +1,4 @@ -package hello.cluebackend.assignment.domain.SubmissionAttachment; +package hello.cluebackend.assignment.participation.domain.SubmissionAttachment; import jakarta.persistence.Column; import jakarta.persistence.DiscriminatorValue; @@ -11,7 +11,7 @@ @DiscriminatorValue("Document") @SuperBuilder @NoArgsConstructor -public class SubmissionDocument extends SubmissionFile { +public class SubmissionDocument extends SubmissionAttachment { @JoinColumn(name="original_file_name") private String originalFileName; diff --git a/src/main/java/hello/cluebackend/assignment/domain/SubmissionAttachment/SubmissionLink.java b/src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionLink.java similarity index 64% rename from src/main/java/hello/cluebackend/assignment/domain/SubmissionAttachment/SubmissionLink.java rename to src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionLink.java index 13f1cf6b..249281c4 100644 --- a/src/main/java/hello/cluebackend/assignment/domain/SubmissionAttachment/SubmissionLink.java +++ b/src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionLink.java @@ -1,4 +1,4 @@ -package hello.cluebackend.assignment.domain.SubmissionAttachment; +package hello.cluebackend.assignment.participation.domain.SubmissionAttachment; import jakarta.persistence.DiscriminatorValue; import jakarta.persistence.Entity; @@ -9,6 +9,6 @@ @DiscriminatorValue("Link") @SuperBuilder @NoArgsConstructor -public class SubmissionLink extends SubmissionDocument { +public class SubmissionLink extends SubmissionAttachment { private String url; } diff --git a/src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionAttachmentRepository.java b/src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionAttachmentRepository.java new file mode 100644 index 00000000..c8eee01e --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionAttachmentRepository.java @@ -0,0 +1,9 @@ +package hello.cluebackend.assignment.participation.persistence; + +import hello.cluebackend.assignment.participation.domain.SubmissionAttachment.SubmissionAttachment; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + + +@Repository +public interface SubmissionAttachmentRepository extends JpaRepository { } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/assignment/persistence/SubmissionRepository.java b/src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionRepository.java similarity index 60% rename from src/main/java/hello/cluebackend/assignment/persistence/SubmissionRepository.java rename to src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionRepository.java index 8c841a04..48a3ce12 100644 --- a/src/main/java/hello/cluebackend/assignment/persistence/SubmissionRepository.java +++ b/src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionRepository.java @@ -1,6 +1,6 @@ -package hello.cluebackend.assignment.persistence; +package hello.cluebackend.assignment.participation.persistence; -import hello.cluebackend.assignment.domain.Submission; +import hello.cluebackend.assignment.participation.domain.Submission; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/src/main/java/hello/cluebackend/assignment/persistence/AssignmentAttachmentRepository.java b/src/main/java/hello/cluebackend/assignment/persistence/AssignmentAttachmentRepository.java deleted file mode 100644 index e568ba1a..00000000 --- a/src/main/java/hello/cluebackend/assignment/persistence/AssignmentAttachmentRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package hello.cluebackend.assignment.persistence; - -import hello.cluebackend.assignment.domain.AssignmentAttachment.AssignmentAttachment; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface AssignmentAttachmentRepository extends JpaRepository { } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/assignment/persistence/AssignmentRepository.java b/src/main/java/hello/cluebackend/assignment/persistence/AssignmentRepository.java deleted file mode 100644 index 2da4a997..00000000 --- a/src/main/java/hello/cluebackend/assignment/persistence/AssignmentRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package hello.cluebackend.assignment.persistence; - -import hello.cluebackend.assignment.domain.Assignment; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface AssignmentRepository extends JpaRepository { } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/assignment/persistence/SubmissionFile.java b/src/main/java/hello/cluebackend/assignment/persistence/SubmissionFile.java deleted file mode 100644 index 571a23b2..00000000 --- a/src/main/java/hello/cluebackend/assignment/persistence/SubmissionFile.java +++ /dev/null @@ -1,8 +0,0 @@ -package hello.cluebackend.assignment.persistence; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - - -@Repository -public interface SubmissionFile extends JpaRepository { } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/global/common/response/ApiResponse.java b/src/main/java/hello/cluebackend/global/common/response/ApiResponse.java index 767d3909..76897895 100644 --- a/src/main/java/hello/cluebackend/global/common/response/ApiResponse.java +++ b/src/main/java/hello/cluebackend/global/common/response/ApiResponse.java @@ -1,6 +1,6 @@ //package hello.cluebackend.global.common.response; // -//import hello.cluebackend.assignment.domain.Assignment; +//import hello.cluebackend.assignment.management.domain.Assignment; //import lombok.*; // //import java.util.List; From e766f86c2e771dc22b6e5513c53aa7df771e8f91 Mon Sep 17 00:00:00 2001 From: Haeyul Date: Tue, 12 Aug 2025 19:29:02 +0900 Subject: [PATCH 05/22] =?UTF-8?q?feat(#5):=20=EA=B3=BC=EC=A0=9C=20?= =?UTF-8?q?=EC=84=A0=EC=83=9D=EB=8B=98=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B0=9C=EB=B0=9C=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 17 ++++ ...AssignmentManagementCommandController.java | 79 +++++++++++++++---- .../AssignmentManagementQueryController.java | 8 ++ ...ponseResult.java => AssignmentResult.java} | 2 +- .../api/dto/response/Attachment.java | 4 + .../GetAllClassRoomAssignmentResponse.java | 3 - ...tAllClassRoomAssignmentResponseResult.java | 5 -- .../dto/response/GetAllSubmissionCheck.java | 19 +++++ .../api/dto/response/GetSubmissionFile.java | 7 ++ .../api/dto/response/GetSubmissionResult.java | 10 +++ .../application/AssignmentCommandService.java | 66 ++++++++++++++++ .../application/AssignmentQueryService.java | 20 +++++ ...entAttachmentManagementCommandService.java | 8 -- .../AssignmentManagementCommandService.java | 28 ------- ...nmentAttachmentManagementQueryService.java | 7 -- .../AssignmentManagementQueryService.java | 7 -- .../AssignmentAttachment.java | 7 +- .../AttachmentDocument.java | 6 +- .../AssignmentAttachment/AttachmentLink.java | 4 +- .../AssignmentAttachmentRepository.java | 5 +- .../persistence/AssignmentRepository.java | 7 +- .../CustomAssignmentAttachmentRepository.java | 4 + ...ignmentParticipationCommandController.java | 4 + ...ssignmentParticipationQueryController.java | 6 ++ .../application/SubmissionCommandService.java | 21 +++++ .../application/SubmissionQueryService.java | 4 + .../SubmissionAttachment.java | 9 +-- .../SubmissionDocument.java | 1 - .../SubmissionAttachment/SubmissionLink.java | 1 - .../persistence/SubmissionRepository.java | 16 +++- .../repository/ClassRoomRepository.java | 2 + src/main/resources/application.yaml | 2 +- 32 files changed, 290 insertions(+), 99 deletions(-) rename src/main/java/hello/cluebackend/assignment/management/api/dto/response/{GetAllAssignmentResponseResult.java => AssignmentResult.java} (78%) create mode 100644 src/main/java/hello/cluebackend/assignment/management/api/dto/response/Attachment.java delete mode 100644 src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponseResult.java create mode 100644 src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllSubmissionCheck.java create mode 100644 src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetSubmissionFile.java create mode 100644 src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetSubmissionResult.java create mode 100644 src/main/java/hello/cluebackend/assignment/management/application/AssignmentCommandService.java create mode 100644 src/main/java/hello/cluebackend/assignment/management/application/AssignmentQueryService.java delete mode 100644 src/main/java/hello/cluebackend/assignment/management/application/command/AssignmentAttachmentManagementCommandService.java delete mode 100644 src/main/java/hello/cluebackend/assignment/management/application/command/AssignmentManagementCommandService.java delete mode 100644 src/main/java/hello/cluebackend/assignment/management/application/query/AssignmentAttachmentManagementQueryService.java delete mode 100644 src/main/java/hello/cluebackend/assignment/management/application/query/AssignmentManagementQueryService.java create mode 100644 src/main/java/hello/cluebackend/assignment/management/persistence/CustomAssignmentAttachmentRepository.java create mode 100644 src/main/java/hello/cluebackend/assignment/participation/application/SubmissionCommandService.java create mode 100644 src/main/java/hello/cluebackend/assignment/participation/application/SubmissionQueryService.java diff --git a/build.gradle b/build.gradle index f7031ea0..693b75c0 100644 --- a/build.gradle +++ b/build.gradle @@ -68,6 +68,23 @@ dependencies { // implementation 'software.amazon.awssdk:s3' implementation 'software.amazon.awssdk:s3:2.32.1' implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE' + + // QueryDSL + implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' + annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta' + annotationProcessor "jakarta.annotation:jakarta.annotation-api" + annotationProcessor "jakarta.persistence:jakarta.persistence-api" + +} + +def querydslSrcDir = 'src/main/generated' + +clean { + delete file(querydslSrcDir) +} + +tasks.withType(JavaCompile).configureEach { + options.generatedSourceOutputDirectory = file(querydslSrcDir) } ext { diff --git a/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementCommandController.java b/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementCommandController.java index d3f41031..724a6793 100644 --- a/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementCommandController.java +++ b/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementCommandController.java @@ -1,11 +1,12 @@ package hello.cluebackend.assignment.management.api; -import hello.cluebackend.assignment.management.api.dto.response.GetAllAssignmentResponse; -import hello.cluebackend.assignment.management.api.dto.response.GetAllAssignmentResponseResult; -import hello.cluebackend.assignment.management.application.command.AssignmentManagementCommandService; +import hello.cluebackend.assignment.management.api.dto.response.*; +import hello.cluebackend.assignment.management.application.AssignmentCommandService; +import hello.cluebackend.assignment.management.domain.Assignment; +import hello.cluebackend.assignment.participation.application.SubmissionCommandService; +import hello.cluebackend.assignment.participation.domain.Submission; import hello.cluebackend.domain.user.domain.UserEntity; import hello.cluebackend.domain.user.domain.repository.UserRepository; -import hello.cluebackend.domain.user.service.UserService; import hello.cluebackend.global.config.JWTUtil; import io.jsonwebtoken.JwtException; import jakarta.servlet.http.HttpServletRequest; @@ -15,6 +16,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -26,36 +28,79 @@ @Slf4j public class AssignmentManagementCommandController { private final JWTUtil jwtUtil; - private final UserService userService; - private final AssignmentManagementCommandService assignmentManagementCommandService; + private final AssignmentCommandService assignmentCommandService; private final UserRepository userRepository; + private final SubmissionCommandService submissionCommandService; // TODO : 메인 페이지 제작한 과제 전체 조회 @GetMapping("/getAllAssignments") - public ResponseEntity getAllAssignments(HttpServletRequest request){ + public ResponseEntity getAllAssignments(HttpServletRequest request) { try { String token = jwtUtil.getToken(request); Long userId = jwtUtil.getUserId(token); - UserEntity user = userRepository.findById(userId) - .orElseThrow(() -> new UsernameNotFoundException("User not found.")); - - List assignments = assignmentManagementCommandService.findAllAssignment(user); - - return ResponseEntity.ok(new GetAllAssignmentResponseResult(assignments)); + UserEntity user = userRepository.findById(userId).orElseThrow(() -> new UsernameNotFoundException("User not found.")); + List assignments = assignmentCommandService.findAllAssignment(user); + return ResponseEntity.ok(new AssignmentResult(assignments)); } catch (JwtException | UsernameNotFoundException e) { return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); + }catch (Exception e){ + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } // TODO : 학습실 과제 전체 조회, 학습실 - 과제(T) @GetMapping("/getAllAssignments/{classId}") - public ResponseEntity<> + public ResponseEntity getAllClassroomAssignment(HttpServletRequest request, @PathVariable Long classId) { + try{ + String token = jwtUtil.getToken(request); + Long userId = jwtUtil.getUserId(token); + + List result = assignmentCommandService.findAllClassroomAssignment(classId); + + return ResponseEntity.ok(new AssignmentResult(result)); + }catch(JwtException | UsernameNotFoundException e){ + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); + }catch (Exception e){ + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + } + // TODO : 특정 과제 학생 제출 여부 전체 조회, 학습실 - 과제 - 확인(T) - //@GetMapping("{classId}/checkAssignment/{assignmentId}") + @GetMapping("/checkAssignment/{assignmentId}") + public ResponseEntity getAllSubmissionCheck(HttpServletRequest request, @PathVariable Long assignmentId) { + try { + String token = jwtUtil.getToken(request); + Long userId = jwtUtil.getUserId(token); + + Assignment assignment = assignmentCommandService.findById(assignmentId); - // TODO : 개인 제출 과제 보기, 학습실 - 과제 - 채점(T) - //@GetMapping("/{classId}/{assignmentId}/getAssignment/{studentId}") + List result = assignmentCommandService.checkIsSubmitted(assignment); + + return ResponseEntity.ok(new AssignmentResult(result)); + }catch (JwtException | UsernameNotFoundException e){ + return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); + }catch (Exception e){ + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + } +// // TODO : 개인 제출 과제 보기, 학습실 - 과제 - 채점(T) +// @GetMapping("/getAssignment/{submissionId}") +// public ResponseEntity getSubmission(HttpServletRequest request, @PathVariable Long submissionId) { +// try { +// String token = jwtUtil.getToken(request); +// Long userId = jwtUtil.getUserId(token); +// +// Submission submission = submissionCommandService.findById(submissionId); +// GetSubmissionFile result = submissionCommandService.getSubmissionGrade(submission); +// +// return ResponseEntity.ok(new GetSubmissionResult(result)); +// }catch (JwtException | UsernameNotFoundException e){ +// return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); +// }catch (Exception e){ +// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); +// } +// } } diff --git a/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementQueryController.java b/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementQueryController.java index 4af5db3d..b59619d6 100644 --- a/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementQueryController.java +++ b/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementQueryController.java @@ -10,6 +10,14 @@ @RequiredArgsConstructor @Slf4j public class AssignmentManagementQueryController { + + // 과제 생성 + + + // 과제 삭제 + + // 과제 수정 + // TODO : 과제 생성하기, 과제생성/수정 // TODO : 과제 첨부 파일 넣기, 과제생성/수정 diff --git a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllAssignmentResponseResult.java b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/AssignmentResult.java similarity index 78% rename from src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllAssignmentResponseResult.java rename to src/main/java/hello/cluebackend/assignment/management/api/dto/response/AssignmentResult.java index 6a3815f7..7e3287f5 100644 --- a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllAssignmentResponseResult.java +++ b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/AssignmentResult.java @@ -5,6 +5,6 @@ @Data @AllArgsConstructor -public class GetAllAssignmentResponseResult { +public class AssignmentResult { private T assignments; } diff --git a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/Attachment.java b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/Attachment.java new file mode 100644 index 00000000..1f87b037 --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/Attachment.java @@ -0,0 +1,4 @@ +package hello.cluebackend.assignment.management.api.dto.response; + +public class Attachment { +} diff --git a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponse.java b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponse.java index b7565562..b6a87266 100644 --- a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponse.java +++ b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponse.java @@ -1,11 +1,9 @@ package hello.cluebackend.assignment.management.api.dto.response; -import hello.cluebackend.assignment.management.domain.AssignmentAttachment.AssignmentAttachment; import lombok.AllArgsConstructor; import lombok.Data; import java.time.LocalDateTime; -import java.util.List; @Data @AllArgsConstructor @@ -15,5 +13,4 @@ public class GetAllClassRoomAssignmentResponse { private String title; private LocalDateTime startDate; private LocalDateTime endDate; - private List files; } diff --git a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponseResult.java b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponseResult.java deleted file mode 100644 index 3aaff86f..00000000 --- a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponseResult.java +++ /dev/null @@ -1,5 +0,0 @@ -package hello.cluebackend.assignment.management.api.dto.response; - -public class GetAllClassRoomAssignmentResponseResult { - private T assignments; -} diff --git a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllSubmissionCheck.java b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllSubmissionCheck.java new file mode 100644 index 00000000..328ec414 --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllSubmissionCheck.java @@ -0,0 +1,19 @@ +package hello.cluebackend.assignment.management.api.dto.response; + +import hello.cluebackend.domain.user.domain.UserEntity; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +public class GetAllSubmissionCheck { + private Long submissionId; + private Long userId; + private String userName; + private int userClassCode; + private boolean isSubmitted; + private LocalDateTime submittedAt; + private LocalDateTime assignmentEndDate; +} diff --git a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetSubmissionFile.java b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetSubmissionFile.java new file mode 100644 index 00000000..44c8fa5f --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetSubmissionFile.java @@ -0,0 +1,7 @@ +package hello.cluebackend.assignment.management.api.dto.response; + +public class GetSubmissionFile { + private Long SubmissionAttachmentId; + private String fileName; // 만약 파일이 아닌 url인 경우 url 주소 + private int fileSize; // url일 경우 보내지 않음. +} diff --git a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetSubmissionResult.java b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetSubmissionResult.java new file mode 100644 index 00000000..0a4990df --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetSubmissionResult.java @@ -0,0 +1,10 @@ +package hello.cluebackend.assignment.management.api.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class GetSubmissionResult { + private T SubmissionAttachments; +} diff --git a/src/main/java/hello/cluebackend/assignment/management/application/AssignmentCommandService.java b/src/main/java/hello/cluebackend/assignment/management/application/AssignmentCommandService.java new file mode 100644 index 00000000..56a4eb08 --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/management/application/AssignmentCommandService.java @@ -0,0 +1,66 @@ +package hello.cluebackend.assignment.management.application; + +import hello.cluebackend.assignment.management.api.dto.response.GetAllAssignmentResponse; +import hello.cluebackend.assignment.management.api.dto.response.GetAllClassRoomAssignmentResponse; +import hello.cluebackend.assignment.management.api.dto.response.GetAllSubmissionCheck; +import hello.cluebackend.assignment.management.domain.Assignment; +import hello.cluebackend.assignment.management.persistence.AssignmentRepository; +import hello.cluebackend.assignment.participation.domain.Submission; +import hello.cluebackend.assignment.participation.persistence.SubmissionRepository; +import hello.cluebackend.domain.classroom.domain.ClassRoom; +import hello.cluebackend.domain.classroom.domain.repository.ClassRoomRepository; +import hello.cluebackend.domain.classroom.service.ClassRoomService; +import hello.cluebackend.domain.user.domain.UserEntity; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class AssignmentCommandService { + private final AssignmentRepository assignmentRepository; + private final ClassRoomService classRoomService; + private final ClassRoomRepository classRoomRepository; + private final SubmissionRepository submissionRepository; + + // 과제 단일 조회 + public Assignment findById(Long assignmentId) { + return assignmentRepository.findById(assignmentId).get(); + } + + // 과제 전체 조회 + public List findAll() { + return assignmentRepository.findAll(); + } + + // ---------- 세부 API ----------------- // + + // 해당 사용자가 속한 모든 과제 출력 (단, 마감이 된 과제는 반환하지 않는다.) + public List findAllAssignment(UserEntity user) { + List assignments = assignmentRepository.getAllByUser(user); + return assignments.stream() + .map(a -> new GetAllAssignmentResponse(a.getAssignmentId(), a.getTitle(), a.getStartDate(), a.getEndDate())) + .toList(); + } + + // 해당 교실에 속한 모든 과제 출력( 마감이 된 과제도 반환한다.) + public List findAllClassroomAssignment(Long classId) { + ClassRoom classRoom = classRoomRepository.findByClassRoomId(classId); // 나중에 Service 코드로 바꿔야 함. + List assignments = assignmentRepository.getAllClassroomAssignmentByUser(classRoom); + List result = assignments.stream() + .map(a -> new GetAllClassRoomAssignmentResponse(a.getAssignmentId(), false, a.getTitle(), a.getStartDate(), a.getEndDate())) // 모든 학생 제출 여부 코드 만들어야 함! + .toList(); + return result; + } + + // + public List checkIsSubmitted(Assignment assignment) { + List result = submissionRepository.findByAssignment(assignment); + return result.stream() + .map(a -> new GetAllSubmissionCheck(a.getSubmissionId(),a.getUser().getUserId(),a.getUser().getUsername(),a.getUser().getClassCode(),a.getIsSubmitted(),a.getSubmittedAt(),a.getAssignment().getEndDate())) + .toList(); + } +} diff --git a/src/main/java/hello/cluebackend/assignment/management/application/AssignmentQueryService.java b/src/main/java/hello/cluebackend/assignment/management/application/AssignmentQueryService.java new file mode 100644 index 00000000..076b1035 --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/management/application/AssignmentQueryService.java @@ -0,0 +1,20 @@ +package hello.cluebackend.assignment.management.application; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = false) +public class AssignmentQueryService { + // 과제 생성 +// public void assignmentCreate() + + // 과제 수정 + + + // ------------------- 세부 API ----------------- // + + +} diff --git a/src/main/java/hello/cluebackend/assignment/management/application/command/AssignmentAttachmentManagementCommandService.java b/src/main/java/hello/cluebackend/assignment/management/application/command/AssignmentAttachmentManagementCommandService.java deleted file mode 100644 index fcab972c..00000000 --- a/src/main/java/hello/cluebackend/assignment/management/application/command/AssignmentAttachmentManagementCommandService.java +++ /dev/null @@ -1,8 +0,0 @@ -package hello.cluebackend.assignment.management.application.command; - -import org.springframework.stereotype.Service; - -@Service -public class AssignmentAttachmentManagementCommandService { - -} diff --git a/src/main/java/hello/cluebackend/assignment/management/application/command/AssignmentManagementCommandService.java b/src/main/java/hello/cluebackend/assignment/management/application/command/AssignmentManagementCommandService.java deleted file mode 100644 index 331f8235..00000000 --- a/src/main/java/hello/cluebackend/assignment/management/application/command/AssignmentManagementCommandService.java +++ /dev/null @@ -1,28 +0,0 @@ -package hello.cluebackend.assignment.management.application.command; - -import hello.cluebackend.assignment.management.api.dto.response.GetAllAssignmentResponse; -import hello.cluebackend.assignment.management.domain.Assignment; -import hello.cluebackend.assignment.management.persistence.AssignmentRepository; -import hello.cluebackend.domain.user.domain.UserEntity; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -@RequiredArgsConstructor -public class AssignmentManagementCommandService { - private final AssignmentRepository assignmentRepository; - - // 해당 사용자가 속한 모든 과제 출력 (단, 마감이 된 과제는 반환하지 않는다.) - public List findAllAssignment(UserEntity user) { - List assignments = assignmentRepository.getAllByUser(user); - - return assignments.stream() - .map(a -> new GetAllAssignmentResponse(a.getAssignmentId(), a.getTitle(), a.getStartDate(), a.getEndDate())) - .toList(); - } - - // 해당 교실에 속한 모든 과제 출력( 마감이 된 과제도 반환한다.) - public List -} diff --git a/src/main/java/hello/cluebackend/assignment/management/application/query/AssignmentAttachmentManagementQueryService.java b/src/main/java/hello/cluebackend/assignment/management/application/query/AssignmentAttachmentManagementQueryService.java deleted file mode 100644 index 89d5e069..00000000 --- a/src/main/java/hello/cluebackend/assignment/management/application/query/AssignmentAttachmentManagementQueryService.java +++ /dev/null @@ -1,7 +0,0 @@ -package hello.cluebackend.assignment.management.application.query; - -import org.springframework.stereotype.Service; - -@Service -public class AssignmentAttachmentManagementQueryService { -} diff --git a/src/main/java/hello/cluebackend/assignment/management/application/query/AssignmentManagementQueryService.java b/src/main/java/hello/cluebackend/assignment/management/application/query/AssignmentManagementQueryService.java deleted file mode 100644 index 6f2705f9..00000000 --- a/src/main/java/hello/cluebackend/assignment/management/application/query/AssignmentManagementQueryService.java +++ /dev/null @@ -1,7 +0,0 @@ -package hello.cluebackend.assignment.management.application.query; - -import org.springframework.stereotype.Service; - -@Service -public class AssignmentManagementQueryService { -} diff --git a/src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AssignmentAttachment.java b/src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AssignmentAttachment.java index d40fe8b2..7c5290df 100644 --- a/src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AssignmentAttachment.java +++ b/src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AssignmentAttachment.java @@ -1,21 +1,20 @@ package hello.cluebackend.assignment.management.domain.AssignmentAttachment; +import com.fasterxml.jackson.annotation.JsonIgnore; import hello.cluebackend.assignment.management.domain.Assignment; import hello.cluebackend.domain.user.domain.UserEntity; import jakarta.persistence.*; import lombok.*; -import lombok.experimental.SuperBuilder; import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; @Entity @Table(name = "assignment_attachment") @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorColumn(name = "DTYPE") @Getter @Setter -@AllArgsConstructor -@NoArgsConstructor -@SuperBuilder public abstract class AssignmentAttachment { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "assignment_attachment_id") diff --git a/src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AttachmentDocument.java b/src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AttachmentDocument.java index 237afc02..250bb11d 100644 --- a/src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AttachmentDocument.java +++ b/src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AttachmentDocument.java @@ -6,11 +6,9 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import lombok.experimental.SuperBuilder; @Entity -@SuperBuilder -@DiscriminatorValue("DOCUMENT") +@DiscriminatorValue("D") @Getter @Setter @NoArgsConstructor public class AttachmentDocument extends AssignmentAttachment{ @@ -25,4 +23,4 @@ public class AttachmentDocument extends AssignmentAttachment{ @Column(name = "file_size") private long fileSize; -} +} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AttachmentLink.java b/src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AttachmentLink.java index 587b5174..85894c8d 100644 --- a/src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AttachmentLink.java +++ b/src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AttachmentLink.java @@ -6,11 +6,9 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import lombok.experimental.SuperBuilder; @Entity -@SuperBuilder -@DiscriminatorValue("Link") +@DiscriminatorValue("L") @Getter @Setter @NoArgsConstructor public class AttachmentLink extends AssignmentAttachment{ diff --git a/src/main/java/hello/cluebackend/assignment/management/persistence/AssignmentAttachmentRepository.java b/src/main/java/hello/cluebackend/assignment/management/persistence/AssignmentAttachmentRepository.java index db3aacfc..a7c5cd4b 100644 --- a/src/main/java/hello/cluebackend/assignment/management/persistence/AssignmentAttachmentRepository.java +++ b/src/main/java/hello/cluebackend/assignment/management/persistence/AssignmentAttachmentRepository.java @@ -1,10 +1,13 @@ package hello.cluebackend.assignment.management.persistence; +import hello.cluebackend.assignment.management.domain.Assignment; import hello.cluebackend.assignment.management.domain.AssignmentAttachment.AssignmentAttachment; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface AssignmentAttachmentRepository extends JpaRepository { - + List findAllByAssignment(Assignment assignment); } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/assignment/management/persistence/AssignmentRepository.java b/src/main/java/hello/cluebackend/assignment/management/persistence/AssignmentRepository.java index 534db896..d6451b75 100644 --- a/src/main/java/hello/cluebackend/assignment/management/persistence/AssignmentRepository.java +++ b/src/main/java/hello/cluebackend/assignment/management/persistence/AssignmentRepository.java @@ -1,6 +1,7 @@ package hello.cluebackend.assignment.management.persistence; import hello.cluebackend.assignment.management.domain.Assignment; +import hello.cluebackend.domain.classroom.domain.ClassRoom; import hello.cluebackend.domain.user.domain.UserEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -9,11 +10,15 @@ import java.util.List; - @Repository public interface AssignmentRepository extends JpaRepository { @Query("select a from Assignment a " + "join ClassRoomUser cru ON a.classRoom = cru.classRoom " + "WHERE cru.user =:user") List getAllByUser(@Param("user") UserEntity user); + + @Query("select a from Assignment a " + + "join fetch a.classRoom " + + "where a.classRoom =:classRoom") + List getAllClassroomAssignmentByUser(@Param("classRoom") ClassRoom classRoom); } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/assignment/management/persistence/CustomAssignmentAttachmentRepository.java b/src/main/java/hello/cluebackend/assignment/management/persistence/CustomAssignmentAttachmentRepository.java new file mode 100644 index 00000000..406c2547 --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/management/persistence/CustomAssignmentAttachmentRepository.java @@ -0,0 +1,4 @@ +package hello.cluebackend.assignment.management.persistence; + +public interface CustomAssignmentAttachmentRepository { +} diff --git a/src/main/java/hello/cluebackend/assignment/participation/api/AssignmentParticipationCommandController.java b/src/main/java/hello/cluebackend/assignment/participation/api/AssignmentParticipationCommandController.java index e1233fc3..a1263422 100644 --- a/src/main/java/hello/cluebackend/assignment/participation/api/AssignmentParticipationCommandController.java +++ b/src/main/java/hello/cluebackend/assignment/participation/api/AssignmentParticipationCommandController.java @@ -10,6 +10,10 @@ @RequiredArgsConstructor @Slf4j public class AssignmentParticipationCommandController { + // 제출한 과제 전체 조회 + + // 제출한 과제 조회 + // TODO : 메인 페이지 학생 미제출 과제 전체 조회, 메인 // TODO : 수업실 과제 전체 조회 및 학생 첨부 파일 전체 조회, 학습실 - 과제 diff --git a/src/main/java/hello/cluebackend/assignment/participation/api/AssignmentParticipationQueryController.java b/src/main/java/hello/cluebackend/assignment/participation/api/AssignmentParticipationQueryController.java index 889fc2e7..acbf8b04 100644 --- a/src/main/java/hello/cluebackend/assignment/participation/api/AssignmentParticipationQueryController.java +++ b/src/main/java/hello/cluebackend/assignment/participation/api/AssignmentParticipationQueryController.java @@ -10,6 +10,12 @@ @RequiredArgsConstructor @Slf4j public class AssignmentParticipationQueryController { + // 제출한 과제 생성 + + // 제출한 과제 수정 + + // 제출한 과제 삭제 + // TODO : 과제 파일 업로드 하기 // TODO : 과제 첨부 파일 삭제하기 diff --git a/src/main/java/hello/cluebackend/assignment/participation/application/SubmissionCommandService.java b/src/main/java/hello/cluebackend/assignment/participation/application/SubmissionCommandService.java new file mode 100644 index 00000000..44b342b4 --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/participation/application/SubmissionCommandService.java @@ -0,0 +1,21 @@ +package hello.cluebackend.assignment.participation.application; + +import hello.cluebackend.assignment.management.api.dto.response.GetSubmissionFile; +import hello.cluebackend.assignment.participation.domain.Submission; +import hello.cluebackend.assignment.participation.persistence.SubmissionRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class SubmissionCommandService { + private final SubmissionRepository submissionRepository; + + public Submission findById(Long submissionId) { + return submissionRepository.findById(submissionId).get(); + } + + public GetSubmissionFile getSubmissionGrade(Submission submission) { + return submissionRepository.findByIdWithAttachment(submission); + } +} diff --git a/src/main/java/hello/cluebackend/assignment/participation/application/SubmissionQueryService.java b/src/main/java/hello/cluebackend/assignment/participation/application/SubmissionQueryService.java new file mode 100644 index 00000000..2e482fa2 --- /dev/null +++ b/src/main/java/hello/cluebackend/assignment/participation/application/SubmissionQueryService.java @@ -0,0 +1,4 @@ +package hello.cluebackend.assignment.participation.application; + +public class SubmissionQueryService { +} diff --git a/src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionAttachment.java b/src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionAttachment.java index b427553e..64bceeee 100644 --- a/src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionAttachment.java +++ b/src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionAttachment.java @@ -14,13 +14,10 @@ @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorColumn(name = "DTYPE") @Getter @Setter -@AllArgsConstructor -@NoArgsConstructor -@SuperBuilder public abstract class SubmissionAttachment { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name="submission_file_id") - private Long assignmentContentId; + @Column(name="submission_attachment_id") + private Long SubmissionAttachmentId; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="user_id") @@ -28,7 +25,7 @@ public abstract class SubmissionAttachment { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="submission_id") - private Submission assignmentCheck; + private Submission submission; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="assignment_id") diff --git a/src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionDocument.java b/src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionDocument.java index 34c50881..430fb224 100644 --- a/src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionDocument.java +++ b/src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionDocument.java @@ -9,7 +9,6 @@ @Entity @DiscriminatorValue("Document") -@SuperBuilder @NoArgsConstructor public class SubmissionDocument extends SubmissionAttachment { @JoinColumn(name="original_file_name") diff --git a/src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionLink.java b/src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionLink.java index 249281c4..db33c470 100644 --- a/src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionLink.java +++ b/src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionLink.java @@ -7,7 +7,6 @@ @Entity @DiscriminatorValue("Link") -@SuperBuilder @NoArgsConstructor public class SubmissionLink extends SubmissionAttachment { private String url; diff --git a/src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionRepository.java b/src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionRepository.java index 48a3ce12..ce89783d 100644 --- a/src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionRepository.java +++ b/src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionRepository.java @@ -1,9 +1,23 @@ package hello.cluebackend.assignment.participation.persistence; +import hello.cluebackend.assignment.management.api.dto.response.GetSubmissionFile; +import hello.cluebackend.assignment.management.domain.Assignment; import hello.cluebackend.assignment.participation.domain.Submission; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.util.List; @Repository -public interface SubmissionRepository extends JpaRepository { } +public interface SubmissionRepository extends JpaRepository { + @Query("select s from Submission s" + + " where s.assignment =:assignment") + List findByAssignment(@Param("assignment") Assignment assignment); + + @Query("select sa.SubmissionAttachmentId from SubmissionAttachment sa" + + " join fetch sa.submission s" + + " where s=:submission") + GetSubmissionFile findByIdWithAttachment(@Param("submission") Submission submission); +} diff --git a/src/main/java/hello/cluebackend/domain/classroom/domain/repository/ClassRoomRepository.java b/src/main/java/hello/cluebackend/domain/classroom/domain/repository/ClassRoomRepository.java index 64c5b206..a7d42636 100644 --- a/src/main/java/hello/cluebackend/domain/classroom/domain/repository/ClassRoomRepository.java +++ b/src/main/java/hello/cluebackend/domain/classroom/domain/repository/ClassRoomRepository.java @@ -12,4 +12,6 @@ public interface ClassRoomRepository extends JpaRepository { Boolean existsByCode(String code); Optional findByCode(String code); + + ClassRoom findByClassRoomId(Long classRoomId); } diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 98babe66..79a7844e 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -11,7 +11,7 @@ spring: database-platform: org.hibernate.dialect.PostgreSQLDialect show-sql: true hibernate: - ddl-auto: create + ddl-auto: none data: redis: # host: my_redis From 5077eb84a4ad1012f42232043f7f4272c801a293 Mon Sep 17 00:00:00 2001 From: Haeyul Date: Tue, 12 Aug 2025 20:41:22 +0900 Subject: [PATCH 06/22] =?UTF-8?q?feat(#5)=20:=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QAssignmentAttachment.java | 56 ++++++++++++++ .../QAttachmentDocument.java | 73 ++++++++++++++++++ .../AssignmentAttachment/QAttachmentLink.java | 67 ++++++++++++++++ .../management/domain/QAssignment.java | 62 +++++++++++++++ .../participation/domain/QSubmission.java | 58 ++++++++++++++ .../QSubmissionAttachment.java | 59 ++++++++++++++ .../QSubmissionDocument.java | 77 +++++++++++++++++++ .../SubmissionAttachment/QSubmissionLink.java | 71 +++++++++++++++++ .../domain/classroom/domain/QClassRoom.java | 58 ++++++++++++++ .../classroomuser/domain/QClassRoomUser.java | 54 +++++++++++++ .../domain/directory/domain/QDirectory.java | 57 ++++++++++++++ .../domain/document/domain/QDocument.java | 62 +++++++++++++++ .../domain/user/domain/QUserEntity.java | 47 +++++++++++ ...AssignmentManagementCommandController.java | 14 ++-- .../dto/response/GetAllSubmissionCheck.java | 1 - .../application/AssignmentCommandService.java | 20 ++--- .../application/AssignmentQueryService.java | 7 +- .../AssignmentAttachmentRepository.java | 4 - .../CustomAssignmentAttachmentRepository.java | 3 + .../application/SubmissionCommandService.java | 8 +- .../SubmissionAttachmentRepository.java | 10 ++- .../persistence/SubmissionRepository.java | 8 +- 22 files changed, 830 insertions(+), 46 deletions(-) create mode 100644 src/main/generated/hello/cluebackend/assignment/management/domain/AssignmentAttachment/QAssignmentAttachment.java create mode 100644 src/main/generated/hello/cluebackend/assignment/management/domain/AssignmentAttachment/QAttachmentDocument.java create mode 100644 src/main/generated/hello/cluebackend/assignment/management/domain/AssignmentAttachment/QAttachmentLink.java create mode 100644 src/main/generated/hello/cluebackend/assignment/management/domain/QAssignment.java create mode 100644 src/main/generated/hello/cluebackend/assignment/participation/domain/QSubmission.java create mode 100644 src/main/generated/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/QSubmissionAttachment.java create mode 100644 src/main/generated/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/QSubmissionDocument.java create mode 100644 src/main/generated/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/QSubmissionLink.java create mode 100644 src/main/generated/hello/cluebackend/domain/classroom/domain/QClassRoom.java create mode 100644 src/main/generated/hello/cluebackend/domain/classroomuser/domain/QClassRoomUser.java create mode 100644 src/main/generated/hello/cluebackend/domain/directory/domain/QDirectory.java create mode 100644 src/main/generated/hello/cluebackend/domain/document/domain/QDocument.java create mode 100644 src/main/generated/hello/cluebackend/domain/user/domain/QUserEntity.java diff --git a/src/main/generated/hello/cluebackend/assignment/management/domain/AssignmentAttachment/QAssignmentAttachment.java b/src/main/generated/hello/cluebackend/assignment/management/domain/AssignmentAttachment/QAssignmentAttachment.java new file mode 100644 index 00000000..5102bd61 --- /dev/null +++ b/src/main/generated/hello/cluebackend/assignment/management/domain/AssignmentAttachment/QAssignmentAttachment.java @@ -0,0 +1,56 @@ +package hello.cluebackend.assignment.management.domain.AssignmentAttachment; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QAssignmentAttachment is a Querydsl query type for AssignmentAttachment + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QAssignmentAttachment extends EntityPathBase { + + private static final long serialVersionUID = -1218380451L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QAssignmentAttachment assignmentAttachment = new QAssignmentAttachment("assignmentAttachment"); + + public final hello.cluebackend.assignment.management.domain.QAssignment assignment; + + public final NumberPath assignmentAttachmentId = createNumber("assignmentAttachmentId", Long.class); + + public final DateTimePath updateDate = createDateTime("updateDate", java.time.LocalDateTime.class); + + public final hello.cluebackend.domain.user.domain.QUserEntity user; + + public QAssignmentAttachment(String variable) { + this(AssignmentAttachment.class, forVariable(variable), INITS); + } + + public QAssignmentAttachment(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QAssignmentAttachment(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QAssignmentAttachment(PathMetadata metadata, PathInits inits) { + this(AssignmentAttachment.class, metadata, inits); + } + + public QAssignmentAttachment(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.assignment = inits.isInitialized("assignment") ? new hello.cluebackend.assignment.management.domain.QAssignment(forProperty("assignment"), inits.get("assignment")) : null; + this.user = inits.isInitialized("user") ? new hello.cluebackend.domain.user.domain.QUserEntity(forProperty("user")) : null; + } + +} + diff --git a/src/main/generated/hello/cluebackend/assignment/management/domain/AssignmentAttachment/QAttachmentDocument.java b/src/main/generated/hello/cluebackend/assignment/management/domain/AssignmentAttachment/QAttachmentDocument.java new file mode 100644 index 00000000..f75f4314 --- /dev/null +++ b/src/main/generated/hello/cluebackend/assignment/management/domain/AssignmentAttachment/QAttachmentDocument.java @@ -0,0 +1,73 @@ +package hello.cluebackend.assignment.management.domain.AssignmentAttachment; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QAttachmentDocument is a Querydsl query type for AttachmentDocument + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QAttachmentDocument extends EntityPathBase { + + private static final long serialVersionUID = -2058528725L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QAttachmentDocument attachmentDocument = new QAttachmentDocument("attachmentDocument"); + + public final QAssignmentAttachment _super; + + // inherited + public final hello.cluebackend.assignment.management.domain.QAssignment assignment; + + //inherited + public final NumberPath assignmentAttachmentId; + + public final StringPath filePath = createString("filePath"); + + public final NumberPath fileSize = createNumber("fileSize", Long.class); + + public final StringPath originalFileName = createString("originalFileName"); + + public final StringPath storedFileName = createString("storedFileName"); + + //inherited + public final DateTimePath updateDate; + + // inherited + public final hello.cluebackend.domain.user.domain.QUserEntity user; + + public QAttachmentDocument(String variable) { + this(AttachmentDocument.class, forVariable(variable), INITS); + } + + public QAttachmentDocument(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QAttachmentDocument(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QAttachmentDocument(PathMetadata metadata, PathInits inits) { + this(AttachmentDocument.class, metadata, inits); + } + + public QAttachmentDocument(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this._super = new QAssignmentAttachment(type, metadata, inits); + this.assignment = _super.assignment; + this.assignmentAttachmentId = _super.assignmentAttachmentId; + this.updateDate = _super.updateDate; + this.user = _super.user; + } + +} + diff --git a/src/main/generated/hello/cluebackend/assignment/management/domain/AssignmentAttachment/QAttachmentLink.java b/src/main/generated/hello/cluebackend/assignment/management/domain/AssignmentAttachment/QAttachmentLink.java new file mode 100644 index 00000000..a4317906 --- /dev/null +++ b/src/main/generated/hello/cluebackend/assignment/management/domain/AssignmentAttachment/QAttachmentLink.java @@ -0,0 +1,67 @@ +package hello.cluebackend.assignment.management.domain.AssignmentAttachment; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QAttachmentLink is a Querydsl query type for AttachmentLink + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QAttachmentLink extends EntityPathBase { + + private static final long serialVersionUID = -1725874422L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QAttachmentLink attachmentLink = new QAttachmentLink("attachmentLink"); + + public final QAssignmentAttachment _super; + + // inherited + public final hello.cluebackend.assignment.management.domain.QAssignment assignment; + + //inherited + public final NumberPath assignmentAttachmentId; + + //inherited + public final DateTimePath updateDate; + + public final StringPath url = createString("url"); + + // inherited + public final hello.cluebackend.domain.user.domain.QUserEntity user; + + public QAttachmentLink(String variable) { + this(AttachmentLink.class, forVariable(variable), INITS); + } + + public QAttachmentLink(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QAttachmentLink(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QAttachmentLink(PathMetadata metadata, PathInits inits) { + this(AttachmentLink.class, metadata, inits); + } + + public QAttachmentLink(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this._super = new QAssignmentAttachment(type, metadata, inits); + this.assignment = _super.assignment; + this.assignmentAttachmentId = _super.assignmentAttachmentId; + this.updateDate = _super.updateDate; + this.user = _super.user; + } + +} + diff --git a/src/main/generated/hello/cluebackend/assignment/management/domain/QAssignment.java b/src/main/generated/hello/cluebackend/assignment/management/domain/QAssignment.java new file mode 100644 index 00000000..780431d1 --- /dev/null +++ b/src/main/generated/hello/cluebackend/assignment/management/domain/QAssignment.java @@ -0,0 +1,62 @@ +package hello.cluebackend.assignment.management.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QAssignment is a Querydsl query type for Assignment + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QAssignment extends EntityPathBase { + + private static final long serialVersionUID = -204103010L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QAssignment assignment = new QAssignment("assignment"); + + public final NumberPath assignmentId = createNumber("assignmentId", Long.class); + + public final hello.cluebackend.domain.classroom.domain.QClassRoom classRoom; + + public final StringPath content = createString("content"); + + public final DateTimePath endDate = createDateTime("endDate", java.time.LocalDateTime.class); + + public final DateTimePath startDate = createDateTime("startDate", java.time.LocalDateTime.class); + + public final StringPath title = createString("title"); + + public final hello.cluebackend.domain.user.domain.QUserEntity user; + + public QAssignment(String variable) { + this(Assignment.class, forVariable(variable), INITS); + } + + public QAssignment(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QAssignment(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QAssignment(PathMetadata metadata, PathInits inits) { + this(Assignment.class, metadata, inits); + } + + public QAssignment(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.classRoom = inits.isInitialized("classRoom") ? new hello.cluebackend.domain.classroom.domain.QClassRoom(forProperty("classRoom")) : null; + this.user = inits.isInitialized("user") ? new hello.cluebackend.domain.user.domain.QUserEntity(forProperty("user")) : null; + } + +} + diff --git a/src/main/generated/hello/cluebackend/assignment/participation/domain/QSubmission.java b/src/main/generated/hello/cluebackend/assignment/participation/domain/QSubmission.java new file mode 100644 index 00000000..855bdeab --- /dev/null +++ b/src/main/generated/hello/cluebackend/assignment/participation/domain/QSubmission.java @@ -0,0 +1,58 @@ +package hello.cluebackend.assignment.participation.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QSubmission is a Querydsl query type for Submission + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QSubmission extends EntityPathBase { + + private static final long serialVersionUID = 1273442551L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QSubmission submission = new QSubmission("submission"); + + public final hello.cluebackend.assignment.management.domain.QAssignment assignment; + + public final BooleanPath isSubmitted = createBoolean("isSubmitted"); + + public final NumberPath submissionId = createNumber("submissionId", Long.class); + + public final DateTimePath submittedAt = createDateTime("submittedAt", java.time.LocalDateTime.class); + + public final hello.cluebackend.domain.user.domain.QUserEntity user; + + public QSubmission(String variable) { + this(Submission.class, forVariable(variable), INITS); + } + + public QSubmission(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QSubmission(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QSubmission(PathMetadata metadata, PathInits inits) { + this(Submission.class, metadata, inits); + } + + public QSubmission(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.assignment = inits.isInitialized("assignment") ? new hello.cluebackend.assignment.management.domain.QAssignment(forProperty("assignment"), inits.get("assignment")) : null; + this.user = inits.isInitialized("user") ? new hello.cluebackend.domain.user.domain.QUserEntity(forProperty("user")) : null; + } + +} + diff --git a/src/main/generated/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/QSubmissionAttachment.java b/src/main/generated/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/QSubmissionAttachment.java new file mode 100644 index 00000000..aa28445d --- /dev/null +++ b/src/main/generated/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/QSubmissionAttachment.java @@ -0,0 +1,59 @@ +package hello.cluebackend.assignment.participation.domain.SubmissionAttachment; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QSubmissionAttachment is a Querydsl query type for SubmissionAttachment + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QSubmissionAttachment extends EntityPathBase { + + private static final long serialVersionUID = -418232925L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QSubmissionAttachment submissionAttachment = new QSubmissionAttachment("submissionAttachment"); + + public final hello.cluebackend.assignment.management.domain.QAssignment assignment; + + public final hello.cluebackend.assignment.participation.domain.QSubmission submission; + + public final NumberPath SubmissionAttachmentId = createNumber("SubmissionAttachmentId", Long.class); + + public final DateTimePath updateDate = createDateTime("updateDate", java.time.LocalDateTime.class); + + public final hello.cluebackend.domain.user.domain.QUserEntity user; + + public QSubmissionAttachment(String variable) { + this(SubmissionAttachment.class, forVariable(variable), INITS); + } + + public QSubmissionAttachment(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QSubmissionAttachment(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QSubmissionAttachment(PathMetadata metadata, PathInits inits) { + this(SubmissionAttachment.class, metadata, inits); + } + + public QSubmissionAttachment(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.assignment = inits.isInitialized("assignment") ? new hello.cluebackend.assignment.management.domain.QAssignment(forProperty("assignment"), inits.get("assignment")) : null; + this.submission = inits.isInitialized("submission") ? new hello.cluebackend.assignment.participation.domain.QSubmission(forProperty("submission"), inits.get("submission")) : null; + this.user = inits.isInitialized("user") ? new hello.cluebackend.domain.user.domain.QUserEntity(forProperty("user")) : null; + } + +} + diff --git a/src/main/generated/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/QSubmissionDocument.java b/src/main/generated/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/QSubmissionDocument.java new file mode 100644 index 00000000..b7c0e16c --- /dev/null +++ b/src/main/generated/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/QSubmissionDocument.java @@ -0,0 +1,77 @@ +package hello.cluebackend.assignment.participation.domain.SubmissionAttachment; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QSubmissionDocument is a Querydsl query type for SubmissionDocument + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QSubmissionDocument extends EntityPathBase { + + private static final long serialVersionUID = -1706500709L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QSubmissionDocument submissionDocument = new QSubmissionDocument("submissionDocument"); + + public final QSubmissionAttachment _super; + + // inherited + public final hello.cluebackend.assignment.management.domain.QAssignment assignment; + + public final StringPath filePath = createString("filePath"); + + public final NumberPath fileSize = createNumber("fileSize", Integer.class); + + public final StringPath originalFileName = createString("originalFileName"); + + public final StringPath storedFileName = createString("storedFileName"); + + // inherited + public final hello.cluebackend.assignment.participation.domain.QSubmission submission; + + //inherited + public final NumberPath SubmissionAttachmentId; + + //inherited + public final DateTimePath updateDate; + + // inherited + public final hello.cluebackend.domain.user.domain.QUserEntity user; + + public QSubmissionDocument(String variable) { + this(SubmissionDocument.class, forVariable(variable), INITS); + } + + public QSubmissionDocument(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QSubmissionDocument(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QSubmissionDocument(PathMetadata metadata, PathInits inits) { + this(SubmissionDocument.class, metadata, inits); + } + + public QSubmissionDocument(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this._super = new QSubmissionAttachment(type, metadata, inits); + this.assignment = _super.assignment; + this.submission = _super.submission; + this.SubmissionAttachmentId = _super.SubmissionAttachmentId; + this.updateDate = _super.updateDate; + this.user = _super.user; + } + +} + diff --git a/src/main/generated/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/QSubmissionLink.java b/src/main/generated/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/QSubmissionLink.java new file mode 100644 index 00000000..f3de8771 --- /dev/null +++ b/src/main/generated/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/QSubmissionLink.java @@ -0,0 +1,71 @@ +package hello.cluebackend.assignment.participation.domain.SubmissionAttachment; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QSubmissionLink is a Querydsl query type for SubmissionLink + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QSubmissionLink extends EntityPathBase { + + private static final long serialVersionUID = -1810301830L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QSubmissionLink submissionLink = new QSubmissionLink("submissionLink"); + + public final QSubmissionAttachment _super; + + // inherited + public final hello.cluebackend.assignment.management.domain.QAssignment assignment; + + // inherited + public final hello.cluebackend.assignment.participation.domain.QSubmission submission; + + //inherited + public final NumberPath SubmissionAttachmentId; + + //inherited + public final DateTimePath updateDate; + + public final StringPath url = createString("url"); + + // inherited + public final hello.cluebackend.domain.user.domain.QUserEntity user; + + public QSubmissionLink(String variable) { + this(SubmissionLink.class, forVariable(variable), INITS); + } + + public QSubmissionLink(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QSubmissionLink(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QSubmissionLink(PathMetadata metadata, PathInits inits) { + this(SubmissionLink.class, metadata, inits); + } + + public QSubmissionLink(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this._super = new QSubmissionAttachment(type, metadata, inits); + this.assignment = _super.assignment; + this.submission = _super.submission; + this.SubmissionAttachmentId = _super.SubmissionAttachmentId; + this.updateDate = _super.updateDate; + this.user = _super.user; + } + +} + diff --git a/src/main/generated/hello/cluebackend/domain/classroom/domain/QClassRoom.java b/src/main/generated/hello/cluebackend/domain/classroom/domain/QClassRoom.java new file mode 100644 index 00000000..089e0e9c --- /dev/null +++ b/src/main/generated/hello/cluebackend/domain/classroom/domain/QClassRoom.java @@ -0,0 +1,58 @@ +package hello.cluebackend.domain.classroom.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QClassRoom is a Querydsl query type for ClassRoom + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QClassRoom extends EntityPathBase { + + private static final long serialVersionUID = 1743497663L; + + public static final QClassRoom classRoom = new QClassRoom("classRoom"); + + public final NumberPath classRoomId = createNumber("classRoomId", Long.class); + + public final ListPath classRoomUserList = this.createList("classRoomUserList", hello.cluebackend.domain.classroomuser.domain.ClassRoomUser.class, hello.cluebackend.domain.classroomuser.domain.QClassRoomUser.class, PathInits.DIRECT2); + + public final StringPath code = createString("code"); + + public final DateTimePath createdAt = createDateTime("createdAt", java.time.LocalDateTime.class); + + public final StringPath description = createString("description"); + + public final ListPath directoryList = this.createList("directoryList", hello.cluebackend.domain.directory.domain.Directory.class, hello.cluebackend.domain.directory.domain.QDirectory.class, PathInits.DIRECT2); + + public final ListPath documentList = this.createList("documentList", hello.cluebackend.domain.document.domain.Document.class, hello.cluebackend.domain.document.domain.QDocument.class, PathInits.DIRECT2); + + public final BooleanPath isActivation = createBoolean("isActivation"); + + public final StringPath name = createString("name"); + + public final StringPath sort = createString("sort"); + + public final StringPath target = createString("target"); + + public QClassRoom(String variable) { + super(ClassRoom.class, forVariable(variable)); + } + + public QClassRoom(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QClassRoom(PathMetadata metadata) { + super(ClassRoom.class, metadata); + } + +} + diff --git a/src/main/generated/hello/cluebackend/domain/classroomuser/domain/QClassRoomUser.java b/src/main/generated/hello/cluebackend/domain/classroomuser/domain/QClassRoomUser.java new file mode 100644 index 00000000..4f209996 --- /dev/null +++ b/src/main/generated/hello/cluebackend/domain/classroomuser/domain/QClassRoomUser.java @@ -0,0 +1,54 @@ +package hello.cluebackend.domain.classroomuser.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QClassRoomUser is a Querydsl query type for ClassRoomUser + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QClassRoomUser extends EntityPathBase { + + private static final long serialVersionUID = 338153279L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QClassRoomUser classRoomUser = new QClassRoomUser("classRoomUser"); + + public final hello.cluebackend.domain.classroom.domain.QClassRoom classRoom; + + public final NumberPath classRoomUserId = createNumber("classRoomUserId", Long.class); + + public final hello.cluebackend.domain.user.domain.QUserEntity user; + + public QClassRoomUser(String variable) { + this(ClassRoomUser.class, forVariable(variable), INITS); + } + + public QClassRoomUser(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QClassRoomUser(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QClassRoomUser(PathMetadata metadata, PathInits inits) { + this(ClassRoomUser.class, metadata, inits); + } + + public QClassRoomUser(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.classRoom = inits.isInitialized("classRoom") ? new hello.cluebackend.domain.classroom.domain.QClassRoom(forProperty("classRoom")) : null; + this.user = inits.isInitialized("user") ? new hello.cluebackend.domain.user.domain.QUserEntity(forProperty("user")) : null; + } + +} + diff --git a/src/main/generated/hello/cluebackend/domain/directory/domain/QDirectory.java b/src/main/generated/hello/cluebackend/domain/directory/domain/QDirectory.java new file mode 100644 index 00000000..52046f5b --- /dev/null +++ b/src/main/generated/hello/cluebackend/domain/directory/domain/QDirectory.java @@ -0,0 +1,57 @@ +package hello.cluebackend.domain.directory.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QDirectory is a Querydsl query type for Directory + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QDirectory extends EntityPathBase { + + private static final long serialVersionUID = -1569116961L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QDirectory directory = new QDirectory("directory"); + + public final hello.cluebackend.domain.classroom.domain.QClassRoom classRoom; + + public final NumberPath directoryId = createNumber("directoryId", Long.class); + + public final NumberPath directoryOrder = createNumber("directoryOrder", Integer.class); + + public final ListPath documentList = this.createList("documentList", hello.cluebackend.domain.document.domain.Document.class, hello.cluebackend.domain.document.domain.QDocument.class, PathInits.DIRECT2); + + public final StringPath name = createString("name"); + + public QDirectory(String variable) { + this(Directory.class, forVariable(variable), INITS); + } + + public QDirectory(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QDirectory(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QDirectory(PathMetadata metadata, PathInits inits) { + this(Directory.class, metadata, inits); + } + + public QDirectory(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.classRoom = inits.isInitialized("classRoom") ? new hello.cluebackend.domain.classroom.domain.QClassRoom(forProperty("classRoom")) : null; + } + +} + diff --git a/src/main/generated/hello/cluebackend/domain/document/domain/QDocument.java b/src/main/generated/hello/cluebackend/domain/document/domain/QDocument.java new file mode 100644 index 00000000..031b742c --- /dev/null +++ b/src/main/generated/hello/cluebackend/domain/document/domain/QDocument.java @@ -0,0 +1,62 @@ +package hello.cluebackend.domain.document.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; +import com.querydsl.core.types.dsl.PathInits; + + +/** + * QDocument is a Querydsl query type for Document + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QDocument extends EntityPathBase { + + private static final long serialVersionUID = -687513363L; + + private static final PathInits INITS = PathInits.DIRECT2; + + public static final QDocument document = new QDocument("document"); + + public final hello.cluebackend.domain.classroom.domain.QClassRoom classRoom; + + public final StringPath content = createString("content"); + + public final DateTimePath createdAt = createDateTime("createdAt", java.time.LocalDateTime.class); + + public final hello.cluebackend.domain.directory.domain.QDirectory directory; + + public final NumberPath documentId = createNumber("documentId", Long.class); + + public final StringPath title = createString("title"); + + public final NumberPath type = createNumber("type", Integer.class); + + public QDocument(String variable) { + this(Document.class, forVariable(variable), INITS); + } + + public QDocument(Path path) { + this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); + } + + public QDocument(PathMetadata metadata) { + this(metadata, PathInits.getFor(metadata, INITS)); + } + + public QDocument(PathMetadata metadata, PathInits inits) { + this(Document.class, metadata, inits); + } + + public QDocument(Class type, PathMetadata metadata, PathInits inits) { + super(type, metadata, inits); + this.classRoom = inits.isInitialized("classRoom") ? new hello.cluebackend.domain.classroom.domain.QClassRoom(forProperty("classRoom")) : null; + this.directory = inits.isInitialized("directory") ? new hello.cluebackend.domain.directory.domain.QDirectory(forProperty("directory"), inits.get("directory")) : null; + } + +} + diff --git a/src/main/generated/hello/cluebackend/domain/user/domain/QUserEntity.java b/src/main/generated/hello/cluebackend/domain/user/domain/QUserEntity.java new file mode 100644 index 00000000..0afcbca2 --- /dev/null +++ b/src/main/generated/hello/cluebackend/domain/user/domain/QUserEntity.java @@ -0,0 +1,47 @@ +package hello.cluebackend.domain.user.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QUserEntity is a Querydsl query type for UserEntity + */ +@Generated("com.querydsl.codegen.DefaultEntitySerializer") +public class QUserEntity extends EntityPathBase { + + private static final long serialVersionUID = -1925951728L; + + public static final QUserEntity userEntity = new QUserEntity("userEntity"); + + public final NumberPath classCode = createNumber("classCode", Integer.class); + + public final DateTimePath createdAt = createDateTime("createdAt", java.time.LocalDateTime.class); + + public final StringPath email = createString("email"); + + public final EnumPath role = createEnum("role", Role.class); + + public final NumberPath userId = createNumber("userId", Long.class); + + public final StringPath username = createString("username"); + + public QUserEntity(String variable) { + super(UserEntity.class, forVariable(variable)); + } + + public QUserEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QUserEntity(PathMetadata metadata) { + super(UserEntity.class, metadata); + } + +} + diff --git a/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementCommandController.java b/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementCommandController.java index 724a6793..4f7f288a 100644 --- a/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementCommandController.java +++ b/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementCommandController.java @@ -3,8 +3,6 @@ import hello.cluebackend.assignment.management.api.dto.response.*; import hello.cluebackend.assignment.management.application.AssignmentCommandService; import hello.cluebackend.assignment.management.domain.Assignment; -import hello.cluebackend.assignment.participation.application.SubmissionCommandService; -import hello.cluebackend.assignment.participation.domain.Submission; import hello.cluebackend.domain.user.domain.UserEntity; import hello.cluebackend.domain.user.domain.repository.UserRepository; import hello.cluebackend.global.config.JWTUtil; @@ -30,10 +28,9 @@ public class AssignmentManagementCommandController { private final JWTUtil jwtUtil; private final AssignmentCommandService assignmentCommandService; private final UserRepository userRepository; - private final SubmissionCommandService submissionCommandService; - // TODO : 메인 페이지 제작한 과제 전체 조회 - @GetMapping("/getAllAssignments") + // TODO : 메인 페이지 제작한 과제 전체 조회(T) + @GetMapping("/getAllAssignments/my") public ResponseEntity getAllAssignments(HttpServletRequest request) { try { String token = jwtUtil.getToken(request); @@ -43,9 +40,8 @@ public ResponseEntity getAllAssignments(HttpServletRequest req List assignments = assignmentCommandService.findAllAssignment(user); return ResponseEntity.ok(new AssignmentResult(assignments)); - } catch (JwtException | UsernameNotFoundException e) { - return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); - }catch (Exception e){ + } catch (Exception e) { + log.error("Failed to retrieve assignments for user", e); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } @@ -86,7 +82,7 @@ public ResponseEntity getAllSubmissionCheck(HttpServletRequest } } -// // TODO : 개인 제출 과제 보기, 학습실 - 과제 - 채점(T) + // TODO : 개인 제출 과제 보기, 학습실 - 과제 - 채점(T) // @GetMapping("/getAssignment/{submissionId}") // public ResponseEntity getSubmission(HttpServletRequest request, @PathVariable Long submissionId) { // try { diff --git a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllSubmissionCheck.java b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllSubmissionCheck.java index 328ec414..eb028825 100644 --- a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllSubmissionCheck.java +++ b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllSubmissionCheck.java @@ -1,6 +1,5 @@ package hello.cluebackend.assignment.management.api.dto.response; -import hello.cluebackend.domain.user.domain.UserEntity; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/hello/cluebackend/assignment/management/application/AssignmentCommandService.java b/src/main/java/hello/cluebackend/assignment/management/application/AssignmentCommandService.java index 56a4eb08..3853f5a7 100644 --- a/src/main/java/hello/cluebackend/assignment/management/application/AssignmentCommandService.java +++ b/src/main/java/hello/cluebackend/assignment/management/application/AssignmentCommandService.java @@ -11,6 +11,7 @@ import hello.cluebackend.domain.classroom.domain.repository.ClassRoomRepository; import hello.cluebackend.domain.classroom.service.ClassRoomService; import hello.cluebackend.domain.user.domain.UserEntity; +import jakarta.persistence.EntityNotFoundException; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -20,24 +21,12 @@ @Service @RequiredArgsConstructor @Transactional(readOnly = true) -public class AssignmentCommandService { +public class AssignmentCommandService{ private final AssignmentRepository assignmentRepository; private final ClassRoomService classRoomService; private final ClassRoomRepository classRoomRepository; private final SubmissionRepository submissionRepository; - // 과제 단일 조회 - public Assignment findById(Long assignmentId) { - return assignmentRepository.findById(assignmentId).get(); - } - - // 과제 전체 조회 - public List findAll() { - return assignmentRepository.findAll(); - } - - // ---------- 세부 API ----------------- // - // 해당 사용자가 속한 모든 과제 출력 (단, 마감이 된 과제는 반환하지 않는다.) public List findAllAssignment(UserEntity user) { List assignments = assignmentRepository.getAllByUser(user); @@ -63,4 +52,9 @@ public List checkIsSubmitted(Assignment assignment) { .map(a -> new GetAllSubmissionCheck(a.getSubmissionId(),a.getUser().getUserId(),a.getUser().getUsername(),a.getUser().getClassCode(),a.getIsSubmitted(),a.getSubmittedAt(),a.getAssignment().getEndDate())) .toList(); } + + public Assignment findById(Long assignmentId) { + return assignmentRepository.findById(assignmentId) + .orElseThrow(() -> new EntityNotFoundException("Entity not found : " + assignmentId)); + } } diff --git a/src/main/java/hello/cluebackend/assignment/management/application/AssignmentQueryService.java b/src/main/java/hello/cluebackend/assignment/management/application/AssignmentQueryService.java index 076b1035..ca288afe 100644 --- a/src/main/java/hello/cluebackend/assignment/management/application/AssignmentQueryService.java +++ b/src/main/java/hello/cluebackend/assignment/management/application/AssignmentQueryService.java @@ -7,14 +7,9 @@ @Service @RequiredArgsConstructor @Transactional(readOnly = false) -public class AssignmentQueryService { +public class AssignmentQueryService{ // 과제 생성 -// public void assignmentCreate() // 과제 수정 - - // ------------------- 세부 API ----------------- // - - } diff --git a/src/main/java/hello/cluebackend/assignment/management/persistence/AssignmentAttachmentRepository.java b/src/main/java/hello/cluebackend/assignment/management/persistence/AssignmentAttachmentRepository.java index a7c5cd4b..c9e9bec0 100644 --- a/src/main/java/hello/cluebackend/assignment/management/persistence/AssignmentAttachmentRepository.java +++ b/src/main/java/hello/cluebackend/assignment/management/persistence/AssignmentAttachmentRepository.java @@ -1,13 +1,9 @@ package hello.cluebackend.assignment.management.persistence; -import hello.cluebackend.assignment.management.domain.Assignment; import hello.cluebackend.assignment.management.domain.AssignmentAttachment.AssignmentAttachment; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; -import java.util.List; - @Repository public interface AssignmentAttachmentRepository extends JpaRepository { - List findAllByAssignment(Assignment assignment); } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/assignment/management/persistence/CustomAssignmentAttachmentRepository.java b/src/main/java/hello/cluebackend/assignment/management/persistence/CustomAssignmentAttachmentRepository.java index 406c2547..11783e5d 100644 --- a/src/main/java/hello/cluebackend/assignment/management/persistence/CustomAssignmentAttachmentRepository.java +++ b/src/main/java/hello/cluebackend/assignment/management/persistence/CustomAssignmentAttachmentRepository.java @@ -1,4 +1,7 @@ package hello.cluebackend.assignment.management.persistence; +import org.springframework.stereotype.Repository; + +@Repository public interface CustomAssignmentAttachmentRepository { } diff --git a/src/main/java/hello/cluebackend/assignment/participation/application/SubmissionCommandService.java b/src/main/java/hello/cluebackend/assignment/participation/application/SubmissionCommandService.java index 44b342b4..28132e39 100644 --- a/src/main/java/hello/cluebackend/assignment/participation/application/SubmissionCommandService.java +++ b/src/main/java/hello/cluebackend/assignment/participation/application/SubmissionCommandService.java @@ -3,6 +3,7 @@ import hello.cluebackend.assignment.management.api.dto.response.GetSubmissionFile; import hello.cluebackend.assignment.participation.domain.Submission; import hello.cluebackend.assignment.participation.persistence.SubmissionRepository; +import jakarta.persistence.EntityNotFoundException; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -12,10 +13,7 @@ public class SubmissionCommandService { private final SubmissionRepository submissionRepository; public Submission findById(Long submissionId) { - return submissionRepository.findById(submissionId).get(); - } - - public GetSubmissionFile getSubmissionGrade(Submission submission) { - return submissionRepository.findByIdWithAttachment(submission); + return submissionRepository.findById(submissionId) + .orElseThrow(() -> new EntityNotFoundException("Submission not found : " + submissionId)); } } diff --git a/src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionAttachmentRepository.java b/src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionAttachmentRepository.java index c8eee01e..f74e383f 100644 --- a/src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionAttachmentRepository.java +++ b/src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionAttachmentRepository.java @@ -1,9 +1,17 @@ package hello.cluebackend.assignment.participation.persistence; +import hello.cluebackend.assignment.management.api.dto.response.GetSubmissionFile; +import hello.cluebackend.assignment.participation.domain.Submission; import hello.cluebackend.assignment.participation.domain.SubmissionAttachment.SubmissionAttachment; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.util.List; @Repository -public interface SubmissionAttachmentRepository extends JpaRepository { } \ No newline at end of file +public interface SubmissionAttachmentRepository extends JpaRepository { + + List findBySubmissionWithAttachments(@Param("submission")Submission submission); +} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionRepository.java b/src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionRepository.java index ce89783d..c72045a8 100644 --- a/src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionRepository.java +++ b/src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionRepository.java @@ -1,6 +1,5 @@ package hello.cluebackend.assignment.participation.persistence; -import hello.cluebackend.assignment.management.api.dto.response.GetSubmissionFile; import hello.cluebackend.assignment.management.domain.Assignment; import hello.cluebackend.assignment.participation.domain.Submission; import org.springframework.data.jpa.repository.JpaRepository; @@ -11,13 +10,8 @@ import java.util.List; @Repository -public interface SubmissionRepository extends JpaRepository { +public interface SubmissionRepository extends JpaRepository { @Query("select s from Submission s" + " where s.assignment =:assignment") List findByAssignment(@Param("assignment") Assignment assignment); - - @Query("select sa.SubmissionAttachmentId from SubmissionAttachment sa" + - " join fetch sa.submission s" + - " where s=:submission") - GetSubmissionFile findByIdWithAttachment(@Param("submission") Submission submission); } From 948ed321712a8eafcb78dc62ad833255e24c0d66 Mon Sep 17 00:00:00 2001 From: Haeyul Date: Wed, 13 Aug 2025 07:38:06 +0900 Subject: [PATCH 07/22] =?UTF-8?q?feat(#5):=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EA=B0=80=20=EC=86=8D=ED=95=9C=20=EB=AA=A8=EB=93=A0=20=EC=88=98?= =?UTF-8?q?=EC=97=85=20=EA=B3=BC=EC=A0=9C=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QAssignmentAttachment.java | 8 +- .../QAttachmentDocument.java | 6 +- .../AssignmentAttachment/QAttachmentLink.java | 6 +- .../management/domain/QAssignment.java | 4 +- .../participation/domain/QSubmission.java | 8 +- .../QSubmissionAttachment.java | 12 +-- .../QSubmissionDocument.java | 8 +- .../SubmissionAttachment/QSubmissionLink.java | 8 +- ...AssignmentManagementCommandController.java | 102 ------------------ .../api/dto/response/AssignmentResult.java | 10 -- .../api/dto/response/Attachment.java | 4 - .../GetAllClassRoomAssignmentResponse.java | 16 --- .../application/AssignmentCommandService.java | 60 ----------- .../CustomAssignmentAttachmentRepository.java | 7 -- .../application/SubmissionCommandService.java | 19 ---- .../application/SubmissionQueryService.java | 4 - .../SubmissionAttachmentRepository.java | 17 --- .../persistence/SubmissionRepository.java | 17 --- ...AssignmentManagementCommandController.java | 83 ++++++++++++++ .../AssignmentManagementQueryController.java | 2 +- .../response/GetAllAssignmentResponse.java | 2 +- .../GetAllAssignmentResponseResult.java | 10 ++ .../GetAllClassRoomAssignmentResponse.java | 22 ++++ ...tAllClassRoomAssignmentResponseResult.java | 10 ++ .../dto/response/GetAllSubmissionCheck.java | 2 +- .../response/GetAllSubmissionCheckResult.java | 5 + .../api/dto/response/GetSubmissionFile.java | 2 +- .../api/dto/response/GetSubmissionResult.java | 2 +- .../application/AssignmentCommandService.java | 56 ++++++++++ .../application/AssignmentQueryService.java | 2 +- .../management/domain/Assignment.java | 4 +- .../AssignmentAttachment.java | 7 +- .../AttachmentDocument.java | 2 +- .../AssignmentAttachment/AttachmentLink.java | 2 +- .../AssignmentAttachmentRepository.java | 4 +- .../persistence/AssignmentRepository.java | 13 +-- ...ignmentParticipationCommandController.java | 2 +- ...ssignmentParticipationQueryController.java | 2 +- .../application/SubmissionCommandService.java | 23 ++++ .../application/SubmissionQueryService.java | 4 + .../participation/domain/Submission.java | 6 +- .../SubmissionAttachment.java | 9 +- .../SubmissionDocument.java | 3 +- .../SubmissionAttachment/SubmissionLink.java | 3 +- .../SubmissionAttachmentRepository.java | 15 +++ .../persistence/SubmissionRepository.java | 14 +++ 46 files changed, 304 insertions(+), 323 deletions(-) rename src/main/generated/hello/cluebackend/{ => domain}/assignment/management/domain/AssignmentAttachment/QAssignmentAttachment.java (84%) rename src/main/generated/hello/cluebackend/{ => domain}/assignment/management/domain/AssignmentAttachment/QAttachmentDocument.java (90%) rename src/main/generated/hello/cluebackend/{ => domain}/assignment/management/domain/AssignmentAttachment/QAttachmentLink.java (89%) rename src/main/generated/hello/cluebackend/{ => domain}/assignment/management/domain/QAssignment.java (94%) rename src/main/generated/hello/cluebackend/{ => domain}/assignment/participation/domain/QSubmission.java (83%) rename src/main/generated/hello/cluebackend/{ => domain}/assignment/participation/domain/SubmissionAttachment/QSubmissionAttachment.java (76%) rename src/main/generated/hello/cluebackend/{ => domain}/assignment/participation/domain/SubmissionAttachment/QSubmissionDocument.java (87%) rename src/main/generated/hello/cluebackend/{ => domain}/assignment/participation/domain/SubmissionAttachment/QSubmissionLink.java (85%) delete mode 100644 src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementCommandController.java delete mode 100644 src/main/java/hello/cluebackend/assignment/management/api/dto/response/AssignmentResult.java delete mode 100644 src/main/java/hello/cluebackend/assignment/management/api/dto/response/Attachment.java delete mode 100644 src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponse.java delete mode 100644 src/main/java/hello/cluebackend/assignment/management/application/AssignmentCommandService.java delete mode 100644 src/main/java/hello/cluebackend/assignment/management/persistence/CustomAssignmentAttachmentRepository.java delete mode 100644 src/main/java/hello/cluebackend/assignment/participation/application/SubmissionCommandService.java delete mode 100644 src/main/java/hello/cluebackend/assignment/participation/application/SubmissionQueryService.java delete mode 100644 src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionAttachmentRepository.java delete mode 100644 src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionRepository.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/management/api/AssignmentManagementCommandController.java rename src/main/java/hello/cluebackend/{ => domain}/assignment/management/api/AssignmentManagementQueryController.java (92%) rename src/main/java/hello/cluebackend/{ => domain}/assignment/management/api/dto/response/GetAllAssignmentResponse.java (82%) create mode 100644 src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllAssignmentResponseResult.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponse.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponseResult.java rename src/main/java/hello/cluebackend/{ => domain}/assignment/management/api/dto/response/GetAllSubmissionCheck.java (83%) create mode 100644 src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllSubmissionCheckResult.java rename src/main/java/hello/cluebackend/{ => domain}/assignment/management/api/dto/response/GetSubmissionFile.java (74%) rename src/main/java/hello/cluebackend/{ => domain}/assignment/management/api/dto/response/GetSubmissionResult.java (68%) create mode 100644 src/main/java/hello/cluebackend/domain/assignment/management/application/AssignmentCommandService.java rename src/main/java/hello/cluebackend/{ => domain}/assignment/management/application/AssignmentQueryService.java (81%) rename src/main/java/hello/cluebackend/{ => domain}/assignment/management/domain/Assignment.java (90%) rename src/main/java/hello/cluebackend/{ => domain}/assignment/management/domain/AssignmentAttachment/AssignmentAttachment.java (75%) rename src/main/java/hello/cluebackend/{ => domain}/assignment/management/domain/AssignmentAttachment/AttachmentDocument.java (88%) rename src/main/java/hello/cluebackend/{ => domain}/assignment/management/domain/AssignmentAttachment/AttachmentLink.java (82%) rename src/main/java/hello/cluebackend/{ => domain}/assignment/management/persistence/AssignmentAttachmentRepository.java (56%) rename src/main/java/hello/cluebackend/{ => domain}/assignment/management/persistence/AssignmentRepository.java (64%) rename src/main/java/hello/cluebackend/{ => domain}/assignment/participation/api/AssignmentParticipationCommandController.java (92%) rename src/main/java/hello/cluebackend/{ => domain}/assignment/participation/api/AssignmentParticipationQueryController.java (90%) create mode 100644 src/main/java/hello/cluebackend/domain/assignment/participation/application/SubmissionCommandService.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/participation/application/SubmissionQueryService.java rename src/main/java/hello/cluebackend/{ => domain}/assignment/participation/domain/Submission.java (81%) rename src/main/java/hello/cluebackend/{ => domain}/assignment/participation/domain/SubmissionAttachment/SubmissionAttachment.java (73%) rename src/main/java/hello/cluebackend/{ => domain}/assignment/participation/domain/SubmissionAttachment/SubmissionDocument.java (82%) rename src/main/java/hello/cluebackend/{ => domain}/assignment/participation/domain/SubmissionAttachment/SubmissionLink.java (67%) create mode 100644 src/main/java/hello/cluebackend/domain/assignment/participation/persistence/SubmissionAttachmentRepository.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/participation/persistence/SubmissionRepository.java diff --git a/src/main/generated/hello/cluebackend/assignment/management/domain/AssignmentAttachment/QAssignmentAttachment.java b/src/main/generated/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/QAssignmentAttachment.java similarity index 84% rename from src/main/generated/hello/cluebackend/assignment/management/domain/AssignmentAttachment/QAssignmentAttachment.java rename to src/main/generated/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/QAssignmentAttachment.java index 5102bd61..659ac41e 100644 --- a/src/main/generated/hello/cluebackend/assignment/management/domain/AssignmentAttachment/QAssignmentAttachment.java +++ b/src/main/generated/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/QAssignmentAttachment.java @@ -1,4 +1,4 @@ -package hello.cluebackend.assignment.management.domain.AssignmentAttachment; +package hello.cluebackend.domain.assignment.management.domain.AssignmentAttachment; import static com.querydsl.core.types.PathMetadataFactory.*; @@ -16,13 +16,13 @@ @Generated("com.querydsl.codegen.DefaultEntitySerializer") public class QAssignmentAttachment extends EntityPathBase { - private static final long serialVersionUID = -1218380451L; + private static final long serialVersionUID = 886859401L; private static final PathInits INITS = PathInits.DIRECT2; public static final QAssignmentAttachment assignmentAttachment = new QAssignmentAttachment("assignmentAttachment"); - public final hello.cluebackend.assignment.management.domain.QAssignment assignment; + public final hello.cluebackend.domain.assignment.management.domain.QAssignment assignment; public final NumberPath assignmentAttachmentId = createNumber("assignmentAttachmentId", Long.class); @@ -48,7 +48,7 @@ public QAssignmentAttachment(PathMetadata metadata, PathInits inits) { public QAssignmentAttachment(Class type, PathMetadata metadata, PathInits inits) { super(type, metadata, inits); - this.assignment = inits.isInitialized("assignment") ? new hello.cluebackend.assignment.management.domain.QAssignment(forProperty("assignment"), inits.get("assignment")) : null; + this.assignment = inits.isInitialized("assignment") ? new hello.cluebackend.domain.assignment.management.domain.QAssignment(forProperty("assignment"), inits.get("assignment")) : null; this.user = inits.isInitialized("user") ? new hello.cluebackend.domain.user.domain.QUserEntity(forProperty("user")) : null; } diff --git a/src/main/generated/hello/cluebackend/assignment/management/domain/AssignmentAttachment/QAttachmentDocument.java b/src/main/generated/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/QAttachmentDocument.java similarity index 90% rename from src/main/generated/hello/cluebackend/assignment/management/domain/AssignmentAttachment/QAttachmentDocument.java rename to src/main/generated/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/QAttachmentDocument.java index f75f4314..bdaf6f0a 100644 --- a/src/main/generated/hello/cluebackend/assignment/management/domain/AssignmentAttachment/QAttachmentDocument.java +++ b/src/main/generated/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/QAttachmentDocument.java @@ -1,4 +1,4 @@ -package hello.cluebackend.assignment.management.domain.AssignmentAttachment; +package hello.cluebackend.domain.assignment.management.domain.AssignmentAttachment; import static com.querydsl.core.types.PathMetadataFactory.*; @@ -16,7 +16,7 @@ @Generated("com.querydsl.codegen.DefaultEntitySerializer") public class QAttachmentDocument extends EntityPathBase { - private static final long serialVersionUID = -2058528725L; + private static final long serialVersionUID = -358015913L; private static final PathInits INITS = PathInits.DIRECT2; @@ -25,7 +25,7 @@ public class QAttachmentDocument extends EntityPathBase { public final QAssignmentAttachment _super; // inherited - public final hello.cluebackend.assignment.management.domain.QAssignment assignment; + public final hello.cluebackend.domain.assignment.management.domain.QAssignment assignment; //inherited public final NumberPath assignmentAttachmentId; diff --git a/src/main/generated/hello/cluebackend/assignment/management/domain/AssignmentAttachment/QAttachmentLink.java b/src/main/generated/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/QAttachmentLink.java similarity index 89% rename from src/main/generated/hello/cluebackend/assignment/management/domain/AssignmentAttachment/QAttachmentLink.java rename to src/main/generated/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/QAttachmentLink.java index a4317906..f004cc95 100644 --- a/src/main/generated/hello/cluebackend/assignment/management/domain/AssignmentAttachment/QAttachmentLink.java +++ b/src/main/generated/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/QAttachmentLink.java @@ -1,4 +1,4 @@ -package hello.cluebackend.assignment.management.domain.AssignmentAttachment; +package hello.cluebackend.domain.assignment.management.domain.AssignmentAttachment; import static com.querydsl.core.types.PathMetadataFactory.*; @@ -16,7 +16,7 @@ @Generated("com.querydsl.codegen.DefaultEntitySerializer") public class QAttachmentLink extends EntityPathBase { - private static final long serialVersionUID = -1725874422L; + private static final long serialVersionUID = 217970998L; private static final PathInits INITS = PathInits.DIRECT2; @@ -25,7 +25,7 @@ public class QAttachmentLink extends EntityPathBase { public final QAssignmentAttachment _super; // inherited - public final hello.cluebackend.assignment.management.domain.QAssignment assignment; + public final hello.cluebackend.domain.assignment.management.domain.QAssignment assignment; //inherited public final NumberPath assignmentAttachmentId; diff --git a/src/main/generated/hello/cluebackend/assignment/management/domain/QAssignment.java b/src/main/generated/hello/cluebackend/domain/assignment/management/domain/QAssignment.java similarity index 94% rename from src/main/generated/hello/cluebackend/assignment/management/domain/QAssignment.java rename to src/main/generated/hello/cluebackend/domain/assignment/management/domain/QAssignment.java index 780431d1..866a537f 100644 --- a/src/main/generated/hello/cluebackend/assignment/management/domain/QAssignment.java +++ b/src/main/generated/hello/cluebackend/domain/assignment/management/domain/QAssignment.java @@ -1,4 +1,4 @@ -package hello.cluebackend.assignment.management.domain; +package hello.cluebackend.domain.assignment.management.domain; import static com.querydsl.core.types.PathMetadataFactory.*; @@ -16,7 +16,7 @@ @Generated("com.querydsl.codegen.DefaultEntitySerializer") public class QAssignment extends EntityPathBase { - private static final long serialVersionUID = -204103010L; + private static final long serialVersionUID = 506310386L; private static final PathInits INITS = PathInits.DIRECT2; diff --git a/src/main/generated/hello/cluebackend/assignment/participation/domain/QSubmission.java b/src/main/generated/hello/cluebackend/domain/assignment/participation/domain/QSubmission.java similarity index 83% rename from src/main/generated/hello/cluebackend/assignment/participation/domain/QSubmission.java rename to src/main/generated/hello/cluebackend/domain/assignment/participation/domain/QSubmission.java index 855bdeab..d8986ff9 100644 --- a/src/main/generated/hello/cluebackend/assignment/participation/domain/QSubmission.java +++ b/src/main/generated/hello/cluebackend/domain/assignment/participation/domain/QSubmission.java @@ -1,4 +1,4 @@ -package hello.cluebackend.assignment.participation.domain; +package hello.cluebackend.domain.assignment.participation.domain; import static com.querydsl.core.types.PathMetadataFactory.*; @@ -16,13 +16,13 @@ @Generated("com.querydsl.codegen.DefaultEntitySerializer") public class QSubmission extends EntityPathBase { - private static final long serialVersionUID = 1273442551L; + private static final long serialVersionUID = -399911901L; private static final PathInits INITS = PathInits.DIRECT2; public static final QSubmission submission = new QSubmission("submission"); - public final hello.cluebackend.assignment.management.domain.QAssignment assignment; + public final hello.cluebackend.domain.assignment.management.domain.QAssignment assignment; public final BooleanPath isSubmitted = createBoolean("isSubmitted"); @@ -50,7 +50,7 @@ public QSubmission(PathMetadata metadata, PathInits inits) { public QSubmission(Class type, PathMetadata metadata, PathInits inits) { super(type, metadata, inits); - this.assignment = inits.isInitialized("assignment") ? new hello.cluebackend.assignment.management.domain.QAssignment(forProperty("assignment"), inits.get("assignment")) : null; + this.assignment = inits.isInitialized("assignment") ? new hello.cluebackend.domain.assignment.management.domain.QAssignment(forProperty("assignment"), inits.get("assignment")) : null; this.user = inits.isInitialized("user") ? new hello.cluebackend.domain.user.domain.QUserEntity(forProperty("user")) : null; } diff --git a/src/main/generated/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/QSubmissionAttachment.java b/src/main/generated/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/QSubmissionAttachment.java similarity index 76% rename from src/main/generated/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/QSubmissionAttachment.java rename to src/main/generated/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/QSubmissionAttachment.java index aa28445d..3713eef0 100644 --- a/src/main/generated/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/QSubmissionAttachment.java +++ b/src/main/generated/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/QSubmissionAttachment.java @@ -1,4 +1,4 @@ -package hello.cluebackend.assignment.participation.domain.SubmissionAttachment; +package hello.cluebackend.domain.assignment.participation.domain.SubmissionAttachment; import static com.querydsl.core.types.PathMetadataFactory.*; @@ -16,15 +16,15 @@ @Generated("com.querydsl.codegen.DefaultEntitySerializer") public class QSubmissionAttachment extends EntityPathBase { - private static final long serialVersionUID = -418232925L; + private static final long serialVersionUID = 1669741815L; private static final PathInits INITS = PathInits.DIRECT2; public static final QSubmissionAttachment submissionAttachment = new QSubmissionAttachment("submissionAttachment"); - public final hello.cluebackend.assignment.management.domain.QAssignment assignment; + public final hello.cluebackend.domain.assignment.management.domain.QAssignment assignment; - public final hello.cluebackend.assignment.participation.domain.QSubmission submission; + public final hello.cluebackend.domain.assignment.participation.domain.QSubmission submission; public final NumberPath SubmissionAttachmentId = createNumber("SubmissionAttachmentId", Long.class); @@ -50,8 +50,8 @@ public QSubmissionAttachment(PathMetadata metadata, PathInits inits) { public QSubmissionAttachment(Class type, PathMetadata metadata, PathInits inits) { super(type, metadata, inits); - this.assignment = inits.isInitialized("assignment") ? new hello.cluebackend.assignment.management.domain.QAssignment(forProperty("assignment"), inits.get("assignment")) : null; - this.submission = inits.isInitialized("submission") ? new hello.cluebackend.assignment.participation.domain.QSubmission(forProperty("submission"), inits.get("submission")) : null; + this.assignment = inits.isInitialized("assignment") ? new hello.cluebackend.domain.assignment.management.domain.QAssignment(forProperty("assignment"), inits.get("assignment")) : null; + this.submission = inits.isInitialized("submission") ? new hello.cluebackend.domain.assignment.participation.domain.QSubmission(forProperty("submission"), inits.get("submission")) : null; this.user = inits.isInitialized("user") ? new hello.cluebackend.domain.user.domain.QUserEntity(forProperty("user")) : null; } diff --git a/src/main/generated/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/QSubmissionDocument.java b/src/main/generated/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/QSubmissionDocument.java similarity index 87% rename from src/main/generated/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/QSubmissionDocument.java rename to src/main/generated/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/QSubmissionDocument.java index b7c0e16c..1ffde5d3 100644 --- a/src/main/generated/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/QSubmissionDocument.java +++ b/src/main/generated/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/QSubmissionDocument.java @@ -1,4 +1,4 @@ -package hello.cluebackend.assignment.participation.domain.SubmissionAttachment; +package hello.cluebackend.domain.assignment.participation.domain.SubmissionAttachment; import static com.querydsl.core.types.PathMetadataFactory.*; @@ -16,7 +16,7 @@ @Generated("com.querydsl.codegen.DefaultEntitySerializer") public class QSubmissionDocument extends EntityPathBase { - private static final long serialVersionUID = -1706500709L; + private static final long serialVersionUID = -868574737L; private static final PathInits INITS = PathInits.DIRECT2; @@ -25,7 +25,7 @@ public class QSubmissionDocument extends EntityPathBase { public final QSubmissionAttachment _super; // inherited - public final hello.cluebackend.assignment.management.domain.QAssignment assignment; + public final hello.cluebackend.domain.assignment.management.domain.QAssignment assignment; public final StringPath filePath = createString("filePath"); @@ -36,7 +36,7 @@ public class QSubmissionDocument extends EntityPathBase { public final StringPath storedFileName = createString("storedFileName"); // inherited - public final hello.cluebackend.assignment.participation.domain.QSubmission submission; + public final hello.cluebackend.domain.assignment.participation.domain.QSubmission submission; //inherited public final NumberPath SubmissionAttachmentId; diff --git a/src/main/generated/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/QSubmissionLink.java b/src/main/generated/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/QSubmissionLink.java similarity index 85% rename from src/main/generated/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/QSubmissionLink.java rename to src/main/generated/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/QSubmissionLink.java index f3de8771..c9c5e776 100644 --- a/src/main/generated/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/QSubmissionLink.java +++ b/src/main/generated/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/QSubmissionLink.java @@ -1,4 +1,4 @@ -package hello.cluebackend.assignment.participation.domain.SubmissionAttachment; +package hello.cluebackend.domain.assignment.participation.domain.SubmissionAttachment; import static com.querydsl.core.types.PathMetadataFactory.*; @@ -16,7 +16,7 @@ @Generated("com.querydsl.codegen.DefaultEntitySerializer") public class QSubmissionLink extends EntityPathBase { - private static final long serialVersionUID = -1810301830L; + private static final long serialVersionUID = -1755446578L; private static final PathInits INITS = PathInits.DIRECT2; @@ -25,10 +25,10 @@ public class QSubmissionLink extends EntityPathBase { public final QSubmissionAttachment _super; // inherited - public final hello.cluebackend.assignment.management.domain.QAssignment assignment; + public final hello.cluebackend.domain.assignment.management.domain.QAssignment assignment; // inherited - public final hello.cluebackend.assignment.participation.domain.QSubmission submission; + public final hello.cluebackend.domain.assignment.participation.domain.QSubmission submission; //inherited public final NumberPath SubmissionAttachmentId; diff --git a/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementCommandController.java b/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementCommandController.java deleted file mode 100644 index 4f7f288a..00000000 --- a/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementCommandController.java +++ /dev/null @@ -1,102 +0,0 @@ -package hello.cluebackend.assignment.management.api; - -import hello.cluebackend.assignment.management.api.dto.response.*; -import hello.cluebackend.assignment.management.application.AssignmentCommandService; -import hello.cluebackend.assignment.management.domain.Assignment; -import hello.cluebackend.domain.user.domain.UserEntity; -import hello.cluebackend.domain.user.domain.repository.UserRepository; -import hello.cluebackend.global.config.JWTUtil; -import io.jsonwebtoken.JwtException; -import jakarta.servlet.http.HttpServletRequest; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -@RestController -@RequestMapping("/api/assignment/teacher") -@RequiredArgsConstructor -@Slf4j -public class AssignmentManagementCommandController { - private final JWTUtil jwtUtil; - private final AssignmentCommandService assignmentCommandService; - private final UserRepository userRepository; - - // TODO : 메인 페이지 제작한 과제 전체 조회(T) - @GetMapping("/getAllAssignments/my") - public ResponseEntity getAllAssignments(HttpServletRequest request) { - try { - String token = jwtUtil.getToken(request); - Long userId = jwtUtil.getUserId(token); - - UserEntity user = userRepository.findById(userId).orElseThrow(() -> new UsernameNotFoundException("User not found.")); - List assignments = assignmentCommandService.findAllAssignment(user); - - return ResponseEntity.ok(new AssignmentResult(assignments)); - } catch (Exception e) { - log.error("Failed to retrieve assignments for user", e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - } - } - - // TODO : 학습실 과제 전체 조회, 학습실 - 과제(T) - @GetMapping("/getAllAssignments/{classId}") - public ResponseEntity getAllClassroomAssignment(HttpServletRequest request, @PathVariable Long classId) { - try{ - String token = jwtUtil.getToken(request); - Long userId = jwtUtil.getUserId(token); - - List result = assignmentCommandService.findAllClassroomAssignment(classId); - - return ResponseEntity.ok(new AssignmentResult(result)); - }catch(JwtException | UsernameNotFoundException e){ - return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); - }catch (Exception e){ - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - } - } - - // TODO : 특정 과제 학생 제출 여부 전체 조회, 학습실 - 과제 - 확인(T) - @GetMapping("/checkAssignment/{assignmentId}") - public ResponseEntity getAllSubmissionCheck(HttpServletRequest request, @PathVariable Long assignmentId) { - try { - String token = jwtUtil.getToken(request); - Long userId = jwtUtil.getUserId(token); - - Assignment assignment = assignmentCommandService.findById(assignmentId); - - List result = assignmentCommandService.checkIsSubmitted(assignment); - - return ResponseEntity.ok(new AssignmentResult(result)); - }catch (JwtException | UsernameNotFoundException e){ - return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); - }catch (Exception e){ - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - } - } - - // TODO : 개인 제출 과제 보기, 학습실 - 과제 - 채점(T) -// @GetMapping("/getAssignment/{submissionId}") -// public ResponseEntity getSubmission(HttpServletRequest request, @PathVariable Long submissionId) { -// try { -// String token = jwtUtil.getToken(request); -// Long userId = jwtUtil.getUserId(token); -// -// Submission submission = submissionCommandService.findById(submissionId); -// GetSubmissionFile result = submissionCommandService.getSubmissionGrade(submission); -// -// return ResponseEntity.ok(new GetSubmissionResult(result)); -// }catch (JwtException | UsernameNotFoundException e){ -// return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); -// }catch (Exception e){ -// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); -// } -// } -} diff --git a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/AssignmentResult.java b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/AssignmentResult.java deleted file mode 100644 index 7e3287f5..00000000 --- a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/AssignmentResult.java +++ /dev/null @@ -1,10 +0,0 @@ -package hello.cluebackend.assignment.management.api.dto.response; - -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class AssignmentResult { - private T assignments; -} diff --git a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/Attachment.java b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/Attachment.java deleted file mode 100644 index 1f87b037..00000000 --- a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/Attachment.java +++ /dev/null @@ -1,4 +0,0 @@ -package hello.cluebackend.assignment.management.api.dto.response; - -public class Attachment { -} diff --git a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponse.java b/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponse.java deleted file mode 100644 index b6a87266..00000000 --- a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponse.java +++ /dev/null @@ -1,16 +0,0 @@ -package hello.cluebackend.assignment.management.api.dto.response; - -import lombok.AllArgsConstructor; -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -@AllArgsConstructor -public class GetAllClassRoomAssignmentResponse { - private Long assignmentId; - private boolean allSubmit; - private String title; - private LocalDateTime startDate; - private LocalDateTime endDate; -} diff --git a/src/main/java/hello/cluebackend/assignment/management/application/AssignmentCommandService.java b/src/main/java/hello/cluebackend/assignment/management/application/AssignmentCommandService.java deleted file mode 100644 index 3853f5a7..00000000 --- a/src/main/java/hello/cluebackend/assignment/management/application/AssignmentCommandService.java +++ /dev/null @@ -1,60 +0,0 @@ -package hello.cluebackend.assignment.management.application; - -import hello.cluebackend.assignment.management.api.dto.response.GetAllAssignmentResponse; -import hello.cluebackend.assignment.management.api.dto.response.GetAllClassRoomAssignmentResponse; -import hello.cluebackend.assignment.management.api.dto.response.GetAllSubmissionCheck; -import hello.cluebackend.assignment.management.domain.Assignment; -import hello.cluebackend.assignment.management.persistence.AssignmentRepository; -import hello.cluebackend.assignment.participation.domain.Submission; -import hello.cluebackend.assignment.participation.persistence.SubmissionRepository; -import hello.cluebackend.domain.classroom.domain.ClassRoom; -import hello.cluebackend.domain.classroom.domain.repository.ClassRoomRepository; -import hello.cluebackend.domain.classroom.service.ClassRoomService; -import hello.cluebackend.domain.user.domain.UserEntity; -import jakarta.persistence.EntityNotFoundException; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -@Service -@RequiredArgsConstructor -@Transactional(readOnly = true) -public class AssignmentCommandService{ - private final AssignmentRepository assignmentRepository; - private final ClassRoomService classRoomService; - private final ClassRoomRepository classRoomRepository; - private final SubmissionRepository submissionRepository; - - // 해당 사용자가 속한 모든 과제 출력 (단, 마감이 된 과제는 반환하지 않는다.) - public List findAllAssignment(UserEntity user) { - List assignments = assignmentRepository.getAllByUser(user); - return assignments.stream() - .map(a -> new GetAllAssignmentResponse(a.getAssignmentId(), a.getTitle(), a.getStartDate(), a.getEndDate())) - .toList(); - } - - // 해당 교실에 속한 모든 과제 출력( 마감이 된 과제도 반환한다.) - public List findAllClassroomAssignment(Long classId) { - ClassRoom classRoom = classRoomRepository.findByClassRoomId(classId); // 나중에 Service 코드로 바꿔야 함. - List assignments = assignmentRepository.getAllClassroomAssignmentByUser(classRoom); - List result = assignments.stream() - .map(a -> new GetAllClassRoomAssignmentResponse(a.getAssignmentId(), false, a.getTitle(), a.getStartDate(), a.getEndDate())) // 모든 학생 제출 여부 코드 만들어야 함! - .toList(); - return result; - } - - // - public List checkIsSubmitted(Assignment assignment) { - List result = submissionRepository.findByAssignment(assignment); - return result.stream() - .map(a -> new GetAllSubmissionCheck(a.getSubmissionId(),a.getUser().getUserId(),a.getUser().getUsername(),a.getUser().getClassCode(),a.getIsSubmitted(),a.getSubmittedAt(),a.getAssignment().getEndDate())) - .toList(); - } - - public Assignment findById(Long assignmentId) { - return assignmentRepository.findById(assignmentId) - .orElseThrow(() -> new EntityNotFoundException("Entity not found : " + assignmentId)); - } -} diff --git a/src/main/java/hello/cluebackend/assignment/management/persistence/CustomAssignmentAttachmentRepository.java b/src/main/java/hello/cluebackend/assignment/management/persistence/CustomAssignmentAttachmentRepository.java deleted file mode 100644 index 11783e5d..00000000 --- a/src/main/java/hello/cluebackend/assignment/management/persistence/CustomAssignmentAttachmentRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package hello.cluebackend.assignment.management.persistence; - -import org.springframework.stereotype.Repository; - -@Repository -public interface CustomAssignmentAttachmentRepository { -} diff --git a/src/main/java/hello/cluebackend/assignment/participation/application/SubmissionCommandService.java b/src/main/java/hello/cluebackend/assignment/participation/application/SubmissionCommandService.java deleted file mode 100644 index 28132e39..00000000 --- a/src/main/java/hello/cluebackend/assignment/participation/application/SubmissionCommandService.java +++ /dev/null @@ -1,19 +0,0 @@ -package hello.cluebackend.assignment.participation.application; - -import hello.cluebackend.assignment.management.api.dto.response.GetSubmissionFile; -import hello.cluebackend.assignment.participation.domain.Submission; -import hello.cluebackend.assignment.participation.persistence.SubmissionRepository; -import jakarta.persistence.EntityNotFoundException; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class SubmissionCommandService { - private final SubmissionRepository submissionRepository; - - public Submission findById(Long submissionId) { - return submissionRepository.findById(submissionId) - .orElseThrow(() -> new EntityNotFoundException("Submission not found : " + submissionId)); - } -} diff --git a/src/main/java/hello/cluebackend/assignment/participation/application/SubmissionQueryService.java b/src/main/java/hello/cluebackend/assignment/participation/application/SubmissionQueryService.java deleted file mode 100644 index 2e482fa2..00000000 --- a/src/main/java/hello/cluebackend/assignment/participation/application/SubmissionQueryService.java +++ /dev/null @@ -1,4 +0,0 @@ -package hello.cluebackend.assignment.participation.application; - -public class SubmissionQueryService { -} diff --git a/src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionAttachmentRepository.java b/src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionAttachmentRepository.java deleted file mode 100644 index f74e383f..00000000 --- a/src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionAttachmentRepository.java +++ /dev/null @@ -1,17 +0,0 @@ -package hello.cluebackend.assignment.participation.persistence; - -import hello.cluebackend.assignment.management.api.dto.response.GetSubmissionFile; -import hello.cluebackend.assignment.participation.domain.Submission; -import hello.cluebackend.assignment.participation.domain.SubmissionAttachment.SubmissionAttachment; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public interface SubmissionAttachmentRepository extends JpaRepository { - - List findBySubmissionWithAttachments(@Param("submission")Submission submission); -} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionRepository.java b/src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionRepository.java deleted file mode 100644 index c72045a8..00000000 --- a/src/main/java/hello/cluebackend/assignment/participation/persistence/SubmissionRepository.java +++ /dev/null @@ -1,17 +0,0 @@ -package hello.cluebackend.assignment.participation.persistence; - -import hello.cluebackend.assignment.management.domain.Assignment; -import hello.cluebackend.assignment.participation.domain.Submission; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public interface SubmissionRepository extends JpaRepository { - @Query("select s from Submission s" + - " where s.assignment =:assignment") - List findByAssignment(@Param("assignment") Assignment assignment); -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/management/api/AssignmentManagementCommandController.java b/src/main/java/hello/cluebackend/domain/assignment/management/api/AssignmentManagementCommandController.java new file mode 100644 index 00000000..e864236a --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/management/api/AssignmentManagementCommandController.java @@ -0,0 +1,83 @@ +package hello.cluebackend.domain.assignment.management.api; + +import hello.cluebackend.domain.assignment.management.api.dto.response.GetAllAssignmentResponse; +import hello.cluebackend.domain.assignment.management.api.dto.response.GetAllAssignmentResponseResult; +import hello.cluebackend.domain.assignment.management.application.AssignmentCommandService; +import hello.cluebackend.domain.assignment.participation.application.SubmissionCommandService; +import hello.cluebackend.domain.user.domain.repository.UserRepository; +import hello.cluebackend.global.config.JWTUtil; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/api/assignment") +@RequiredArgsConstructor +@Slf4j +public class AssignmentManagementCommandController { + private final JWTUtil jwtUtil; + private final AssignmentCommandService assignmentCommandService; + private final UserRepository userRepository; + private final SubmissionCommandService submissionCommandService; + + // 사용자가 속한 모든 수업 과제 조회 + @GetMapping("/assignments/me") + public ResponseEntity getAllAssignments(HttpServletRequest request) { + String token = jwtUtil.getToken(request); + Long userId = jwtUtil.getUserId(token); + List result = assignmentCommandService.findAllAssignment(userId); + return ResponseEntity.ok(new GetAllAssignmentResponseResult(result)); + } + + // +// @GetMapping("/getAllAssignments/{classId}") +// public ResponseEntity getAllClassroomAssignment(HttpServletRequest request, @PathVariable Long classId) { +// try{ +// String token = jwtUtil.getToken(request); +// Long userId = jwtUtil.getUserId(token); +// return ResponseEntity.ok(new GetAllClassRoomAssignmentResponseResult(assignmentCommandService.findAllClassroomAssignment(classId))); +// }catch (Exception e){ +// log.error("Failed to retrieve assignments in classroom for user", e); +// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); +// } +// } + + // TODO : 특정 과제 학생 제출 여부 전체 조회, 학습실 - 과제 - 확인(T) +// @GetMapping("/checkAssignment/{assignmentId}") +// public ResponseEntity getAllSubmissionCheck(HttpServletRequest request, @PathVariable Long assignmentId) { +// try { +// String token = jwtUtil.getToken(request); +// Long userId = jwtUtil.getUserId(token); +// +// Assignment assignment = assignmentCommandService.findById(assignmentId); +// return ResponseEntity.ok(new GetAllSubmissionCheckResult(assignmentCommandService.checkIsSubmitted(assignment);)); +// }catch (Exception e){ +// log.error("Failed to retrieve assignments in classroom for user", e); +// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); +// } +// } + + // TODO : 개인 제출 과제 보기, 학습실 - 과제 - 채점(T) +// @GetMapping("/getAssignment/{submissionId}") +// public ResponseEntity getSubmission(HttpServletRequest request, @PathVariable Long submissionId) { +// try { +// String token = jwtUtil.getToken(request); +// Long userId = jwtUtil.getUserId(token); +// +// Submission submission = submissionCommandService.findById(submissionId); +// GetSubmissionFile result = submissionCommandService.getSubmissionGrade(submission); +// +// return ResponseEntity.ok(new GetSubmissionResult(result)); +// }catch (Exception e){ +// log.error("Failed to retrieve assignments in classroom for user", e); +// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); +// } +// } +} diff --git a/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementQueryController.java b/src/main/java/hello/cluebackend/domain/assignment/management/api/AssignmentManagementQueryController.java similarity index 92% rename from src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementQueryController.java rename to src/main/java/hello/cluebackend/domain/assignment/management/api/AssignmentManagementQueryController.java index b59619d6..38422431 100644 --- a/src/main/java/hello/cluebackend/assignment/management/api/AssignmentManagementQueryController.java +++ b/src/main/java/hello/cluebackend/domain/assignment/management/api/AssignmentManagementQueryController.java @@ -1,4 +1,4 @@ -package hello.cluebackend.assignment.management.api; +package hello.cluebackend.domain.assignment.management.api; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllAssignmentResponse.java b/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllAssignmentResponse.java similarity index 82% rename from src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllAssignmentResponse.java rename to src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllAssignmentResponse.java index d173d394..2930e691 100644 --- a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllAssignmentResponse.java +++ b/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllAssignmentResponse.java @@ -1,4 +1,4 @@ -package hello.cluebackend.assignment.management.api.dto.response; +package hello.cluebackend.domain.assignment.management.api.dto.response; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllAssignmentResponseResult.java b/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllAssignmentResponseResult.java new file mode 100644 index 00000000..0c364cfb --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllAssignmentResponseResult.java @@ -0,0 +1,10 @@ +package hello.cluebackend.domain.assignment.management.api.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class GetAllAssignmentResponseResult { + private T assignments; +} diff --git a/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponse.java b/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponse.java new file mode 100644 index 00000000..066ce75d --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponse.java @@ -0,0 +1,22 @@ +package hello.cluebackend.domain.assignment.management.api.dto.response; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class GetAllClassRoomAssignmentResponse { + private Long assignmentId; + private boolean allSubmitted; + private String title; + private LocalDateTime startDate; + private LocalDateTime endDate; + + public GetAllClassRoomAssignmentResponse(Long assignmentId, String title, LocalDateTime startDate, LocalDateTime endDate){ + this.assignmentId = assignmentId; + this.title = title; + this.startDate = startDate; + this.endDate = endDate; +// this.allSubmitted = //새로운 sql 호출 + } +} diff --git a/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponseResult.java b/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponseResult.java new file mode 100644 index 00000000..800c9a9e --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponseResult.java @@ -0,0 +1,10 @@ +package hello.cluebackend.domain.assignment.management.api.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class GetAllClassRoomAssignmentResponseResult { + private T assignments; +} diff --git a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllSubmissionCheck.java b/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllSubmissionCheck.java similarity index 83% rename from src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllSubmissionCheck.java rename to src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllSubmissionCheck.java index eb028825..8519d2bd 100644 --- a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetAllSubmissionCheck.java +++ b/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllSubmissionCheck.java @@ -1,4 +1,4 @@ -package hello.cluebackend.assignment.management.api.dto.response; +package hello.cluebackend.domain.assignment.management.api.dto.response; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllSubmissionCheckResult.java b/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllSubmissionCheckResult.java new file mode 100644 index 00000000..789fef02 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllSubmissionCheckResult.java @@ -0,0 +1,5 @@ +package hello.cluebackend.domain.assignment.management.api.dto.response; + +public class GetAllSubmissionCheckResult { + private T assignments; +} diff --git a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetSubmissionFile.java b/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetSubmissionFile.java similarity index 74% rename from src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetSubmissionFile.java rename to src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetSubmissionFile.java index 44c8fa5f..a7c89a9b 100644 --- a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetSubmissionFile.java +++ b/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetSubmissionFile.java @@ -1,4 +1,4 @@ -package hello.cluebackend.assignment.management.api.dto.response; +package hello.cluebackend.domain.assignment.management.api.dto.response; public class GetSubmissionFile { private Long SubmissionAttachmentId; diff --git a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetSubmissionResult.java b/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetSubmissionResult.java similarity index 68% rename from src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetSubmissionResult.java rename to src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetSubmissionResult.java index 0a4990df..8212eade 100644 --- a/src/main/java/hello/cluebackend/assignment/management/api/dto/response/GetSubmissionResult.java +++ b/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetSubmissionResult.java @@ -1,4 +1,4 @@ -package hello.cluebackend.assignment.management.api.dto.response; +package hello.cluebackend.domain.assignment.management.api.dto.response; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/src/main/java/hello/cluebackend/domain/assignment/management/application/AssignmentCommandService.java b/src/main/java/hello/cluebackend/domain/assignment/management/application/AssignmentCommandService.java new file mode 100644 index 00000000..25641315 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/management/application/AssignmentCommandService.java @@ -0,0 +1,56 @@ +package hello.cluebackend.domain.assignment.management.application; + +import hello.cluebackend.domain.assignment.management.api.dto.response.GetAllAssignmentResponse; +import hello.cluebackend.domain.assignment.management.api.dto.response.GetAllClassRoomAssignmentResponse; +import hello.cluebackend.domain.assignment.management.domain.Assignment; +import hello.cluebackend.domain.assignment.management.persistence.AssignmentRepository; +import hello.cluebackend.domain.assignment.participation.persistence.SubmissionRepository; +import hello.cluebackend.domain.classroom.domain.ClassRoom; +import hello.cluebackend.domain.classroom.domain.repository.ClassRoomRepository; +import hello.cluebackend.domain.classroom.service.ClassRoomService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class AssignmentCommandService{ + private final AssignmentRepository assignmentRepository; + private final ClassRoomService classRoomService; + private final ClassRoomRepository classRoomRepository; + private final SubmissionRepository submissionRepository; + + // 사용자가 속한 모든 수업 과제 조회 + public List findAllAssignment(Long userId) { + List assignments = assignmentRepository.getAllByUser(userId); + return assignments.stream() + .map(a -> new GetAllAssignmentResponse(a.getAssignmentId(), a.getTitle(), a.getStartDate(), a.getEndDate())) + .toList(); + } + + // 해당 교실에 속한 모든 과제 출력( 마감이 된 과제도 반환한다.) + public List findAllClassroomAssignment(Long classId) { + ClassRoom classRoom = classRoomRepository.findByClassRoomId(classId); // 나중에 Service 코드로 바꿔야 함. + List assignments = assignmentRepository.getAllClassroomAssignmentByUser(classRoom); + List result = assignments.stream() + .map(a -> new GetAllClassRoomAssignmentResponse(a.getAssignmentId(), a.getTitle(), a.getStartDate(), a.getEndDate())) // 모든 학생 제출 여부 코드 만들어야 함! + .toList(); + return result; + } + + +// public List checkIsSubmitted(Assignment assignment) { +// List result = submissionRepository.findByAssignment(assignment); +// return result.stream() +// .map(a -> new GetAllSubmissionCheck(a.getSubmissionId(),a.getUser().getUserId(),a.getUser().getUsername(),a.getUser().getClassCode(),a.getIsSubmitted(),a.getSubmittedAt(),a.getAssignment().getEndDate())) +// .toList(); +// } + +// public Assignment findById(Long assignmentId) { +// return assignmentRepository.findById(assignmentId) +// .orElseThrow(() -> new EntityNotFoundException("Entity not found : " + assignmentId)); +// } +} diff --git a/src/main/java/hello/cluebackend/assignment/management/application/AssignmentQueryService.java b/src/main/java/hello/cluebackend/domain/assignment/management/application/AssignmentQueryService.java similarity index 81% rename from src/main/java/hello/cluebackend/assignment/management/application/AssignmentQueryService.java rename to src/main/java/hello/cluebackend/domain/assignment/management/application/AssignmentQueryService.java index ca288afe..ffdace78 100644 --- a/src/main/java/hello/cluebackend/assignment/management/application/AssignmentQueryService.java +++ b/src/main/java/hello/cluebackend/domain/assignment/management/application/AssignmentQueryService.java @@ -1,4 +1,4 @@ -package hello.cluebackend.assignment.management.application; +package hello.cluebackend.domain.assignment.management.application; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/hello/cluebackend/assignment/management/domain/Assignment.java b/src/main/java/hello/cluebackend/domain/assignment/management/domain/Assignment.java similarity index 90% rename from src/main/java/hello/cluebackend/assignment/management/domain/Assignment.java rename to src/main/java/hello/cluebackend/domain/assignment/management/domain/Assignment.java index e9080104..a4ac9ad3 100644 --- a/src/main/java/hello/cluebackend/assignment/management/domain/Assignment.java +++ b/src/main/java/hello/cluebackend/domain/assignment/management/domain/Assignment.java @@ -1,4 +1,4 @@ -package hello.cluebackend.assignment.management.domain; +package hello.cluebackend.domain.assignment.management.domain; import hello.cluebackend.domain.classroom.domain.ClassRoom; import hello.cluebackend.domain.user.domain.UserEntity; @@ -8,7 +8,7 @@ import java.time.LocalDateTime; @Entity -@Table(name = "Assignment") +@Table(name = "assignment") @Getter @Setter @Builder @AllArgsConstructor diff --git a/src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AssignmentAttachment.java b/src/main/java/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/AssignmentAttachment.java similarity index 75% rename from src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AssignmentAttachment.java rename to src/main/java/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/AssignmentAttachment.java index 7c5290df..d88c8224 100644 --- a/src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AssignmentAttachment.java +++ b/src/main/java/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/AssignmentAttachment.java @@ -1,14 +1,11 @@ -package hello.cluebackend.assignment.management.domain.AssignmentAttachment; +package hello.cluebackend.domain.assignment.management.domain.AssignmentAttachment; -import com.fasterxml.jackson.annotation.JsonIgnore; -import hello.cluebackend.assignment.management.domain.Assignment; +import hello.cluebackend.domain.assignment.management.domain.Assignment; import hello.cluebackend.domain.user.domain.UserEntity; import jakarta.persistence.*; import lombok.*; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; @Entity @Table(name = "assignment_attachment") diff --git a/src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AttachmentDocument.java b/src/main/java/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/AttachmentDocument.java similarity index 88% rename from src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AttachmentDocument.java rename to src/main/java/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/AttachmentDocument.java index 250bb11d..cc4d4b91 100644 --- a/src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AttachmentDocument.java +++ b/src/main/java/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/AttachmentDocument.java @@ -1,4 +1,4 @@ -package hello.cluebackend.assignment.management.domain.AssignmentAttachment; +package hello.cluebackend.domain.assignment.management.domain.AssignmentAttachment; import jakarta.persistence.Column; import jakarta.persistence.DiscriminatorValue; diff --git a/src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AttachmentLink.java b/src/main/java/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/AttachmentLink.java similarity index 82% rename from src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AttachmentLink.java rename to src/main/java/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/AttachmentLink.java index 85894c8d..1e6be323 100644 --- a/src/main/java/hello/cluebackend/assignment/management/domain/AssignmentAttachment/AttachmentLink.java +++ b/src/main/java/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/AttachmentLink.java @@ -1,4 +1,4 @@ -package hello.cluebackend.assignment.management.domain.AssignmentAttachment; +package hello.cluebackend.domain.assignment.management.domain.AssignmentAttachment; import jakarta.persistence.Column; import jakarta.persistence.DiscriminatorValue; diff --git a/src/main/java/hello/cluebackend/assignment/management/persistence/AssignmentAttachmentRepository.java b/src/main/java/hello/cluebackend/domain/assignment/management/persistence/AssignmentAttachmentRepository.java similarity index 56% rename from src/main/java/hello/cluebackend/assignment/management/persistence/AssignmentAttachmentRepository.java rename to src/main/java/hello/cluebackend/domain/assignment/management/persistence/AssignmentAttachmentRepository.java index c9e9bec0..c280aa4b 100644 --- a/src/main/java/hello/cluebackend/assignment/management/persistence/AssignmentAttachmentRepository.java +++ b/src/main/java/hello/cluebackend/domain/assignment/management/persistence/AssignmentAttachmentRepository.java @@ -1,6 +1,6 @@ -package hello.cluebackend.assignment.management.persistence; +package hello.cluebackend.domain.assignment.management.persistence; -import hello.cluebackend.assignment.management.domain.AssignmentAttachment.AssignmentAttachment; +import hello.cluebackend.domain.assignment.management.domain.AssignmentAttachment.AssignmentAttachment; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/src/main/java/hello/cluebackend/assignment/management/persistence/AssignmentRepository.java b/src/main/java/hello/cluebackend/domain/assignment/management/persistence/AssignmentRepository.java similarity index 64% rename from src/main/java/hello/cluebackend/assignment/management/persistence/AssignmentRepository.java rename to src/main/java/hello/cluebackend/domain/assignment/management/persistence/AssignmentRepository.java index d6451b75..aa099d72 100644 --- a/src/main/java/hello/cluebackend/assignment/management/persistence/AssignmentRepository.java +++ b/src/main/java/hello/cluebackend/domain/assignment/management/persistence/AssignmentRepository.java @@ -1,6 +1,6 @@ -package hello.cluebackend.assignment.management.persistence; +package hello.cluebackend.domain.assignment.management.persistence; -import hello.cluebackend.assignment.management.domain.Assignment; +import hello.cluebackend.domain.assignment.management.domain.Assignment; import hello.cluebackend.domain.classroom.domain.ClassRoom; import hello.cluebackend.domain.user.domain.UserEntity; import org.springframework.data.jpa.repository.JpaRepository; @@ -12,10 +12,11 @@ @Repository public interface AssignmentRepository extends JpaRepository { - @Query("select a from Assignment a " + - "join ClassRoomUser cru ON a.classRoom = cru.classRoom " + - "WHERE cru.user =:user") - List getAllByUser(@Param("user") UserEntity user); + @Query("SELECT a FROM Submission s" + + " join fetch s.assignment a" + + " where s.user.userId =:userId" + + " AND s.isSubmitted = false") + List getAllByUser(@Param("userId") Long userId); @Query("select a from Assignment a " + "join fetch a.classRoom " + diff --git a/src/main/java/hello/cluebackend/assignment/participation/api/AssignmentParticipationCommandController.java b/src/main/java/hello/cluebackend/domain/assignment/participation/api/AssignmentParticipationCommandController.java similarity index 92% rename from src/main/java/hello/cluebackend/assignment/participation/api/AssignmentParticipationCommandController.java rename to src/main/java/hello/cluebackend/domain/assignment/participation/api/AssignmentParticipationCommandController.java index a1263422..28070a66 100644 --- a/src/main/java/hello/cluebackend/assignment/participation/api/AssignmentParticipationCommandController.java +++ b/src/main/java/hello/cluebackend/domain/assignment/participation/api/AssignmentParticipationCommandController.java @@ -1,4 +1,4 @@ -package hello.cluebackend.assignment.participation.api; +package hello.cluebackend.domain.assignment.participation.api; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/hello/cluebackend/assignment/participation/api/AssignmentParticipationQueryController.java b/src/main/java/hello/cluebackend/domain/assignment/participation/api/AssignmentParticipationQueryController.java similarity index 90% rename from src/main/java/hello/cluebackend/assignment/participation/api/AssignmentParticipationQueryController.java rename to src/main/java/hello/cluebackend/domain/assignment/participation/api/AssignmentParticipationQueryController.java index acbf8b04..7e514d9b 100644 --- a/src/main/java/hello/cluebackend/assignment/participation/api/AssignmentParticipationQueryController.java +++ b/src/main/java/hello/cluebackend/domain/assignment/participation/api/AssignmentParticipationQueryController.java @@ -1,4 +1,4 @@ -package hello.cluebackend.assignment.participation.api; +package hello.cluebackend.domain.assignment.participation.api; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/hello/cluebackend/domain/assignment/participation/application/SubmissionCommandService.java b/src/main/java/hello/cluebackend/domain/assignment/participation/application/SubmissionCommandService.java new file mode 100644 index 00000000..4e5268f7 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/participation/application/SubmissionCommandService.java @@ -0,0 +1,23 @@ +package hello.cluebackend.domain.assignment.participation.application; + +import hello.cluebackend.domain.assignment.management.api.dto.response.GetSubmissionFile; +import hello.cluebackend.domain.assignment.participation.domain.Submission; +import hello.cluebackend.domain.assignment.participation.persistence.SubmissionRepository; +import jakarta.persistence.EntityNotFoundException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class SubmissionCommandService { + private final SubmissionRepository submissionRepository; + +// public Submission findById(Long submissionId) { +// return submissionRepository.findById(submissionId) +// .orElseThrow(() -> new EntityNotFoundException("Submission not found : " + submissionId)); +// } +// +// public GetSubmissionFile getSubmissionGrade(Submission submission) { +// +// } +} diff --git a/src/main/java/hello/cluebackend/domain/assignment/participation/application/SubmissionQueryService.java b/src/main/java/hello/cluebackend/domain/assignment/participation/application/SubmissionQueryService.java new file mode 100644 index 00000000..0481b986 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/participation/application/SubmissionQueryService.java @@ -0,0 +1,4 @@ +package hello.cluebackend.domain.assignment.participation.application; + +public class SubmissionQueryService { +} diff --git a/src/main/java/hello/cluebackend/assignment/participation/domain/Submission.java b/src/main/java/hello/cluebackend/domain/assignment/participation/domain/Submission.java similarity index 81% rename from src/main/java/hello/cluebackend/assignment/participation/domain/Submission.java rename to src/main/java/hello/cluebackend/domain/assignment/participation/domain/Submission.java index 7713d32f..3d4a9b98 100644 --- a/src/main/java/hello/cluebackend/assignment/participation/domain/Submission.java +++ b/src/main/java/hello/cluebackend/domain/assignment/participation/domain/Submission.java @@ -1,6 +1,6 @@ -package hello.cluebackend.assignment.participation.domain; +package hello.cluebackend.domain.assignment.participation.domain; -import hello.cluebackend.assignment.management.domain.Assignment; +import hello.cluebackend.domain.assignment.management.domain.Assignment; import hello.cluebackend.domain.user.domain.UserEntity; import jakarta.persistence.*; import lombok.*; @@ -8,7 +8,7 @@ import java.time.LocalDateTime; @Entity -@Table(name = "Submission") +@Table(name = "submission") @Getter @Setter @AllArgsConstructor @NoArgsConstructor diff --git a/src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionAttachment.java b/src/main/java/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/SubmissionAttachment.java similarity index 73% rename from src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionAttachment.java rename to src/main/java/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/SubmissionAttachment.java index 64bceeee..c3ebe9d2 100644 --- a/src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionAttachment.java +++ b/src/main/java/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/SubmissionAttachment.java @@ -1,16 +1,15 @@ -package hello.cluebackend.assignment.participation.domain.SubmissionAttachment; +package hello.cluebackend.domain.assignment.participation.domain.SubmissionAttachment; -import hello.cluebackend.assignment.management.domain.Assignment; -import hello.cluebackend.assignment.participation.domain.Submission; +import hello.cluebackend.domain.assignment.management.domain.Assignment; +import hello.cluebackend.domain.assignment.participation.domain.Submission; import hello.cluebackend.domain.user.domain.UserEntity; import jakarta.persistence.*; import lombok.*; -import lombok.experimental.SuperBuilder; import java.time.LocalDateTime; @Entity -@Table(name = "assignment_content") +@Table(name = "submission_attachment") @Inheritance(strategy = InheritanceType.JOINED) @DiscriminatorColumn(name = "DTYPE") @Getter @Setter diff --git a/src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionDocument.java b/src/main/java/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/SubmissionDocument.java similarity index 82% rename from src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionDocument.java rename to src/main/java/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/SubmissionDocument.java index 430fb224..6c1b4565 100644 --- a/src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionDocument.java +++ b/src/main/java/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/SubmissionDocument.java @@ -1,11 +1,10 @@ -package hello.cluebackend.assignment.participation.domain.SubmissionAttachment; +package hello.cluebackend.domain.assignment.participation.domain.SubmissionAttachment; import jakarta.persistence.Column; import jakarta.persistence.DiscriminatorValue; import jakarta.persistence.Entity; import jakarta.persistence.JoinColumn; import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; @Entity @DiscriminatorValue("Document") diff --git a/src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionLink.java b/src/main/java/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/SubmissionLink.java similarity index 67% rename from src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionLink.java rename to src/main/java/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/SubmissionLink.java index db33c470..2a30bae3 100644 --- a/src/main/java/hello/cluebackend/assignment/participation/domain/SubmissionAttachment/SubmissionLink.java +++ b/src/main/java/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/SubmissionLink.java @@ -1,9 +1,8 @@ -package hello.cluebackend.assignment.participation.domain.SubmissionAttachment; +package hello.cluebackend.domain.assignment.participation.domain.SubmissionAttachment; import jakarta.persistence.DiscriminatorValue; import jakarta.persistence.Entity; import lombok.NoArgsConstructor; -import lombok.experimental.SuperBuilder; @Entity @DiscriminatorValue("Link") diff --git a/src/main/java/hello/cluebackend/domain/assignment/participation/persistence/SubmissionAttachmentRepository.java b/src/main/java/hello/cluebackend/domain/assignment/participation/persistence/SubmissionAttachmentRepository.java new file mode 100644 index 00000000..3e85e3c7 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/participation/persistence/SubmissionAttachmentRepository.java @@ -0,0 +1,15 @@ +package hello.cluebackend.domain.assignment.participation.persistence; + +import hello.cluebackend.domain.assignment.management.api.dto.response.GetSubmissionFile; +import hello.cluebackend.domain.assignment.participation.domain.Submission; +import hello.cluebackend.domain.assignment.participation.domain.SubmissionAttachment.SubmissionAttachment; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface SubmissionAttachmentRepository extends JpaRepository { + +} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/participation/persistence/SubmissionRepository.java b/src/main/java/hello/cluebackend/domain/assignment/participation/persistence/SubmissionRepository.java new file mode 100644 index 00000000..ea15e701 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/participation/persistence/SubmissionRepository.java @@ -0,0 +1,14 @@ +package hello.cluebackend.domain.assignment.participation.persistence; + +import hello.cluebackend.domain.assignment.management.domain.Assignment; +import hello.cluebackend.domain.assignment.participation.domain.Submission; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface SubmissionRepository extends JpaRepository { +} From 1412de5f0d95ab4c5e247a1de978b6be37a9f80a Mon Sep 17 00:00:00 2001 From: Haeyul Date: Wed, 13 Aug 2025 07:57:11 +0900 Subject: [PATCH 08/22] =?UTF-8?q?feat(#5):=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=20=EC=9D=B8=EC=A6=9D=20=EA=B0=84=ED=8E=B8=20=EC=96=B4=EB=85=B8?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/common/annotation/CurrentUser.java | 11 ++++++ .../resolver/CurrentUserArgumentResolver.java | 35 +++++++++++++++++++ .../cluebackend/global/config/WebConfig.java | 29 +++++++++------ 3 files changed, 65 insertions(+), 10 deletions(-) create mode 100644 src/main/java/hello/cluebackend/global/common/annotation/CurrentUser.java create mode 100644 src/main/java/hello/cluebackend/global/common/resolver/CurrentUserArgumentResolver.java diff --git a/src/main/java/hello/cluebackend/global/common/annotation/CurrentUser.java b/src/main/java/hello/cluebackend/global/common/annotation/CurrentUser.java new file mode 100644 index 00000000..c27eff17 --- /dev/null +++ b/src/main/java/hello/cluebackend/global/common/annotation/CurrentUser.java @@ -0,0 +1,11 @@ +package hello.cluebackend.global.common.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.PARAMETER) +@Retention(RetentionPolicy.RUNTIME) +public @interface CurrentUser { +} diff --git a/src/main/java/hello/cluebackend/global/common/resolver/CurrentUserArgumentResolver.java b/src/main/java/hello/cluebackend/global/common/resolver/CurrentUserArgumentResolver.java new file mode 100644 index 00000000..4456c3b2 --- /dev/null +++ b/src/main/java/hello/cluebackend/global/common/resolver/CurrentUserArgumentResolver.java @@ -0,0 +1,35 @@ +package hello.cluebackend.global.common.resolver; + +import hello.cluebackend.global.common.annotation.CurrentUser; +import hello.cluebackend.global.config.JWTUtil; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.core.MethodParameter; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.support.WebDataBinderFactory; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.method.support.ModelAndViewContainer; + +@Component +@RequiredArgsConstructor +public class CurrentUserArgumentResolver implements HandlerMethodArgumentResolver { + + private final JWTUtil jwtUtil; + + @Override + public boolean supportsParameter(MethodParameter parameter) { + return parameter.hasParameterAnnotation(CurrentUser.class) + && parameter.getParameterType().equals(Long.class); + } + + @Override + public Object resolveArgument(MethodParameter parameter, + ModelAndViewContainer mavContainer, + NativeWebRequest webRequest, + WebDataBinderFactory binderFactory) { + HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest(); + String token = jwtUtil.getToken(request); + return jwtUtil.getUserId(token); + } +} diff --git a/src/main/java/hello/cluebackend/global/config/WebConfig.java b/src/main/java/hello/cluebackend/global/config/WebConfig.java index 8a88deea..da435cce 100644 --- a/src/main/java/hello/cluebackend/global/config/WebConfig.java +++ b/src/main/java/hello/cluebackend/global/config/WebConfig.java @@ -1,23 +1,32 @@ package hello.cluebackend.global.config; -import org.springframework.beans.factory.annotation.Autowired; +import hello.cluebackend.global.common.resolver.CurrentUserArgumentResolver; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.List; @Configuration public class WebConfig implements WebMvcConfigurer { - private OctetStreamReadMsgConverter octetStreamReadMsgConverter; - @Autowired - public WebConfig(OctetStreamReadMsgConverter octetStreamReadMsgConverter) { - this.octetStreamReadMsgConverter = octetStreamReadMsgConverter; - } + private final OctetStreamReadMsgConverter octetStreamReadMsgConverter; + private final CurrentUserArgumentResolver currentUserArgumentResolver; - @Override - public void configureMessageConverters(List> converters) { - converters.add(octetStreamReadMsgConverter); - } + public WebConfig(OctetStreamReadMsgConverter octetStreamReadMsgConverter, + CurrentUserArgumentResolver currentUserArgumentResolver) { + this.octetStreamReadMsgConverter = octetStreamReadMsgConverter; + this.currentUserArgumentResolver = currentUserArgumentResolver; + } + + @Override + public void configureMessageConverters(List> converters) { + converters.add(octetStreamReadMsgConverter); + } + + @Override + public void addArgumentResolvers(List resolvers) { + resolvers.add(currentUserArgumentResolver); + } } \ No newline at end of file From f0abc6082a920a1a828492e031c93d35a0484c28 Mon Sep 17 00:00:00 2001 From: Haeyul Date: Sat, 23 Aug 2025 21:18:40 +0900 Subject: [PATCH 09/22] =?UTF-8?q?feat(#5):=20=EA=B3=BC=EC=A0=9C=20?= =?UTF-8?q?=EC=A0=9C=EC=B6=9C,=20=EA=B3=BC=EC=A0=9C=20=EC=A0=9C=EC=B6=9C?= =?UTF-8?q?=20=EC=B7=A8=EC=86=8C=20=EA=B8=B0=EB=8A=A5=20=EC=A0=9C=EC=9E=91?= =?UTF-8?q?=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 - .../QAssignmentAttachment.java | 7 +- .../QAttachmentDocument.java | 5 +- .../AssignmentAttachment/QAttachmentLink.java | 5 +- .../domain/QAssignment.java | 6 +- .../domain/QSubmission.java | 7 +- .../QSubmissionAttachment.java | 11 +-- .../QSubmissionDocument.java | 7 +- .../SubmissionAttachment/QSubmissionLink.java | 7 +- .../api/AssignmentCommandController.java | 47 +++++++++++ .../api/AssignmentQueryController.java | 66 +++++++++++++++ .../api/dto/request/CreateAssignmentDto.java | 15 ++++ .../api/dto/request/ModifyAssignmentDto.java | 18 ++++ .../api/dto/request/UploadAttachment.java | 6 ++ .../api/dto/response/AssignmentCheck.java | 15 ++++ .../api/dto/response/AssignmentDto.java | 27 ++++++ .../api/dto/response/GetAllAssignmentDto.java | 23 +++++ .../GetAllClassRoomAssignmentDto.java | 23 +++++ .../response/GetAllSubmissionCheckDto.java} | 4 +- .../dto/response/GetSubmissionFileDto.java} | 4 +- .../dto/response/GetSubmissionResultDto.java} | 4 +- .../application/AssignmentCommandService.java | 77 +++++++++++++++++ .../application/AssignmentQueryService.java | 60 ++++++++++++++ .../domain/assignment/domain/Assignment.java | 67 +++++++++++++++ .../AssignmentAttachment.java | 4 +- .../AttachmentDocument.java | 2 +- .../AssignmentAttachment/AttachmentLink.java | 2 +- ...AssignmentManagementCommandController.java | 83 ------------------- .../AssignmentManagementQueryController.java | 31 ------- .../response/GetAllAssignmentResponse.java | 15 ---- .../GetAllAssignmentResponseResult.java | 10 --- .../GetAllClassRoomAssignmentResponse.java | 22 ----- ...tAllClassRoomAssignmentResponseResult.java | 10 --- .../response/GetAllSubmissionCheckResult.java | 5 -- .../application/AssignmentCommandService.java | 56 ------------- .../application/AssignmentQueryService.java | 15 ---- .../management/domain/Assignment.java | 40 --------- ...ignmentParticipationCommandController.java | 23 ----- ...ssignmentParticipationQueryController.java | 27 ------ .../application/SubmissionCommandService.java | 23 ----- .../application/SubmissionQueryService.java | 4 - .../participation/domain/Submission.java | 34 -------- .../SubmissionAttachmentRepository.java | 15 ---- .../persistence/SubmissionRepository.java | 14 ---- .../persistence/AssignmentRepository.java | 16 ++-- .../AssignmentAttachmentRepository.java | 5 +- .../AttachmentDocumentRepository.java | 8 ++ .../AttachmentLinkRepository.java | 8 ++ .../presentation/ClassRoomController.java | 20 +++-- .../application/ClassroomUserService.java | 25 ++++++ .../repository/ClassRoomUserRepository.java | 2 + .../api/SubmissionCommandController.java | 74 +++++++++++++++++ .../api/SubmissionQueryController.java | 56 +++++++++++++ .../api/dto/request/modifySubmissionDto.java | 5 ++ .../api/dto/response/SubmissionDto.java | 28 +++++++ .../application/SubmissionCommandService.java | 59 +++++++++++++ .../application/SubmissionQueryService.java | 75 +++++++++++++++++ .../domain/submission/domain/Submission.java | 60 ++++++++++++++ .../SubmissionAttachment.java | 6 +- .../SubmissionDocument.java | 2 +- .../SubmissionAttachment/SubmissionLink.java | 2 +- .../persistence/SubmissionRepository.java | 15 ++++ .../SubmissionAttachmentRepository.java | 10 +++ .../SubmissionDocumentRepository.java | 8 ++ .../SubmissionLinkRepository.java | 8 ++ 65 files changed, 959 insertions(+), 480 deletions(-) rename src/main/generated/hello/cluebackend/domain/assignment/{management => assignment}/domain/AssignmentAttachment/QAssignmentAttachment.java (88%) rename src/main/generated/hello/cluebackend/domain/assignment/{management => assignment}/domain/AssignmentAttachment/QAttachmentDocument.java (91%) rename src/main/generated/hello/cluebackend/domain/assignment/{management => assignment}/domain/AssignmentAttachment/QAttachmentLink.java (90%) rename src/main/generated/hello/cluebackend/domain/assignment/{management => assignment}/domain/QAssignment.java (80%) rename src/main/generated/hello/cluebackend/domain/assignment/{participation => submission}/domain/QSubmission.java (88%) rename src/main/generated/hello/cluebackend/domain/assignment/{participation => submission}/domain/SubmissionAttachment/QSubmissionAttachment.java (80%) rename src/main/generated/hello/cluebackend/domain/assignment/{participation => submission}/domain/SubmissionAttachment/QSubmissionDocument.java (87%) rename src/main/generated/hello/cluebackend/domain/assignment/{participation => submission}/domain/SubmissionAttachment/QSubmissionLink.java (86%) create mode 100644 src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/api/AssignmentQueryController.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/api/dto/request/CreateAssignmentDto.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/api/dto/request/ModifyAssignmentDto.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/api/dto/request/UploadAttachment.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentCheck.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentDto.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetAllAssignmentDto.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetAllClassRoomAssignmentDto.java rename src/main/java/hello/cluebackend/domain/assignment/{management/api/dto/response/GetAllSubmissionCheck.java => api/dto/response/GetAllSubmissionCheckDto.java} (75%) rename src/main/java/hello/cluebackend/domain/assignment/{management/api/dto/response/GetSubmissionFile.java => api/dto/response/GetSubmissionFileDto.java} (62%) rename src/main/java/hello/cluebackend/domain/assignment/{management/api/dto/response/GetSubmissionResult.java => api/dto/response/GetSubmissionResultDto.java} (51%) create mode 100644 src/main/java/hello/cluebackend/domain/assignment/application/AssignmentCommandService.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/application/AssignmentQueryService.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/domain/Assignment.java rename src/main/java/hello/cluebackend/domain/assignment/{management => }/domain/AssignmentAttachment/AssignmentAttachment.java (82%) rename src/main/java/hello/cluebackend/domain/assignment/{management => }/domain/AssignmentAttachment/AttachmentDocument.java (88%) rename src/main/java/hello/cluebackend/domain/assignment/{management => }/domain/AssignmentAttachment/AttachmentLink.java (82%) delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/management/api/AssignmentManagementCommandController.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/management/api/AssignmentManagementQueryController.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllAssignmentResponse.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllAssignmentResponseResult.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponse.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponseResult.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllSubmissionCheckResult.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/management/application/AssignmentCommandService.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/management/application/AssignmentQueryService.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/management/domain/Assignment.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/participation/api/AssignmentParticipationCommandController.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/participation/api/AssignmentParticipationQueryController.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/participation/application/SubmissionCommandService.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/participation/application/SubmissionQueryService.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/participation/domain/Submission.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/participation/persistence/SubmissionAttachmentRepository.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/participation/persistence/SubmissionRepository.java rename src/main/java/hello/cluebackend/domain/assignment/{management => }/persistence/AssignmentRepository.java (56%) rename src/main/java/hello/cluebackend/domain/assignment/{management/persistence => persistence/assignmentDocument}/AssignmentAttachmentRepository.java (56%) create mode 100644 src/main/java/hello/cluebackend/domain/assignment/persistence/assignmentDocument/AttachmentDocumentRepository.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/persistence/assignmentDocument/AttachmentLinkRepository.java create mode 100644 src/main/java/hello/cluebackend/domain/classroomuser/application/ClassroomUserService.java create mode 100644 src/main/java/hello/cluebackend/domain/submission/api/SubmissionCommandController.java create mode 100644 src/main/java/hello/cluebackend/domain/submission/api/SubmissionQueryController.java create mode 100644 src/main/java/hello/cluebackend/domain/submission/api/dto/request/modifySubmissionDto.java create mode 100644 src/main/java/hello/cluebackend/domain/submission/api/dto/response/SubmissionDto.java create mode 100644 src/main/java/hello/cluebackend/domain/submission/application/SubmissionCommandService.java create mode 100644 src/main/java/hello/cluebackend/domain/submission/application/SubmissionQueryService.java create mode 100644 src/main/java/hello/cluebackend/domain/submission/domain/Submission.java rename src/main/java/hello/cluebackend/domain/{assignment/participation => submission}/domain/SubmissionAttachment/SubmissionAttachment.java (78%) rename src/main/java/hello/cluebackend/domain/{assignment/participation => submission}/domain/SubmissionAttachment/SubmissionDocument.java (86%) rename src/main/java/hello/cluebackend/domain/{assignment/participation => submission}/domain/SubmissionAttachment/SubmissionLink.java (74%) create mode 100644 src/main/java/hello/cluebackend/domain/submission/persistence/SubmissionRepository.java create mode 100644 src/main/java/hello/cluebackend/domain/submission/persistence/submissionAttachment/SubmissionAttachmentRepository.java create mode 100644 src/main/java/hello/cluebackend/domain/submission/persistence/submissionAttachment/SubmissionDocumentRepository.java create mode 100644 src/main/java/hello/cluebackend/domain/submission/persistence/submissionAttachment/SubmissionLinkRepository.java diff --git a/build.gradle b/build.gradle index 693b75c0..5a795e70 100644 --- a/build.gradle +++ b/build.gradle @@ -74,7 +74,6 @@ dependencies { annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta' annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" - } def querydslSrcDir = 'src/main/generated' diff --git a/src/main/generated/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/QAssignmentAttachment.java b/src/main/generated/hello/cluebackend/domain/assignment/assignment/domain/AssignmentAttachment/QAssignmentAttachment.java similarity index 88% rename from src/main/generated/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/QAssignmentAttachment.java rename to src/main/generated/hello/cluebackend/domain/assignment/assignment/domain/AssignmentAttachment/QAssignmentAttachment.java index 659ac41e..dd883d81 100644 --- a/src/main/generated/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/QAssignmentAttachment.java +++ b/src/main/generated/hello/cluebackend/domain/assignment/assignment/domain/AssignmentAttachment/QAssignmentAttachment.java @@ -1,4 +1,4 @@ -package hello.cluebackend.domain.assignment.management.domain.AssignmentAttachment; +package hello.cluebackend.domain.assignment.assignment.domain.AssignmentAttachment; import static com.querydsl.core.types.PathMetadataFactory.*; @@ -8,6 +8,7 @@ import javax.annotation.processing.Generated; import com.querydsl.core.types.Path; import com.querydsl.core.types.dsl.PathInits; +import hello.cluebackend.domain.assignment.domain.AssignmentAttachment.AssignmentAttachment; /** @@ -22,7 +23,7 @@ public class QAssignmentAttachment extends EntityPathBase public static final QAssignmentAttachment assignmentAttachment = new QAssignmentAttachment("assignmentAttachment"); - public final hello.cluebackend.domain.assignment.management.domain.QAssignment assignment; + public final hello.cluebackend.domain.assignment.assignment.domain.QAssignment assignment; public final NumberPath assignmentAttachmentId = createNumber("assignmentAttachmentId", Long.class); @@ -48,7 +49,7 @@ public QAssignmentAttachment(PathMetadata metadata, PathInits inits) { public QAssignmentAttachment(Class type, PathMetadata metadata, PathInits inits) { super(type, metadata, inits); - this.assignment = inits.isInitialized("assignment") ? new hello.cluebackend.domain.assignment.management.domain.QAssignment(forProperty("assignment"), inits.get("assignment")) : null; + this.assignment = inits.isInitialized("assignment") ? new hello.cluebackend.domain.assignment.assignment.domain.QAssignment(forProperty("assignment"), inits.get("assignment")) : null; this.user = inits.isInitialized("user") ? new hello.cluebackend.domain.user.domain.QUserEntity(forProperty("user")) : null; } diff --git a/src/main/generated/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/QAttachmentDocument.java b/src/main/generated/hello/cluebackend/domain/assignment/assignment/domain/AssignmentAttachment/QAttachmentDocument.java similarity index 91% rename from src/main/generated/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/QAttachmentDocument.java rename to src/main/generated/hello/cluebackend/domain/assignment/assignment/domain/AssignmentAttachment/QAttachmentDocument.java index bdaf6f0a..5c89528f 100644 --- a/src/main/generated/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/QAttachmentDocument.java +++ b/src/main/generated/hello/cluebackend/domain/assignment/assignment/domain/AssignmentAttachment/QAttachmentDocument.java @@ -1,4 +1,4 @@ -package hello.cluebackend.domain.assignment.management.domain.AssignmentAttachment; +package hello.cluebackend.domain.assignment.assignment.domain.AssignmentAttachment; import static com.querydsl.core.types.PathMetadataFactory.*; @@ -8,6 +8,7 @@ import javax.annotation.processing.Generated; import com.querydsl.core.types.Path; import com.querydsl.core.types.dsl.PathInits; +import hello.cluebackend.domain.assignment.domain.AssignmentAttachment.AttachmentDocument; /** @@ -25,7 +26,7 @@ public class QAttachmentDocument extends EntityPathBase { public final QAssignmentAttachment _super; // inherited - public final hello.cluebackend.domain.assignment.management.domain.QAssignment assignment; + public final hello.cluebackend.domain.assignment.assignment.domain.QAssignment assignment; //inherited public final NumberPath assignmentAttachmentId; diff --git a/src/main/generated/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/QAttachmentLink.java b/src/main/generated/hello/cluebackend/domain/assignment/assignment/domain/AssignmentAttachment/QAttachmentLink.java similarity index 90% rename from src/main/generated/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/QAttachmentLink.java rename to src/main/generated/hello/cluebackend/domain/assignment/assignment/domain/AssignmentAttachment/QAttachmentLink.java index f004cc95..181c3d8b 100644 --- a/src/main/generated/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/QAttachmentLink.java +++ b/src/main/generated/hello/cluebackend/domain/assignment/assignment/domain/AssignmentAttachment/QAttachmentLink.java @@ -1,4 +1,4 @@ -package hello.cluebackend.domain.assignment.management.domain.AssignmentAttachment; +package hello.cluebackend.domain.assignment.assignment.domain.AssignmentAttachment; import static com.querydsl.core.types.PathMetadataFactory.*; @@ -8,6 +8,7 @@ import javax.annotation.processing.Generated; import com.querydsl.core.types.Path; import com.querydsl.core.types.dsl.PathInits; +import hello.cluebackend.domain.assignment.domain.AssignmentAttachment.AttachmentLink; /** @@ -25,7 +26,7 @@ public class QAttachmentLink extends EntityPathBase { public final QAssignmentAttachment _super; // inherited - public final hello.cluebackend.domain.assignment.management.domain.QAssignment assignment; + public final hello.cluebackend.domain.assignment.assignment.domain.QAssignment assignment; //inherited public final NumberPath assignmentAttachmentId; diff --git a/src/main/generated/hello/cluebackend/domain/assignment/management/domain/QAssignment.java b/src/main/generated/hello/cluebackend/domain/assignment/assignment/domain/QAssignment.java similarity index 80% rename from src/main/generated/hello/cluebackend/domain/assignment/management/domain/QAssignment.java rename to src/main/generated/hello/cluebackend/domain/assignment/assignment/domain/QAssignment.java index 866a537f..07a40120 100644 --- a/src/main/generated/hello/cluebackend/domain/assignment/management/domain/QAssignment.java +++ b/src/main/generated/hello/cluebackend/domain/assignment/assignment/domain/QAssignment.java @@ -1,4 +1,4 @@ -package hello.cluebackend.domain.assignment.management.domain; +package hello.cluebackend.domain.assignment.assignment.domain; import static com.querydsl.core.types.PathMetadataFactory.*; @@ -8,6 +8,8 @@ import javax.annotation.processing.Generated; import com.querydsl.core.types.Path; import com.querydsl.core.types.dsl.PathInits; +import hello.cluebackend.domain.assignment.domain.Assignment; +import hello.cluebackend.domain.submission.domain.Submission; /** @@ -32,6 +34,8 @@ public class QAssignment extends EntityPathBase { public final DateTimePath startDate = createDateTime("startDate", java.time.LocalDateTime.class); + public final ListPath submissions = this.createList("submissions", Submission.class, hello.cluebackend.domain.assignment.submission.domain.QSubmission.class, PathInits.DIRECT2); + public final StringPath title = createString("title"); public final hello.cluebackend.domain.user.domain.QUserEntity user; diff --git a/src/main/generated/hello/cluebackend/domain/assignment/participation/domain/QSubmission.java b/src/main/generated/hello/cluebackend/domain/assignment/submission/domain/QSubmission.java similarity index 88% rename from src/main/generated/hello/cluebackend/domain/assignment/participation/domain/QSubmission.java rename to src/main/generated/hello/cluebackend/domain/assignment/submission/domain/QSubmission.java index d8986ff9..d3470b4d 100644 --- a/src/main/generated/hello/cluebackend/domain/assignment/participation/domain/QSubmission.java +++ b/src/main/generated/hello/cluebackend/domain/assignment/submission/domain/QSubmission.java @@ -1,4 +1,4 @@ -package hello.cluebackend.domain.assignment.participation.domain; +package hello.cluebackend.domain.assignment.submission.domain; import static com.querydsl.core.types.PathMetadataFactory.*; @@ -8,6 +8,7 @@ import javax.annotation.processing.Generated; import com.querydsl.core.types.Path; import com.querydsl.core.types.dsl.PathInits; +import hello.cluebackend.domain.submission.domain.Submission; /** @@ -22,7 +23,7 @@ public class QSubmission extends EntityPathBase { public static final QSubmission submission = new QSubmission("submission"); - public final hello.cluebackend.domain.assignment.management.domain.QAssignment assignment; + public final hello.cluebackend.domain.assignment.assignment.domain.QAssignment assignment; public final BooleanPath isSubmitted = createBoolean("isSubmitted"); @@ -50,7 +51,7 @@ public QSubmission(PathMetadata metadata, PathInits inits) { public QSubmission(Class type, PathMetadata metadata, PathInits inits) { super(type, metadata, inits); - this.assignment = inits.isInitialized("assignment") ? new hello.cluebackend.domain.assignment.management.domain.QAssignment(forProperty("assignment"), inits.get("assignment")) : null; + this.assignment = inits.isInitialized("assignment") ? new hello.cluebackend.domain.assignment.assignment.domain.QAssignment(forProperty("assignment"), inits.get("assignment")) : null; this.user = inits.isInitialized("user") ? new hello.cluebackend.domain.user.domain.QUserEntity(forProperty("user")) : null; } diff --git a/src/main/generated/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/QSubmissionAttachment.java b/src/main/generated/hello/cluebackend/domain/assignment/submission/domain/SubmissionAttachment/QSubmissionAttachment.java similarity index 80% rename from src/main/generated/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/QSubmissionAttachment.java rename to src/main/generated/hello/cluebackend/domain/assignment/submission/domain/SubmissionAttachment/QSubmissionAttachment.java index 3713eef0..61d0a99e 100644 --- a/src/main/generated/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/QSubmissionAttachment.java +++ b/src/main/generated/hello/cluebackend/domain/assignment/submission/domain/SubmissionAttachment/QSubmissionAttachment.java @@ -1,4 +1,4 @@ -package hello.cluebackend.domain.assignment.participation.domain.SubmissionAttachment; +package hello.cluebackend.domain.assignment.submission.domain.SubmissionAttachment; import static com.querydsl.core.types.PathMetadataFactory.*; @@ -8,6 +8,7 @@ import javax.annotation.processing.Generated; import com.querydsl.core.types.Path; import com.querydsl.core.types.dsl.PathInits; +import hello.cluebackend.domain.submission.domain.SubmissionAttachment.SubmissionAttachment; /** @@ -22,9 +23,9 @@ public class QSubmissionAttachment extends EntityPathBase public static final QSubmissionAttachment submissionAttachment = new QSubmissionAttachment("submissionAttachment"); - public final hello.cluebackend.domain.assignment.management.domain.QAssignment assignment; + public final hello.cluebackend.domain.assignment.assignment.domain.QAssignment assignment; - public final hello.cluebackend.domain.assignment.participation.domain.QSubmission submission; + public final hello.cluebackend.domain.assignment.submission.domain.QSubmission submission; public final NumberPath SubmissionAttachmentId = createNumber("SubmissionAttachmentId", Long.class); @@ -50,8 +51,8 @@ public QSubmissionAttachment(PathMetadata metadata, PathInits inits) { public QSubmissionAttachment(Class type, PathMetadata metadata, PathInits inits) { super(type, metadata, inits); - this.assignment = inits.isInitialized("assignment") ? new hello.cluebackend.domain.assignment.management.domain.QAssignment(forProperty("assignment"), inits.get("assignment")) : null; - this.submission = inits.isInitialized("submission") ? new hello.cluebackend.domain.assignment.participation.domain.QSubmission(forProperty("submission"), inits.get("submission")) : null; + this.assignment = inits.isInitialized("assignment") ? new hello.cluebackend.domain.assignment.assignment.domain.QAssignment(forProperty("assignment"), inits.get("assignment")) : null; + this.submission = inits.isInitialized("submission") ? new hello.cluebackend.domain.assignment.submission.domain.QSubmission(forProperty("submission"), inits.get("submission")) : null; this.user = inits.isInitialized("user") ? new hello.cluebackend.domain.user.domain.QUserEntity(forProperty("user")) : null; } diff --git a/src/main/generated/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/QSubmissionDocument.java b/src/main/generated/hello/cluebackend/domain/assignment/submission/domain/SubmissionAttachment/QSubmissionDocument.java similarity index 87% rename from src/main/generated/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/QSubmissionDocument.java rename to src/main/generated/hello/cluebackend/domain/assignment/submission/domain/SubmissionAttachment/QSubmissionDocument.java index 1ffde5d3..beff681a 100644 --- a/src/main/generated/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/QSubmissionDocument.java +++ b/src/main/generated/hello/cluebackend/domain/assignment/submission/domain/SubmissionAttachment/QSubmissionDocument.java @@ -1,4 +1,4 @@ -package hello.cluebackend.domain.assignment.participation.domain.SubmissionAttachment; +package hello.cluebackend.domain.assignment.submission.domain.SubmissionAttachment; import static com.querydsl.core.types.PathMetadataFactory.*; @@ -8,6 +8,7 @@ import javax.annotation.processing.Generated; import com.querydsl.core.types.Path; import com.querydsl.core.types.dsl.PathInits; +import hello.cluebackend.domain.submission.domain.SubmissionAttachment.SubmissionDocument; /** @@ -25,7 +26,7 @@ public class QSubmissionDocument extends EntityPathBase { public final QSubmissionAttachment _super; // inherited - public final hello.cluebackend.domain.assignment.management.domain.QAssignment assignment; + public final hello.cluebackend.domain.assignment.assignment.domain.QAssignment assignment; public final StringPath filePath = createString("filePath"); @@ -36,7 +37,7 @@ public class QSubmissionDocument extends EntityPathBase { public final StringPath storedFileName = createString("storedFileName"); // inherited - public final hello.cluebackend.domain.assignment.participation.domain.QSubmission submission; + public final hello.cluebackend.domain.assignment.submission.domain.QSubmission submission; //inherited public final NumberPath SubmissionAttachmentId; diff --git a/src/main/generated/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/QSubmissionLink.java b/src/main/generated/hello/cluebackend/domain/assignment/submission/domain/SubmissionAttachment/QSubmissionLink.java similarity index 86% rename from src/main/generated/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/QSubmissionLink.java rename to src/main/generated/hello/cluebackend/domain/assignment/submission/domain/SubmissionAttachment/QSubmissionLink.java index c9c5e776..b9908878 100644 --- a/src/main/generated/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/QSubmissionLink.java +++ b/src/main/generated/hello/cluebackend/domain/assignment/submission/domain/SubmissionAttachment/QSubmissionLink.java @@ -1,4 +1,4 @@ -package hello.cluebackend.domain.assignment.participation.domain.SubmissionAttachment; +package hello.cluebackend.domain.assignment.submission.domain.SubmissionAttachment; import static com.querydsl.core.types.PathMetadataFactory.*; @@ -8,6 +8,7 @@ import javax.annotation.processing.Generated; import com.querydsl.core.types.Path; import com.querydsl.core.types.dsl.PathInits; +import hello.cluebackend.domain.submission.domain.SubmissionAttachment.SubmissionLink; /** @@ -25,10 +26,10 @@ public class QSubmissionLink extends EntityPathBase { public final QSubmissionAttachment _super; // inherited - public final hello.cluebackend.domain.assignment.management.domain.QAssignment assignment; + public final hello.cluebackend.domain.assignment.assignment.domain.QAssignment assignment; // inherited - public final hello.cluebackend.domain.assignment.participation.domain.QSubmission submission; + public final hello.cluebackend.domain.assignment.submission.domain.QSubmission submission; //inherited public final NumberPath SubmissionAttachmentId; diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java b/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java new file mode 100644 index 00000000..05356780 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java @@ -0,0 +1,47 @@ +package hello.cluebackend.domain.assignment.api; + +import hello.cluebackend.domain.assignment.api.dto.response.AssignmentCheck; +import hello.cluebackend.domain.assignment.api.dto.response.AssignmentDto; +import hello.cluebackend.domain.assignment.api.dto.response.GetAllAssignmentDto; +import hello.cluebackend.domain.assignment.application.AssignmentCommandService; +import hello.cluebackend.domain.submission.application.SubmissionCommandService; +import hello.cluebackend.global.common.annotation.CurrentUser; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/api/assignments") +@RequiredArgsConstructor +@Slf4j +public class AssignmentCommandController { + private final AssignmentCommandService assignmentCommandService; + private final SubmissionCommandService submissionCommandService; + + // 사용자가 속한 모든 수업 과제 조회 + @GetMapping("/me") + public ResponseEntity> getAllAssignments(@CurrentUser Long userId) { + List result = assignmentCommandService.findAllAssignment(userId); + return ResponseEntity.ok(result); + } + + // 과제 모든 정보 조회 + @GetMapping("/{assignmentId}") + public ResponseEntity getAssignment(@CurrentUser Long userId, @PathVariable Long assignmentId) { + AssignmentDto result = assignmentCommandService.findById(assignmentId); + return ResponseEntity.ok(result); + } + + // 전체 학생 과제 제출 여부 + @GetMapping("/{assignmentId}/check") + public ResponseEntity> checkAssignment(@CurrentUser Long userId, @PathVariable Long assignmentId){ + List assignmentChecks = submissionCommandService.checkAssignment(assignmentId); + return ResponseEntity.ok(assignmentChecks); + } +} diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentQueryController.java b/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentQueryController.java new file mode 100644 index 00000000..b60eb22a --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentQueryController.java @@ -0,0 +1,66 @@ +package hello.cluebackend.domain.assignment.api; + +import hello.cluebackend.domain.assignment.api.dto.request.CreateAssignmentDto; +import hello.cluebackend.domain.assignment.api.dto.request.ModifyAssignmentDto; +import hello.cluebackend.domain.assignment.application.AssignmentQueryService; +import hello.cluebackend.domain.assignment.domain.Assignment; +import hello.cluebackend.domain.submission.application.SubmissionQueryService; +import hello.cluebackend.global.common.annotation.CurrentUser; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/assignments") +@RequiredArgsConstructor +@Slf4j +public class AssignmentQueryController { + private final AssignmentQueryService assignmentService; + private final SubmissionQueryService submissionQueryService; + + // 과제 생성 + @PostMapping("") + public ResponseEntity createAssignment(@CurrentUser Long userId, @Valid @RequestBody CreateAssignmentDto request){ + Assignment assignment = assignmentService.save(request.classId(), request); + submissionQueryService.assignToAllStudentsInClassroom(request.classId(), assignment); + return ResponseEntity.ok(assignment); + } + + // 과제 삭제 + @DeleteMapping("/{assignmentId}") + public ResponseEntity deleteAssignment( + @CurrentUser Long userId, + @PathVariable Long assignmentId){ + assignmentService.delete(assignmentId); + return ResponseEntity.ok("과제를 성공적으로 삭제했습니다."); + } + + // 과제 수정 + @PatchMapping("/{assignmentId}") + public ResponseEntity modifyAssignment( + @CurrentUser Long userId, + @PathVariable Long assignmentId, + @Valid @RequestBody ModifyAssignmentDto assignmentDto + ) { + assignmentService.patchAssignment(assignmentId, assignmentDto); + return ResponseEntity.ok("과제를 성공적으로 수정했습니다."); + } + + // 첨부파일 생성 +// @PostMapping("/upload") +// public ResponseEntity uploadAttachment(@CurrentUser Long userId, @RequestBody UploadAttachment request, @RequestParam("file") MultipartFile file +// ) throws IOException { +// submissionQueryService.uploadAttachment(request,file); +// return ResponseEntity.ok("과제 업로드가 성공했습니다."); +// } + + // 첨부파일 삭제 +// @DeleteMapping("/deleteAttachment/{attachmentId}") +// public ResponseEntity deleteAttachment(@CurrentUser Long userId, @PathVariable Long attachmentId, @RequestParam("file") MultipartFile file) throws IOException { +// String filePath = "uploads/" + file.getOriginalFilename(); +// submissionQueryService.deleteAttachment() +// return ResponseEntity.ok("과제를 성공적으로 삭제했습니다."); +// } +} diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/dto/request/CreateAssignmentDto.java b/src/main/java/hello/cluebackend/domain/assignment/api/dto/request/CreateAssignmentDto.java new file mode 100644 index 00000000..b1b54dab --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/api/dto/request/CreateAssignmentDto.java @@ -0,0 +1,15 @@ +package hello.cluebackend.domain.assignment.api.dto.request; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.validation.constraints.NotNull; + +import java.time.LocalDateTime; + +public record CreateAssignmentDto ( + @NotNull @JsonProperty("class_id") Long classId, + @NotNull String title, + @NotNull String content, + @NotNull @JsonProperty("start_date") @JsonFormat(pattern = "yyyy-MM-dd HH:mm") LocalDateTime startDate, + @NotNull @JsonProperty("end_date") @JsonFormat(pattern = "yyyy-MM-dd HH:mm") LocalDateTime endDate +){} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/dto/request/ModifyAssignmentDto.java b/src/main/java/hello/cluebackend/domain/assignment/api/dto/request/ModifyAssignmentDto.java new file mode 100644 index 00000000..02a4695d --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/api/dto/request/ModifyAssignmentDto.java @@ -0,0 +1,18 @@ +package hello.cluebackend.domain.assignment.api.dto.request; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.*; + +import java.time.LocalDateTime; + +@Getter @Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class ModifyAssignmentDto { + private String title; + private String content; + private @JsonProperty("start_date") @JsonFormat(pattern = "yyyy-MM-dd HH:mm") LocalDateTime startDate; + private @JsonProperty("end_date") @JsonFormat(pattern = "yyyy-MM-dd HH:mm") LocalDateTime endDate; +} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/dto/request/UploadAttachment.java b/src/main/java/hello/cluebackend/domain/assignment/api/dto/request/UploadAttachment.java new file mode 100644 index 00000000..55146c73 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/api/dto/request/UploadAttachment.java @@ -0,0 +1,6 @@ +//package hello.cluebackend.domain.assignment.management.api.dto.request; +// +//public class UploadAttachment { +// private final ; +// private final +//} diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentCheck.java b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentCheck.java new file mode 100644 index 00000000..f1b8b09a --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentCheck.java @@ -0,0 +1,15 @@ +package hello.cluebackend.domain.assignment.api.dto.response; + +import lombok.Builder; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +@Builder +public class AssignmentCheck { + private String userName; + private int classNumberGrade; + private boolean isSubmitted; + private LocalDateTime submittedAt; +} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentDto.java b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentDto.java new file mode 100644 index 00000000..e8fdd4f8 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentDto.java @@ -0,0 +1,27 @@ +package hello.cluebackend.domain.assignment.api.dto.response; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@NoArgsConstructor +@Builder +public class AssignmentDto { + private Long assignmentId; + private String title; + private String content; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm") private LocalDateTime startDate; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm") private LocalDateTime endDate; + + public AssignmentDto(Long assignmentId, String title, String content, LocalDateTime startDate, LocalDateTime endDate) { + this.assignmentId = assignmentId; + this.title = title; + this.content = content; + this.startDate = startDate; + this.endDate = endDate; + } +} diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetAllAssignmentDto.java b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetAllAssignmentDto.java new file mode 100644 index 00000000..9f583958 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetAllAssignmentDto.java @@ -0,0 +1,23 @@ +package hello.cluebackend.domain.assignment.api.dto.response; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Builder; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +@Builder +public class GetAllAssignmentDto { + private Long assignmentId; // 과제 아이디 + private String title; // 과제 제목 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm") private LocalDateTime startDate; // 과제 시작일 + @JsonFormat(pattern = "yyyy-MM-dd HH:mm") private LocalDateTime endDate; // 마감일 + + public GetAllAssignmentDto(Long assignmentId, String title, LocalDateTime startDate, LocalDateTime endDate){ + this.assignmentId = assignmentId; + this.title = title; + this.startDate = startDate; + this.endDate = endDate; + } +} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetAllClassRoomAssignmentDto.java b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetAllClassRoomAssignmentDto.java new file mode 100644 index 00000000..3e3db53d --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetAllClassRoomAssignmentDto.java @@ -0,0 +1,23 @@ +package hello.cluebackend.domain.assignment.api.dto.response; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Builder; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +@Builder +public class GetAllClassRoomAssignmentDto { + private Long assignmentId; + private String title; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm") private LocalDateTime startDate; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm") private LocalDateTime endDate; + + public GetAllClassRoomAssignmentDto(Long assignmentId, String title, LocalDateTime startDate, LocalDateTime endDate){ + this.assignmentId = assignmentId; + this.title = title; + this.startDate = startDate; + this.endDate = endDate; + } +} diff --git a/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllSubmissionCheck.java b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetAllSubmissionCheckDto.java similarity index 75% rename from src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllSubmissionCheck.java rename to src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetAllSubmissionCheckDto.java index 8519d2bd..ec7ceea2 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllSubmissionCheck.java +++ b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetAllSubmissionCheckDto.java @@ -1,4 +1,4 @@ -package hello.cluebackend.domain.assignment.management.api.dto.response; +package hello.cluebackend.domain.assignment.api.dto.response; import lombok.AllArgsConstructor; import lombok.Data; @@ -7,7 +7,7 @@ @Data @AllArgsConstructor -public class GetAllSubmissionCheck { +public class GetAllSubmissionCheckDto { private Long submissionId; private Long userId; private String userName; diff --git a/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetSubmissionFile.java b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetSubmissionFileDto.java similarity index 62% rename from src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetSubmissionFile.java rename to src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetSubmissionFileDto.java index a7c89a9b..7e406388 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetSubmissionFile.java +++ b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetSubmissionFileDto.java @@ -1,6 +1,6 @@ -package hello.cluebackend.domain.assignment.management.api.dto.response; +package hello.cluebackend.domain.assignment.api.dto.response; -public class GetSubmissionFile { +public class GetSubmissionFileDto { private Long SubmissionAttachmentId; private String fileName; // 만약 파일이 아닌 url인 경우 url 주소 private int fileSize; // url일 경우 보내지 않음. diff --git a/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetSubmissionResult.java b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetSubmissionResultDto.java similarity index 51% rename from src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetSubmissionResult.java rename to src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetSubmissionResultDto.java index 8212eade..d1ff93a5 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetSubmissionResult.java +++ b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetSubmissionResultDto.java @@ -1,10 +1,10 @@ -package hello.cluebackend.domain.assignment.management.api.dto.response; +package hello.cluebackend.domain.assignment.api.dto.response; import lombok.AllArgsConstructor; import lombok.Data; @Data @AllArgsConstructor -public class GetSubmissionResult { +public class GetSubmissionResultDto { private T SubmissionAttachments; } diff --git a/src/main/java/hello/cluebackend/domain/assignment/application/AssignmentCommandService.java b/src/main/java/hello/cluebackend/domain/assignment/application/AssignmentCommandService.java new file mode 100644 index 00000000..5bd7e23e --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/application/AssignmentCommandService.java @@ -0,0 +1,77 @@ +package hello.cluebackend.domain.assignment.application; + +import hello.cluebackend.domain.assignment.api.dto.response.AssignmentDto; +import hello.cluebackend.domain.assignment.api.dto.response.GetAllAssignmentDto; +import hello.cluebackend.domain.assignment.api.dto.response.GetAllClassRoomAssignmentDto; +import hello.cluebackend.domain.assignment.domain.Assignment; +import hello.cluebackend.domain.assignment.persistence.AssignmentRepository; +import hello.cluebackend.domain.submission.application.SubmissionCommandService; +import hello.cluebackend.domain.classroom.domain.ClassRoom; +import jakarta.persistence.EntityNotFoundException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class AssignmentCommandService{ + private final AssignmentRepository assignmentRepository; + private final SubmissionCommandService submissionCommandService; + + // 사용자가 속한 모든 수업 과제 조회 + public List findAllAssignment(Long userId) { + List assignments = assignmentRepository.getAllByUser(userId); + return assignments.stream() + .map(a -> GetAllAssignmentDto.builder() + .assignmentId(a.getAssignmentId()) + .title(a.getTitle()) + .startDate(a.getStartDate()) + .endDate(a.getEndDate()) + .build() + ) + .toList(); + } + + // 해당 교실에 속한 모든 과제 출력 + public List findAllClassroomAssignment(ClassRoom classRoom) { + List assignments = assignmentRepository.findAllByClassRoom(classRoom); + return assignments.stream() + .map(a -> GetAllClassRoomAssignmentDto.builder() + .assignmentId(a.getAssignmentId()) + .title(a.getTitle()) + .startDate(a.getStartDate()) + .endDate(a.getEndDate()) + .build() + ) + .toList(); + } + + // 과제 ID로 조회 + public AssignmentDto findById(Long assignmentId) { + Assignment a = assignmentRepository.findById(assignmentId) + .orElseThrow(() -> new EntityNotFoundException("Assignment not found : " + assignmentId)); + return AssignmentDto.builder() + .assignmentId(a.getAssignmentId()) + .title(a.getTitle()) + .content(a.getContent()) + .startDate(a.getStartDate()) + .endDate(a.getEndDate()) + .build(); + } + + // +// public List checkIsSubmitted(Assignment assignment) { +// List result = submissionRepository.findByAssignment(assignment); +// return result.stream() +// .map(a -> new GetAllSubmissionCheck(a.getSubmissionId(),a.getUser().getUserId(),a.getUser().getUsername(),a.getUser().getClassCode(),a.getIsSubmitted(),a.getSubmittedAt(),a.getAssignment().getEndDate())) +// .toList(); +// } + +// public Assignment findById(Long assignmentId) { +// return assignmentRepository.findById(assignmentId) +// .orElseThrow(() -> new EntityNotFoundException("Entity not found : " + assignmentId)); +// } +} diff --git a/src/main/java/hello/cluebackend/domain/assignment/application/AssignmentQueryService.java b/src/main/java/hello/cluebackend/domain/assignment/application/AssignmentQueryService.java new file mode 100644 index 00000000..1bee98ae --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/application/AssignmentQueryService.java @@ -0,0 +1,60 @@ +package hello.cluebackend.domain.assignment.application; + +import hello.cluebackend.domain.assignment.api.dto.request.CreateAssignmentDto; +import hello.cluebackend.domain.assignment.api.dto.request.ModifyAssignmentDto; +import hello.cluebackend.domain.assignment.domain.Assignment; +import hello.cluebackend.domain.assignment.persistence.AssignmentRepository; +import hello.cluebackend.domain.classroom.domain.ClassRoom; +import hello.cluebackend.domain.classroom.domain.repository.ClassRoomRepository; +import hello.cluebackend.domain.user.domain.UserEntity; +import hello.cluebackend.domain.user.domain.repository.UserRepository; +import jakarta.persistence.EntityNotFoundException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class AssignmentQueryService{ + private final AssignmentRepository assignmentRepository; + private final UserRepository userRepository; + private final ClassRoomRepository classRoomRepository; + + // 과제 생성 + @Transactional + public Assignment save(Long userId, CreateAssignmentDto request) { + UserEntity user = userRepository.findById(userId) + .orElseThrow(() -> new EntityNotFoundException("해당 사용자를 찾을수 없습니다.")); + ClassRoom classRoom = classRoomRepository.findById(request.classId()) + .orElseThrow(() -> new EntityNotFoundException("해당 교실을 찾을수 없습니다")); + + Assignment assignment = Assignment.builder() + .classRoom(classRoom) + .user(user) + .title(request.title()) + .content(request.content()) + .startDate(request.startDate()) + .endDate(request.endDate()) + .build(); + + assignmentRepository.save(assignment); + return assignment; + } + + // 과제 삭제 + @Transactional + public void delete(Long assignmentId) { + Assignment assignment = assignmentRepository.findById(assignmentId) + .orElseThrow(() -> new EntityNotFoundException("해당 과제를 찾을수 없습니다.")); + assignmentRepository.delete(assignment); + } + + // 과제 수정 + @Transactional + public Assignment patchAssignment(Long id, ModifyAssignmentDto dto){ + Assignment assignment = assignmentRepository.findById(id) + .orElseThrow(() -> new EntityNotFoundException("해당 과제를 찾을수 없습니다.")); + assignment.patch(dto); + return assignment; + } +} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/domain/Assignment.java b/src/main/java/hello/cluebackend/domain/assignment/domain/Assignment.java new file mode 100644 index 00000000..656c7287 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/domain/Assignment.java @@ -0,0 +1,67 @@ +package hello.cluebackend.domain.assignment.domain; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import hello.cluebackend.domain.assignment.api.dto.request.ModifyAssignmentDto; +import hello.cluebackend.domain.submission.domain.Submission; +import hello.cluebackend.domain.classroom.domain.ClassRoom; +import hello.cluebackend.domain.user.domain.UserEntity; +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Table(name = "assignment") +@Getter @Setter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +@Builder +public class Assignment { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "assignment_id") + private Long assignmentId; + + @JsonIgnore + @ManyToOne + @JoinColumn(name = "classroom_id") + private ClassRoom classRoom; + + @JsonIgnore + @ManyToOne + @JoinColumn(name = "user_id") + private UserEntity user; + + @Column(name = "title") + private String title; + + @Column(name = "content") + private String content; + + @Column(name = "start_date") + private LocalDateTime startDate; + + @Column(name = "end_date") + private LocalDateTime endDate; + + @JsonIgnore + @OneToMany(fetch = FetchType.LAZY, mappedBy = "assignment", cascade = CascadeType.REMOVE) + private List submissions = new ArrayList<>(); + + public Assignment(ClassRoom classRoom,UserEntity user,String title, String content, LocalDateTime startDate, LocalDateTime endDate){ + this.classRoom = classRoom; + this.user = user; + this.title = title; + this.content = content; + this.startDate = startDate; + this.endDate = endDate; + } + + public void patch(ModifyAssignmentDto dto) { + if (dto.getTitle() != null) this.title = dto.getTitle(); + if (dto.getContent() != null) this.content = dto.getContent(); + if (dto.getStartDate() != null) this.startDate = dto.getStartDate(); + if (dto.getEndDate() != null) this.endDate = dto.getEndDate(); + } +} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/AssignmentAttachment.java b/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment/AssignmentAttachment.java similarity index 82% rename from src/main/java/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/AssignmentAttachment.java rename to src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment/AssignmentAttachment.java index d88c8224..24db4cd2 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/AssignmentAttachment.java +++ b/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment/AssignmentAttachment.java @@ -1,6 +1,6 @@ -package hello.cluebackend.domain.assignment.management.domain.AssignmentAttachment; +package hello.cluebackend.domain.assignment.domain.AssignmentAttachment; -import hello.cluebackend.domain.assignment.management.domain.Assignment; +import hello.cluebackend.domain.assignment.domain.Assignment; import hello.cluebackend.domain.user.domain.UserEntity; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/AttachmentDocument.java b/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment/AttachmentDocument.java similarity index 88% rename from src/main/java/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/AttachmentDocument.java rename to src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment/AttachmentDocument.java index cc4d4b91..cc2ba3b6 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/AttachmentDocument.java +++ b/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment/AttachmentDocument.java @@ -1,4 +1,4 @@ -package hello.cluebackend.domain.assignment.management.domain.AssignmentAttachment; +package hello.cluebackend.domain.assignment.domain.AssignmentAttachment; import jakarta.persistence.Column; import jakarta.persistence.DiscriminatorValue; diff --git a/src/main/java/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/AttachmentLink.java b/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment/AttachmentLink.java similarity index 82% rename from src/main/java/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/AttachmentLink.java rename to src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment/AttachmentLink.java index 1e6be323..a47fde73 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/management/domain/AssignmentAttachment/AttachmentLink.java +++ b/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment/AttachmentLink.java @@ -1,4 +1,4 @@ -package hello.cluebackend.domain.assignment.management.domain.AssignmentAttachment; +package hello.cluebackend.domain.assignment.domain.AssignmentAttachment; import jakarta.persistence.Column; import jakarta.persistence.DiscriminatorValue; diff --git a/src/main/java/hello/cluebackend/domain/assignment/management/api/AssignmentManagementCommandController.java b/src/main/java/hello/cluebackend/domain/assignment/management/api/AssignmentManagementCommandController.java deleted file mode 100644 index e864236a..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/management/api/AssignmentManagementCommandController.java +++ /dev/null @@ -1,83 +0,0 @@ -package hello.cluebackend.domain.assignment.management.api; - -import hello.cluebackend.domain.assignment.management.api.dto.response.GetAllAssignmentResponse; -import hello.cluebackend.domain.assignment.management.api.dto.response.GetAllAssignmentResponseResult; -import hello.cluebackend.domain.assignment.management.application.AssignmentCommandService; -import hello.cluebackend.domain.assignment.participation.application.SubmissionCommandService; -import hello.cluebackend.domain.user.domain.repository.UserRepository; -import hello.cluebackend.global.config.JWTUtil; -import jakarta.servlet.http.HttpServletRequest; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -@RestController -@RequestMapping("/api/assignment") -@RequiredArgsConstructor -@Slf4j -public class AssignmentManagementCommandController { - private final JWTUtil jwtUtil; - private final AssignmentCommandService assignmentCommandService; - private final UserRepository userRepository; - private final SubmissionCommandService submissionCommandService; - - // 사용자가 속한 모든 수업 과제 조회 - @GetMapping("/assignments/me") - public ResponseEntity getAllAssignments(HttpServletRequest request) { - String token = jwtUtil.getToken(request); - Long userId = jwtUtil.getUserId(token); - List result = assignmentCommandService.findAllAssignment(userId); - return ResponseEntity.ok(new GetAllAssignmentResponseResult(result)); - } - - // -// @GetMapping("/getAllAssignments/{classId}") -// public ResponseEntity getAllClassroomAssignment(HttpServletRequest request, @PathVariable Long classId) { -// try{ -// String token = jwtUtil.getToken(request); -// Long userId = jwtUtil.getUserId(token); -// return ResponseEntity.ok(new GetAllClassRoomAssignmentResponseResult(assignmentCommandService.findAllClassroomAssignment(classId))); -// }catch (Exception e){ -// log.error("Failed to retrieve assignments in classroom for user", e); -// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); -// } -// } - - // TODO : 특정 과제 학생 제출 여부 전체 조회, 학습실 - 과제 - 확인(T) -// @GetMapping("/checkAssignment/{assignmentId}") -// public ResponseEntity getAllSubmissionCheck(HttpServletRequest request, @PathVariable Long assignmentId) { -// try { -// String token = jwtUtil.getToken(request); -// Long userId = jwtUtil.getUserId(token); -// -// Assignment assignment = assignmentCommandService.findById(assignmentId); -// return ResponseEntity.ok(new GetAllSubmissionCheckResult(assignmentCommandService.checkIsSubmitted(assignment);)); -// }catch (Exception e){ -// log.error("Failed to retrieve assignments in classroom for user", e); -// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); -// } -// } - - // TODO : 개인 제출 과제 보기, 학습실 - 과제 - 채점(T) -// @GetMapping("/getAssignment/{submissionId}") -// public ResponseEntity getSubmission(HttpServletRequest request, @PathVariable Long submissionId) { -// try { -// String token = jwtUtil.getToken(request); -// Long userId = jwtUtil.getUserId(token); -// -// Submission submission = submissionCommandService.findById(submissionId); -// GetSubmissionFile result = submissionCommandService.getSubmissionGrade(submission); -// -// return ResponseEntity.ok(new GetSubmissionResult(result)); -// }catch (Exception e){ -// log.error("Failed to retrieve assignments in classroom for user", e); -// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); -// } -// } -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/management/api/AssignmentManagementQueryController.java b/src/main/java/hello/cluebackend/domain/assignment/management/api/AssignmentManagementQueryController.java deleted file mode 100644 index 38422431..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/management/api/AssignmentManagementQueryController.java +++ /dev/null @@ -1,31 +0,0 @@ -package hello.cluebackend.domain.assignment.management.api; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/api/assignment/teacher") -@RequiredArgsConstructor -@Slf4j -public class AssignmentManagementQueryController { - - // 과제 생성 - - - // 과제 삭제 - - // 과제 수정 - - // TODO : 과제 생성하기, 과제생성/수정 - - // TODO : 과제 첨부 파일 넣기, 과제생성/수정 - - // TODO : 과제 첨부 삭제하기, 과제생성/수정 - - // TODO : 과제 수정하기, 과제생성/수정 - - // TODO : 과제 삭제하기, 학습실 - 과제 (T) - -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllAssignmentResponse.java b/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllAssignmentResponse.java deleted file mode 100644 index 2930e691..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllAssignmentResponse.java +++ /dev/null @@ -1,15 +0,0 @@ -package hello.cluebackend.domain.assignment.management.api.dto.response; - -import lombok.AllArgsConstructor; -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -@AllArgsConstructor -public class GetAllAssignmentResponse { - private Long assignmentId; // 과제 아이디 - private String title; // 과제 제목 - private LocalDateTime startDate; // 과제 시작일 - private LocalDateTime endDate; // 남은 시간 -} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllAssignmentResponseResult.java b/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllAssignmentResponseResult.java deleted file mode 100644 index 0c364cfb..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllAssignmentResponseResult.java +++ /dev/null @@ -1,10 +0,0 @@ -package hello.cluebackend.domain.assignment.management.api.dto.response; - -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class GetAllAssignmentResponseResult { - private T assignments; -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponse.java b/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponse.java deleted file mode 100644 index 066ce75d..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package hello.cluebackend.domain.assignment.management.api.dto.response; - -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -public class GetAllClassRoomAssignmentResponse { - private Long assignmentId; - private boolean allSubmitted; - private String title; - private LocalDateTime startDate; - private LocalDateTime endDate; - - public GetAllClassRoomAssignmentResponse(Long assignmentId, String title, LocalDateTime startDate, LocalDateTime endDate){ - this.assignmentId = assignmentId; - this.title = title; - this.startDate = startDate; - this.endDate = endDate; -// this.allSubmitted = //새로운 sql 호출 - } -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponseResult.java b/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponseResult.java deleted file mode 100644 index 800c9a9e..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllClassRoomAssignmentResponseResult.java +++ /dev/null @@ -1,10 +0,0 @@ -package hello.cluebackend.domain.assignment.management.api.dto.response; - -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class GetAllClassRoomAssignmentResponseResult { - private T assignments; -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllSubmissionCheckResult.java b/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllSubmissionCheckResult.java deleted file mode 100644 index 789fef02..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/management/api/dto/response/GetAllSubmissionCheckResult.java +++ /dev/null @@ -1,5 +0,0 @@ -package hello.cluebackend.domain.assignment.management.api.dto.response; - -public class GetAllSubmissionCheckResult { - private T assignments; -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/management/application/AssignmentCommandService.java b/src/main/java/hello/cluebackend/domain/assignment/management/application/AssignmentCommandService.java deleted file mode 100644 index 25641315..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/management/application/AssignmentCommandService.java +++ /dev/null @@ -1,56 +0,0 @@ -package hello.cluebackend.domain.assignment.management.application; - -import hello.cluebackend.domain.assignment.management.api.dto.response.GetAllAssignmentResponse; -import hello.cluebackend.domain.assignment.management.api.dto.response.GetAllClassRoomAssignmentResponse; -import hello.cluebackend.domain.assignment.management.domain.Assignment; -import hello.cluebackend.domain.assignment.management.persistence.AssignmentRepository; -import hello.cluebackend.domain.assignment.participation.persistence.SubmissionRepository; -import hello.cluebackend.domain.classroom.domain.ClassRoom; -import hello.cluebackend.domain.classroom.domain.repository.ClassRoomRepository; -import hello.cluebackend.domain.classroom.service.ClassRoomService; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -@Service -@RequiredArgsConstructor -@Transactional(readOnly = true) -public class AssignmentCommandService{ - private final AssignmentRepository assignmentRepository; - private final ClassRoomService classRoomService; - private final ClassRoomRepository classRoomRepository; - private final SubmissionRepository submissionRepository; - - // 사용자가 속한 모든 수업 과제 조회 - public List findAllAssignment(Long userId) { - List assignments = assignmentRepository.getAllByUser(userId); - return assignments.stream() - .map(a -> new GetAllAssignmentResponse(a.getAssignmentId(), a.getTitle(), a.getStartDate(), a.getEndDate())) - .toList(); - } - - // 해당 교실에 속한 모든 과제 출력( 마감이 된 과제도 반환한다.) - public List findAllClassroomAssignment(Long classId) { - ClassRoom classRoom = classRoomRepository.findByClassRoomId(classId); // 나중에 Service 코드로 바꿔야 함. - List assignments = assignmentRepository.getAllClassroomAssignmentByUser(classRoom); - List result = assignments.stream() - .map(a -> new GetAllClassRoomAssignmentResponse(a.getAssignmentId(), a.getTitle(), a.getStartDate(), a.getEndDate())) // 모든 학생 제출 여부 코드 만들어야 함! - .toList(); - return result; - } - - -// public List checkIsSubmitted(Assignment assignment) { -// List result = submissionRepository.findByAssignment(assignment); -// return result.stream() -// .map(a -> new GetAllSubmissionCheck(a.getSubmissionId(),a.getUser().getUserId(),a.getUser().getUsername(),a.getUser().getClassCode(),a.getIsSubmitted(),a.getSubmittedAt(),a.getAssignment().getEndDate())) -// .toList(); -// } - -// public Assignment findById(Long assignmentId) { -// return assignmentRepository.findById(assignmentId) -// .orElseThrow(() -> new EntityNotFoundException("Entity not found : " + assignmentId)); -// } -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/management/application/AssignmentQueryService.java b/src/main/java/hello/cluebackend/domain/assignment/management/application/AssignmentQueryService.java deleted file mode 100644 index ffdace78..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/management/application/AssignmentQueryService.java +++ /dev/null @@ -1,15 +0,0 @@ -package hello.cluebackend.domain.assignment.management.application; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -@RequiredArgsConstructor -@Transactional(readOnly = false) -public class AssignmentQueryService{ - // 과제 생성 - - // 과제 수정 - -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/management/domain/Assignment.java b/src/main/java/hello/cluebackend/domain/assignment/management/domain/Assignment.java deleted file mode 100644 index a4ac9ad3..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/management/domain/Assignment.java +++ /dev/null @@ -1,40 +0,0 @@ -package hello.cluebackend.domain.assignment.management.domain; - -import hello.cluebackend.domain.classroom.domain.ClassRoom; -import hello.cluebackend.domain.user.domain.UserEntity; -import jakarta.persistence.*; -import lombok.*; - -import java.time.LocalDateTime; - -@Entity -@Table(name = "assignment") -@Getter @Setter -@Builder -@AllArgsConstructor -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Assignment { - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "assignment_id") - private Long assignmentId; - - @ManyToOne - @JoinColumn(name = "classroom_id") - private ClassRoom classRoom; - - @ManyToOne - @JoinColumn(name = "user_id") - private UserEntity user; - - @Column(name = "title") - private String title; - - @Column(name = "content") - private String content; - - @Column(name = "start_date") - private LocalDateTime startDate; - - @Column(name = "end_date") - private LocalDateTime endDate; -} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/participation/api/AssignmentParticipationCommandController.java b/src/main/java/hello/cluebackend/domain/assignment/participation/api/AssignmentParticipationCommandController.java deleted file mode 100644 index 28070a66..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/participation/api/AssignmentParticipationCommandController.java +++ /dev/null @@ -1,23 +0,0 @@ -package hello.cluebackend.domain.assignment.participation.api; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/api/assignment/student") -@RequiredArgsConstructor -@Slf4j -public class AssignmentParticipationCommandController { - // 제출한 과제 전체 조회 - - // 제출한 과제 조회 - - // TODO : 메인 페이지 학생 미제출 과제 전체 조회, 메인 - - // TODO : 수업실 과제 전체 조회 및 학생 첨부 파일 전체 조회, 학습실 - 과제 - - // TODO : 수업실 과제 단일 세부 조회 및 학생,선생 첨부 파일 전체 조회 , 학습실 - 과제세부확인 - -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/participation/api/AssignmentParticipationQueryController.java b/src/main/java/hello/cluebackend/domain/assignment/participation/api/AssignmentParticipationQueryController.java deleted file mode 100644 index 7e514d9b..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/participation/api/AssignmentParticipationQueryController.java +++ /dev/null @@ -1,27 +0,0 @@ -package hello.cluebackend.domain.assignment.participation.api; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/api/assignment/student") -@RequiredArgsConstructor -@Slf4j -public class AssignmentParticipationQueryController { - // 제출한 과제 생성 - - // 제출한 과제 수정 - - // 제출한 과제 삭제 - - // TODO : 과제 파일 업로드 하기 - - // TODO : 과제 첨부 파일 삭제하기 - - // TODO : 과제 제출하기 - - // TODO : 과제 제출 취소하기 - -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/participation/application/SubmissionCommandService.java b/src/main/java/hello/cluebackend/domain/assignment/participation/application/SubmissionCommandService.java deleted file mode 100644 index 4e5268f7..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/participation/application/SubmissionCommandService.java +++ /dev/null @@ -1,23 +0,0 @@ -package hello.cluebackend.domain.assignment.participation.application; - -import hello.cluebackend.domain.assignment.management.api.dto.response.GetSubmissionFile; -import hello.cluebackend.domain.assignment.participation.domain.Submission; -import hello.cluebackend.domain.assignment.participation.persistence.SubmissionRepository; -import jakarta.persistence.EntityNotFoundException; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class SubmissionCommandService { - private final SubmissionRepository submissionRepository; - -// public Submission findById(Long submissionId) { -// return submissionRepository.findById(submissionId) -// .orElseThrow(() -> new EntityNotFoundException("Submission not found : " + submissionId)); -// } -// -// public GetSubmissionFile getSubmissionGrade(Submission submission) { -// -// } -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/participation/application/SubmissionQueryService.java b/src/main/java/hello/cluebackend/domain/assignment/participation/application/SubmissionQueryService.java deleted file mode 100644 index 0481b986..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/participation/application/SubmissionQueryService.java +++ /dev/null @@ -1,4 +0,0 @@ -package hello.cluebackend.domain.assignment.participation.application; - -public class SubmissionQueryService { -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/participation/domain/Submission.java b/src/main/java/hello/cluebackend/domain/assignment/participation/domain/Submission.java deleted file mode 100644 index 3d4a9b98..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/participation/domain/Submission.java +++ /dev/null @@ -1,34 +0,0 @@ -package hello.cluebackend.domain.assignment.participation.domain; - -import hello.cluebackend.domain.assignment.management.domain.Assignment; -import hello.cluebackend.domain.user.domain.UserEntity; -import jakarta.persistence.*; -import lombok.*; - -import java.time.LocalDateTime; - -@Entity -@Table(name = "submission") -@Getter @Setter -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class Submission { - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "submission_id") - private Long submissionId; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "assignment_id") - private Assignment assignment; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id") - private UserEntity user; - - @Column(name = "is_submitted") - private Boolean isSubmitted; - - @Column(name = "submitted_at", nullable = true) - private LocalDateTime submittedAt; -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/participation/persistence/SubmissionAttachmentRepository.java b/src/main/java/hello/cluebackend/domain/assignment/participation/persistence/SubmissionAttachmentRepository.java deleted file mode 100644 index 3e85e3c7..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/participation/persistence/SubmissionAttachmentRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package hello.cluebackend.domain.assignment.participation.persistence; - -import hello.cluebackend.domain.assignment.management.api.dto.response.GetSubmissionFile; -import hello.cluebackend.domain.assignment.participation.domain.Submission; -import hello.cluebackend.domain.assignment.participation.domain.SubmissionAttachment.SubmissionAttachment; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public interface SubmissionAttachmentRepository extends JpaRepository { - -} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/participation/persistence/SubmissionRepository.java b/src/main/java/hello/cluebackend/domain/assignment/participation/persistence/SubmissionRepository.java deleted file mode 100644 index ea15e701..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/participation/persistence/SubmissionRepository.java +++ /dev/null @@ -1,14 +0,0 @@ -package hello.cluebackend.domain.assignment.participation.persistence; - -import hello.cluebackend.domain.assignment.management.domain.Assignment; -import hello.cluebackend.domain.assignment.participation.domain.Submission; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public interface SubmissionRepository extends JpaRepository { -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/management/persistence/AssignmentRepository.java b/src/main/java/hello/cluebackend/domain/assignment/persistence/AssignmentRepository.java similarity index 56% rename from src/main/java/hello/cluebackend/domain/assignment/management/persistence/AssignmentRepository.java rename to src/main/java/hello/cluebackend/domain/assignment/persistence/AssignmentRepository.java index aa099d72..1726ff73 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/management/persistence/AssignmentRepository.java +++ b/src/main/java/hello/cluebackend/domain/assignment/persistence/AssignmentRepository.java @@ -1,8 +1,7 @@ -package hello.cluebackend.domain.assignment.management.persistence; +package hello.cluebackend.domain.assignment.persistence; -import hello.cluebackend.domain.assignment.management.domain.Assignment; +import hello.cluebackend.domain.assignment.domain.Assignment; import hello.cluebackend.domain.classroom.domain.ClassRoom; -import hello.cluebackend.domain.user.domain.UserEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -13,13 +12,14 @@ @Repository public interface AssignmentRepository extends JpaRepository { @Query("SELECT a FROM Submission s" + - " join fetch s.assignment a" + + " join s.assignment a" + " where s.user.userId =:userId" + " AND s.isSubmitted = false") List getAllByUser(@Param("userId") Long userId); - @Query("select a from Assignment a " + - "join fetch a.classRoom " + - "where a.classRoom =:classRoom") - List getAllClassroomAssignmentByUser(@Param("classRoom") ClassRoom classRoom); + Assignment findByAssignmentId(Long assignmentId); + + List findByClassRoom(ClassRoom classRoom); + + List findAllByClassRoom(ClassRoom classRoom); } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/management/persistence/AssignmentAttachmentRepository.java b/src/main/java/hello/cluebackend/domain/assignment/persistence/assignmentDocument/AssignmentAttachmentRepository.java similarity index 56% rename from src/main/java/hello/cluebackend/domain/assignment/management/persistence/AssignmentAttachmentRepository.java rename to src/main/java/hello/cluebackend/domain/assignment/persistence/assignmentDocument/AssignmentAttachmentRepository.java index c280aa4b..0e64d7d8 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/management/persistence/AssignmentAttachmentRepository.java +++ b/src/main/java/hello/cluebackend/domain/assignment/persistence/assignmentDocument/AssignmentAttachmentRepository.java @@ -1,9 +1,10 @@ -package hello.cluebackend.domain.assignment.management.persistence; +package hello.cluebackend.domain.assignment.persistence.assignmentDocument; -import hello.cluebackend.domain.assignment.management.domain.AssignmentAttachment.AssignmentAttachment; +import hello.cluebackend.domain.assignment.domain.AssignmentAttachment.AssignmentAttachment; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface AssignmentAttachmentRepository extends JpaRepository { + } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/persistence/assignmentDocument/AttachmentDocumentRepository.java b/src/main/java/hello/cluebackend/domain/assignment/persistence/assignmentDocument/AttachmentDocumentRepository.java new file mode 100644 index 00000000..6b774c38 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/persistence/assignmentDocument/AttachmentDocumentRepository.java @@ -0,0 +1,8 @@ +package hello.cluebackend.domain.assignment.persistence.assignmentDocument; + +import hello.cluebackend.domain.assignment.domain.AssignmentAttachment.AttachmentDocument; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface AttachmentDocumentRepository extends JpaRepository { + +} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/persistence/assignmentDocument/AttachmentLinkRepository.java b/src/main/java/hello/cluebackend/domain/assignment/persistence/assignmentDocument/AttachmentLinkRepository.java new file mode 100644 index 00000000..eb4c24ec --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/persistence/assignmentDocument/AttachmentLinkRepository.java @@ -0,0 +1,8 @@ +package hello.cluebackend.domain.assignment.persistence.assignmentDocument; + +import hello.cluebackend.domain.assignment.domain.AssignmentAttachment.AttachmentLink; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface AttachmentLinkRepository extends JpaRepository { + +} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/classroom/presentation/ClassRoomController.java b/src/main/java/hello/cluebackend/domain/classroom/presentation/ClassRoomController.java index 3a023274..f2a1179f 100644 --- a/src/main/java/hello/cluebackend/domain/classroom/presentation/ClassRoomController.java +++ b/src/main/java/hello/cluebackend/domain/classroom/presentation/ClassRoomController.java @@ -1,12 +1,17 @@ package hello.cluebackend.domain.classroom.presentation; +import hello.cluebackend.domain.assignment.api.dto.response.GetAllClassRoomAssignmentDto; +import hello.cluebackend.domain.assignment.application.AssignmentCommandService; +import hello.cluebackend.domain.classroom.domain.ClassRoom; import hello.cluebackend.domain.classroom.presentation.dto.ClassRoomCardDto; import hello.cluebackend.domain.classroom.presentation.dto.ClassRoomDto; import hello.cluebackend.domain.classroom.service.ClassRoomService; import hello.cluebackend.domain.user.domain.Role; +import hello.cluebackend.global.common.annotation.CurrentUser; import hello.cluebackend.global.config.JWTUtil; import jakarta.persistence.EntityNotFoundException; import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -18,14 +23,11 @@ @Slf4j @RestController @RequestMapping("/api/class") +@RequiredArgsConstructor public class ClassRoomController { private final JWTUtil jwtUtil; private final ClassRoomService classRoomService; - - public ClassRoomController(JWTUtil jwtUtil, ClassRoomService classRoomService) { - this.jwtUtil = jwtUtil; - this.classRoomService = classRoomService; - } + private final AssignmentCommandService assignmentCommandService; @GetMapping public ResponseEntity> getAllClassRooms(HttpServletRequest request){ @@ -43,6 +45,14 @@ public ResponseEntity getAllInfo(HttpServletRequest request, @PathVariable Lo return ResponseEntity.ok(classRoomService.getAllInfo(classId)); } + // 교실 과제 전체 조회 + @GetMapping("/{classId}/assignments") + public ResponseEntity> getAllClassroomAssignment(@CurrentUser Long userId, @PathVariable Long classId) { + ClassRoom classRoom = classRoomService.findById(classId).toEntity(); + List result = assignmentCommandService.findAllClassroomAssignment(classRoom); + return ResponseEntity.ok(result); + } + @PostMapping public ResponseEntity> createClassRoom(@RequestBody ClassRoomDto classRoomDTO, HttpServletRequest request) { String token = jwtUtil.getToken(request); diff --git a/src/main/java/hello/cluebackend/domain/classroomuser/application/ClassroomUserService.java b/src/main/java/hello/cluebackend/domain/classroomuser/application/ClassroomUserService.java new file mode 100644 index 00000000..675b15be --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/classroomuser/application/ClassroomUserService.java @@ -0,0 +1,25 @@ +package hello.cluebackend.domain.classroomuser.application; + +import hello.cluebackend.domain.classroom.domain.ClassRoom; +import hello.cluebackend.domain.classroomuser.domain.ClassRoomUser; +import hello.cluebackend.domain.classroomuser.domain.repository.ClassRoomUserRepository; +import hello.cluebackend.domain.user.domain.UserEntity; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class ClassroomUserService { + private final ClassRoomUserRepository classRoomUserRepository; + + // 해당 교실에 속한 모든 사용자 조회 + public List findAllClassroomUser(ClassRoom classRoom){ + List classRoomUsers = classRoomUserRepository.findAllByClassRoom(classRoom); + List users = classRoomUsers.stream() + .map(cru -> cru.getUser()) + .toList(); + return users; + } +} diff --git a/src/main/java/hello/cluebackend/domain/classroomuser/domain/repository/ClassRoomUserRepository.java b/src/main/java/hello/cluebackend/domain/classroomuser/domain/repository/ClassRoomUserRepository.java index cc6f7701..2cb5feef 100644 --- a/src/main/java/hello/cluebackend/domain/classroomuser/domain/repository/ClassRoomUserRepository.java +++ b/src/main/java/hello/cluebackend/domain/classroomuser/domain/repository/ClassRoomUserRepository.java @@ -25,4 +25,6 @@ public interface ClassRoomUserRepository extends JpaRepository findAllStudentsByClassRoomId(Long classRoomId); List user(UserEntity user); + + List findAllByClassRoom(ClassRoom classRoom); } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/submission/api/SubmissionCommandController.java b/src/main/java/hello/cluebackend/domain/submission/api/SubmissionCommandController.java new file mode 100644 index 00000000..b7018c6d --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/submission/api/SubmissionCommandController.java @@ -0,0 +1,74 @@ +package hello.cluebackend.domain.submission.api; + +import hello.cluebackend.domain.submission.api.dto.response.SubmissionDto; +import hello.cluebackend.domain.submission.application.SubmissionCommandService; +import hello.cluebackend.domain.submission.domain.Submission; +import hello.cluebackend.global.common.annotation.CurrentUser; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/api/submissions") +@RequiredArgsConstructor +@Slf4j +public class SubmissionCommandController { + private final SubmissionCommandService submissionCommandService; + + // 할당된 과제 전체 조회 + @GetMapping("/assignment/{assignmentId}") + public ResponseEntity> findAllSubmission(@CurrentUser Long id, @PathVariable Long assignmentId) { + List submissions = submissionCommandService.findAllByAssignmentId(assignmentId); + + List result = submissions.stream() + .map(s -> SubmissionDto.builder() + .title(s.getAssignment().getTitle()) + .startDate(s.getAssignment().getStartDate()) + .endDate(s.getAssignment().getEndDate()) + .userName(s.getUser().getUsername()) + .isSubmitted(s.getIsSubmitted()) + .submittedAt(s.getSubmittedAt()) + .build() + ) + .toList(); + + return ResponseEntity.ok(result); + } + + // 할당된 과제 단일 조회 + @GetMapping("/{submissionId}") + public ResponseEntity findSubmission(@CurrentUser Long id, @PathVariable Long assignmentId) { + + Submission s = submissionCommandService.findByAssignmentId(assignmentId); + + SubmissionDto result = SubmissionDto.builder() + .title(s.getAssignment().getTitle()) + .startDate(s.getAssignment().getStartDate()) + .endDate(s.getAssignment().getEndDate()) + .userName(s.getUser().getUsername()) + .isSubmitted(s.getIsSubmitted()) + .submittedAt(s.getSubmittedAt()) + .build(); + + return ResponseEntity.ok(result); + } + + // 할당된 과제의 파일 전체 조회 + + + // TODO : 메인 페이지 학생 미제출 과제 전체 조회, 메인 + + + // TODO : 수업실 과제 전체 조회 및 학생 첨부 파일 전체 조회, 학습실 - 과제 + + + // TODO : 수업실 과제 단일 세부 조회 및 학생,선생 첨부 파일 전체 조회 , 학습실 - 과제세부확인 + + +} diff --git a/src/main/java/hello/cluebackend/domain/submission/api/SubmissionQueryController.java b/src/main/java/hello/cluebackend/domain/submission/api/SubmissionQueryController.java new file mode 100644 index 00000000..f82eefe0 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/submission/api/SubmissionQueryController.java @@ -0,0 +1,56 @@ +package hello.cluebackend.domain.submission.api; + +import hello.cluebackend.domain.submission.application.SubmissionQueryService; +import hello.cluebackend.global.common.annotation.CurrentUser; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/submissions") +@RequiredArgsConstructor +@Slf4j +public class SubmissionQueryController { + private final SubmissionQueryService submissionQueryService; + + // 과제 제출 하기 + @PatchMapping("/{submissionId}/submit") + public ResponseEntity submitSubmission( + @CurrentUser Long userId, + @PathVariable Long submissionId + ) { + submissionQueryService.submitSubmission(submissionId); + return ResponseEntity.ok("성공적으로 과제가 제출되었습니다."); + } + + // 과제 제출 취소하기 + @PatchMapping("/{submissionId}/cancel") + public ResponseEntity cancelSubmission( + @CurrentUser Long userId, + @PathVariable Long submissionId + ){ + submissionQueryService.cancelSubmission(submissionId); + return ResponseEntity.ok("과제 제출이 취소되었습니다."); + } + + // TODO : 과제 파일 업로드 하기 +// @PostMapping("/{submissionId}/upload") +// public ResponseEntity fileUpload( +// @CurrentUser Long userId, +// @PathVariable Long submissionId, +// @RequestBody MultipartFile file +// ) { +// submissionQueryService.fileUpload(submissionId, file); +// return ResponseEntity.ok("첨부파일 업로드가 성공적으로 이뤄졌습니다."); +// } + + // TODO : 과제 첨부 파일 삭제하기 +// @DeleteMapping("/{submissionAttachmentId}/delete") +// public ResponseEntity deleteFile( +// @PathVariable Long submissionAttachmentId +// ) { +// submissionQueryService.deletefile(submissionAttachmentId); +// return ResponseEntity.ok("첨부 파일 삭제"); +// } +} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/submission/api/dto/request/modifySubmissionDto.java b/src/main/java/hello/cluebackend/domain/submission/api/dto/request/modifySubmissionDto.java new file mode 100644 index 00000000..e4312689 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/submission/api/dto/request/modifySubmissionDto.java @@ -0,0 +1,5 @@ +package hello.cluebackend.domain.submission.api.dto.request; + +public record modifySubmissionDto( + boolean isSubmitted +) {} diff --git a/src/main/java/hello/cluebackend/domain/submission/api/dto/response/SubmissionDto.java b/src/main/java/hello/cluebackend/domain/submission/api/dto/response/SubmissionDto.java new file mode 100644 index 00000000..62467c85 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/submission/api/dto/response/SubmissionDto.java @@ -0,0 +1,28 @@ +package hello.cluebackend.domain.submission.api.dto.response; + +import lombok.*; + +import java.time.LocalDateTime; + +@AllArgsConstructor +@Data +@Builder +public class SubmissionDto { + // 과제 데이터 + private String title; + private LocalDateTime startDate; + private LocalDateTime endDate; + + // 유저 정보 + private String userName; + + // 제출 정보 + private boolean isSubmitted; + private LocalDateTime submittedAt; + + // 과제 정보 + + + // 과제 첨부파일 정보 + +} diff --git a/src/main/java/hello/cluebackend/domain/submission/application/SubmissionCommandService.java b/src/main/java/hello/cluebackend/domain/submission/application/SubmissionCommandService.java new file mode 100644 index 00000000..dcce52fa --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/submission/application/SubmissionCommandService.java @@ -0,0 +1,59 @@ +package hello.cluebackend.domain.submission.application; + +import hello.cluebackend.domain.assignment.api.dto.response.AssignmentCheck; +import hello.cluebackend.domain.assignment.domain.Assignment; +import hello.cluebackend.domain.assignment.persistence.AssignmentRepository; +import hello.cluebackend.domain.submission.domain.Submission; +import hello.cluebackend.domain.submission.persistence.SubmissionRepository; +import jakarta.persistence.EntityNotFoundException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class SubmissionCommandService { + private final SubmissionRepository submissionRepository; + private final AssignmentRepository assignmentRepository; + + // 과제 제출 여부 확인 API + public List checkAssignment(Long assignmentId) { + Assignment assignment = assignmentRepository.findById(assignmentId).orElseThrow(() -> new EntityNotFoundException("해당 과제를 찾을수 없습니다.")); + List submissions = submissionRepository.findAllByAssignment(assignment); + return submissions.stream() + .map(s -> AssignmentCheck.builder() + .userName(s.getUser().getUsername()) + .classNumberGrade(s.getUser().getClassCode()) + .isSubmitted(s.getIsSubmitted()) + .submittedAt(s.getSubmittedAt()) + .build() + ) + .toList(); + } + + public List findAllByAssignmentId(Long assignmentId) { + Assignment assignment = assignmentRepository.findById(assignmentId) + .orElseThrow(() -> new EntityNotFoundException("해당 과제를 찾을수 없습니다.")); + + List result = submissionRepository.findAllByAssignment(assignment); + return result; + } + + public Submission findByAssignmentId(Long assignmentId) { + Assignment assignment = assignmentRepository.findById(assignmentId) + .orElseThrow(() -> new EntityNotFoundException("해당 과제를 찾을수 없습니다.")); + + Submission result = submissionRepository.findByAssignment(assignment); + return result; + } + +// public Submission findById(Long submissionId) { +// return submissionRepository.findById(submissionId) +// .orElseThrow(() -> new EntityNotFoundException("Submission not found : " + submissionId)); +// } +// +// public GetSubmissionFile getSubmissionGrade(Submission submission) { +// +// } +} diff --git a/src/main/java/hello/cluebackend/domain/submission/application/SubmissionQueryService.java b/src/main/java/hello/cluebackend/domain/submission/application/SubmissionQueryService.java new file mode 100644 index 00000000..25a4809c --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/submission/application/SubmissionQueryService.java @@ -0,0 +1,75 @@ +package hello.cluebackend.domain.submission.application; + +import hello.cluebackend.domain.assignment.domain.Assignment; +import hello.cluebackend.domain.submission.domain.Submission; +import hello.cluebackend.domain.submission.persistence.submissionAttachment.SubmissionAttachmentRepository; +import hello.cluebackend.domain.submission.persistence.SubmissionRepository; +import hello.cluebackend.domain.classroom.domain.ClassRoom; +import hello.cluebackend.domain.classroom.service.ClassRoomService; +import hello.cluebackend.domain.classroomuser.application.ClassroomUserService; +import hello.cluebackend.domain.user.domain.UserEntity; +import jakarta.persistence.EntityNotFoundException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +@Service +@RequiredArgsConstructor +@Transactional +public class SubmissionQueryService { + private final SubmissionAttachmentRepository submissionAttachmentRepository; + private final SubmissionRepository submissionRepository; + private final ClassroomUserService classroomUserService; + private final ClassRoomService classRoomService; + + // 해당 교실 모든 학생에게 과제 부여 + @Transactional + public void assignToAllStudentsInClassroom(Long classroomId, Assignment assignment){ + ClassRoom classRoom = classRoomService.findById(classroomId).toEntity(); + List users = classroomUserService.findAllClassroomUser(classRoom); + List submissions = users.stream() + .map(u -> new Submission(assignment, u, false, null)) + .toList(); + submissionRepository.saveAll(submissions); + } + + // 과제 제출하기 + @Transactional + public Submission submitSubmission(Long submissionId) { + Submission submission = submissionRepository.findById(submissionId) + .orElseThrow(() -> new EntityNotFoundException("해당 제출 과제를 찾을수 없습니다.")); + submission.submit(); + return submissionRepository.save(submission); + } + + @Transactional + public Submission cancelSubmission(Long submissionId) { + Submission submission = submissionRepository.findById(submissionId) + .orElseThrow(() -> new EntityNotFoundException("해당 제출 과제를 찾을수 없습니다.")); + submission.cancel(); + return submissionRepository.save(submission); + } + + // 파일 업로드 + @Transactional + public void fileUpload(Long submissionId, MultipartFile file) { + Submission submission = submissionRepository.findById(submissionId) + .orElseThrow(() -> new EntityNotFoundException("해당 제출 과제를 찾을수 없습니다.")); + } + +// @Transactional +// public void deletefile(Long submissionAttachmentId) { +// SubmissionAttachment submission = submissionAttachmentRepository.findById(submissionAttachmentId) +// .orElseThrow(() -> new EntityNotFoundException("해당 첨부파일을 찾을수 없습니다.")); +// } + +// public void uploadAttachment(UploadAttachment request, MultipartFile file) { +// String filePath = "uploads/" + file.getOriginalFilename(); + // UUID 값으로 이름 변경 +// file.transferTo(new java.io.File(filePath)); +// submissionAttachmentRepository.save() +// } +} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/submission/domain/Submission.java b/src/main/java/hello/cluebackend/domain/submission/domain/Submission.java new file mode 100644 index 00000000..205aaf56 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/submission/domain/Submission.java @@ -0,0 +1,60 @@ +package hello.cluebackend.domain.submission.domain; + +import hello.cluebackend.domain.assignment.domain.Assignment; +import hello.cluebackend.domain.user.domain.UserEntity; +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "submission") +@Getter @Setter +@AllArgsConstructor +@Builder +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Submission { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "submission_id") + private Long submissionId; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "assignment_id") + private Assignment assignment; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private UserEntity user; + + @Column(name = "is_submitted") + private boolean isSubmitted; + + @Column(name = "submitted_at", nullable = true) + private LocalDateTime submittedAt; + + public Submission(Assignment assignment, UserEntity user, boolean isSubmitted, LocalDateTime submittedAt){ + if(assignment != null) { changeAssignment(assignment); } + this.user = user; + this.isSubmitted = isSubmitted; + this.submittedAt = submittedAt; + } + + public void changeAssignment(Assignment assignment){ + this.assignment = assignment; + assignment.getSubmissions().add(this); + } + + // 과제 제출 취소 + public void cancel(){ + this.isSubmitted = false; + } + + // 과제 제출 + public void submit(){ + this.isSubmitted = true; + } + + public boolean getIsSubmitted(){ + return this.isSubmitted; + } +} diff --git a/src/main/java/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/SubmissionAttachment.java b/src/main/java/hello/cluebackend/domain/submission/domain/SubmissionAttachment/SubmissionAttachment.java similarity index 78% rename from src/main/java/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/SubmissionAttachment.java rename to src/main/java/hello/cluebackend/domain/submission/domain/SubmissionAttachment/SubmissionAttachment.java index c3ebe9d2..063e6bca 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/SubmissionAttachment.java +++ b/src/main/java/hello/cluebackend/domain/submission/domain/SubmissionAttachment/SubmissionAttachment.java @@ -1,7 +1,7 @@ -package hello.cluebackend.domain.assignment.participation.domain.SubmissionAttachment; +package hello.cluebackend.domain.submission.domain.SubmissionAttachment; -import hello.cluebackend.domain.assignment.management.domain.Assignment; -import hello.cluebackend.domain.assignment.participation.domain.Submission; +import hello.cluebackend.domain.assignment.domain.Assignment; +import hello.cluebackend.domain.submission.domain.Submission; import hello.cluebackend.domain.user.domain.UserEntity; import jakarta.persistence.*; import lombok.*; diff --git a/src/main/java/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/SubmissionDocument.java b/src/main/java/hello/cluebackend/domain/submission/domain/SubmissionAttachment/SubmissionDocument.java similarity index 86% rename from src/main/java/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/SubmissionDocument.java rename to src/main/java/hello/cluebackend/domain/submission/domain/SubmissionAttachment/SubmissionDocument.java index 6c1b4565..c6afa482 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/SubmissionDocument.java +++ b/src/main/java/hello/cluebackend/domain/submission/domain/SubmissionAttachment/SubmissionDocument.java @@ -1,4 +1,4 @@ -package hello.cluebackend.domain.assignment.participation.domain.SubmissionAttachment; +package hello.cluebackend.domain.submission.domain.SubmissionAttachment; import jakarta.persistence.Column; import jakarta.persistence.DiscriminatorValue; diff --git a/src/main/java/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/SubmissionLink.java b/src/main/java/hello/cluebackend/domain/submission/domain/SubmissionAttachment/SubmissionLink.java similarity index 74% rename from src/main/java/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/SubmissionLink.java rename to src/main/java/hello/cluebackend/domain/submission/domain/SubmissionAttachment/SubmissionLink.java index 2a30bae3..225b094d 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/participation/domain/SubmissionAttachment/SubmissionLink.java +++ b/src/main/java/hello/cluebackend/domain/submission/domain/SubmissionAttachment/SubmissionLink.java @@ -1,4 +1,4 @@ -package hello.cluebackend.domain.assignment.participation.domain.SubmissionAttachment; +package hello.cluebackend.domain.submission.domain.SubmissionAttachment; import jakarta.persistence.DiscriminatorValue; import jakarta.persistence.Entity; diff --git a/src/main/java/hello/cluebackend/domain/submission/persistence/SubmissionRepository.java b/src/main/java/hello/cluebackend/domain/submission/persistence/SubmissionRepository.java new file mode 100644 index 00000000..944565ae --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/submission/persistence/SubmissionRepository.java @@ -0,0 +1,15 @@ +package hello.cluebackend.domain.submission.persistence; + +import hello.cluebackend.domain.assignment.domain.Assignment; +import hello.cluebackend.domain.submission.domain.Submission; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface SubmissionRepository extends JpaRepository { + List findAllByAssignment(Assignment assignment); + + Submission findByAssignment(Assignment assignment); +} diff --git a/src/main/java/hello/cluebackend/domain/submission/persistence/submissionAttachment/SubmissionAttachmentRepository.java b/src/main/java/hello/cluebackend/domain/submission/persistence/submissionAttachment/SubmissionAttachmentRepository.java new file mode 100644 index 00000000..a6a17495 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/submission/persistence/submissionAttachment/SubmissionAttachmentRepository.java @@ -0,0 +1,10 @@ +package hello.cluebackend.domain.submission.persistence.submissionAttachment; + +import hello.cluebackend.domain.submission.domain.SubmissionAttachment.SubmissionAttachment; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface SubmissionAttachmentRepository extends JpaRepository { + +} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/submission/persistence/submissionAttachment/SubmissionDocumentRepository.java b/src/main/java/hello/cluebackend/domain/submission/persistence/submissionAttachment/SubmissionDocumentRepository.java new file mode 100644 index 00000000..fa2ea50d --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/submission/persistence/submissionAttachment/SubmissionDocumentRepository.java @@ -0,0 +1,8 @@ +package hello.cluebackend.domain.submission.persistence.submissionAttachment; + +import hello.cluebackend.domain.submission.domain.SubmissionAttachment.SubmissionDocument; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface SubmissionDocumentRepository extends JpaRepository { + +} diff --git a/src/main/java/hello/cluebackend/domain/submission/persistence/submissionAttachment/SubmissionLinkRepository.java b/src/main/java/hello/cluebackend/domain/submission/persistence/submissionAttachment/SubmissionLinkRepository.java new file mode 100644 index 00000000..97778f90 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/submission/persistence/submissionAttachment/SubmissionLinkRepository.java @@ -0,0 +1,8 @@ +package hello.cluebackend.domain.submission.persistence.submissionAttachment; + +import hello.cluebackend.domain.submission.domain.SubmissionAttachment.SubmissionLink; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface SubmissionLinkRepository extends JpaRepository { + +} From 5fcb88985f9fa165f5b67fda8ebbeab63912fad7 Mon Sep 17 00:00:00 2001 From: Haeyul Date: Tue, 26 Aug 2025 19:54:17 +0900 Subject: [PATCH 10/22] =?UTF-8?q?feat(#5):=20assignment=20=EC=A0=9C?= =?UTF-8?q?=EC=9E=91=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QAttachmentDocument.java | 74 --------- .../AssignmentAttachment/QAttachmentLink.java | 68 -------- .../{assignment => }/domain/QAssignment.java | 22 ++- .../QAssignmentAttachment.java | 34 +++- .../domain/assignment/domain/QBaseEntity.java | 43 +++++ .../QSubmissionDocument.java | 78 ---------- .../SubmissionAttachment/QSubmissionLink.java | 72 --------- .../domain/submission/domain/QBaseEntity.java | 43 +++++ .../submission/domain/QSubmission.java | 23 ++- .../domain}/QSubmissionAttachment.java | 20 ++- .../cluebackend/ClueBackendApplication.java | 11 +- .../api/AssignmentCommandController.java | 70 +++++++-- .../api/AssignmentQueryController.java | 75 ++++++--- .../dto/request/AssignmentAttachmentDto.java | 5 + .../api/dto/request/CreateAssignmentDto.java | 2 + .../api/dto/request/UploadAttachment.java | 6 - .../dto/response/AssignmentAttachmentDto.java | 13 ++ .../api/dto/response/AssignmentDto.java | 27 ---- .../dto/response/AssignmentResponseDto.java | 19 +++ .../GetAllClassRoomAssignmentDto.java | 23 --- .../response/GetAllSubmissionCheckDto.java | 18 --- .../dto/response/GetSubmissionFileDto.java | 7 - .../dto/response/GetSubmissionResultDto.java | 10 -- ...ignmentCheck.java => SubmissionCheck.java} | 3 +- .../application/AssignmentCommandService.java | 102 +++++++----- .../application/AssignmentQueryService.java | 75 +++++++-- .../domain/assignment/domain/Assignment.java | 60 +++---- .../domain/AssignmentAttachment.java | 34 ++++ .../AssignmentAttachment.java | 30 ---- .../AttachmentDocument.java | 26 ---- .../AssignmentAttachment/AttachmentLink.java | 17 -- .../domain/assignment/domain/BaseEntity.java | 32 ++++ .../domain/assignment/domain/fileType.java | 5 + .../exception/AccessDeniedException.java | 7 + .../AssignmentAttachmentRepository.java | 9 +- .../persistence/AssignmentRepository.java | 4 - .../AttachmentDocumentRepository.java | 8 - .../AttachmentLinkRepository.java | 8 - .../presentation/ClassRoomController.java | 12 -- .../application/ClassroomUserService.java | 12 ++ .../classroomuser/domain/ClassRoomUser.java | 1 - .../repository/ClassRoomUserRepository.java | 2 + .../exception/S3FileNotFoundException.java | 7 + .../file/presentation/FileController.java | 47 ------ .../domain/file/service/FileService.java | 147 ++++++++---------- .../api/SubmissionCommandController.java | 77 +++++---- .../api/SubmissionQueryController.java | 64 +++++--- .../SubmissionAssignmentAttachmentDto.java | 4 + .../request/SubmissionAttachmentUrlDto.java | 5 + .../api/dto/request/modifySubmissionDto.java | 5 - .../dto/response/SubmissionAttachmentDto.java | 13 ++ .../api/dto/response/SubmissionDto.java | 6 - .../application/SubmissionCommandService.java | 102 +++++++++--- .../application/SubmissionQueryService.java | 76 ++++++--- .../domain/submission/domain/BaseEntity.java | 32 ++++ .../domain/submission/domain/Submission.java | 17 +- .../domain/SubmissionAttachment.java | 37 +++++ .../SubmissionAttachment.java | 35 ----- .../SubmissionDocument.java | 24 --- .../SubmissionAttachment/SubmissionLink.java | 12 -- .../domain/submission/domain/fileType.java | 5 + .../SubmissionAttachmentRepository.java | 10 +- .../SubmissionDocumentRepository.java | 8 - .../SubmissionLinkRepository.java | 8 - .../domain/user/domain/UserEntity.java | 3 - 65 files changed, 968 insertions(+), 986 deletions(-) delete mode 100644 src/main/generated/hello/cluebackend/domain/assignment/assignment/domain/AssignmentAttachment/QAttachmentDocument.java delete mode 100644 src/main/generated/hello/cluebackend/domain/assignment/assignment/domain/AssignmentAttachment/QAttachmentLink.java rename src/main/generated/hello/cluebackend/domain/assignment/{assignment => }/domain/QAssignment.java (68%) rename src/main/generated/hello/cluebackend/domain/assignment/{assignment/domain/AssignmentAttachment => domain}/QAssignmentAttachment.java (60%) create mode 100644 src/main/generated/hello/cluebackend/domain/assignment/domain/QBaseEntity.java delete mode 100644 src/main/generated/hello/cluebackend/domain/assignment/submission/domain/SubmissionAttachment/QSubmissionDocument.java delete mode 100644 src/main/generated/hello/cluebackend/domain/assignment/submission/domain/SubmissionAttachment/QSubmissionLink.java create mode 100644 src/main/generated/hello/cluebackend/domain/submission/domain/QBaseEntity.java rename src/main/generated/hello/cluebackend/domain/{assignment => }/submission/domain/QSubmission.java (70%) rename src/main/generated/hello/cluebackend/domain/{assignment/submission/domain/SubmissionAttachment => submission/domain}/QSubmissionAttachment.java (67%) create mode 100644 src/main/java/hello/cluebackend/domain/assignment/api/dto/request/AssignmentAttachmentDto.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/api/dto/request/UploadAttachment.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentAttachmentDto.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentDto.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentResponseDto.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetAllClassRoomAssignmentDto.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetAllSubmissionCheckDto.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetSubmissionFileDto.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetSubmissionResultDto.java rename src/main/java/hello/cluebackend/domain/assignment/api/dto/response/{AssignmentCheck.java => SubmissionCheck.java} (82%) create mode 100644 src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment/AssignmentAttachment.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment/AttachmentDocument.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment/AttachmentLink.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/domain/BaseEntity.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/domain/fileType.java create mode 100644 src/main/java/hello/cluebackend/domain/assignment/exception/AccessDeniedException.java rename src/main/java/hello/cluebackend/domain/assignment/persistence/{assignmentDocument => }/AssignmentAttachmentRepository.java (56%) delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/persistence/assignmentDocument/AttachmentDocumentRepository.java delete mode 100644 src/main/java/hello/cluebackend/domain/assignment/persistence/assignmentDocument/AttachmentLinkRepository.java create mode 100644 src/main/java/hello/cluebackend/domain/file/exception/S3FileNotFoundException.java delete mode 100644 src/main/java/hello/cluebackend/domain/file/presentation/FileController.java create mode 100644 src/main/java/hello/cluebackend/domain/submission/api/dto/request/SubmissionAssignmentAttachmentDto.java create mode 100644 src/main/java/hello/cluebackend/domain/submission/api/dto/request/SubmissionAttachmentUrlDto.java delete mode 100644 src/main/java/hello/cluebackend/domain/submission/api/dto/request/modifySubmissionDto.java create mode 100644 src/main/java/hello/cluebackend/domain/submission/api/dto/response/SubmissionAttachmentDto.java create mode 100644 src/main/java/hello/cluebackend/domain/submission/domain/BaseEntity.java create mode 100644 src/main/java/hello/cluebackend/domain/submission/domain/SubmissionAttachment.java delete mode 100644 src/main/java/hello/cluebackend/domain/submission/domain/SubmissionAttachment/SubmissionAttachment.java delete mode 100644 src/main/java/hello/cluebackend/domain/submission/domain/SubmissionAttachment/SubmissionDocument.java delete mode 100644 src/main/java/hello/cluebackend/domain/submission/domain/SubmissionAttachment/SubmissionLink.java create mode 100644 src/main/java/hello/cluebackend/domain/submission/domain/fileType.java rename src/main/java/hello/cluebackend/domain/submission/persistence/{submissionAttachment => }/SubmissionAttachmentRepository.java (50%) delete mode 100644 src/main/java/hello/cluebackend/domain/submission/persistence/submissionAttachment/SubmissionDocumentRepository.java delete mode 100644 src/main/java/hello/cluebackend/domain/submission/persistence/submissionAttachment/SubmissionLinkRepository.java diff --git a/src/main/generated/hello/cluebackend/domain/assignment/assignment/domain/AssignmentAttachment/QAttachmentDocument.java b/src/main/generated/hello/cluebackend/domain/assignment/assignment/domain/AssignmentAttachment/QAttachmentDocument.java deleted file mode 100644 index 5c89528f..00000000 --- a/src/main/generated/hello/cluebackend/domain/assignment/assignment/domain/AssignmentAttachment/QAttachmentDocument.java +++ /dev/null @@ -1,74 +0,0 @@ -package hello.cluebackend.domain.assignment.assignment.domain.AssignmentAttachment; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; -import hello.cluebackend.domain.assignment.domain.AssignmentAttachment.AttachmentDocument; - - -/** - * QAttachmentDocument is a Querydsl query type for AttachmentDocument - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QAttachmentDocument extends EntityPathBase { - - private static final long serialVersionUID = -358015913L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QAttachmentDocument attachmentDocument = new QAttachmentDocument("attachmentDocument"); - - public final QAssignmentAttachment _super; - - // inherited - public final hello.cluebackend.domain.assignment.assignment.domain.QAssignment assignment; - - //inherited - public final NumberPath assignmentAttachmentId; - - public final StringPath filePath = createString("filePath"); - - public final NumberPath fileSize = createNumber("fileSize", Long.class); - - public final StringPath originalFileName = createString("originalFileName"); - - public final StringPath storedFileName = createString("storedFileName"); - - //inherited - public final DateTimePath updateDate; - - // inherited - public final hello.cluebackend.domain.user.domain.QUserEntity user; - - public QAttachmentDocument(String variable) { - this(AttachmentDocument.class, forVariable(variable), INITS); - } - - public QAttachmentDocument(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QAttachmentDocument(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QAttachmentDocument(PathMetadata metadata, PathInits inits) { - this(AttachmentDocument.class, metadata, inits); - } - - public QAttachmentDocument(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this._super = new QAssignmentAttachment(type, metadata, inits); - this.assignment = _super.assignment; - this.assignmentAttachmentId = _super.assignmentAttachmentId; - this.updateDate = _super.updateDate; - this.user = _super.user; - } - -} - diff --git a/src/main/generated/hello/cluebackend/domain/assignment/assignment/domain/AssignmentAttachment/QAttachmentLink.java b/src/main/generated/hello/cluebackend/domain/assignment/assignment/domain/AssignmentAttachment/QAttachmentLink.java deleted file mode 100644 index 181c3d8b..00000000 --- a/src/main/generated/hello/cluebackend/domain/assignment/assignment/domain/AssignmentAttachment/QAttachmentLink.java +++ /dev/null @@ -1,68 +0,0 @@ -package hello.cluebackend.domain.assignment.assignment.domain.AssignmentAttachment; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; -import hello.cluebackend.domain.assignment.domain.AssignmentAttachment.AttachmentLink; - - -/** - * QAttachmentLink is a Querydsl query type for AttachmentLink - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QAttachmentLink extends EntityPathBase { - - private static final long serialVersionUID = 217970998L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QAttachmentLink attachmentLink = new QAttachmentLink("attachmentLink"); - - public final QAssignmentAttachment _super; - - // inherited - public final hello.cluebackend.domain.assignment.assignment.domain.QAssignment assignment; - - //inherited - public final NumberPath assignmentAttachmentId; - - //inherited - public final DateTimePath updateDate; - - public final StringPath url = createString("url"); - - // inherited - public final hello.cluebackend.domain.user.domain.QUserEntity user; - - public QAttachmentLink(String variable) { - this(AttachmentLink.class, forVariable(variable), INITS); - } - - public QAttachmentLink(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QAttachmentLink(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QAttachmentLink(PathMetadata metadata, PathInits inits) { - this(AttachmentLink.class, metadata, inits); - } - - public QAttachmentLink(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this._super = new QAssignmentAttachment(type, metadata, inits); - this.assignment = _super.assignment; - this.assignmentAttachmentId = _super.assignmentAttachmentId; - this.updateDate = _super.updateDate; - this.user = _super.user; - } - -} - diff --git a/src/main/generated/hello/cluebackend/domain/assignment/assignment/domain/QAssignment.java b/src/main/generated/hello/cluebackend/domain/assignment/domain/QAssignment.java similarity index 68% rename from src/main/generated/hello/cluebackend/domain/assignment/assignment/domain/QAssignment.java rename to src/main/generated/hello/cluebackend/domain/assignment/domain/QAssignment.java index 07a40120..24b49190 100644 --- a/src/main/generated/hello/cluebackend/domain/assignment/assignment/domain/QAssignment.java +++ b/src/main/generated/hello/cluebackend/domain/assignment/domain/QAssignment.java @@ -1,4 +1,4 @@ -package hello.cluebackend.domain.assignment.assignment.domain; +package hello.cluebackend.domain.assignment.domain; import static com.querydsl.core.types.PathMetadataFactory.*; @@ -8,8 +8,6 @@ import javax.annotation.processing.Generated; import com.querydsl.core.types.Path; import com.querydsl.core.types.dsl.PathInits; -import hello.cluebackend.domain.assignment.domain.Assignment; -import hello.cluebackend.domain.submission.domain.Submission; /** @@ -18,23 +16,37 @@ @Generated("com.querydsl.codegen.DefaultEntitySerializer") public class QAssignment extends EntityPathBase { - private static final long serialVersionUID = 506310386L; + private static final long serialVersionUID = -473772911L; private static final PathInits INITS = PathInits.DIRECT2; public static final QAssignment assignment = new QAssignment("assignment"); + public final QBaseEntity _super = new QBaseEntity(this); + public final NumberPath assignmentId = createNumber("assignmentId", Long.class); public final hello.cluebackend.domain.classroom.domain.QClassRoom classRoom; public final StringPath content = createString("content"); + //inherited + public final StringPath createdBy = _super.createdBy; + + //inherited + public final DateTimePath createdDate = _super.createdDate; + public final DateTimePath endDate = createDateTime("endDate", java.time.LocalDateTime.class); + //inherited + public final DateTimePath lastModified = _super.lastModified; + + //inherited + public final StringPath lastModifiedBy = _super.lastModifiedBy; + public final DateTimePath startDate = createDateTime("startDate", java.time.LocalDateTime.class); - public final ListPath submissions = this.createList("submissions", Submission.class, hello.cluebackend.domain.assignment.submission.domain.QSubmission.class, PathInits.DIRECT2); + public final ListPath submissions = this.createList("submissions", hello.cluebackend.domain.submission.domain.Submission.class, hello.cluebackend.domain.submission.domain.QSubmission.class, PathInits.DIRECT2); public final StringPath title = createString("title"); diff --git a/src/main/generated/hello/cluebackend/domain/assignment/assignment/domain/AssignmentAttachment/QAssignmentAttachment.java b/src/main/generated/hello/cluebackend/domain/assignment/domain/QAssignmentAttachment.java similarity index 60% rename from src/main/generated/hello/cluebackend/domain/assignment/assignment/domain/AssignmentAttachment/QAssignmentAttachment.java rename to src/main/generated/hello/cluebackend/domain/assignment/domain/QAssignmentAttachment.java index dd883d81..6939095c 100644 --- a/src/main/generated/hello/cluebackend/domain/assignment/assignment/domain/AssignmentAttachment/QAssignmentAttachment.java +++ b/src/main/generated/hello/cluebackend/domain/assignment/domain/QAssignmentAttachment.java @@ -1,4 +1,4 @@ -package hello.cluebackend.domain.assignment.assignment.domain.AssignmentAttachment; +package hello.cluebackend.domain.assignment.domain; import static com.querydsl.core.types.PathMetadataFactory.*; @@ -8,7 +8,6 @@ import javax.annotation.processing.Generated; import com.querydsl.core.types.Path; import com.querydsl.core.types.dsl.PathInits; -import hello.cluebackend.domain.assignment.domain.AssignmentAttachment.AssignmentAttachment; /** @@ -17,19 +16,39 @@ @Generated("com.querydsl.codegen.DefaultEntitySerializer") public class QAssignmentAttachment extends EntityPathBase { - private static final long serialVersionUID = 886859401L; + private static final long serialVersionUID = 788938900L; private static final PathInits INITS = PathInits.DIRECT2; public static final QAssignmentAttachment assignmentAttachment = new QAssignmentAttachment("assignmentAttachment"); - public final hello.cluebackend.domain.assignment.assignment.domain.QAssignment assignment; + public final QBaseEntity _super = new QBaseEntity(this); + + public final QAssignment assignment; public final NumberPath assignmentAttachmentId = createNumber("assignmentAttachmentId", Long.class); - public final DateTimePath updateDate = createDateTime("updateDate", java.time.LocalDateTime.class); + public final StringPath contentType = createString("contentType"); + + //inherited + public final StringPath createdBy = _super.createdBy; + + //inherited + public final DateTimePath createdDate = _super.createdDate; + + //inherited + public final DateTimePath lastModified = _super.lastModified; + + //inherited + public final StringPath lastModifiedBy = _super.lastModifiedBy; + + public final StringPath originalFileName = createString("originalFileName"); + + public final NumberPath size = createNumber("size", Long.class); + + public final EnumPath type = createEnum("type", fileType.class); - public final hello.cluebackend.domain.user.domain.QUserEntity user; + public final StringPath value = createString("value"); public QAssignmentAttachment(String variable) { this(AssignmentAttachment.class, forVariable(variable), INITS); @@ -49,8 +68,7 @@ public QAssignmentAttachment(PathMetadata metadata, PathInits inits) { public QAssignmentAttachment(Class type, PathMetadata metadata, PathInits inits) { super(type, metadata, inits); - this.assignment = inits.isInitialized("assignment") ? new hello.cluebackend.domain.assignment.assignment.domain.QAssignment(forProperty("assignment"), inits.get("assignment")) : null; - this.user = inits.isInitialized("user") ? new hello.cluebackend.domain.user.domain.QUserEntity(forProperty("user")) : null; + this.assignment = inits.isInitialized("assignment") ? new QAssignment(forProperty("assignment"), inits.get("assignment")) : null; } } diff --git a/src/main/generated/hello/cluebackend/domain/assignment/domain/QBaseEntity.java b/src/main/generated/hello/cluebackend/domain/assignment/domain/QBaseEntity.java new file mode 100644 index 00000000..3562f97a --- /dev/null +++ b/src/main/generated/hello/cluebackend/domain/assignment/domain/QBaseEntity.java @@ -0,0 +1,43 @@ +package hello.cluebackend.domain.assignment.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QBaseEntity is a Querydsl query type for BaseEntity + */ +@Generated("com.querydsl.codegen.DefaultSupertypeSerializer") +public class QBaseEntity extends EntityPathBase { + + private static final long serialVersionUID = 1570896856L; + + public static final QBaseEntity baseEntity = new QBaseEntity("baseEntity"); + + public final StringPath createdBy = createString("createdBy"); + + public final DateTimePath createdDate = createDateTime("createdDate", java.time.LocalDateTime.class); + + public final DateTimePath lastModified = createDateTime("lastModified", java.time.LocalDateTime.class); + + public final StringPath lastModifiedBy = createString("lastModifiedBy"); + + public QBaseEntity(String variable) { + super(BaseEntity.class, forVariable(variable)); + } + + public QBaseEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QBaseEntity(PathMetadata metadata) { + super(BaseEntity.class, metadata); + } + +} + diff --git a/src/main/generated/hello/cluebackend/domain/assignment/submission/domain/SubmissionAttachment/QSubmissionDocument.java b/src/main/generated/hello/cluebackend/domain/assignment/submission/domain/SubmissionAttachment/QSubmissionDocument.java deleted file mode 100644 index beff681a..00000000 --- a/src/main/generated/hello/cluebackend/domain/assignment/submission/domain/SubmissionAttachment/QSubmissionDocument.java +++ /dev/null @@ -1,78 +0,0 @@ -package hello.cluebackend.domain.assignment.submission.domain.SubmissionAttachment; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; -import hello.cluebackend.domain.submission.domain.SubmissionAttachment.SubmissionDocument; - - -/** - * QSubmissionDocument is a Querydsl query type for SubmissionDocument - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QSubmissionDocument extends EntityPathBase { - - private static final long serialVersionUID = -868574737L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QSubmissionDocument submissionDocument = new QSubmissionDocument("submissionDocument"); - - public final QSubmissionAttachment _super; - - // inherited - public final hello.cluebackend.domain.assignment.assignment.domain.QAssignment assignment; - - public final StringPath filePath = createString("filePath"); - - public final NumberPath fileSize = createNumber("fileSize", Integer.class); - - public final StringPath originalFileName = createString("originalFileName"); - - public final StringPath storedFileName = createString("storedFileName"); - - // inherited - public final hello.cluebackend.domain.assignment.submission.domain.QSubmission submission; - - //inherited - public final NumberPath SubmissionAttachmentId; - - //inherited - public final DateTimePath updateDate; - - // inherited - public final hello.cluebackend.domain.user.domain.QUserEntity user; - - public QSubmissionDocument(String variable) { - this(SubmissionDocument.class, forVariable(variable), INITS); - } - - public QSubmissionDocument(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QSubmissionDocument(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QSubmissionDocument(PathMetadata metadata, PathInits inits) { - this(SubmissionDocument.class, metadata, inits); - } - - public QSubmissionDocument(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this._super = new QSubmissionAttachment(type, metadata, inits); - this.assignment = _super.assignment; - this.submission = _super.submission; - this.SubmissionAttachmentId = _super.SubmissionAttachmentId; - this.updateDate = _super.updateDate; - this.user = _super.user; - } - -} - diff --git a/src/main/generated/hello/cluebackend/domain/assignment/submission/domain/SubmissionAttachment/QSubmissionLink.java b/src/main/generated/hello/cluebackend/domain/assignment/submission/domain/SubmissionAttachment/QSubmissionLink.java deleted file mode 100644 index b9908878..00000000 --- a/src/main/generated/hello/cluebackend/domain/assignment/submission/domain/SubmissionAttachment/QSubmissionLink.java +++ /dev/null @@ -1,72 +0,0 @@ -package hello.cluebackend.domain.assignment.submission.domain.SubmissionAttachment; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; -import com.querydsl.core.types.dsl.PathInits; -import hello.cluebackend.domain.submission.domain.SubmissionAttachment.SubmissionLink; - - -/** - * QSubmissionLink is a Querydsl query type for SubmissionLink - */ -@Generated("com.querydsl.codegen.DefaultEntitySerializer") -public class QSubmissionLink extends EntityPathBase { - - private static final long serialVersionUID = -1755446578L; - - private static final PathInits INITS = PathInits.DIRECT2; - - public static final QSubmissionLink submissionLink = new QSubmissionLink("submissionLink"); - - public final QSubmissionAttachment _super; - - // inherited - public final hello.cluebackend.domain.assignment.assignment.domain.QAssignment assignment; - - // inherited - public final hello.cluebackend.domain.assignment.submission.domain.QSubmission submission; - - //inherited - public final NumberPath SubmissionAttachmentId; - - //inherited - public final DateTimePath updateDate; - - public final StringPath url = createString("url"); - - // inherited - public final hello.cluebackend.domain.user.domain.QUserEntity user; - - public QSubmissionLink(String variable) { - this(SubmissionLink.class, forVariable(variable), INITS); - } - - public QSubmissionLink(Path path) { - this(path.getType(), path.getMetadata(), PathInits.getFor(path.getMetadata(), INITS)); - } - - public QSubmissionLink(PathMetadata metadata) { - this(metadata, PathInits.getFor(metadata, INITS)); - } - - public QSubmissionLink(PathMetadata metadata, PathInits inits) { - this(SubmissionLink.class, metadata, inits); - } - - public QSubmissionLink(Class type, PathMetadata metadata, PathInits inits) { - super(type, metadata, inits); - this._super = new QSubmissionAttachment(type, metadata, inits); - this.assignment = _super.assignment; - this.submission = _super.submission; - this.SubmissionAttachmentId = _super.SubmissionAttachmentId; - this.updateDate = _super.updateDate; - this.user = _super.user; - } - -} - diff --git a/src/main/generated/hello/cluebackend/domain/submission/domain/QBaseEntity.java b/src/main/generated/hello/cluebackend/domain/submission/domain/QBaseEntity.java new file mode 100644 index 00000000..ddd8f67c --- /dev/null +++ b/src/main/generated/hello/cluebackend/domain/submission/domain/QBaseEntity.java @@ -0,0 +1,43 @@ +package hello.cluebackend.domain.submission.domain; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QBaseEntity is a Querydsl query type for BaseEntity + */ +@Generated("com.querydsl.codegen.DefaultSupertypeSerializer") +public class QBaseEntity extends EntityPathBase { + + private static final long serialVersionUID = -1972490601L; + + public static final QBaseEntity baseEntity = new QBaseEntity("baseEntity"); + + public final StringPath createdBy = createString("createdBy"); + + public final DateTimePath createdDate = createDateTime("createdDate", java.time.LocalDateTime.class); + + public final DateTimePath lastModified = createDateTime("lastModified", java.time.LocalDateTime.class); + + public final StringPath lastModifiedBy = createString("lastModifiedBy"); + + public QBaseEntity(String variable) { + super(BaseEntity.class, forVariable(variable)); + } + + public QBaseEntity(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QBaseEntity(PathMetadata metadata) { + super(BaseEntity.class, metadata); + } + +} + diff --git a/src/main/generated/hello/cluebackend/domain/assignment/submission/domain/QSubmission.java b/src/main/generated/hello/cluebackend/domain/submission/domain/QSubmission.java similarity index 70% rename from src/main/generated/hello/cluebackend/domain/assignment/submission/domain/QSubmission.java rename to src/main/generated/hello/cluebackend/domain/submission/domain/QSubmission.java index d3470b4d..b1b55429 100644 --- a/src/main/generated/hello/cluebackend/domain/assignment/submission/domain/QSubmission.java +++ b/src/main/generated/hello/cluebackend/domain/submission/domain/QSubmission.java @@ -1,4 +1,4 @@ -package hello.cluebackend.domain.assignment.submission.domain; +package hello.cluebackend.domain.submission.domain; import static com.querydsl.core.types.PathMetadataFactory.*; @@ -8,7 +8,6 @@ import javax.annotation.processing.Generated; import com.querydsl.core.types.Path; import com.querydsl.core.types.dsl.PathInits; -import hello.cluebackend.domain.submission.domain.Submission; /** @@ -17,16 +16,30 @@ @Generated("com.querydsl.codegen.DefaultEntitySerializer") public class QSubmission extends EntityPathBase { - private static final long serialVersionUID = -399911901L; + private static final long serialVersionUID = 1469690831L; private static final PathInits INITS = PathInits.DIRECT2; public static final QSubmission submission = new QSubmission("submission"); - public final hello.cluebackend.domain.assignment.assignment.domain.QAssignment assignment; + public final QBaseEntity _super = new QBaseEntity(this); + + public final hello.cluebackend.domain.assignment.domain.QAssignment assignment; + + //inherited + public final StringPath createdBy = _super.createdBy; + + //inherited + public final DateTimePath createdDate = _super.createdDate; public final BooleanPath isSubmitted = createBoolean("isSubmitted"); + //inherited + public final DateTimePath lastModified = _super.lastModified; + + //inherited + public final StringPath lastModifiedBy = _super.lastModifiedBy; + public final NumberPath submissionId = createNumber("submissionId", Long.class); public final DateTimePath submittedAt = createDateTime("submittedAt", java.time.LocalDateTime.class); @@ -51,7 +64,7 @@ public QSubmission(PathMetadata metadata, PathInits inits) { public QSubmission(Class type, PathMetadata metadata, PathInits inits) { super(type, metadata, inits); - this.assignment = inits.isInitialized("assignment") ? new hello.cluebackend.domain.assignment.assignment.domain.QAssignment(forProperty("assignment"), inits.get("assignment")) : null; + this.assignment = inits.isInitialized("assignment") ? new hello.cluebackend.domain.assignment.domain.QAssignment(forProperty("assignment"), inits.get("assignment")) : null; this.user = inits.isInitialized("user") ? new hello.cluebackend.domain.user.domain.QUserEntity(forProperty("user")) : null; } diff --git a/src/main/generated/hello/cluebackend/domain/assignment/submission/domain/SubmissionAttachment/QSubmissionAttachment.java b/src/main/generated/hello/cluebackend/domain/submission/domain/QSubmissionAttachment.java similarity index 67% rename from src/main/generated/hello/cluebackend/domain/assignment/submission/domain/SubmissionAttachment/QSubmissionAttachment.java rename to src/main/generated/hello/cluebackend/domain/submission/domain/QSubmissionAttachment.java index 61d0a99e..6a185b7f 100644 --- a/src/main/generated/hello/cluebackend/domain/assignment/submission/domain/SubmissionAttachment/QSubmissionAttachment.java +++ b/src/main/generated/hello/cluebackend/domain/submission/domain/QSubmissionAttachment.java @@ -1,4 +1,4 @@ -package hello.cluebackend.domain.assignment.submission.domain.SubmissionAttachment; +package hello.cluebackend.domain.submission.domain; import static com.querydsl.core.types.PathMetadataFactory.*; @@ -8,7 +8,6 @@ import javax.annotation.processing.Generated; import com.querydsl.core.types.Path; import com.querydsl.core.types.dsl.PathInits; -import hello.cluebackend.domain.submission.domain.SubmissionAttachment.SubmissionAttachment; /** @@ -17,22 +16,28 @@ @Generated("com.querydsl.codegen.DefaultEntitySerializer") public class QSubmissionAttachment extends EntityPathBase { - private static final long serialVersionUID = 1669741815L; + private static final long serialVersionUID = -1140084142L; private static final PathInits INITS = PathInits.DIRECT2; public static final QSubmissionAttachment submissionAttachment = new QSubmissionAttachment("submissionAttachment"); - public final hello.cluebackend.domain.assignment.assignment.domain.QAssignment assignment; + public final StringPath contentType = createString("contentType"); - public final hello.cluebackend.domain.assignment.submission.domain.QSubmission submission; + public final StringPath originalFileName = createString("originalFileName"); + + public final NumberPath size = createNumber("size", Long.class); + + public final QSubmission submission; public final NumberPath SubmissionAttachmentId = createNumber("SubmissionAttachmentId", Long.class); - public final DateTimePath updateDate = createDateTime("updateDate", java.time.LocalDateTime.class); + public final EnumPath type = createEnum("type", fileType.class); public final hello.cluebackend.domain.user.domain.QUserEntity user; + public final StringPath value = createString("value"); + public QSubmissionAttachment(String variable) { this(SubmissionAttachment.class, forVariable(variable), INITS); } @@ -51,8 +56,7 @@ public QSubmissionAttachment(PathMetadata metadata, PathInits inits) { public QSubmissionAttachment(Class type, PathMetadata metadata, PathInits inits) { super(type, metadata, inits); - this.assignment = inits.isInitialized("assignment") ? new hello.cluebackend.domain.assignment.assignment.domain.QAssignment(forProperty("assignment"), inits.get("assignment")) : null; - this.submission = inits.isInitialized("submission") ? new hello.cluebackend.domain.assignment.submission.domain.QSubmission(forProperty("submission"), inits.get("submission")) : null; + this.submission = inits.isInitialized("submission") ? new QSubmission(forProperty("submission"), inits.get("submission")) : null; this.user = inits.isInitialized("user") ? new hello.cluebackend.domain.user.domain.QUserEntity(forProperty("user")) : null; } diff --git a/src/main/java/hello/cluebackend/ClueBackendApplication.java b/src/main/java/hello/cluebackend/ClueBackendApplication.java index f309f9bd..e8f60d48 100644 --- a/src/main/java/hello/cluebackend/ClueBackendApplication.java +++ b/src/main/java/hello/cluebackend/ClueBackendApplication.java @@ -2,13 +2,22 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.data.domain.AuditorAware; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import java.util.Optional; +import java.util.UUID; + @SpringBootApplication @EnableJpaAuditing public class ClueBackendApplication { - public static void main(String[] args) { SpringApplication.run(ClueBackendApplication.class, args); } + + @Bean + public AuditorAware auditorProvider(){ + return () -> Optional.of(UUID.randomUUID().toString()); + } } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java b/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java index 05356780..5ae69d9a 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java +++ b/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java @@ -1,19 +1,28 @@ package hello.cluebackend.domain.assignment.api; -import hello.cluebackend.domain.assignment.api.dto.response.AssignmentCheck; -import hello.cluebackend.domain.assignment.api.dto.response.AssignmentDto; -import hello.cluebackend.domain.assignment.api.dto.response.GetAllAssignmentDto; +import hello.cluebackend.domain.assignment.api.dto.response.*; import hello.cluebackend.domain.assignment.application.AssignmentCommandService; +import hello.cluebackend.domain.assignment.domain.Assignment; +import hello.cluebackend.domain.assignment.domain.AssignmentAttachment; +import hello.cluebackend.domain.assignment.exception.AccessDeniedException; +import hello.cluebackend.domain.classroomuser.application.ClassroomUserService; +import hello.cluebackend.domain.submission.api.dto.response.SubmissionAttachmentDto; import hello.cluebackend.domain.submission.application.SubmissionCommandService; import hello.cluebackend.global.common.annotation.CurrentUser; +import jakarta.persistence.EntityNotFoundException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.core.io.Resource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.io.File; +import java.io.IOException; import java.util.List; @RestController @@ -21,27 +30,60 @@ @RequiredArgsConstructor @Slf4j public class AssignmentCommandController { + private final ClassroomUserService classroomUserService; private final AssignmentCommandService assignmentCommandService; private final SubmissionCommandService submissionCommandService; - // 사용자가 속한 모든 수업 과제 조회 + // 과제 단일 조회 + @GetMapping("/{assignmentId}") + public ResponseEntity getAssignment( + @CurrentUser Long userId, + @PathVariable Long assignmentId + ) { + AssignmentResponseDto result = assignmentCommandService.findById(assignmentId); + Assignment assignment = assignmentCommandService.findByIdOrThrow(assignmentId); + Long classroomId = assignment.getClassRoom().getClassRoomId(); + if (!classroomUserService.isUserInClassroom(classroomId, userId)) { + throw new AccessDeniedException("해당 수업실에 속하지 않은 유저입니다."); + } + return ResponseEntity.ok(result); + } + + // 교실 과제 전체 조회 + @GetMapping("/{classId}/all") + public ResponseEntity> getAllClassroomAssignment( + @CurrentUser Long userId, + @PathVariable Long classId + ) { + List result = assignmentCommandService.findAllById(userId,classId); + return ResponseEntity.ok(result); + } + + // 메인 페이지 모든 과제 조회 @GetMapping("/me") public ResponseEntity> getAllAssignments(@CurrentUser Long userId) { - List result = assignmentCommandService.findAllAssignment(userId); + List result = assignmentCommandService.findAllAssignmentMe(userId); return ResponseEntity.ok(result); } - // 과제 모든 정보 조회 - @GetMapping("/{assignmentId}") - public ResponseEntity getAssignment(@CurrentUser Long userId, @PathVariable Long assignmentId) { - AssignmentDto result = assignmentCommandService.findById(assignmentId); + // 첨부 파일 혹은 링크 전체 조회 (선생, 학생) + @GetMapping("/{submissionId}/attachment") + public ResponseEntity> findAllAssignments(@CurrentUser Long userId, @PathVariable Long submissionId) { + List result = submissionCommandService.findAllAssignment(submissionId); return ResponseEntity.ok(result); } - // 전체 학생 과제 제출 여부 - @GetMapping("/{assignmentId}/check") - public ResponseEntity> checkAssignment(@CurrentUser Long userId, @PathVariable Long assignmentId){ - List assignmentChecks = submissionCommandService.checkAssignment(assignmentId); - return ResponseEntity.ok(assignmentChecks); + // 첨부 파일 다운로드 + @GetMapping("/{assignmentAttachmentId}/download") + public ResponseEntity assignmentAttachmentDownload( + @CurrentUser Long userId, + @PathVariable Long assignmentAttachmentId + ) throws IOException { + AssignmentAttachment assignmentAttachment = assignmentCommandService.findAssignmentAttachmentByIdOrderThrow(assignmentAttachmentId); + Resource resource = assignmentCommandService.downloadAttachment(assignmentAttachment); + return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + assignmentAttachment.getOriginalFileName() + assignmentAttachment.getContentType() + "\"") + .contentType(MediaType.APPLICATION_OCTET_STREAM) + .body(resource); } } diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentQueryController.java b/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentQueryController.java index b60eb22a..a351f985 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentQueryController.java +++ b/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentQueryController.java @@ -1,5 +1,6 @@ package hello.cluebackend.domain.assignment.api; +import hello.cluebackend.domain.assignment.api.dto.request.AssignmentAttachmentDto; import hello.cluebackend.domain.assignment.api.dto.request.CreateAssignmentDto; import hello.cluebackend.domain.assignment.api.dto.request.ModifyAssignmentDto; import hello.cluebackend.domain.assignment.application.AssignmentQueryService; @@ -11,21 +12,29 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.List; @RestController @RequestMapping("/api/assignments") @RequiredArgsConstructor @Slf4j public class AssignmentQueryController { - private final AssignmentQueryService assignmentService; + private final AssignmentQueryService assignmentQueryService; private final SubmissionQueryService submissionQueryService; // 과제 생성 - @PostMapping("") - public ResponseEntity createAssignment(@CurrentUser Long userId, @Valid @RequestBody CreateAssignmentDto request){ - Assignment assignment = assignmentService.save(request.classId(), request); + @PostMapping + public ResponseEntity createAssignment( + @CurrentUser Long userId, + @Valid @RequestBody CreateAssignmentDto request + ) { + Assignment assignment = assignmentQueryService.save(request.classId(), request); + submissionQueryService.assignToAllStudentsInClassroom(request.classId(), assignment); - return ResponseEntity.ok(assignment); + return ResponseEntity.ok(assignment.getAssignmentId()); } // 과제 삭제 @@ -33,7 +42,7 @@ public ResponseEntity createAssignment(@CurrentUser Long userId, @Va public ResponseEntity deleteAssignment( @CurrentUser Long userId, @PathVariable Long assignmentId){ - assignmentService.delete(assignmentId); + assignmentQueryService.delete(assignmentId); return ResponseEntity.ok("과제를 성공적으로 삭제했습니다."); } @@ -44,23 +53,43 @@ public ResponseEntity modifyAssignment( @PathVariable Long assignmentId, @Valid @RequestBody ModifyAssignmentDto assignmentDto ) { - assignmentService.patchAssignment(assignmentId, assignmentDto); - return ResponseEntity.ok("과제를 성공적으로 수정했습니다."); + Assignment assignment = assignmentQueryService.patchAssignment(assignmentId, assignmentDto); + return ResponseEntity.ok(assignment); } - // 첨부파일 생성 -// @PostMapping("/upload") -// public ResponseEntity uploadAttachment(@CurrentUser Long userId, @RequestBody UploadAttachment request, @RequestParam("file") MultipartFile file -// ) throws IOException { -// submissionQueryService.uploadAttachment(request,file); -// return ResponseEntity.ok("과제 업로드가 성공했습니다."); -// } + // 첨부 파일 추가 + @PostMapping("/{assignmentId}/file") + public ResponseEntity uploadAttachments( + @CurrentUser Long userId, + @PathVariable Long assignmentId, + @RequestParam("files") MultipartFile[] files + ) throws IOException { - // 첨부파일 삭제 -// @DeleteMapping("/deleteAttachment/{attachmentId}") -// public ResponseEntity deleteAttachment(@CurrentUser Long userId, @PathVariable Long attachmentId, @RequestParam("file") MultipartFile file) throws IOException { -// String filePath = "uploads/" + file.getOriginalFilename(); -// submissionQueryService.deleteAttachment() -// return ResponseEntity.ok("과제를 성공적으로 삭제했습니다."); -// } -} + for (MultipartFile file : files) { + assignmentQueryService.uploadFileAttachment(assignmentId, file); + } + + return ResponseEntity.ok("과제 업로드가 성공했습니다."); + } + + // 첨부 링크 추가 + @PostMapping("/{assignmentId}/link") + public ResponseEntity urlAttachments( + @CurrentUser Long userId, + @PathVariable Long assignmentId, + @RequestBody List assignmentAttachmentDto + ){ + assignmentQueryService.uploadUrlAttachment(assignmentId, assignmentAttachmentDto); + return ResponseEntity.ok("과제 링크가 성공적으로 업로드 되었습니다."); + } + + // 첨부파일 혹은 링크 삭제 + @DeleteMapping("/attachment/{attachmentId}") + public ResponseEntity deleteAttachment( + @CurrentUser Long userId, + @PathVariable Long attachmentId + ) { + assignmentQueryService.deleteAttachment(attachmentId); + return ResponseEntity.ok("과제를 성공적으로 삭제했습니다."); + } +} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/dto/request/AssignmentAttachmentDto.java b/src/main/java/hello/cluebackend/domain/assignment/api/dto/request/AssignmentAttachmentDto.java new file mode 100644 index 00000000..3645818e --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/api/dto/request/AssignmentAttachmentDto.java @@ -0,0 +1,5 @@ +package hello.cluebackend.domain.assignment.api.dto.request; + +public record AssignmentAttachmentDto( + String url +) {} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/dto/request/CreateAssignmentDto.java b/src/main/java/hello/cluebackend/domain/assignment/api/dto/request/CreateAssignmentDto.java index b1b54dab..bc9db012 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/api/dto/request/CreateAssignmentDto.java +++ b/src/main/java/hello/cluebackend/domain/assignment/api/dto/request/CreateAssignmentDto.java @@ -3,9 +3,11 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; import jakarta.validation.constraints.NotNull; +import lombok.Builder; import java.time.LocalDateTime; +@Builder public record CreateAssignmentDto ( @NotNull @JsonProperty("class_id") Long classId, @NotNull String title, diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/dto/request/UploadAttachment.java b/src/main/java/hello/cluebackend/domain/assignment/api/dto/request/UploadAttachment.java deleted file mode 100644 index 55146c73..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/api/dto/request/UploadAttachment.java +++ /dev/null @@ -1,6 +0,0 @@ -//package hello.cluebackend.domain.assignment.management.api.dto.request; -// -//public class UploadAttachment { -// private final ; -// private final -//} diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentAttachmentDto.java b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentAttachmentDto.java new file mode 100644 index 00000000..e49f7e3c --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentAttachmentDto.java @@ -0,0 +1,13 @@ +package hello.cluebackend.domain.assignment.api.dto.response; + +import hello.cluebackend.domain.assignment.domain.fileType; +import lombok.Builder; + +@Builder +public record AssignmentAttachmentDto( + fileType type, + String value, + String originalFileName, + String contentType, + Long size +) {} diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentDto.java b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentDto.java deleted file mode 100644 index e8fdd4f8..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentDto.java +++ /dev/null @@ -1,27 +0,0 @@ -package hello.cluebackend.domain.assignment.api.dto.response; - -import com.fasterxml.jackson.annotation.JsonFormat; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.time.LocalDateTime; - -@Data -@NoArgsConstructor -@Builder -public class AssignmentDto { - private Long assignmentId; - private String title; - private String content; - @JsonFormat(pattern = "yyyy-MM-dd HH:mm") private LocalDateTime startDate; - @JsonFormat(pattern = "yyyy-MM-dd HH:mm") private LocalDateTime endDate; - - public AssignmentDto(Long assignmentId, String title, String content, LocalDateTime startDate, LocalDateTime endDate) { - this.assignmentId = assignmentId; - this.title = title; - this.content = content; - this.startDate = startDate; - this.endDate = endDate; - } -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentResponseDto.java b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentResponseDto.java new file mode 100644 index 00000000..0a19e7ad --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentResponseDto.java @@ -0,0 +1,19 @@ +package hello.cluebackend.domain.assignment.api.dto.response; + +import lombok.Builder; + +import java.time.LocalDateTime; +import java.util.List; + +@Builder +public record AssignmentResponseDto( + Long assignmentId, + String title, + String content, + LocalDateTime startDate, + LocalDateTime endDate, + String userName, + + // 과제 첨부 데이터 + List xAssignmentResponseDtos +) { } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetAllClassRoomAssignmentDto.java b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetAllClassRoomAssignmentDto.java deleted file mode 100644 index 3e3db53d..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetAllClassRoomAssignmentDto.java +++ /dev/null @@ -1,23 +0,0 @@ -package hello.cluebackend.domain.assignment.api.dto.response; - -import com.fasterxml.jackson.annotation.JsonFormat; -import lombok.Builder; -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -@Builder -public class GetAllClassRoomAssignmentDto { - private Long assignmentId; - private String title; - @JsonFormat(pattern = "yyyy-MM-dd HH:mm") private LocalDateTime startDate; - @JsonFormat(pattern = "yyyy-MM-dd HH:mm") private LocalDateTime endDate; - - public GetAllClassRoomAssignmentDto(Long assignmentId, String title, LocalDateTime startDate, LocalDateTime endDate){ - this.assignmentId = assignmentId; - this.title = title; - this.startDate = startDate; - this.endDate = endDate; - } -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetAllSubmissionCheckDto.java b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetAllSubmissionCheckDto.java deleted file mode 100644 index ec7ceea2..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetAllSubmissionCheckDto.java +++ /dev/null @@ -1,18 +0,0 @@ -package hello.cluebackend.domain.assignment.api.dto.response; - -import lombok.AllArgsConstructor; -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -@AllArgsConstructor -public class GetAllSubmissionCheckDto { - private Long submissionId; - private Long userId; - private String userName; - private int userClassCode; - private boolean isSubmitted; - private LocalDateTime submittedAt; - private LocalDateTime assignmentEndDate; -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetSubmissionFileDto.java b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetSubmissionFileDto.java deleted file mode 100644 index 7e406388..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetSubmissionFileDto.java +++ /dev/null @@ -1,7 +0,0 @@ -package hello.cluebackend.domain.assignment.api.dto.response; - -public class GetSubmissionFileDto { - private Long SubmissionAttachmentId; - private String fileName; // 만약 파일이 아닌 url인 경우 url 주소 - private int fileSize; // url일 경우 보내지 않음. -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetSubmissionResultDto.java b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetSubmissionResultDto.java deleted file mode 100644 index d1ff93a5..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/GetSubmissionResultDto.java +++ /dev/null @@ -1,10 +0,0 @@ -package hello.cluebackend.domain.assignment.api.dto.response; - -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -public class GetSubmissionResultDto { - private T SubmissionAttachments; -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentCheck.java b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/SubmissionCheck.java similarity index 82% rename from src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentCheck.java rename to src/main/java/hello/cluebackend/domain/assignment/api/dto/response/SubmissionCheck.java index f1b8b09a..16d912b6 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentCheck.java +++ b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/SubmissionCheck.java @@ -7,9 +7,10 @@ @Data @Builder -public class AssignmentCheck { +public class SubmissionCheck { private String userName; private int classNumberGrade; + private Long submissionId; private boolean isSubmitted; private LocalDateTime submittedAt; } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/application/AssignmentCommandService.java b/src/main/java/hello/cluebackend/domain/assignment/application/AssignmentCommandService.java index 5bd7e23e..d38bd7dc 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/application/AssignmentCommandService.java +++ b/src/main/java/hello/cluebackend/domain/assignment/application/AssignmentCommandService.java @@ -1,17 +1,22 @@ package hello.cluebackend.domain.assignment.application; -import hello.cluebackend.domain.assignment.api.dto.response.AssignmentDto; +import hello.cluebackend.domain.assignment.api.dto.response.AssignmentAttachmentDto; +import hello.cluebackend.domain.assignment.api.dto.response.AssignmentResponseDto; import hello.cluebackend.domain.assignment.api.dto.response.GetAllAssignmentDto; -import hello.cluebackend.domain.assignment.api.dto.response.GetAllClassRoomAssignmentDto; import hello.cluebackend.domain.assignment.domain.Assignment; +import hello.cluebackend.domain.assignment.domain.AssignmentAttachment; import hello.cluebackend.domain.assignment.persistence.AssignmentRepository; -import hello.cluebackend.domain.submission.application.SubmissionCommandService; +import hello.cluebackend.domain.assignment.persistence.AssignmentAttachmentRepository; +import hello.cluebackend.domain.classroom.service.ClassRoomService; import hello.cluebackend.domain.classroom.domain.ClassRoom; +import hello.cluebackend.domain.file.service.FileService; import jakarta.persistence.EntityNotFoundException; import lombok.RequiredArgsConstructor; +import org.springframework.core.io.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.io.IOException; import java.util.List; @Service @@ -19,27 +24,61 @@ @Transactional(readOnly = true) public class AssignmentCommandService{ private final AssignmentRepository assignmentRepository; - private final SubmissionCommandService submissionCommandService; + private final ClassRoomService classRoomService; + private final AssignmentAttachmentRepository assignmentAttachmentRepository; + private final FileService fileService; - // 사용자가 속한 모든 수업 과제 조회 - public List findAllAssignment(Long userId) { - List assignments = assignmentRepository.getAllByUser(userId); - return assignments.stream() - .map(a -> GetAllAssignmentDto.builder() - .assignmentId(a.getAssignmentId()) - .title(a.getTitle()) - .startDate(a.getStartDate()) - .endDate(a.getEndDate()) - .build() - ) + // 과제 단일 조회 + public AssignmentResponseDto findById(Long assignmentId) { + Assignment a = findByIdOrThrow(assignmentId); + List assignmentAttachments = assignmentAttachmentRepository.findAllByAssignment(a); + + List assignmentAttachmentDtos = assignmentAttachments.stream() + .map(aa -> AssignmentAttachmentDto.builder() + .type(aa.getType()) + .value(aa.getValue()) + .originalFileName(aa.getOriginalFileName()) + .contentType(aa.getContentType()) + .size(aa.getSize()) + .build()) .toList(); + + return AssignmentResponseDto.builder() + .assignmentId(a.getAssignmentId()) + .title(a.getTitle()) + .content(a.getContent()) + .startDate(a.getStartDate()) + .endDate(a.getEndDate()) + .userName(a.getUser().getUsername()) + .xAssignmentResponseDtos(assignmentAttachmentDtos) + .build(); } - // 해당 교실에 속한 모든 과제 출력 - public List findAllClassroomAssignment(ClassRoom classRoom) { + // 과제 전체 조회 + public List findAllById(Long userId, Long classId) { + ClassRoom classRoom = classRoomService.findById(classId).toEntity(); List assignments = assignmentRepository.findAllByClassRoom(classRoom); return assignments.stream() - .map(a -> GetAllClassRoomAssignmentDto.builder() + .map(a -> findById(a.getAssignmentId())) + .toList(); + } + + // 과제 ID를 통한 조회 + public Assignment findByIdOrThrow(Long assignmentId) { + return assignmentRepository.findById(assignmentId) + .orElseThrow(() -> new EntityNotFoundException("해당 과제를 찾을수 없습니다.")); + } + + public AssignmentAttachment findAssignmentAttachmentByIdOrderThrow(Long attachmentId){ + return assignmentAttachmentRepository.findById(attachmentId) + .orElseThrow(() -> new EntityNotFoundException("해당 첨부 파일을 찾을수 없습니다.")); + } + + // 사용자가 속한 모든 수업 과제 조회 + public List findAllAssignmentMe(Long userId) { + List assignments = assignmentRepository.getAllByUser(userId); + return assignments.stream() + .map(a -> GetAllAssignmentDto.builder() .assignmentId(a.getAssignmentId()) .title(a.getTitle()) .startDate(a.getStartDate()) @@ -49,29 +88,8 @@ public List findAllClassroomAssignment(ClassRoom c .toList(); } - // 과제 ID로 조회 - public AssignmentDto findById(Long assignmentId) { - Assignment a = assignmentRepository.findById(assignmentId) - .orElseThrow(() -> new EntityNotFoundException("Assignment not found : " + assignmentId)); - return AssignmentDto.builder() - .assignmentId(a.getAssignmentId()) - .title(a.getTitle()) - .content(a.getContent()) - .startDate(a.getStartDate()) - .endDate(a.getEndDate()) - .build(); + public Resource downloadAttachment(AssignmentAttachment assignmentAttachment) throws IOException { + String path = assignmentAttachment.getValue(); + return fileService.downloadFile(path); } - - // -// public List checkIsSubmitted(Assignment assignment) { -// List result = submissionRepository.findByAssignment(assignment); -// return result.stream() -// .map(a -> new GetAllSubmissionCheck(a.getSubmissionId(),a.getUser().getUserId(),a.getUser().getUsername(),a.getUser().getClassCode(),a.getIsSubmitted(),a.getSubmittedAt(),a.getAssignment().getEndDate())) -// .toList(); -// } - -// public Assignment findById(Long assignmentId) { -// return assignmentRepository.findById(assignmentId) -// .orElseThrow(() -> new EntityNotFoundException("Entity not found : " + assignmentId)); -// } } diff --git a/src/main/java/hello/cluebackend/domain/assignment/application/AssignmentQueryService.java b/src/main/java/hello/cluebackend/domain/assignment/application/AssignmentQueryService.java index 1bee98ae..0de43820 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/application/AssignmentQueryService.java +++ b/src/main/java/hello/cluebackend/domain/assignment/application/AssignmentQueryService.java @@ -1,30 +1,41 @@ package hello.cluebackend.domain.assignment.application; +import hello.cluebackend.domain.assignment.api.dto.request.AssignmentAttachmentDto; import hello.cluebackend.domain.assignment.api.dto.request.CreateAssignmentDto; import hello.cluebackend.domain.assignment.api.dto.request.ModifyAssignmentDto; import hello.cluebackend.domain.assignment.domain.Assignment; +import hello.cluebackend.domain.assignment.domain.AssignmentAttachment; +import hello.cluebackend.domain.assignment.domain.fileType; import hello.cluebackend.domain.assignment.persistence.AssignmentRepository; +import hello.cluebackend.domain.assignment.persistence.AssignmentAttachmentRepository; import hello.cluebackend.domain.classroom.domain.ClassRoom; import hello.cluebackend.domain.classroom.domain.repository.ClassRoomRepository; +import hello.cluebackend.domain.file.service.FileService; import hello.cluebackend.domain.user.domain.UserEntity; -import hello.cluebackend.domain.user.domain.repository.UserRepository; +import hello.cluebackend.domain.user.service.UserService; import jakarta.persistence.EntityNotFoundException; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; @Service @RequiredArgsConstructor public class AssignmentQueryService{ private final AssignmentRepository assignmentRepository; - private final UserRepository userRepository; private final ClassRoomRepository classRoomRepository; + private final AssignmentCommandService assignmentCommandService; + private final AssignmentAttachmentRepository assignmentAttachmentRepository; + private final FileService fileService; + private final UserService userService; // 과제 생성 @Transactional public Assignment save(Long userId, CreateAssignmentDto request) { - UserEntity user = userRepository.findById(userId) - .orElseThrow(() -> new EntityNotFoundException("해당 사용자를 찾을수 없습니다.")); + UserEntity user = userService.findById(userId).toEntity(); + ClassRoom classRoom = classRoomRepository.findById(request.classId()) .orElseThrow(() -> new EntityNotFoundException("해당 교실을 찾을수 없습니다")); @@ -44,17 +55,61 @@ public Assignment save(Long userId, CreateAssignmentDto request) { // 과제 삭제 @Transactional public void delete(Long assignmentId) { - Assignment assignment = assignmentRepository.findById(assignmentId) - .orElseThrow(() -> new EntityNotFoundException("해당 과제를 찾을수 없습니다.")); + Assignment assignment = assignmentCommandService.findByIdOrThrow(assignmentId); assignmentRepository.delete(assignment); } // 과제 수정 @Transactional - public Assignment patchAssignment(Long id, ModifyAssignmentDto dto){ - Assignment assignment = assignmentRepository.findById(id) - .orElseThrow(() -> new EntityNotFoundException("해당 과제를 찾을수 없습니다.")); - assignment.patch(dto); + public Assignment patchAssignment(Long assignmentId, ModifyAssignmentDto dto){ + Assignment assignment = assignmentCommandService.findByIdOrThrow(assignmentId); + assignment.patch(dto.getTitle(), dto.getContent(), dto.getStartDate(), dto.getEndDate()); return assignment; } + + // url 업로드 + @Transactional + public void uploadUrlAttachment(Long assignmentId, List dtos) { + Assignment assignment = assignmentCommandService.findByIdOrThrow(assignmentId); + + List result = dtos.stream() + .map(dto -> AssignmentAttachment.builder() + .assignment(assignment) + .type(fileType.URL) + .value(dto.url()) + .build()) + .toList(); + + assignmentAttachmentRepository.saveAll(result); + } + + // 첨부 파일 추가 + public void uploadFileAttachment(Long assignmentId, MultipartFile file) { + Assignment assignment = assignmentCommandService.findByIdOrThrow(assignmentId); + + String storedFileName = fileService.storeFile(file); + + AssignmentAttachment result = AssignmentAttachment.builder() + .assignment(assignment) + .type(fileType.FILE) + .value(storedFileName) + .originalFileName(file.getOriginalFilename()) + .contentType(file.getContentType()) + .size(file.getSize()) + .build(); + assignmentAttachmentRepository.save(result); + } + + // 첨부 파일 업로드 삭제 + @Transactional + public void deleteAttachment(Long attachmentId) { + AssignmentAttachment assignmentAttachment = assignmentCommandService.findAssignmentAttachmentByIdOrderThrow(attachmentId); + if(assignmentAttachment.getType() == fileType.FILE){ + fileService.deleteFile(assignmentAttachment.getValue()); + } + assignmentAttachmentRepository.delete(assignmentAttachment); + } + + + } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/domain/Assignment.java b/src/main/java/hello/cluebackend/domain/assignment/domain/Assignment.java index 656c7287..5597298a 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/domain/Assignment.java +++ b/src/main/java/hello/cluebackend/domain/assignment/domain/Assignment.java @@ -1,7 +1,6 @@ package hello.cluebackend.domain.assignment.domain; -import com.fasterxml.jackson.annotation.JsonIgnore; -import hello.cluebackend.domain.assignment.api.dto.request.ModifyAssignmentDto; +import com.fasterxml.jackson.annotation.JsonFormat; import hello.cluebackend.domain.submission.domain.Submission; import hello.cluebackend.domain.classroom.domain.ClassRoom; import hello.cluebackend.domain.user.domain.UserEntity; @@ -14,54 +13,59 @@ @Entity @Table(name = "assignment") -@Getter @Setter +@Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor @Builder -public class Assignment { - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) +@AllArgsConstructor +public class Assignment extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "assignment_id") private Long assignmentId; - @JsonIgnore - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "classroom_id") private ClassRoom classRoom; - @JsonIgnore - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private UserEntity user; - @Column(name = "title") + @Column(nullable = false) private String title; - @Column(name = "content") + @Column(columnDefinition = "TEXT") private String content; - @Column(name = "start_date") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm") private LocalDateTime startDate; - @Column(name = "end_date") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm") private LocalDateTime endDate; - @JsonIgnore - @OneToMany(fetch = FetchType.LAZY, mappedBy = "assignment", cascade = CascadeType.REMOVE) + + @OneToMany(mappedBy = "assignment", cascade = CascadeType.REMOVE, orphanRemoval = true) + @Builder.Default private List submissions = new ArrayList<>(); - public Assignment(ClassRoom classRoom,UserEntity user,String title, String content, LocalDateTime startDate, LocalDateTime endDate){ - this.classRoom = classRoom; - this.user = user; - this.title = title; - this.content = content; - this.startDate = startDate; - this.endDate = endDate; + // DTO 기반 정적 팩토리 메서드 + public static Assignment create(ClassRoom classRoom, UserEntity user, String title, String content, LocalDateTime startDate, LocalDateTime endDate) { + return Assignment.builder() + .classRoom(classRoom) + .user(user) + .title(title) + .content(content) + .startDate(startDate) + .endDate(endDate) + .build(); } - public void patch(ModifyAssignmentDto dto) { - if (dto.getTitle() != null) this.title = dto.getTitle(); - if (dto.getContent() != null) this.content = dto.getContent(); - if (dto.getStartDate() != null) this.startDate = dto.getStartDate(); - if (dto.getEndDate() != null) this.endDate = dto.getEndDate(); + // patch 메서드 (null 체크 후 업데이트) + public void patch(String title, String content, LocalDateTime startDate, LocalDateTime endDate) { + if (title != null) this.title = title; + if (content != null) this.content = content; + if (startDate != null) this.startDate = startDate; + if (endDate != null) this.endDate = endDate; } } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment.java b/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment.java new file mode 100644 index 00000000..53e845f0 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment.java @@ -0,0 +1,34 @@ +package hello.cluebackend.domain.assignment.domain; + +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Table(name = "assignment_attachment") +@Getter @Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class AssignmentAttachment extends BaseEntity { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "assignment_attachment_id") + private Long assignmentAttachmentId; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name="assignment_id") + private Assignment assignment; + + // FILE, URL + @Column(nullable = false) + @Enumerated(EnumType.STRING) + private fileType type; + + // 실제 파일이면 S3 Key, URL이면 링크 + @Column(nullable = false) + private String value; + + // 파일일 경우 메타데이터 + private String originalFileName; + private String contentType; + private Long size; +} diff --git a/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment/AssignmentAttachment.java b/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment/AssignmentAttachment.java deleted file mode 100644 index 24db4cd2..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment/AssignmentAttachment.java +++ /dev/null @@ -1,30 +0,0 @@ -package hello.cluebackend.domain.assignment.domain.AssignmentAttachment; - -import hello.cluebackend.domain.assignment.domain.Assignment; -import hello.cluebackend.domain.user.domain.UserEntity; -import jakarta.persistence.*; -import lombok.*; - -import java.time.LocalDateTime; - -@Entity -@Table(name = "assignment_attachment") -@Inheritance(strategy = InheritanceType.JOINED) -@DiscriminatorColumn(name = "DTYPE") -@Getter @Setter -public abstract class AssignmentAttachment { - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "assignment_attachment_id") - private Long assignmentAttachmentId; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name="assignment_id") - private Assignment assignment; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id") - private UserEntity user; - - @Column(name = "update_date") - private LocalDateTime updateDate; -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment/AttachmentDocument.java b/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment/AttachmentDocument.java deleted file mode 100644 index cc2ba3b6..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment/AttachmentDocument.java +++ /dev/null @@ -1,26 +0,0 @@ -package hello.cluebackend.domain.assignment.domain.AssignmentAttachment; - -import jakarta.persistence.Column; -import jakarta.persistence.DiscriminatorValue; -import jakarta.persistence.Entity; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Entity -@DiscriminatorValue("D") -@Getter @Setter -@NoArgsConstructor -public class AttachmentDocument extends AssignmentAttachment{ - @Column(name = "original_file_name", length = 255) - private String originalFileName; - - @Column(name = "stored_file_name", length = 255) - private String storedFileName; - - @Column(name = "file_path", length = 2000) - private String filePath; - - @Column(name = "file_size") - private long fileSize; -} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment/AttachmentLink.java b/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment/AttachmentLink.java deleted file mode 100644 index a47fde73..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment/AttachmentLink.java +++ /dev/null @@ -1,17 +0,0 @@ -package hello.cluebackend.domain.assignment.domain.AssignmentAttachment; - -import jakarta.persistence.Column; -import jakarta.persistence.DiscriminatorValue; -import jakarta.persistence.Entity; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Entity -@DiscriminatorValue("L") -@Getter @Setter -@NoArgsConstructor -public class AttachmentLink extends AssignmentAttachment{ - @Column(name = "url", length = 2000) - private String url; -} diff --git a/src/main/java/hello/cluebackend/domain/assignment/domain/BaseEntity.java b/src/main/java/hello/cluebackend/domain/assignment/domain/BaseEntity.java new file mode 100644 index 00000000..1beba01c --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/domain/BaseEntity.java @@ -0,0 +1,32 @@ +package hello.cluebackend.domain.assignment.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.MappedSuperclass; +import lombok.Getter; +import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.LocalDateTime; + +@EntityListeners(AuditingEntityListener.class) +@MappedSuperclass +@Getter +public class BaseEntity { + @CreatedDate + @Column + private LocalDateTime createdDate; + + @LastModifiedDate + private LocalDateTime lastModified; + + @CreatedBy + @Column(updatable = false) + private String createdBy; + + @LastModifiedBy + private String lastModifiedBy; +} diff --git a/src/main/java/hello/cluebackend/domain/assignment/domain/fileType.java b/src/main/java/hello/cluebackend/domain/assignment/domain/fileType.java new file mode 100644 index 00000000..d5b3c438 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/domain/fileType.java @@ -0,0 +1,5 @@ +package hello.cluebackend.domain.assignment.domain; + +public enum fileType { + FILE,URL +} diff --git a/src/main/java/hello/cluebackend/domain/assignment/exception/AccessDeniedException.java b/src/main/java/hello/cluebackend/domain/assignment/exception/AccessDeniedException.java new file mode 100644 index 00000000..8bfc7401 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/assignment/exception/AccessDeniedException.java @@ -0,0 +1,7 @@ +package hello.cluebackend.domain.assignment.exception; + +public class AccessDeniedException extends RuntimeException { + public AccessDeniedException(String message) { + super(message); + } +} diff --git a/src/main/java/hello/cluebackend/domain/assignment/persistence/assignmentDocument/AssignmentAttachmentRepository.java b/src/main/java/hello/cluebackend/domain/assignment/persistence/AssignmentAttachmentRepository.java similarity index 56% rename from src/main/java/hello/cluebackend/domain/assignment/persistence/assignmentDocument/AssignmentAttachmentRepository.java rename to src/main/java/hello/cluebackend/domain/assignment/persistence/AssignmentAttachmentRepository.java index 0e64d7d8..215bdc57 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/persistence/assignmentDocument/AssignmentAttachmentRepository.java +++ b/src/main/java/hello/cluebackend/domain/assignment/persistence/AssignmentAttachmentRepository.java @@ -1,10 +1,13 @@ -package hello.cluebackend.domain.assignment.persistence.assignmentDocument; +package hello.cluebackend.domain.assignment.persistence; -import hello.cluebackend.domain.assignment.domain.AssignmentAttachment.AssignmentAttachment; +import hello.cluebackend.domain.assignment.domain.Assignment; +import hello.cluebackend.domain.assignment.domain.AssignmentAttachment; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface AssignmentAttachmentRepository extends JpaRepository { - + List findAllByAssignment(Assignment assignment); } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/persistence/AssignmentRepository.java b/src/main/java/hello/cluebackend/domain/assignment/persistence/AssignmentRepository.java index 1726ff73..930c3e58 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/persistence/AssignmentRepository.java +++ b/src/main/java/hello/cluebackend/domain/assignment/persistence/AssignmentRepository.java @@ -17,9 +17,5 @@ public interface AssignmentRepository extends JpaRepository { " AND s.isSubmitted = false") List getAllByUser(@Param("userId") Long userId); - Assignment findByAssignmentId(Long assignmentId); - - List findByClassRoom(ClassRoom classRoom); - List findAllByClassRoom(ClassRoom classRoom); } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/persistence/assignmentDocument/AttachmentDocumentRepository.java b/src/main/java/hello/cluebackend/domain/assignment/persistence/assignmentDocument/AttachmentDocumentRepository.java deleted file mode 100644 index 6b774c38..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/persistence/assignmentDocument/AttachmentDocumentRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package hello.cluebackend.domain.assignment.persistence.assignmentDocument; - -import hello.cluebackend.domain.assignment.domain.AssignmentAttachment.AttachmentDocument; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface AttachmentDocumentRepository extends JpaRepository { - -} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/assignment/persistence/assignmentDocument/AttachmentLinkRepository.java b/src/main/java/hello/cluebackend/domain/assignment/persistence/assignmentDocument/AttachmentLinkRepository.java deleted file mode 100644 index eb4c24ec..00000000 --- a/src/main/java/hello/cluebackend/domain/assignment/persistence/assignmentDocument/AttachmentLinkRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package hello.cluebackend.domain.assignment.persistence.assignmentDocument; - -import hello.cluebackend.domain.assignment.domain.AssignmentAttachment.AttachmentLink; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface AttachmentLinkRepository extends JpaRepository { - -} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/classroom/presentation/ClassRoomController.java b/src/main/java/hello/cluebackend/domain/classroom/presentation/ClassRoomController.java index f2a1179f..d397ff4d 100644 --- a/src/main/java/hello/cluebackend/domain/classroom/presentation/ClassRoomController.java +++ b/src/main/java/hello/cluebackend/domain/classroom/presentation/ClassRoomController.java @@ -1,13 +1,10 @@ package hello.cluebackend.domain.classroom.presentation; -import hello.cluebackend.domain.assignment.api.dto.response.GetAllClassRoomAssignmentDto; import hello.cluebackend.domain.assignment.application.AssignmentCommandService; -import hello.cluebackend.domain.classroom.domain.ClassRoom; import hello.cluebackend.domain.classroom.presentation.dto.ClassRoomCardDto; import hello.cluebackend.domain.classroom.presentation.dto.ClassRoomDto; import hello.cluebackend.domain.classroom.service.ClassRoomService; import hello.cluebackend.domain.user.domain.Role; -import hello.cluebackend.global.common.annotation.CurrentUser; import hello.cluebackend.global.config.JWTUtil; import jakarta.persistence.EntityNotFoundException; import jakarta.servlet.http.HttpServletRequest; @@ -27,7 +24,6 @@ public class ClassRoomController { private final JWTUtil jwtUtil; private final ClassRoomService classRoomService; - private final AssignmentCommandService assignmentCommandService; @GetMapping public ResponseEntity> getAllClassRooms(HttpServletRequest request){ @@ -45,14 +41,6 @@ public ResponseEntity getAllInfo(HttpServletRequest request, @PathVariable Lo return ResponseEntity.ok(classRoomService.getAllInfo(classId)); } - // 교실 과제 전체 조회 - @GetMapping("/{classId}/assignments") - public ResponseEntity> getAllClassroomAssignment(@CurrentUser Long userId, @PathVariable Long classId) { - ClassRoom classRoom = classRoomService.findById(classId).toEntity(); - List result = assignmentCommandService.findAllClassroomAssignment(classRoom); - return ResponseEntity.ok(result); - } - @PostMapping public ResponseEntity> createClassRoom(@RequestBody ClassRoomDto classRoomDTO, HttpServletRequest request) { String token = jwtUtil.getToken(request); diff --git a/src/main/java/hello/cluebackend/domain/classroomuser/application/ClassroomUserService.java b/src/main/java/hello/cluebackend/domain/classroomuser/application/ClassroomUserService.java index 675b15be..477f8e6d 100644 --- a/src/main/java/hello/cluebackend/domain/classroomuser/application/ClassroomUserService.java +++ b/src/main/java/hello/cluebackend/domain/classroomuser/application/ClassroomUserService.java @@ -1,9 +1,11 @@ package hello.cluebackend.domain.classroomuser.application; import hello.cluebackend.domain.classroom.domain.ClassRoom; +import hello.cluebackend.domain.classroom.service.ClassRoomService; import hello.cluebackend.domain.classroomuser.domain.ClassRoomUser; import hello.cluebackend.domain.classroomuser.domain.repository.ClassRoomUserRepository; import hello.cluebackend.domain.user.domain.UserEntity; +import hello.cluebackend.domain.user.service.UserService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -13,6 +15,8 @@ @RequiredArgsConstructor public class ClassroomUserService { private final ClassRoomUserRepository classRoomUserRepository; + private final UserService userService; + private final ClassRoomService classRoomService; // 해당 교실에 속한 모든 사용자 조회 public List findAllClassroomUser(ClassRoom classRoom){ @@ -22,4 +26,12 @@ public List findAllClassroomUser(ClassRoom classRoom){ .toList(); return users; } + + // 수업실에 해당 유저가 속하는지 확인하는 로직 + public boolean isUserInClassroom(Long classRoomId, Long userId) { + ClassRoom classRoom = classRoomService.findById(classRoomId).toEntity(); + UserEntity user = userService.findById(userId).toEntity(); + + return classRoomUserRepository.existsByClassRoomAndUser(classRoom,user); + } } diff --git a/src/main/java/hello/cluebackend/domain/classroomuser/domain/ClassRoomUser.java b/src/main/java/hello/cluebackend/domain/classroomuser/domain/ClassRoomUser.java index d9f779a3..d9ba340f 100644 --- a/src/main/java/hello/cluebackend/domain/classroomuser/domain/ClassRoomUser.java +++ b/src/main/java/hello/cluebackend/domain/classroomuser/domain/ClassRoomUser.java @@ -8,7 +8,6 @@ @Entity @Table(name="class_room_user") @Getter -@Setter @Builder @NoArgsConstructor @AllArgsConstructor diff --git a/src/main/java/hello/cluebackend/domain/classroomuser/domain/repository/ClassRoomUserRepository.java b/src/main/java/hello/cluebackend/domain/classroomuser/domain/repository/ClassRoomUserRepository.java index 2cb5feef..204be1a2 100644 --- a/src/main/java/hello/cluebackend/domain/classroomuser/domain/repository/ClassRoomUserRepository.java +++ b/src/main/java/hello/cluebackend/domain/classroomuser/domain/repository/ClassRoomUserRepository.java @@ -27,4 +27,6 @@ public interface ClassRoomUserRepository extends JpaRepository user(UserEntity user); List findAllByClassRoom(ClassRoom classRoom); + + boolean existsByClassRoomAndUser(ClassRoom classRoom, UserEntity user); } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/file/exception/S3FileNotFoundException.java b/src/main/java/hello/cluebackend/domain/file/exception/S3FileNotFoundException.java new file mode 100644 index 00000000..93dd1389 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/file/exception/S3FileNotFoundException.java @@ -0,0 +1,7 @@ +package hello.cluebackend.domain.file.exception; + +import com.amazonaws.services.s3.model.AmazonS3Exception; + +public class S3FileNotFoundException extends AmazonS3Exception { + public S3FileNotFoundException(String message) { super(message); } +} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/file/presentation/FileController.java b/src/main/java/hello/cluebackend/domain/file/presentation/FileController.java deleted file mode 100644 index 8101dc74..00000000 --- a/src/main/java/hello/cluebackend/domain/file/presentation/FileController.java +++ /dev/null @@ -1,47 +0,0 @@ -//package hello.cluebackend.domain.file.presentation; -// -//import hello.cluebackend.domain.file.service.FileService; -//import hello.cluebackend.global.config.JWTUtil; -//import jakarta.servlet.http.HttpServletRequest; -//import lombok.RequiredArgsConstructor; -//import org.springframework.core.io.Resource; -//import org.springframework.http.HttpHeaders; -//import org.springframework.http.MediaType; -//import org.springframework.http.ResponseEntity; -//import org.springframework.web.bind.annotation.GetMapping; -//import org.springframework.web.bind.annotation.PathVariable; -//import org.springframework.web.bind.annotation.RequestMapping; -//import org.springframework.web.bind.annotation.RestController; -// -//@RestController -//@RequiredArgsConstructor -//@RequestMapping(name = "/api/file") -//public class FileController { -// -// -// private final FileService fileService; -// private final JWTUtil jWTUtil; -// -// private Long jwtTokenTaker(HttpServletRequest request){ -// String token = jWTUtil.getToken(request); -// Long userId = jWTUtil.getUserId(token); -// -// return userId; -// } -// -// // 선생님 과제 첨부 파일 다운 받기 -//// @GetMapping("/attachment/{attachmentId}") -//// public ResponseEntity downloadAttachment(@PathVariable Long attachmentId, HttpServletRequest request){ -//// Long userId = jwtTokenTaker(request); -//// -//// Resource file = fileService.downloadFile(attachmentId, userId); -//// -//// return ResponseEntity.ok() -//// .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"downloaded-file\"") -//// .contentType(MediaType.APPLICATION_OCTET_STREAM) -//// .body(file); -//// } -// -// // 학생 제출 과제 관련 파일 다운 받기 -// -//} diff --git a/src/main/java/hello/cluebackend/domain/file/service/FileService.java b/src/main/java/hello/cluebackend/domain/file/service/FileService.java index 41b8a3e0..7feb5348 100644 --- a/src/main/java/hello/cluebackend/domain/file/service/FileService.java +++ b/src/main/java/hello/cluebackend/domain/file/service/FileService.java @@ -1,82 +1,65 @@ -//package hello.cluebackend.domain.file.service; -// -//import com.amazonaws.services.s3.AmazonS3Client; -//import com.amazonaws.services.s3.model.ObjectMetadata; -//import com.amazonaws.services.s3.model.PutObjectRequest; -//import com.amazonaws.services.s3.model.S3Object; -//import hello.cluebackend.domain.assignmentAttachment.domain.AssignmentAttachment; -//import hello.cluebackend.domain.assignmentAttachment.domain.repository.AssignmentAttachmentRepository; -//import jakarta.persistence.EntityNotFoundException; -//import lombok.RequiredArgsConstructor; -//import org.springframework.beans.factory.annotation.Value; -//import org.springframework.core.io.InputStreamResource; -//import org.springframework.core.io.Resource; -//import org.springframework.stereotype.Service; -//import org.springframework.web.multipart.MultipartFile; -// -//import java.io.IOException; -//import java.util.UUID; -// -//@Service -//@RequiredArgsConstructor -//public class FileService { -// private final AmazonS3Client amazonS3Client; -// private final AssignmentAttachmentRepository assignmentAttachmentRepository; -// -// @Value("${cloud.aws.s3.bucket}") -// private String bucket; -// -// // 파일 올리기 -// public String storeFile(MultipartFile file) { -// String originalFilename = file.getOriginalFilename(); -// String extension = ""; -// if (originalFilename != null && originalFilename.contains(".")) { -// extension = originalFilename.substring(originalFilename.lastIndexOf(".")); -// } -// String storedFileName = UUID.randomUUID().toString() + extension; -// -// ObjectMetadata metadata = new ObjectMetadata(); -// metadata.setContentLength(file.getSize()); -// metadata.setContentType(file.getContentType()); -// -// try { -// amazonS3Client.putObject(new PutObjectRequest(bucket, storedFileName, file.getInputStream(), metadata)); // 공개 권한 설정 -// -//// return amazonS3Client.getUrl(bucket, storedFileName).toString(); -// return storedFileName; -// } catch (IOException e) { -// throw new RuntimeException("파일 업로드에 실패했습니다.", e); -// } -// } -// -// // 선생님 과제 첨부 -// -// -// -// // 선생님 첨부 파일 다운로드 -//// public Resource downloadFile(Long attachmentId, Long userId) { -//// AssignmentAttachment attachment = assignmentAttachmentRepository.findById(attachmentId) -//// .orElseThrow(() -> new RuntimeException("파일을 찾을 수 없습니다.")); -//// -//// String filePath = attachment.getFilePath(); -//// -//// S3Object s3Object = amazonS3Client.getObject(bucket, filePath); -//// -//// return new InputStreamResource(s3Object.getObjectContent()); -//// } -// -// // 학생 과제 파일 첨부 -// -// -// // 과제 아이디를 가지고 해당 과제 파일 다운로드 -//// public Resource downloadStudentAssignmentFile(Long attachmentId, Long userId){ -//// AssignmentAttachment attachment = assignmentAttachmentRepository.findById(attachmentId) -//// .orElseThrow(() -> new EntityNotFoundException("파일을 찾을 수 없습니다.")); -//// -//// String filePath = attachment.(); -//// -//// S3Object s3Object = amazonS3Client.getObject(bucket, filePath); -//// -//// return new InputStreamResource(s3Object.getObjectContent()); -//// } -//} +package hello.cluebackend.domain.file.service; + +import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.model.ObjectMetadata; +import com.amazonaws.services.s3.model.PutObjectRequest; +import com.amazonaws.services.s3.model.S3Object; +import hello.cluebackend.domain.file.exception.S3FileNotFoundException; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.InputStreamResource; +import org.springframework.core.io.Resource; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.UUID; + +@Service +@RequiredArgsConstructor +public class FileService { + private final AmazonS3Client amazonS3Client; + + @Value("${cloud.aws.s3.bucket}") + private String bucket; + + // 파일 추가 + public String storeFile(MultipartFile file) { + String originalFilename = file.getOriginalFilename(); + String extension = ""; + if (originalFilename != null && originalFilename.contains(".")) { + extension = originalFilename.substring(originalFilename.lastIndexOf(".")); + } + String storedFileName = UUID.randomUUID().toString() + extension; + + ObjectMetadata metadata = new ObjectMetadata(); + metadata.setContentLength(file.getSize()); + metadata.setContentType(file.getContentType()); + + try { + amazonS3Client.putObject(new PutObjectRequest(bucket, storedFileName, file.getInputStream(), metadata)); // 공개 권한 설정 + return storedFileName; + } catch (IOException e) { + throw new RuntimeException("파일 업로드에 실패했습니다.", e); + } + } + + // 파일 삭제 + public void deleteFile(String storedFileName) { + try{ + amazonS3Client.deleteObject(bucket, storedFileName); + }catch(Exception e){ + throw new RuntimeException("파일 삭제에 실패했습니다."); + } + } + + // 파일 다운로드 + public Resource downloadFile(String filePath) throws IOException { + try{ + S3Object s3Object = amazonS3Client.getObject(bucket, filePath); + return new InputStreamResource(s3Object.getObjectContent()); + } catch (Exception e) { + throw new S3FileNotFoundException("해당 파일 경로를 찾을수 없습니다: " + filePath); + } + } +} diff --git a/src/main/java/hello/cluebackend/domain/submission/api/SubmissionCommandController.java b/src/main/java/hello/cluebackend/domain/submission/api/SubmissionCommandController.java index b7018c6d..c8e234f6 100644 --- a/src/main/java/hello/cluebackend/domain/submission/api/SubmissionCommandController.java +++ b/src/main/java/hello/cluebackend/domain/submission/api/SubmissionCommandController.java @@ -1,17 +1,22 @@ package hello.cluebackend.domain.submission.api; +import hello.cluebackend.domain.assignment.api.dto.response.SubmissionCheck; import hello.cluebackend.domain.submission.api.dto.response.SubmissionDto; import hello.cluebackend.domain.submission.application.SubmissionCommandService; -import hello.cluebackend.domain.submission.domain.Submission; +import hello.cluebackend.domain.submission.domain.SubmissionAttachment; import hello.cluebackend.global.common.annotation.CurrentUser; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.core.io.Resource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.io.IOException; import java.util.List; @RestController @@ -23,52 +28,46 @@ public class SubmissionCommandController { // 할당된 과제 전체 조회 @GetMapping("/assignment/{assignmentId}") - public ResponseEntity> findAllSubmission(@CurrentUser Long id, @PathVariable Long assignmentId) { - List submissions = submissionCommandService.findAllByAssignmentId(assignmentId); - - List result = submissions.stream() - .map(s -> SubmissionDto.builder() - .title(s.getAssignment().getTitle()) - .startDate(s.getAssignment().getStartDate()) - .endDate(s.getAssignment().getEndDate()) - .userName(s.getUser().getUsername()) - .isSubmitted(s.getIsSubmitted()) - .submittedAt(s.getSubmittedAt()) - .build() - ) - .toList(); - + public ResponseEntity> findAllSubmission( + @CurrentUser Long userId, + @PathVariable Long assignmentId + ) { + List result = submissionCommandService.findAllByAssignmentId(userId,assignmentId); return ResponseEntity.ok(result); } // 할당된 과제 단일 조회 @GetMapping("/{submissionId}") - public ResponseEntity findSubmission(@CurrentUser Long id, @PathVariable Long assignmentId) { - - Submission s = submissionCommandService.findByAssignmentId(assignmentId); - - SubmissionDto result = SubmissionDto.builder() - .title(s.getAssignment().getTitle()) - .startDate(s.getAssignment().getStartDate()) - .endDate(s.getAssignment().getEndDate()) - .userName(s.getUser().getUsername()) - .isSubmitted(s.getIsSubmitted()) - .submittedAt(s.getSubmittedAt()) - .build(); + public ResponseEntity findSubmission( + @CurrentUser Long userId, + @PathVariable Long assignmentId + ) { + SubmissionDto result = submissionCommandService.findByAssignmentId(assignmentId); return ResponseEntity.ok(result); } - // 할당된 과제의 파일 전체 조회 - - - // TODO : 메인 페이지 학생 미제출 과제 전체 조회, 메인 - - - // TODO : 수업실 과제 전체 조회 및 학생 첨부 파일 전체 조회, 학습실 - 과제 - - - // TODO : 수업실 과제 단일 세부 조회 및 학생,선생 첨부 파일 전체 조회 , 학습실 - 과제세부확인 - + // 전체 학생 과제 제출 여부 + @GetMapping("/{assignmentId}/check") + public ResponseEntity> checkAssignment( + @CurrentUser Long userId, + @PathVariable Long assignmentId + ){ + List assignmentChecks = submissionCommandService.checkAssignment(userId,assignmentId); + return ResponseEntity.ok(assignmentChecks); + } + // 첨부파일 다운로드 + @GetMapping("/{submissionAttachmentId}/download") + public ResponseEntity submissionAttachmentDownload( + @CurrentUser Long userId, + @PathVariable Long submissionAttachmentId + ) throws IOException { + SubmissionAttachment submissionAttachment = submissionCommandService.findsubmissionAttachmentByIdOrThrow(submissionAttachmentId); + Resource resource = submissionCommandService.downloadAttachment(submissionAttachment); + return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + submissionAttachment.getOriginalFileName() + submissionAttachment.getContentType() + "\"") + .contentType(MediaType.APPLICATION_OCTET_STREAM) + .body(resource); + } } diff --git a/src/main/java/hello/cluebackend/domain/submission/api/SubmissionQueryController.java b/src/main/java/hello/cluebackend/domain/submission/api/SubmissionQueryController.java index f82eefe0..a0312adf 100644 --- a/src/main/java/hello/cluebackend/domain/submission/api/SubmissionQueryController.java +++ b/src/main/java/hello/cluebackend/domain/submission/api/SubmissionQueryController.java @@ -1,11 +1,17 @@ package hello.cluebackend.domain.submission.api; +import hello.cluebackend.domain.submission.api.dto.request.SubmissionAttachmentUrlDto; import hello.cluebackend.domain.submission.application.SubmissionQueryService; +import hello.cluebackend.domain.submission.domain.Submission; +import hello.cluebackend.domain.submission.domain.SubmissionAttachment; import hello.cluebackend.global.common.annotation.CurrentUser; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; @RestController @RequestMapping("/api/submissions") @@ -20,8 +26,8 @@ public ResponseEntity submitSubmission( @CurrentUser Long userId, @PathVariable Long submissionId ) { - submissionQueryService.submitSubmission(submissionId); - return ResponseEntity.ok("성공적으로 과제가 제출되었습니다."); + Submission submission = submissionQueryService.submitSubmission(submissionId); + return ResponseEntity.ok(submission); } // 과제 제출 취소하기 @@ -30,27 +36,39 @@ public ResponseEntity cancelSubmission( @CurrentUser Long userId, @PathVariable Long submissionId ){ - submissionQueryService.cancelSubmission(submissionId); - return ResponseEntity.ok("과제 제출이 취소되었습니다."); + Submission submission = submissionQueryService.cancelSubmission(submissionId); + return ResponseEntity.ok(submission); + } + + + @DeleteMapping("/{submissionAttachmentId}") + public ResponseEntity deleteSubmission( + @CurrentUser Long userId, + @PathVariable Long submissionAttachmentId + ){ + submissionQueryService.deleteSubmissionAttachment(submissionAttachmentId); + return ResponseEntity.ok("과제 첨부파일이 성공적으로 삭제되었습니다."); } - // TODO : 과제 파일 업로드 하기 -// @PostMapping("/{submissionId}/upload") -// public ResponseEntity fileUpload( -// @CurrentUser Long userId, -// @PathVariable Long submissionId, -// @RequestBody MultipartFile file -// ) { -// submissionQueryService.fileUpload(submissionId, file); -// return ResponseEntity.ok("첨부파일 업로드가 성공적으로 이뤄졌습니다."); -// } - - // TODO : 과제 첨부 파일 삭제하기 -// @DeleteMapping("/{submissionAttachmentId}/delete") -// public ResponseEntity deleteFile( -// @PathVariable Long submissionAttachmentId -// ) { -// submissionQueryService.deletefile(submissionAttachmentId); -// return ResponseEntity.ok("첨부 파일 삭제"); -// } + // 과제 제출 첨부 파일 추가 + @PostMapping("/{submissionId}/file") + public ResponseEntity fileUpload( + @CurrentUser Long userId, + @PathVariable Long submissionId, + @RequestBody MultipartFile file + ) throws IOException { + SubmissionAttachment submissionAttachment = submissionQueryService.fileUpload(submissionId, file); + return ResponseEntity.ok(submissionAttachment); + } + + // 과제 제출 첨부 링크 추가 + @PostMapping("/{submisisonId}/link") + public ResponseEntity deleteFile( + @CurrentUser Long userId, + @PathVariable Long submissionId, + @RequestBody SubmissionAttachmentUrlDto dto + ) { + submissionQueryService.linkUpload(submissionId, dto); + return ResponseEntity.ok("첨부 파일 삭제"); + } } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/submission/api/dto/request/SubmissionAssignmentAttachmentDto.java b/src/main/java/hello/cluebackend/domain/submission/api/dto/request/SubmissionAssignmentAttachmentDto.java new file mode 100644 index 00000000..998b45a0 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/submission/api/dto/request/SubmissionAssignmentAttachmentDto.java @@ -0,0 +1,4 @@ +package hello.cluebackend.domain.submission.api.dto.request; + +public record SubmissionAssignmentAttachmentDto() { +} diff --git a/src/main/java/hello/cluebackend/domain/submission/api/dto/request/SubmissionAttachmentUrlDto.java b/src/main/java/hello/cluebackend/domain/submission/api/dto/request/SubmissionAttachmentUrlDto.java new file mode 100644 index 00000000..3b1fd081 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/submission/api/dto/request/SubmissionAttachmentUrlDto.java @@ -0,0 +1,5 @@ +package hello.cluebackend.domain.submission.api.dto.request; + +public record SubmissionAttachmentUrlDto( + String url +) { } diff --git a/src/main/java/hello/cluebackend/domain/submission/api/dto/request/modifySubmissionDto.java b/src/main/java/hello/cluebackend/domain/submission/api/dto/request/modifySubmissionDto.java deleted file mode 100644 index e4312689..00000000 --- a/src/main/java/hello/cluebackend/domain/submission/api/dto/request/modifySubmissionDto.java +++ /dev/null @@ -1,5 +0,0 @@ -package hello.cluebackend.domain.submission.api.dto.request; - -public record modifySubmissionDto( - boolean isSubmitted -) {} diff --git a/src/main/java/hello/cluebackend/domain/submission/api/dto/response/SubmissionAttachmentDto.java b/src/main/java/hello/cluebackend/domain/submission/api/dto/response/SubmissionAttachmentDto.java new file mode 100644 index 00000000..c1300e25 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/submission/api/dto/response/SubmissionAttachmentDto.java @@ -0,0 +1,13 @@ +package hello.cluebackend.domain.submission.api.dto.response; + +import hello.cluebackend.domain.submission.domain.fileType; +import lombok.Builder; + +@Builder +public record SubmissionAttachmentDto( + fileType type, + String value, + String originalFileName, + String contentType, + Long size +) { } diff --git a/src/main/java/hello/cluebackend/domain/submission/api/dto/response/SubmissionDto.java b/src/main/java/hello/cluebackend/domain/submission/api/dto/response/SubmissionDto.java index 62467c85..345e3001 100644 --- a/src/main/java/hello/cluebackend/domain/submission/api/dto/response/SubmissionDto.java +++ b/src/main/java/hello/cluebackend/domain/submission/api/dto/response/SubmissionDto.java @@ -19,10 +19,4 @@ public class SubmissionDto { // 제출 정보 private boolean isSubmitted; private LocalDateTime submittedAt; - - // 과제 정보 - - - // 과제 첨부파일 정보 - } diff --git a/src/main/java/hello/cluebackend/domain/submission/application/SubmissionCommandService.java b/src/main/java/hello/cluebackend/domain/submission/application/SubmissionCommandService.java index dcce52fa..6d6ee5c9 100644 --- a/src/main/java/hello/cluebackend/domain/submission/application/SubmissionCommandService.java +++ b/src/main/java/hello/cluebackend/domain/submission/application/SubmissionCommandService.java @@ -1,28 +1,42 @@ package hello.cluebackend.domain.submission.application; -import hello.cluebackend.domain.assignment.api.dto.response.AssignmentCheck; +import hello.cluebackend.domain.assignment.api.dto.response.SubmissionCheck; +import hello.cluebackend.domain.assignment.application.AssignmentCommandService; import hello.cluebackend.domain.assignment.domain.Assignment; import hello.cluebackend.domain.assignment.persistence.AssignmentRepository; +import hello.cluebackend.domain.file.service.FileService; +import hello.cluebackend.domain.submission.api.dto.response.SubmissionAttachmentDto; +import hello.cluebackend.domain.submission.api.dto.response.SubmissionDto; import hello.cluebackend.domain.submission.domain.Submission; +import hello.cluebackend.domain.submission.domain.SubmissionAttachment; import hello.cluebackend.domain.submission.persistence.SubmissionRepository; +import hello.cluebackend.domain.submission.persistence.SubmissionAttachmentRepository; import jakarta.persistence.EntityNotFoundException; import lombok.RequiredArgsConstructor; +import org.springframework.core.io.Resource; import org.springframework.stereotype.Service; +import java.io.IOException; import java.util.List; @Service @RequiredArgsConstructor public class SubmissionCommandService { private final SubmissionRepository submissionRepository; + private final SubmissionAttachmentRepository submissionAttachmentRepository; private final AssignmentRepository assignmentRepository; + private final AssignmentCommandService assignmentCommandService; + private final FileService fileService; // 과제 제출 여부 확인 API - public List checkAssignment(Long assignmentId) { - Assignment assignment = assignmentRepository.findById(assignmentId).orElseThrow(() -> new EntityNotFoundException("해당 과제를 찾을수 없습니다.")); - List submissions = submissionRepository.findAllByAssignment(assignment); + public List checkAssignment(Long userId, Long assignmentId) { + Assignment assignment = assignmentRepository.findById(assignmentId) + .orElseThrow(() -> new EntityNotFoundException("해당 과제를 찾을수 없습니다.")); + List submissions = submissionRepository.findAllByAssignment(assignment); return submissions.stream() - .map(s -> AssignmentCheck.builder() + .filter(s -> s.getUser().getUserId().equals(userId)) + .map(s -> SubmissionCheck.builder() + .submissionId(s.getSubmissionId()) .userName(s.getUser().getUsername()) .classNumberGrade(s.getUser().getClassCode()) .isSubmitted(s.getIsSubmitted()) @@ -32,28 +46,70 @@ public List checkAssignment(Long assignmentId) { .toList(); } - public List findAllByAssignmentId(Long assignmentId) { - Assignment assignment = assignmentRepository.findById(assignmentId) - .orElseThrow(() -> new EntityNotFoundException("해당 과제를 찾을수 없습니다.")); + public List findAllByAssignmentId(Long userId, Long assignmentId) { + Assignment assignment = assignmentCommandService.findByIdOrThrow(assignmentId); + List submissions = submissionRepository.findAllByAssignment(assignment); - List result = submissionRepository.findAllByAssignment(assignment); - return result; + return submissions.stream() + .map(s -> SubmissionDto.builder() + .title(s.getAssignment().getTitle()) + .startDate(s.getAssignment().getStartDate()) + .endDate(s.getAssignment().getEndDate()) + .userName(s.getUser().getUsername()) + .isSubmitted(s.getIsSubmitted()) + .submittedAt(s.getSubmittedAt()) + .build() + ) + .toList(); } - public Submission findByAssignmentId(Long assignmentId) { - Assignment assignment = assignmentRepository.findById(assignmentId) - .orElseThrow(() -> new EntityNotFoundException("해당 과제를 찾을수 없습니다.")); + // + public SubmissionDto findByAssignmentId(Long assignmentId) { + Assignment assignment = assignmentCommandService.findByIdOrThrow(assignmentId); + + Submission s = submissionRepository.findByAssignment(assignment); + + return SubmissionDto.builder() + .title(s.getAssignment().getTitle()) + .startDate(s.getAssignment().getStartDate()) + .endDate(s.getAssignment().getEndDate()) + .userName(s.getUser().getUsername()) + .isSubmitted(s.getIsSubmitted()) + .submittedAt(s.getSubmittedAt()) + .build(); + } + + public Submission findByIdOrThrow(Long submissionId) { + return submissionRepository.findById(submissionId) + .orElseThrow(() -> new EntityNotFoundException("해당 제출 과제를 찾을수 없습니다.")); + } - Submission result = submissionRepository.findByAssignment(assignment); - return result; + public SubmissionAttachment findAssignmentAttachmentByIdOrThrow(Long submissionAttachmentId){ + return submissionAttachmentRepository.findById(submissionAttachmentId) + .orElseThrow(() -> new EntityNotFoundException("해당 제출 과제를 찾을수 없습니다.")); } -// public Submission findById(Long submissionId) { -// return submissionRepository.findById(submissionId) -// .orElseThrow(() -> new EntityNotFoundException("Submission not found : " + submissionId)); -// } -// -// public GetSubmissionFile getSubmissionGrade(Submission submission) { -// -// } + public List findAllAssignment(Long submissionId) { + Submission submission = findByIdOrThrow(submissionId); + List attachments = submissionAttachmentRepository.findAllBySubmission(submission); + return attachments.stream() + .map(sa -> SubmissionAttachmentDto.builder() + .type(sa.getType()) + .value(sa.getValue()) + .originalFileName(sa.getOriginalFileName()) + .contentType(sa.getContentType()) + .size(sa.getSize()) + .build() + ).toList(); + } + + public SubmissionAttachment findsubmissionAttachmentByIdOrThrow(Long submissionAttachmentId) { + return submissionAttachmentRepository.findById(submissionAttachmentId) + .orElseThrow(() -> new EntityNotFoundException("해당 과제 제출 첨부파일을 찾을수 없습니다.")); + } + + public Resource downloadAttachment(SubmissionAttachment submissionAttachment) throws IOException { + String path = submissionAttachment.getValue(); + return fileService.downloadFile(path); + } } diff --git a/src/main/java/hello/cluebackend/domain/submission/application/SubmissionQueryService.java b/src/main/java/hello/cluebackend/domain/submission/application/SubmissionQueryService.java index 25a4809c..8f7d5632 100644 --- a/src/main/java/hello/cluebackend/domain/submission/application/SubmissionQueryService.java +++ b/src/main/java/hello/cluebackend/domain/submission/application/SubmissionQueryService.java @@ -1,14 +1,17 @@ package hello.cluebackend.domain.submission.application; import hello.cluebackend.domain.assignment.domain.Assignment; +import hello.cluebackend.domain.submission.api.dto.request.SubmissionAttachmentUrlDto; +import hello.cluebackend.domain.submission.domain.fileType; +import hello.cluebackend.domain.file.service.FileService; import hello.cluebackend.domain.submission.domain.Submission; -import hello.cluebackend.domain.submission.persistence.submissionAttachment.SubmissionAttachmentRepository; +import hello.cluebackend.domain.submission.domain.SubmissionAttachment; import hello.cluebackend.domain.submission.persistence.SubmissionRepository; import hello.cluebackend.domain.classroom.domain.ClassRoom; import hello.cluebackend.domain.classroom.service.ClassRoomService; import hello.cluebackend.domain.classroomuser.application.ClassroomUserService; +import hello.cluebackend.domain.submission.persistence.SubmissionAttachmentRepository; import hello.cluebackend.domain.user.domain.UserEntity; -import jakarta.persistence.EntityNotFoundException; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -18,14 +21,15 @@ @Service @RequiredArgsConstructor -@Transactional public class SubmissionQueryService { - private final SubmissionAttachmentRepository submissionAttachmentRepository; private final SubmissionRepository submissionRepository; + private final SubmissionAttachmentRepository submissionAttachmentRepository; private final ClassroomUserService classroomUserService; private final ClassRoomService classRoomService; + private final FileService fileService; + private final SubmissionCommandService submissionCommandService; - // 해당 교실 모든 학생에게 과제 부여 + // 해당 교실 모든 학생에게 과제 부여 & 제출 과제 생성 @Transactional public void assignToAllStudentsInClassroom(Long classroomId, Assignment assignment){ ClassRoom classRoom = classRoomService.findById(classroomId).toEntity(); @@ -39,37 +43,61 @@ public void assignToAllStudentsInClassroom(Long classroomId, Assignment assignme // 과제 제출하기 @Transactional public Submission submitSubmission(Long submissionId) { - Submission submission = submissionRepository.findById(submissionId) - .orElseThrow(() -> new EntityNotFoundException("해당 제출 과제를 찾을수 없습니다.")); + Submission submission = submissionCommandService.findByIdOrThrow(submissionId); submission.submit(); return submissionRepository.save(submission); } + // 과제 제출 취소하기 @Transactional public Submission cancelSubmission(Long submissionId) { - Submission submission = submissionRepository.findById(submissionId) - .orElseThrow(() -> new EntityNotFoundException("해당 제출 과제를 찾을수 없습니다.")); + Submission submission = submissionCommandService.findByIdOrThrow(submissionId); submission.cancel(); return submissionRepository.save(submission); } - // 파일 업로드 + + // 첨부 파일 추가 @Transactional - public void fileUpload(Long submissionId, MultipartFile file) { - Submission submission = submissionRepository.findById(submissionId) - .orElseThrow(() -> new EntityNotFoundException("해당 제출 과제를 찾을수 없습니다.")); + public SubmissionAttachment fileUpload(Long submissionId, MultipartFile file) { + Submission submission = submissionCommandService.findByIdOrThrow(submissionId); + + String storedFiledName = fileService.storeFile(file); + + SubmissionAttachment result = SubmissionAttachment.builder() + .submission(submission) + .type(fileType.file) + .value(storedFiledName) + .originalFileName(file.getOriginalFilename()) + .contentType(file.getContentType()) + .size(file.getSize()) + .build(); + submissionAttachmentRepository.save(result); + return result; } -// @Transactional -// public void deletefile(Long submissionAttachmentId) { -// SubmissionAttachment submission = submissionAttachmentRepository.findById(submissionAttachmentId) -// .orElseThrow(() -> new EntityNotFoundException("해당 첨부파일을 찾을수 없습니다.")); -// } + // 첨부 링크 추가 + @Transactional + public SubmissionAttachment linkUpload(Long submissionId, SubmissionAttachmentUrlDto dto) { + Submission submission = submissionCommandService.findByIdOrThrow(submissionId); -// public void uploadAttachment(UploadAttachment request, MultipartFile file) { -// String filePath = "uploads/" + file.getOriginalFilename(); - // UUID 값으로 이름 변경 -// file.transferTo(new java.io.File(filePath)); -// submissionAttachmentRepository.save() -// } + SubmissionAttachment submissionAttachment = SubmissionAttachment.builder() + .submission(submission) + .type(fileType.url) + .value(dto.url()) + .build(); + + submissionAttachmentRepository.save(submissionAttachment); + return submissionAttachment; + } + + // 첨부 파일 삭제 + @Transactional + public void deleteSubmissionAttachment(Long submissionAttachmentId) { + SubmissionAttachment submissionAttachment = submissionCommandService.findAssignmentAttachmentByIdOrThrow(submissionAttachmentId); + if(submissionAttachment.getType() == fileType.file){ + fileService.deleteFile(submissionAttachment.getValue()); + } + submissionAttachmentRepository.delete(submissionAttachment); + } } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/submission/domain/BaseEntity.java b/src/main/java/hello/cluebackend/domain/submission/domain/BaseEntity.java new file mode 100644 index 00000000..1d1706cc --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/submission/domain/BaseEntity.java @@ -0,0 +1,32 @@ +package hello.cluebackend.domain.submission.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.MappedSuperclass; +import lombok.Getter; +import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.LocalDateTime; + +@EntityListeners(AuditingEntityListener.class) +@MappedSuperclass +@Getter +public class BaseEntity { + @CreatedDate + @Column + private LocalDateTime createdDate; + + @LastModifiedDate + private LocalDateTime lastModified; + + @CreatedBy + @Column(updatable = false) + private String createdBy; + + @LastModifiedBy + private String lastModifiedBy; +} diff --git a/src/main/java/hello/cluebackend/domain/submission/domain/Submission.java b/src/main/java/hello/cluebackend/domain/submission/domain/Submission.java index 205aaf56..2def5a55 100644 --- a/src/main/java/hello/cluebackend/domain/submission/domain/Submission.java +++ b/src/main/java/hello/cluebackend/domain/submission/domain/Submission.java @@ -9,11 +9,11 @@ @Entity @Table(name = "submission") -@Getter @Setter +@Getter @AllArgsConstructor -@Builder +@Builder @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Submission { +public class Submission extends BaseEntity{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "submission_id") private Long submissionId; @@ -32,28 +32,31 @@ public class Submission { @Column(name = "submitted_at", nullable = true) private LocalDateTime submittedAt; - public Submission(Assignment assignment, UserEntity user, boolean isSubmitted, LocalDateTime submittedAt){ + public Submission(Assignment assignment, UserEntity user, boolean isSubmitted, LocalDateTime submittedAt) { if(assignment != null) { changeAssignment(assignment); } this.user = user; this.isSubmitted = isSubmitted; this.submittedAt = submittedAt; } - public void changeAssignment(Assignment assignment){ + public void changeAssignment(Assignment assignment) { this.assignment = assignment; assignment.getSubmissions().add(this); } // 과제 제출 취소 - public void cancel(){ + public void cancel() { this.isSubmitted = false; + this.submittedAt = LocalDateTime.now(); } // 과제 제출 - public void submit(){ + public void submit() { this.isSubmitted = true; + this.submittedAt = LocalDateTime.now(); } + // getter public boolean getIsSubmitted(){ return this.isSubmitted; } diff --git a/src/main/java/hello/cluebackend/domain/submission/domain/SubmissionAttachment.java b/src/main/java/hello/cluebackend/domain/submission/domain/SubmissionAttachment.java new file mode 100644 index 00000000..ed1e0e60 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/submission/domain/SubmissionAttachment.java @@ -0,0 +1,37 @@ +package hello.cluebackend.domain.submission.domain; + +import hello.cluebackend.domain.user.domain.UserEntity; +import jakarta.persistence.*; +import lombok.*; +import org.springframework.core.io.Resource; + +@Entity +@Table(name = "submission_attachment") +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class SubmissionAttachment { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name="submission_attachment_id") + private Long SubmissionAttachmentId; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name="user_id") + private UserEntity user; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name="submission_id") + private Submission submission; + + @Column(nullable = false) + @Enumerated(EnumType.STRING) + private fileType type; + + @Column(nullable = false) + private String value; + + private String originalFileName; + private String contentType; + private Long size; +} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/submission/domain/SubmissionAttachment/SubmissionAttachment.java b/src/main/java/hello/cluebackend/domain/submission/domain/SubmissionAttachment/SubmissionAttachment.java deleted file mode 100644 index 063e6bca..00000000 --- a/src/main/java/hello/cluebackend/domain/submission/domain/SubmissionAttachment/SubmissionAttachment.java +++ /dev/null @@ -1,35 +0,0 @@ -package hello.cluebackend.domain.submission.domain.SubmissionAttachment; - -import hello.cluebackend.domain.assignment.domain.Assignment; -import hello.cluebackend.domain.submission.domain.Submission; -import hello.cluebackend.domain.user.domain.UserEntity; -import jakarta.persistence.*; -import lombok.*; - -import java.time.LocalDateTime; - -@Entity -@Table(name = "submission_attachment") -@Inheritance(strategy = InheritanceType.JOINED) -@DiscriminatorColumn(name = "DTYPE") -@Getter @Setter -public abstract class SubmissionAttachment { - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name="submission_attachment_id") - private Long SubmissionAttachmentId; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name="user_id") - private UserEntity user; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name="submission_id") - private Submission submission; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name="assignment_id") - private Assignment assignment; - - @Column(name="update_date") - private LocalDateTime updateDate; -} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/submission/domain/SubmissionAttachment/SubmissionDocument.java b/src/main/java/hello/cluebackend/domain/submission/domain/SubmissionAttachment/SubmissionDocument.java deleted file mode 100644 index c6afa482..00000000 --- a/src/main/java/hello/cluebackend/domain/submission/domain/SubmissionAttachment/SubmissionDocument.java +++ /dev/null @@ -1,24 +0,0 @@ -package hello.cluebackend.domain.submission.domain.SubmissionAttachment; - -import jakarta.persistence.Column; -import jakarta.persistence.DiscriminatorValue; -import jakarta.persistence.Entity; -import jakarta.persistence.JoinColumn; -import lombok.NoArgsConstructor; - -@Entity -@DiscriminatorValue("Document") -@NoArgsConstructor -public class SubmissionDocument extends SubmissionAttachment { - @JoinColumn(name="original_file_name") - private String originalFileName; - - @Column(name="stored_file_name") - private String storedFileName; - - @Column(name="file_path") - private String filePath; - - @Column(name="file_size") - private int fileSize; -} diff --git a/src/main/java/hello/cluebackend/domain/submission/domain/SubmissionAttachment/SubmissionLink.java b/src/main/java/hello/cluebackend/domain/submission/domain/SubmissionAttachment/SubmissionLink.java deleted file mode 100644 index 225b094d..00000000 --- a/src/main/java/hello/cluebackend/domain/submission/domain/SubmissionAttachment/SubmissionLink.java +++ /dev/null @@ -1,12 +0,0 @@ -package hello.cluebackend.domain.submission.domain.SubmissionAttachment; - -import jakarta.persistence.DiscriminatorValue; -import jakarta.persistence.Entity; -import lombok.NoArgsConstructor; - -@Entity -@DiscriminatorValue("Link") -@NoArgsConstructor -public class SubmissionLink extends SubmissionAttachment { - private String url; -} diff --git a/src/main/java/hello/cluebackend/domain/submission/domain/fileType.java b/src/main/java/hello/cluebackend/domain/submission/domain/fileType.java new file mode 100644 index 00000000..661ba614 --- /dev/null +++ b/src/main/java/hello/cluebackend/domain/submission/domain/fileType.java @@ -0,0 +1,5 @@ +package hello.cluebackend.domain.submission.domain; + +public enum fileType { + file, url +} diff --git a/src/main/java/hello/cluebackend/domain/submission/persistence/submissionAttachment/SubmissionAttachmentRepository.java b/src/main/java/hello/cluebackend/domain/submission/persistence/SubmissionAttachmentRepository.java similarity index 50% rename from src/main/java/hello/cluebackend/domain/submission/persistence/submissionAttachment/SubmissionAttachmentRepository.java rename to src/main/java/hello/cluebackend/domain/submission/persistence/SubmissionAttachmentRepository.java index a6a17495..a678f749 100644 --- a/src/main/java/hello/cluebackend/domain/submission/persistence/submissionAttachment/SubmissionAttachmentRepository.java +++ b/src/main/java/hello/cluebackend/domain/submission/persistence/SubmissionAttachmentRepository.java @@ -1,10 +1,14 @@ -package hello.cluebackend.domain.submission.persistence.submissionAttachment; +package hello.cluebackend.domain.submission.persistence; -import hello.cluebackend.domain.submission.domain.SubmissionAttachment.SubmissionAttachment; +import hello.cluebackend.domain.assignment.domain.Assignment; +import hello.cluebackend.domain.submission.domain.Submission; +import hello.cluebackend.domain.submission.domain.SubmissionAttachment; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface SubmissionAttachmentRepository extends JpaRepository { - + List findAllBySubmission(Submission submission); } \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/domain/submission/persistence/submissionAttachment/SubmissionDocumentRepository.java b/src/main/java/hello/cluebackend/domain/submission/persistence/submissionAttachment/SubmissionDocumentRepository.java deleted file mode 100644 index fa2ea50d..00000000 --- a/src/main/java/hello/cluebackend/domain/submission/persistence/submissionAttachment/SubmissionDocumentRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package hello.cluebackend.domain.submission.persistence.submissionAttachment; - -import hello.cluebackend.domain.submission.domain.SubmissionAttachment.SubmissionDocument; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface SubmissionDocumentRepository extends JpaRepository { - -} diff --git a/src/main/java/hello/cluebackend/domain/submission/persistence/submissionAttachment/SubmissionLinkRepository.java b/src/main/java/hello/cluebackend/domain/submission/persistence/submissionAttachment/SubmissionLinkRepository.java deleted file mode 100644 index 97778f90..00000000 --- a/src/main/java/hello/cluebackend/domain/submission/persistence/submissionAttachment/SubmissionLinkRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package hello.cluebackend.domain.submission.persistence.submissionAttachment; - -import hello.cluebackend.domain.submission.domain.SubmissionAttachment.SubmissionLink; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface SubmissionLinkRepository extends JpaRepository { - -} diff --git a/src/main/java/hello/cluebackend/domain/user/domain/UserEntity.java b/src/main/java/hello/cluebackend/domain/user/domain/UserEntity.java index e841e58f..b18abe69 100644 --- a/src/main/java/hello/cluebackend/domain/user/domain/UserEntity.java +++ b/src/main/java/hello/cluebackend/domain/user/domain/UserEntity.java @@ -1,14 +1,11 @@ package hello.cluebackend.domain.user.domain; -import hello.cluebackend.domain.classroomuser.domain.ClassRoomUser; import hello.cluebackend.domain.user.presentation.dto.UserDto; import jakarta.persistence.*; import lombok.*; import org.hibernate.annotations.ColumnDefault; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; @ToString @Entity From 06affdd2d20e769a0a606e79d22e7c7c4ecc7607 Mon Sep 17 00:00:00 2001 From: Haeyul Date: Wed, 27 Aug 2025 23:53:04 +0900 Subject: [PATCH 11/22] =?UTF-8?q?feat(#5):=20Cors=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/AssignmentCommandController.java | 6 ++++++ .../user/presentation/RegisterController.java | 6 +++--- .../global/config/CorsMvcConfig.java | 21 +++++++++---------- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java b/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java index 5ae69d9a..9a96d654 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java +++ b/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java @@ -56,6 +56,12 @@ public ResponseEntity> getAllClassroomAssignment( @PathVariable Long classId ) { List result = assignmentCommandService.findAllById(userId,classId); + + if (!classroomUserService.isUserInClassroom(classId, userId)) { + throw new AccessDeniedException("해당 수업실에 속하지 않은 유저입니다."); + } +// List result = assignmentCommandService.findAllByClassId(classId); // 서비스 시그니처 정리 시 + return ResponseEntity.ok(result); } diff --git a/src/main/java/hello/cluebackend/domain/user/presentation/RegisterController.java b/src/main/java/hello/cluebackend/domain/user/presentation/RegisterController.java index 77d768d8..d9e76830 100644 --- a/src/main/java/hello/cluebackend/domain/user/presentation/RegisterController.java +++ b/src/main/java/hello/cluebackend/domain/user/presentation/RegisterController.java @@ -1,5 +1,7 @@ package hello.cluebackend.domain.user.presentation; +import com.nimbusds.oauth2.sdk.TokenResponse; +import hello.cluebackend.domain.user.domain.UserEntity; import hello.cluebackend.domain.user.presentation.dto.DefaultRegisterUserDto; import hello.cluebackend.domain.user.presentation.dto.RegisterUserDto; import hello.cluebackend.domain.user.presentation.dto.UserDto; @@ -43,6 +45,4 @@ public ResponseEntity processRegistration(@RequestBody DefaultRegisterUserDto userService.registerUser(defaultRegisterUserDTO); return new ResponseEntity<>(HttpStatus.CREATED); } - - -} +} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/global/config/CorsMvcConfig.java b/src/main/java/hello/cluebackend/global/config/CorsMvcConfig.java index bd20a540..cbf27270 100644 --- a/src/main/java/hello/cluebackend/global/config/CorsMvcConfig.java +++ b/src/main/java/hello/cluebackend/global/config/CorsMvcConfig.java @@ -7,14 +7,13 @@ @Configuration public class CorsMvcConfig implements WebMvcConfigurer { - @Override - public void addCorsMappings(CorsRegistry corsRegistry) { - corsRegistry.addMapping("/**") - .exposedHeaders("Set-Cookie") - .allowedOrigins("http://10.129.57.136:3000") -// .allowedOrigins("https://clue-frontend-eight.vercel.app") - .allowedHeaders("*") - .exposedHeaders("Authorization") - .allowCredentials(true); - } -} + @Override + public void addCorsMappings(CorsRegistry corsRegistry) { + corsRegistry.addMapping("/**") + .allowedOriginPatterns("http://10.150.149.87") // 해당 IP만 허용 + .allowedMethods("*") // GET, POST, PUT, DELETE 등 모든 메서드 허용 + .allowedHeaders("*") // 모든 헤더 허용 + .exposedHeaders("Authorization", "Set-Cookie") // 클라이언트에서 읽을 헤더 + .allowCredentials(true); // 쿠키 및 인증 헤더 허용 + } +} \ No newline at end of file From 9bad0f507700ddc954d16d0a4f19d530f984669b Mon Sep 17 00:00:00 2001 From: Haeyul Date: Thu, 28 Aug 2025 00:23:05 +0900 Subject: [PATCH 12/22] =?UTF-8?q?feat(#5):=20=EA=B3=BC=EC=A0=9C=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=9D=B8?= =?UTF-8?q?=EC=A6=9D=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/AssignmentCommandController.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java b/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java index 9a96d654..ed9c52f6 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java +++ b/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java @@ -60,7 +60,6 @@ public ResponseEntity> getAllClassroomAssignment( if (!classroomUserService.isUserInClassroom(classId, userId)) { throw new AccessDeniedException("해당 수업실에 속하지 않은 유저입니다."); } -// List result = assignmentCommandService.findAllByClassId(classId); // 서비스 시그니처 정리 시 return ResponseEntity.ok(result); } @@ -87,9 +86,16 @@ public ResponseEntity assignmentAttachmentDownload( ) throws IOException { AssignmentAttachment assignmentAttachment = assignmentCommandService.findAssignmentAttachmentByIdOrderThrow(assignmentAttachmentId); Resource resource = assignmentCommandService.downloadAttachment(assignmentAttachment); - return ResponseEntity.ok() - .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + assignmentAttachment.getOriginalFileName() + assignmentAttachment.getContentType() + "\"") - .contentType(MediaType.APPLICATION_OCTET_STREAM) - .body(resource); + + String original = assignmentAttachment.getOriginalFileName(); + String contentType = assignmentAttachment.getContentType(); + MediaType mediaType = (contentType != null) ? MediaType.parseMediaType(contentType) : MediaType.APPLICATION_OCTET_STREAM; + return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_DISPOSITION, + org.springframework.http.ContentDisposition.attachment() + .filename(original, java.nio.charset.StandardCharsets.UTF_8) + .build().toString()) + .contentType(mediaType) + .body(resource); } } From 1aab2bdbd601814be9124a8a51794ad52c9bf7b7 Mon Sep 17 00:00:00 2001 From: Haeyul Date: Thu, 28 Aug 2025 00:23:29 +0900 Subject: [PATCH 13/22] =?UTF-8?q?feat(#5):=20CORS=20=EC=A0=84=EC=B2=B4=20I?= =?UTF-8?q?P=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/hello/cluebackend/global/config/CorsMvcConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/hello/cluebackend/global/config/CorsMvcConfig.java b/src/main/java/hello/cluebackend/global/config/CorsMvcConfig.java index cbf27270..baeeaae7 100644 --- a/src/main/java/hello/cluebackend/global/config/CorsMvcConfig.java +++ b/src/main/java/hello/cluebackend/global/config/CorsMvcConfig.java @@ -10,7 +10,7 @@ public class CorsMvcConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry corsRegistry) { corsRegistry.addMapping("/**") - .allowedOriginPatterns("http://10.150.149.87") // 해당 IP만 허용 + .allowedOriginPatterns("*") // 해당 IP만 허용 .allowedMethods("*") // GET, POST, PUT, DELETE 등 모든 메서드 허용 .allowedHeaders("*") // 모든 헤더 허용 .exposedHeaders("Authorization", "Set-Cookie") // 클라이언트에서 읽을 헤더 From b09645b3e0a9e2a68cf9a9a8bad9b6612942fb6f Mon Sep 17 00:00:00 2001 From: Haeyul Date: Thu, 28 Aug 2025 02:09:14 +0900 Subject: [PATCH 14/22] =?UTF-8?q?feat(#5):=20Code=20Rabitt=20Assignment=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/AssignmentCommandController.java | 17 ++++++++++------- .../api/AssignmentQueryController.java | 2 +- .../user/presentation/TestController.java | 2 +- .../global/config/CorsMvcConfig.java | 15 ++++++++------- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java b/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java index ed9c52f6..91edee99 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java +++ b/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java @@ -13,6 +13,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.core.io.Resource; +import org.springframework.http.ContentDisposition; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -23,6 +24,7 @@ import java.io.File; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.List; @RestController @@ -90,12 +92,13 @@ public ResponseEntity assignmentAttachmentDownload( String original = assignmentAttachment.getOriginalFileName(); String contentType = assignmentAttachment.getContentType(); MediaType mediaType = (contentType != null) ? MediaType.parseMediaType(contentType) : MediaType.APPLICATION_OCTET_STREAM; - return ResponseEntity.ok() - .header(HttpHeaders.CONTENT_DISPOSITION, - org.springframework.http.ContentDisposition.attachment() - .filename(original, java.nio.charset.StandardCharsets.UTF_8) - .build().toString()) - .contentType(mediaType) - .body(resource); + return ResponseEntity.ok() + .contentType(mediaType) + .header(HttpHeaders.CONTENT_DISPOSITION, + ContentDisposition.attachment() + .filename(original, StandardCharsets.UTF_8) + .build() + .toString()) + .body(resource); } } diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentQueryController.java b/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentQueryController.java index a351f985..4b80bddd 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentQueryController.java +++ b/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentQueryController.java @@ -31,7 +31,7 @@ public ResponseEntity createAssignment( @CurrentUser Long userId, @Valid @RequestBody CreateAssignmentDto request ) { - Assignment assignment = assignmentQueryService.save(request.classId(), request); + Assignment assignment = assignmentQueryService.save(userId, request); submissionQueryService.assignToAllStudentsInClassroom(request.classId(), assignment); return ResponseEntity.ok(assignment.getAssignmentId()); diff --git a/src/main/java/hello/cluebackend/domain/user/presentation/TestController.java b/src/main/java/hello/cluebackend/domain/user/presentation/TestController.java index 86f68bba..3c94efc2 100644 --- a/src/main/java/hello/cluebackend/domain/user/presentation/TestController.java +++ b/src/main/java/hello/cluebackend/domain/user/presentation/TestController.java @@ -24,4 +24,4 @@ public ResponseEntity issueToken(@RequestParam Long userId, @RequestParam Str .header("Authorization", "Bearer " + access) .body("JWT access token and refresh token issued for dev use."); } -} +} \ No newline at end of file diff --git a/src/main/java/hello/cluebackend/global/config/CorsMvcConfig.java b/src/main/java/hello/cluebackend/global/config/CorsMvcConfig.java index baeeaae7..97fba870 100644 --- a/src/main/java/hello/cluebackend/global/config/CorsMvcConfig.java +++ b/src/main/java/hello/cluebackend/global/config/CorsMvcConfig.java @@ -8,12 +8,13 @@ public class CorsMvcConfig implements WebMvcConfigurer { @Override - public void addCorsMappings(CorsRegistry corsRegistry) { - corsRegistry.addMapping("/**") - .allowedOriginPatterns("*") // 해당 IP만 허용 - .allowedMethods("*") // GET, POST, PUT, DELETE 등 모든 메서드 허용 - .allowedHeaders("*") // 모든 헤더 허용 - .exposedHeaders("Authorization", "Set-Cookie") // 클라이언트에서 읽을 헤더 - .allowCredentials(true); // 쿠키 및 인증 헤더 허용 + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") // 모든 API 경로 허용 +// .allowedOriginPatterns("http://10.150.149.87:7789") // 프론트 IP + 포트 + .allowedOriginPatterns("*") + .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 허용할 HTTP 메서드 + .allowedHeaders("*") // 모든 요청 헤더 허용 + .exposedHeaders("Authorization", "Set-Cookie") // 클라이언트가 접근 가능한 헤더 + .allowCredentials(true); // 쿠키, 인증 정보 허용 } } \ No newline at end of file From b9bbe3b21f919edd954956351f73034da5ce30b9 Mon Sep 17 00:00:00 2001 From: Haeyul Date: Thu, 28 Aug 2025 02:29:07 +0900 Subject: [PATCH 15/22] =?UTF-8?q?feat(#5):=20=EA=B3=BC=EC=A0=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=20=EB=B0=98=ED=99=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/assignment/api/AssignmentCommandController.java | 1 + .../domain/assignment/api/AssignmentQueryController.java | 3 ++- .../domain/assignment/application/AssignmentQueryService.java | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java b/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java index 91edee99..c5e8d531 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java +++ b/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java @@ -92,6 +92,7 @@ public ResponseEntity assignmentAttachmentDownload( String original = assignmentAttachment.getOriginalFileName(); String contentType = assignmentAttachment.getContentType(); MediaType mediaType = (contentType != null) ? MediaType.parseMediaType(contentType) : MediaType.APPLICATION_OCTET_STREAM; + return ResponseEntity.ok() .contentType(mediaType) .header(HttpHeaders.CONTENT_DISPOSITION, diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentQueryController.java b/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentQueryController.java index 4b80bddd..3f964350 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentQueryController.java +++ b/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentQueryController.java @@ -53,7 +53,8 @@ public ResponseEntity modifyAssignment( @PathVariable Long assignmentId, @Valid @RequestBody ModifyAssignmentDto assignmentDto ) { - Assignment assignment = assignmentQueryService.patchAssignment(assignmentId, assignmentDto); + Long assignment = assignmentQueryService.patchAssignment(assignmentId, assignmentDto); + return ResponseEntity.ok(assignment); } diff --git a/src/main/java/hello/cluebackend/domain/assignment/application/AssignmentQueryService.java b/src/main/java/hello/cluebackend/domain/assignment/application/AssignmentQueryService.java index 0de43820..69ba0e8e 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/application/AssignmentQueryService.java +++ b/src/main/java/hello/cluebackend/domain/assignment/application/AssignmentQueryService.java @@ -61,10 +61,10 @@ public void delete(Long assignmentId) { // 과제 수정 @Transactional - public Assignment patchAssignment(Long assignmentId, ModifyAssignmentDto dto){ + public Long patchAssignment(Long assignmentId, ModifyAssignmentDto dto){ Assignment assignment = assignmentCommandService.findByIdOrThrow(assignmentId); assignment.patch(dto.getTitle(), dto.getContent(), dto.getStartDate(), dto.getEndDate()); - return assignment; + return assignment.getAssignmentId(); } // url 업로드 From 7a365d4ed42d25eba45a7febf98bc5cf52bd47c6 Mon Sep 17 00:00:00 2001 From: Haeyul Date: Thu, 28 Aug 2025 08:01:20 +0900 Subject: [PATCH 16/22] =?UTF-8?q?feat(#5):=20=EA=B3=BC=EC=A0=9C=20?= =?UTF-8?q?=EA=B3=BC=EC=A0=9C=20=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=20?= =?UTF-8?q?=EB=B0=8F=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/assignment/api/AssignmentCommandController.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java b/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java index c5e8d531..21c37e8c 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java +++ b/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java @@ -95,8 +95,7 @@ public ResponseEntity assignmentAttachmentDownload( return ResponseEntity.ok() .contentType(mediaType) - .header(HttpHeaders.CONTENT_DISPOSITION, - ContentDisposition.attachment() + .header(HttpHeaders.CONTENT_DISPOSITION, ContentDisposition.attachment() .filename(original, StandardCharsets.UTF_8) .build() .toString()) From 0f3da763e36937225560ef96069d98ec17f20562 Mon Sep 17 00:00:00 2001 From: Haeyul Date: Thu, 28 Aug 2025 08:06:58 +0900 Subject: [PATCH 17/22] =?UTF-8?q?feat(#5):=20DB=20=EC=97=B0=EA=B2=B0=20URI?= =?UTF-8?q?=20env=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 79a7844e..cf84cfe5 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -2,7 +2,7 @@ spring: application: name: CLUE-Backend datasource: - url: jdbc:postgresql://localhost:5432/clue + url: {POSTGRES_URI} # url: ${POSTGRES_URL} username: ${POSTGRES_USER} password: ${POSTGRES_PASSWORD} From d0864dd5d67828751df57a8e0098fb423fcd29b1 Mon Sep 17 00:00:00 2001 From: Haeyul Date: Thu, 28 Aug 2025 08:16:46 +0900 Subject: [PATCH 18/22] =?UTF-8?q?feat(#5):=20fileType=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/assignment/domain/QAssignmentAttachment.java | 2 +- .../api/dto/response/AssignmentAttachmentDto.java | 4 ++-- .../assignment/application/AssignmentQueryService.java | 8 ++++---- .../domain/assignment/domain/AssignmentAttachment.java | 2 +- .../assignment/domain/{fileType.java => FileType.java} | 2 +- .../java/hello/cluebackend/global/config/S3Config.java | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) rename src/main/java/hello/cluebackend/domain/assignment/domain/{fileType.java => FileType.java} (74%) diff --git a/src/main/generated/hello/cluebackend/domain/assignment/domain/QAssignmentAttachment.java b/src/main/generated/hello/cluebackend/domain/assignment/domain/QAssignmentAttachment.java index 6939095c..1f48ee7f 100644 --- a/src/main/generated/hello/cluebackend/domain/assignment/domain/QAssignmentAttachment.java +++ b/src/main/generated/hello/cluebackend/domain/assignment/domain/QAssignmentAttachment.java @@ -46,7 +46,7 @@ public class QAssignmentAttachment extends EntityPathBase public final NumberPath size = createNumber("size", Long.class); - public final EnumPath type = createEnum("type", fileType.class); + public final EnumPath type = createEnum("type", FileType.class); public final StringPath value = createString("value"); diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentAttachmentDto.java b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentAttachmentDto.java index e49f7e3c..c7ce9506 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentAttachmentDto.java +++ b/src/main/java/hello/cluebackend/domain/assignment/api/dto/response/AssignmentAttachmentDto.java @@ -1,11 +1,11 @@ package hello.cluebackend.domain.assignment.api.dto.response; -import hello.cluebackend.domain.assignment.domain.fileType; +import hello.cluebackend.domain.assignment.domain.FileType; import lombok.Builder; @Builder public record AssignmentAttachmentDto( - fileType type, + FileType type, String value, String originalFileName, String contentType, diff --git a/src/main/java/hello/cluebackend/domain/assignment/application/AssignmentQueryService.java b/src/main/java/hello/cluebackend/domain/assignment/application/AssignmentQueryService.java index 69ba0e8e..7c766617 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/application/AssignmentQueryService.java +++ b/src/main/java/hello/cluebackend/domain/assignment/application/AssignmentQueryService.java @@ -5,7 +5,7 @@ import hello.cluebackend.domain.assignment.api.dto.request.ModifyAssignmentDto; import hello.cluebackend.domain.assignment.domain.Assignment; import hello.cluebackend.domain.assignment.domain.AssignmentAttachment; -import hello.cluebackend.domain.assignment.domain.fileType; +import hello.cluebackend.domain.assignment.domain.FileType; import hello.cluebackend.domain.assignment.persistence.AssignmentRepository; import hello.cluebackend.domain.assignment.persistence.AssignmentAttachmentRepository; import hello.cluebackend.domain.classroom.domain.ClassRoom; @@ -75,7 +75,7 @@ public void uploadUrlAttachment(Long assignmentId, List List result = dtos.stream() .map(dto -> AssignmentAttachment.builder() .assignment(assignment) - .type(fileType.URL) + .type(FileType.URL) .value(dto.url()) .build()) .toList(); @@ -91,7 +91,7 @@ public void uploadFileAttachment(Long assignmentId, MultipartFile file) { AssignmentAttachment result = AssignmentAttachment.builder() .assignment(assignment) - .type(fileType.FILE) + .type(FileType.FILE) .value(storedFileName) .originalFileName(file.getOriginalFilename()) .contentType(file.getContentType()) @@ -104,7 +104,7 @@ public void uploadFileAttachment(Long assignmentId, MultipartFile file) { @Transactional public void deleteAttachment(Long attachmentId) { AssignmentAttachment assignmentAttachment = assignmentCommandService.findAssignmentAttachmentByIdOrderThrow(attachmentId); - if(assignmentAttachment.getType() == fileType.FILE){ + if(assignmentAttachment.getType() == FileType.FILE){ fileService.deleteFile(assignmentAttachment.getValue()); } assignmentAttachmentRepository.delete(assignmentAttachment); diff --git a/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment.java b/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment.java index 53e845f0..229f9058 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment.java +++ b/src/main/java/hello/cluebackend/domain/assignment/domain/AssignmentAttachment.java @@ -21,7 +21,7 @@ public class AssignmentAttachment extends BaseEntity { // FILE, URL @Column(nullable = false) @Enumerated(EnumType.STRING) - private fileType type; + private FileType type; // 실제 파일이면 S3 Key, URL이면 링크 @Column(nullable = false) diff --git a/src/main/java/hello/cluebackend/domain/assignment/domain/fileType.java b/src/main/java/hello/cluebackend/domain/assignment/domain/FileType.java similarity index 74% rename from src/main/java/hello/cluebackend/domain/assignment/domain/fileType.java rename to src/main/java/hello/cluebackend/domain/assignment/domain/FileType.java index d5b3c438..2b87d93b 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/domain/fileType.java +++ b/src/main/java/hello/cluebackend/domain/assignment/domain/FileType.java @@ -1,5 +1,5 @@ package hello.cluebackend.domain.assignment.domain; -public enum fileType { +public enum FileType { FILE,URL } diff --git a/src/main/java/hello/cluebackend/global/config/S3Config.java b/src/main/java/hello/cluebackend/global/config/S3Config.java index 1dd0c16f..5b4e645c 100644 --- a/src/main/java/hello/cluebackend/global/config/S3Config.java +++ b/src/main/java/hello/cluebackend/global/config/S3Config.java @@ -16,7 +16,7 @@ public class S3Config { @Value("${cloud.aws.credentials.secret-key}") private String secretKey; - @Value("${cloud.aws.region.static}") + @Value("{cloud.aws.credentials.static}") private String region; @Bean From d5f8f7387d945241af65ad29877ef2564edacd0b Mon Sep 17 00:00:00 2001 From: Haeyul Date: Thu, 28 Aug 2025 08:22:12 +0900 Subject: [PATCH 19/22] =?UTF-8?q?feat(#5):=20Assignment=20submissions=20?= =?UTF-8?q?=EC=9D=BC=EB=8C=80=20=EB=8B=A4=20=EA=B4=80=EA=B3=84=20Ignore=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/assignment/api/AssignmentCommandController.java | 2 -- .../hello/cluebackend/domain/assignment/domain/Assignment.java | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java b/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java index 21c37e8c..b5f1198e 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java +++ b/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java @@ -9,7 +9,6 @@ import hello.cluebackend.domain.submission.api.dto.response.SubmissionAttachmentDto; import hello.cluebackend.domain.submission.application.SubmissionCommandService; import hello.cluebackend.global.common.annotation.CurrentUser; -import jakarta.persistence.EntityNotFoundException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.core.io.Resource; @@ -22,7 +21,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.List; diff --git a/src/main/java/hello/cluebackend/domain/assignment/domain/Assignment.java b/src/main/java/hello/cluebackend/domain/assignment/domain/Assignment.java index 5597298a..4d5fe99f 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/domain/Assignment.java +++ b/src/main/java/hello/cluebackend/domain/assignment/domain/Assignment.java @@ -1,6 +1,7 @@ package hello.cluebackend.domain.assignment.domain; import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; import hello.cluebackend.domain.submission.domain.Submission; import hello.cluebackend.domain.classroom.domain.ClassRoom; import hello.cluebackend.domain.user.domain.UserEntity; @@ -47,6 +48,7 @@ public class Assignment extends BaseEntity { @OneToMany(mappedBy = "assignment", cascade = CascadeType.REMOVE, orphanRemoval = true) @Builder.Default + @JsonIgnore private List submissions = new ArrayList<>(); // DTO 기반 정적 팩토리 메서드 From 08b19873ab4b10f45b4f62c14c8eeb40751fbb0c Mon Sep 17 00:00:00 2001 From: Haeyul Date: Thu, 28 Aug 2025 16:37:41 +0900 Subject: [PATCH 20/22] =?UTF-8?q?feat(#5):=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hello/cluebackend/domain/assignment/domain/FileType.java | 3 ++- .../domain/assignment/exception/AccessDeniedException.java | 4 ++++ src/main/resources/application.yaml | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/hello/cluebackend/domain/assignment/domain/FileType.java b/src/main/java/hello/cluebackend/domain/assignment/domain/FileType.java index 2b87d93b..69114d45 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/domain/FileType.java +++ b/src/main/java/hello/cluebackend/domain/assignment/domain/FileType.java @@ -1,5 +1,6 @@ package hello.cluebackend.domain.assignment.domain; public enum FileType { - FILE,URL + FILE, + URL } diff --git a/src/main/java/hello/cluebackend/domain/assignment/exception/AccessDeniedException.java b/src/main/java/hello/cluebackend/domain/assignment/exception/AccessDeniedException.java index 8bfc7401..69e927eb 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/exception/AccessDeniedException.java +++ b/src/main/java/hello/cluebackend/domain/assignment/exception/AccessDeniedException.java @@ -1,5 +1,9 @@ package hello.cluebackend.domain.assignment.exception; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +@ResponseStatus(HttpStatus.FORBIDDEN) public class AccessDeniedException extends RuntimeException { public AccessDeniedException(String message) { super(message); diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index cf84cfe5..9e42b051 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -2,7 +2,7 @@ spring: application: name: CLUE-Backend datasource: - url: {POSTGRES_URI} + url: ${POSTGRES_URI} # url: ${POSTGRES_URL} username: ${POSTGRES_USER} password: ${POSTGRES_PASSWORD} From 9fb9e9c60528ae881e4cb7381c9614a4b876fafb Mon Sep 17 00:00:00 2001 From: Haeyul Date: Thu, 28 Aug 2025 17:05:30 +0900 Subject: [PATCH 21/22] =?UTF-8?q?feat(#5):=20aws=20region=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/hello/cluebackend/global/config/S3Config.java | 2 +- src/main/resources/application.yaml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/hello/cluebackend/global/config/S3Config.java b/src/main/java/hello/cluebackend/global/config/S3Config.java index 5b4e645c..1dd0c16f 100644 --- a/src/main/java/hello/cluebackend/global/config/S3Config.java +++ b/src/main/java/hello/cluebackend/global/config/S3Config.java @@ -16,7 +16,7 @@ public class S3Config { @Value("${cloud.aws.credentials.secret-key}") private String secretKey; - @Value("{cloud.aws.credentials.static}") + @Value("${cloud.aws.region.static}") private String region; @Bean diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 9e42b051..3e197c01 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -3,7 +3,6 @@ spring: name: CLUE-Backend datasource: url: ${POSTGRES_URI} -# url: ${POSTGRES_URL} username: ${POSTGRES_USER} password: ${POSTGRES_PASSWORD} driver-class-name: org.postgresql.Driver From 23fa07f1177a88e86e27712cfd7000d858c6a1df Mon Sep 17 00:00:00 2001 From: Haeyul Date: Thu, 28 Aug 2025 17:07:12 +0900 Subject: [PATCH 22/22] =?UTF-8?q?feat(#5):=20=EC=9D=B4=ED=9B=84=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/assignment/api/AssignmentCommandController.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java b/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java index b5f1198e..17388aa4 100644 --- a/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java +++ b/src/main/java/hello/cluebackend/domain/assignment/api/AssignmentCommandController.java @@ -29,6 +29,9 @@ @RequestMapping("/api/assignments") @RequiredArgsConstructor @Slf4j + +// TODO : 권한 확인 애노테이션 추가 필요" + public class AssignmentCommandController { private final ClassroomUserService classroomUserService; private final AssignmentCommandService assignmentCommandService;