From 62e181cc42b6789047979f277ab51ba5835079c3 Mon Sep 17 00:00:00 2001 From: lilyyang0077 Date: Sun, 17 May 2026 21:11:13 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20AssignmentStatus=EC=97=90=20PENDING?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project/domain/assignment/enums/AssignmentStatus.java | 3 ++- .../db/migration/V2__add_pending_to_assignment_status.sql | 0 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 backend/src/main/resources/db/migration/V2__add_pending_to_assignment_status.sql diff --git a/backend/src/main/java/com/example/Piroin/project/domain/assignment/enums/AssignmentStatus.java b/backend/src/main/java/com/example/Piroin/project/domain/assignment/enums/AssignmentStatus.java index 387ba20..49315aa 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/assignment/enums/AssignmentStatus.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/assignment/enums/AssignmentStatus.java @@ -3,5 +3,6 @@ public enum AssignmentStatus { SUCCESS, INSUFFICIENT, - FAILURE + FAILURE, + PENDING } diff --git a/backend/src/main/resources/db/migration/V2__add_pending_to_assignment_status.sql b/backend/src/main/resources/db/migration/V2__add_pending_to_assignment_status.sql new file mode 100644 index 0000000..e69de29 From f4e10113ededc7f39c97186fed12cafd992fec78 Mon Sep 17 00:00:00 2001 From: lilyyang0077 Date: Sun, 17 May 2026 21:41:09 +0900 Subject: [PATCH 2/4] =?UTF-8?q?feat:=20Swagger=20Authorize=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/CreateAssignmentRequest.java | 4 +++ .../dto/CreateAssignmentResponse.java | 4 +++ .../project/global/config/SwaggerConfig.java | 25 +++++++++++++++---- 3 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 backend/src/main/java/com/example/Piroin/project/domain/assignment/dto/CreateAssignmentRequest.java create mode 100644 backend/src/main/java/com/example/Piroin/project/domain/assignment/dto/CreateAssignmentResponse.java diff --git a/backend/src/main/java/com/example/Piroin/project/domain/assignment/dto/CreateAssignmentRequest.java b/backend/src/main/java/com/example/Piroin/project/domain/assignment/dto/CreateAssignmentRequest.java new file mode 100644 index 0000000..0940acd --- /dev/null +++ b/backend/src/main/java/com/example/Piroin/project/domain/assignment/dto/CreateAssignmentRequest.java @@ -0,0 +1,4 @@ +package com.example.Piroin.project.domain.assignment.dto; + +public class CreateAssignmentRequest { +} diff --git a/backend/src/main/java/com/example/Piroin/project/domain/assignment/dto/CreateAssignmentResponse.java b/backend/src/main/java/com/example/Piroin/project/domain/assignment/dto/CreateAssignmentResponse.java new file mode 100644 index 0000000..f347b68 --- /dev/null +++ b/backend/src/main/java/com/example/Piroin/project/domain/assignment/dto/CreateAssignmentResponse.java @@ -0,0 +1,4 @@ +package com.example.Piroin.project.domain.assignment.dto; + +public class CreateAssignmentResponse { +} diff --git a/backend/src/main/java/com/example/Piroin/project/global/config/SwaggerConfig.java b/backend/src/main/java/com/example/Piroin/project/global/config/SwaggerConfig.java index 9000653..e79285d 100644 --- a/backend/src/main/java/com/example/Piroin/project/global/config/SwaggerConfig.java +++ b/backend/src/main/java/com/example/Piroin/project/global/config/SwaggerConfig.java @@ -1,20 +1,35 @@ package com.example.Piroin.project.global.config; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.info.Info; - +import io.swagger.v3.oas.models.security.SecurityRequirement; +import io.swagger.v3.oas.models.security.SecurityScheme; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; @Configuration public class SwaggerConfig { @Bean public OpenAPI openAPI() { + + String jwtSchemeName = "JWT TOKEN"; + + SecurityRequirement securityRequirement = new SecurityRequirement() + .addList(jwtSchemeName); + + SecurityScheme securityScheme = new SecurityScheme() + .name(jwtSchemeName) + .type(SecurityScheme.Type.HTTP) + .scheme("bearer") + .bearerFormat("JWT"); + return new OpenAPI() .info(new Info() .title("Piro Project API") .description("API 명세서") - .version("1.0.0")); + .version("1.0.0")) + .addSecurityItem(securityRequirement) + .schemaRequirement(jwtSchemeName, securityScheme); } -} +} \ No newline at end of file From 3b311156a8f8fe338b1a0590d34e6e658cd08713 Mon Sep 17 00:00:00 2001 From: lilyyang0077 Date: Sun, 17 May 2026 21:41:39 +0900 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20=EA=B3=BC=EC=A0=9C=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=20PENDING=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../V2__add_pending_to_assignment_status.sql | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/backend/src/main/resources/db/migration/V2__add_pending_to_assignment_status.sql b/backend/src/main/resources/db/migration/V2__add_pending_to_assignment_status.sql index e69de29..280766d 100644 --- a/backend/src/main/resources/db/migration/V2__add_pending_to_assignment_status.sql +++ b/backend/src/main/resources/db/migration/V2__add_pending_to_assignment_status.sql @@ -0,0 +1,11 @@ +ALTER TABLE assignment_item + DROP CONSTRAINT chk_assignment_item_submitted; + +ALTER TABLE assignment_item + ADD CONSTRAINT chk_assignment_item_submitted + CHECK (submitted IN ( + 'SUCCESS', + 'INSUFFICIENT', + 'FAILURE', + 'PENDING' + )); \ No newline at end of file From 2cffc50ed5d23b6d39bf80bf0c4c1589abfd0c49 Mon Sep 17 00:00:00 2001 From: lilyyang0077 Date: Sun, 17 May 2026 21:41:56 +0900 Subject: [PATCH 4/4] =?UTF-8?q?feat:=20=EA=B3=BC=EC=A0=9C=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AssignmentController.java | 22 +++++++++ .../assignment/dto/AssignmentReqDTO.java | 5 ++ .../dto/CreateAssignmentRequest.java | 11 +++++ .../dto/CreateAssignmentResponse.java | 7 +++ .../exception/code/AssignmentErrorCode.java | 11 +++++ .../repository/AssignmentItemRepository.java | 2 +- .../repository/AssignmentRepository.java | 5 +- .../assignment/service/AssignmentService.java | 47 +++++++++++++++++++ .../attendance/service/AttendanceService.java | 2 +- .../user/repository/UserRepository.java | 2 + 10 files changed, 111 insertions(+), 3 deletions(-) diff --git a/backend/src/main/java/com/example/Piroin/project/domain/assignment/controller/AssignmentController.java b/backend/src/main/java/com/example/Piroin/project/domain/assignment/controller/AssignmentController.java index 262c879..7aa1920 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/assignment/controller/AssignmentController.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/assignment/controller/AssignmentController.java @@ -1,4 +1,26 @@ package com.example.Piroin.project.domain.assignment.controller; +import com.example.Piroin.project.domain.assignment.dto.CreateAssignmentRequest; +import com.example.Piroin.project.domain.assignment.dto.CreateAssignmentResponse; +import com.example.Piroin.project.domain.assignment.service.AssignmentService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; + + +@RestController +@RequiredArgsConstructor +@RequestMapping("/assignments") public class AssignmentController { + + private final AssignmentService assignmentService; + + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + public CreateAssignmentResponse createAssignment( + @RequestBody CreateAssignmentRequest request + ) { + return assignmentService.createAssignment(request); + } } + diff --git a/backend/src/main/java/com/example/Piroin/project/domain/assignment/dto/AssignmentReqDTO.java b/backend/src/main/java/com/example/Piroin/project/domain/assignment/dto/AssignmentReqDTO.java index 1fe8227..fe684a3 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/assignment/dto/AssignmentReqDTO.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/assignment/dto/AssignmentReqDTO.java @@ -1,4 +1,9 @@ package com.example.Piroin.project.domain.assignment.dto; +import lombok.Getter; + +import java.time.LocalDate; + public class AssignmentReqDTO { + } diff --git a/backend/src/main/java/com/example/Piroin/project/domain/assignment/dto/CreateAssignmentRequest.java b/backend/src/main/java/com/example/Piroin/project/domain/assignment/dto/CreateAssignmentRequest.java index 0940acd..5cf869c 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/assignment/dto/CreateAssignmentRequest.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/assignment/dto/CreateAssignmentRequest.java @@ -1,4 +1,15 @@ package com.example.Piroin.project.domain.assignment.dto; +import lombok.Getter; + +import java.time.LocalDate; + +@Getter public class CreateAssignmentRequest { + + private String title; + + private String week; + + private LocalDate sessionDate; } diff --git a/backend/src/main/java/com/example/Piroin/project/domain/assignment/dto/CreateAssignmentResponse.java b/backend/src/main/java/com/example/Piroin/project/domain/assignment/dto/CreateAssignmentResponse.java index f347b68..97c7dc5 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/assignment/dto/CreateAssignmentResponse.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/assignment/dto/CreateAssignmentResponse.java @@ -1,4 +1,11 @@ package com.example.Piroin.project.domain.assignment.dto; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor public class CreateAssignmentResponse { + + private Integer assignmentId; } diff --git a/backend/src/main/java/com/example/Piroin/project/domain/assignment/exception/code/AssignmentErrorCode.java b/backend/src/main/java/com/example/Piroin/project/domain/assignment/exception/code/AssignmentErrorCode.java index 24e856b..7e6f6c5 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/assignment/exception/code/AssignmentErrorCode.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/assignment/exception/code/AssignmentErrorCode.java @@ -1,4 +1,15 @@ package com.example.Piroin.project.domain.assignment.exception.code; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; + +@Getter +@RequiredArgsConstructor public enum AssignmentErrorCode { + ASSIGNMENT_CREATE_FAILED(HttpStatus.BAD_REQUEST, "ASSIGNMENT400", "과제 생성에 실패했습니다."); + + private final HttpStatus status; + private final String code; + private final String message; } diff --git a/backend/src/main/java/com/example/Piroin/project/domain/assignment/repository/AssignmentItemRepository.java b/backend/src/main/java/com/example/Piroin/project/domain/assignment/repository/AssignmentItemRepository.java index 9b8b9bd..17e0804 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/assignment/repository/AssignmentItemRepository.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/assignment/repository/AssignmentItemRepository.java @@ -3,5 +3,5 @@ import com.example.Piroin.project.domain.assignment.entity.AssignmentItem; import org.springframework.data.jpa.repository.JpaRepository; -public interface AssignmentItemRepository extends JpaRepository { +public interface AssignmentItemRepository extends JpaRepository { } diff --git a/backend/src/main/java/com/example/Piroin/project/domain/assignment/repository/AssignmentRepository.java b/backend/src/main/java/com/example/Piroin/project/domain/assignment/repository/AssignmentRepository.java index 55408df..6fdfbb4 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/assignment/repository/AssignmentRepository.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/assignment/repository/AssignmentRepository.java @@ -1,4 +1,7 @@ package com.example.Piroin.project.domain.assignment.repository; -public interface AssignmentRepository { +import com.example.Piroin.project.domain.assignment.entity.Assignment; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface AssignmentRepository extends JpaRepository { } diff --git a/backend/src/main/java/com/example/Piroin/project/domain/assignment/service/AssignmentService.java b/backend/src/main/java/com/example/Piroin/project/domain/assignment/service/AssignmentService.java index fbd705a..b220184 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/assignment/service/AssignmentService.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/assignment/service/AssignmentService.java @@ -1,4 +1,51 @@ package com.example.Piroin.project.domain.assignment.service; +import com.example.Piroin.project.domain.assignment.dto.CreateAssignmentRequest; +import com.example.Piroin.project.domain.assignment.dto.CreateAssignmentResponse; +import com.example.Piroin.project.domain.assignment.entity.Assignment; +import com.example.Piroin.project.domain.assignment.entity.AssignmentItem; +import com.example.Piroin.project.domain.assignment.enums.AssignmentStatus; +import com.example.Piroin.project.domain.assignment.repository.AssignmentItemRepository; +import com.example.Piroin.project.domain.assignment.repository.AssignmentRepository; +import com.example.Piroin.project.domain.user.entity.User; +import com.example.Piroin.project.domain.user.repository.UserRepository; +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +@Transactional public class AssignmentService { + + private final AssignmentRepository assignmentRepository; + private final AssignmentItemRepository assignmentItemRepository; + private final UserRepository userRepository; + + public CreateAssignmentResponse createAssignment(CreateAssignmentRequest request) { + + Assignment assignment = Assignment.builder() + .title(request.getTitle()) + .week(request.getWeek()) + .sessionDate(request.getSessionDate()) + .build(); + + assignmentRepository.save(assignment); + + List users = userRepository.findAll(); + + List assignmentItems = users.stream() + .map(user -> AssignmentItem.builder() + .user(user) + .assignment(assignment) + .submitted(AssignmentStatus.PENDING) + .build()) + .toList(); + + assignmentItemRepository.saveAll(assignmentItems); + + return new CreateAssignmentResponse(assignment.getId()); + } } diff --git a/backend/src/main/java/com/example/Piroin/project/domain/attendance/service/AttendanceService.java b/backend/src/main/java/com/example/Piroin/project/domain/attendance/service/AttendanceService.java index b0483a4..fb1f923 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/attendance/service/AttendanceService.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/attendance/service/AttendanceService.java @@ -246,7 +246,7 @@ public boolean updateUserStatus(Integer userId, UpdateUserStatusReq req) { // 과제 상태 변경 코드 if (req.getAssignmentItemId() != null && req.getAssignmentStatus() != null) { - AssignmentItem assignmentItem = assignmentItemRepository.findById(req.getAssignmentItemId()) + AssignmentItem assignmentItem = assignmentItemRepository.findById(Math.toIntExact(req.getAssignmentItemId())) .orElseThrow(() -> new IllegalArgumentException("과제 기록을 찾을 수 없습니다.")); if (!assignmentItem.getUser().getId().equals(userId)) { diff --git a/backend/src/main/java/com/example/Piroin/project/domain/user/repository/UserRepository.java b/backend/src/main/java/com/example/Piroin/project/domain/user/repository/UserRepository.java index 3d05f24..677de60 100644 --- a/backend/src/main/java/com/example/Piroin/project/domain/user/repository/UserRepository.java +++ b/backend/src/main/java/com/example/Piroin/project/domain/user/repository/UserRepository.java @@ -13,6 +13,8 @@ public interface UserRepository extends JpaRepository { List findByRole(Role role); + List findAll(); + // 학생 이름으로 검색기능 List findByNameContainingAndRole(String name, Role role); }