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 new file mode 100644 index 0000000..5cf869c --- /dev/null +++ b/backend/src/main/java/com/example/Piroin/project/domain/assignment/dto/CreateAssignmentRequest.java @@ -0,0 +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 new file mode 100644 index 0000000..97c7dc5 --- /dev/null +++ b/backend/src/main/java/com/example/Piroin/project/domain/assignment/dto/CreateAssignmentResponse.java @@ -0,0 +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/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/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); } 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 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..280766d --- /dev/null +++ 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