diff --git a/pom.xml b/pom.xml index c0b87304..67f61285 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ com.graduation-project student-information-system-be - v1.2.0 + v1.3.0 war Student Information System Student Information System for Higher Education @@ -179,7 +179,8 @@ sis-be 17.0.1 - java -Dserver.port=$PORT -Dspring.profiles.active=mysql-live $JAVA_OPTS -jar target/*.war + + java -Dserver.port=$PORT -Dspring.profiles.active=mysql-live $JAVA_OPTS -jar target/*.war diff --git a/src/main/java/com/graduationproject/studentinformationsystem/common/config/SisSwaggerConfiguration.java b/src/main/java/com/graduationproject/studentinformationsystem/common/config/SisSwaggerConfiguration.java index 404c599e..3ef7a6ce 100644 --- a/src/main/java/com/graduationproject/studentinformationsystem/common/config/SisSwaggerConfiguration.java +++ b/src/main/java/com/graduationproject/studentinformationsystem/common/config/SisSwaggerConfiguration.java @@ -24,9 +24,11 @@ public class SisSwaggerConfiguration { public static final String LESSON_API_TAG = "Lesson Controller"; public static final String EXAM_SCHEDULE_FILE_API_TAG = "Exam Schedule File Controller"; public static final String LESSON_SCHEDULE_FILE_API_TAG = "Lesson Schedule File Controller"; + public static final String FEATURE_TOGGLE_API_TAG = "Feature Toggle Controller"; public static final String STUDENT_API_TAG = "Student Controller"; public static final String STUDENT_LESSON_API_TAG = "Student Lesson Controller"; public static final String STUDENT_LESSON_REGISTRATION_API_TAG = "Student Lesson Registration Controller"; + public static final String STUDENT_LESSON_NOTE_API_TAG = "Student Lesson Note Controller"; public static final String TEACHER_API_TAG = "Teacher Controller"; public static final String TEACHER_LESSON_API_TAG = "Teacher Lesson Controller"; public static final String OFFICER_API_TAG = "Officer Controller"; @@ -48,9 +50,11 @@ public Docket api() { new Tag(LESSON_API_TAG, "UNIV_LESSON"), new Tag(EXAM_SCHEDULE_FILE_API_TAG, "UNIV_EXAM_SCHEDULE_FILE"), new Tag(LESSON_SCHEDULE_FILE_API_TAG, "UNIV_LESSON_SCHEDULE_FILE"), + new Tag(FEATURE_TOGGLE_API_TAG, "UNIV_FEATURE_TOGGLE"), new Tag(STUDENT_API_TAG, "STUDENT_ACADEMIC_INFO & STUDENT_PERSONAL_INFO"), new Tag(STUDENT_LESSON_API_TAG, "STUDENT_LESSON"), new Tag(STUDENT_LESSON_REGISTRATION_API_TAG, "STUDENT_LESSON_REGISTRATION"), + new Tag(STUDENT_LESSON_NOTE_API_TAG, "STUDENT_LESSON_NOTE"), new Tag(TEACHER_API_TAG, "TEACHER_ACADEMIC_INFO & TEACHER_PERSONAL_INFO"), new Tag(TEACHER_LESSON_API_TAG, "TEACHER_LESSON"), new Tag(OFFICER_API_TAG, "OFFICER_ACADEMIC_INFO & OFFICER_PERSONAL_INFO"), diff --git a/src/main/java/com/graduationproject/studentinformationsystem/common/util/controller/endpoint/SisControllerEndpoint.java b/src/main/java/com/graduationproject/studentinformationsystem/common/util/controller/endpoint/SisControllerEndpoint.java index 768c2205..e9f14c4a 100644 --- a/src/main/java/com/graduationproject/studentinformationsystem/common/util/controller/endpoint/SisControllerEndpoint.java +++ b/src/main/java/com/graduationproject/studentinformationsystem/common/util/controller/endpoint/SisControllerEndpoint.java @@ -11,15 +11,18 @@ private Path() { private static final String REGISTRATION = "/registration"; private static final String PASSWORD_OPERATION = "/password-operation"; + private static final String NOTE = "/note"; public static final String FACULTY = "/faculty"; public static final String DEPARTMENT = "/department"; public static final String LESSON = "/lesson"; public static final String EXAM_SCHEDULE_FILE = "/exam-schedule-file"; public static final String LESSON_SCHEDULE_FILE = "/lesson-schedule-file"; + public static final String FEATURE_TOGGLE = "/feature-toggle"; public static final String STUDENT = "/student"; public static final String STUDENT_LESSON = STUDENT + LESSON; public static final String STUDENT_LESSON_REGISTRATION = STUDENT_LESSON + REGISTRATION; + public static final String STUDENT_LESSON_NOTE = STUDENT + LESSON + NOTE; public static final String TEACHER = "/teacher"; public static final String TEACHER_LESSON = TEACHER + LESSON; public static final String OFFICER = "/officer"; diff --git a/src/main/java/com/graduationproject/studentinformationsystem/common/util/controller/response/SisResponseUtil.java b/src/main/java/com/graduationproject/studentinformationsystem/common/util/controller/response/SisResponseUtil.java index aeb47a56..ae38f2ed 100644 --- a/src/main/java/com/graduationproject/studentinformationsystem/common/util/controller/response/SisResponseUtil.java +++ b/src/main/java/com/graduationproject/studentinformationsystem/common/util/controller/response/SisResponseUtil.java @@ -34,4 +34,20 @@ public static ResponseEntity> successResponse(final T .isSuccess(true) .response(response).build(), HttpStatus.OK); } + + public static ResponseEntity failResponse() { + return new ResponseEntity<>( + SisApiResponse.builder() + .requestTime(LocalDateTime.now()) + .httpStatus(HttpStatus.NOT_FOUND) + .isSuccess(false).build(), HttpStatus.NOT_FOUND); + } + + public static ResponseEntity unauthorizedResponse() { + return new ResponseEntity<>( + SisApiResponse.builder() + .requestTime(LocalDateTime.now()) + .httpStatus(HttpStatus.UNAUTHORIZED) + .isSuccess(false).build(), HttpStatus.UNAUTHORIZED); + } } diff --git a/src/main/java/com/graduationproject/studentinformationsystem/common/util/log/SisErrorLogMessageUtil.java b/src/main/java/com/graduationproject/studentinformationsystem/common/util/log/SisErrorLogMessageUtil.java index 413c0344..1e754cdc 100644 --- a/src/main/java/com/graduationproject/studentinformationsystem/common/util/log/SisErrorLogMessageUtil.java +++ b/src/main/java/com/graduationproject/studentinformationsystem/common/util/log/SisErrorLogMessageUtil.java @@ -48,6 +48,14 @@ public void errorWhenGettingAllByStatus(final String status) { log.error("Error When Getting {}s by Status! status:{}", apiName, status); } + public void errorWhenGettingAllByStudentId(final Long studentId) { + log.error("Error When Getting {}s by Student ID! studentId:{}", apiName, studentId); + } + + public void errorWhenGettingAllByLessonId(final Long lessonId) { + log.error("Error When Getting {}s by Lesson ID! lessonId:{}", apiName, lessonId); + } + public void errorWhenGettingAllIdsByDepartmentId(final Long departmentId) { log.error("Error When Getting {} IDs by Department ID! departmentId:{}", apiName, departmentId); } diff --git a/src/main/java/com/graduationproject/studentinformationsystem/common/util/log/SisInfoLogMessageUtil.java b/src/main/java/com/graduationproject/studentinformationsystem/common/util/log/SisInfoLogMessageUtil.java index 4aa007b5..8cf9cc36 100644 --- a/src/main/java/com/graduationproject/studentinformationsystem/common/util/log/SisInfoLogMessageUtil.java +++ b/src/main/java/com/graduationproject/studentinformationsystem/common/util/log/SisInfoLogMessageUtil.java @@ -44,6 +44,14 @@ public void foundAllIds() { log.info("{} IDs Found!", apiName); } + public void foundAllByLessonId(final Long lessonId) { + log.info("{}s Found by Lesson ID! lessonId:{}", apiName, lessonId); + } + + public void foundAllByStudentId(final Long studentId) { + log.info("{}s Found by Student ID! studentId:{}", apiName, studentId); + } + public void foundAllByStatus(final String status) { log.info("{}s Found by Status! status:{}", apiName, status); } diff --git a/src/main/java/com/graduationproject/studentinformationsystem/common/util/log/SisWarnLogMessageUtil.java b/src/main/java/com/graduationproject/studentinformationsystem/common/util/log/SisWarnLogMessageUtil.java index d07f3bd8..055d3912 100644 --- a/src/main/java/com/graduationproject/studentinformationsystem/common/util/log/SisWarnLogMessageUtil.java +++ b/src/main/java/com/graduationproject/studentinformationsystem/common/util/log/SisWarnLogMessageUtil.java @@ -32,6 +32,14 @@ public void notFoundByIdAndStatus(final Long id, final String status) { log.warn("{} Not Found by ID! id:{} status:{}", apiName, id, status); } + public void notFoundAllByStudentId(final Long lessonId) { + log.warn("{}s Not Found By Student ID! lessonId:{}", apiName, lessonId); + } + + public void notFoundAllByLessonId(final Long lessonId) { + log.warn("{}s Not Found By Lesson ID! lessonId:{}", apiName, lessonId); + } + public void notFoundAllIds() { log.warn("{} IDs Not Found!", apiName); } diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/controller/FeatureToggleController.java b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/controller/FeatureToggleController.java new file mode 100644 index 00000000..e44b8ec4 --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/controller/FeatureToggleController.java @@ -0,0 +1,79 @@ +package com.graduationproject.studentinformationsystem.university.featuretoggle.controller; + +import com.graduationproject.studentinformationsystem.common.util.controller.response.SisBaseApiResponse; +import com.graduationproject.studentinformationsystem.common.util.exception.SisNotExistException; +import com.graduationproject.studentinformationsystem.university.featuretoggle.controller.endpoint.FeatureToggleControllerEndpoint; +import com.graduationproject.studentinformationsystem.university.featuretoggle.model.dto.request.FeatureToggleRequest; +import com.graduationproject.studentinformationsystem.university.featuretoggle.model.dto.response.FeatureToggleIsEnabledResponse; +import com.graduationproject.studentinformationsystem.university.featuretoggle.model.dto.response.FeatureToggleResponse; +import com.graduationproject.studentinformationsystem.university.featuretoggle.model.enums.FeatureToggleName; +import com.graduationproject.studentinformationsystem.university.featuretoggle.service.FeatureToggleService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +import static com.graduationproject.studentinformationsystem.common.config.SisSwaggerConfiguration.FEATURE_TOGGLE_API_TAG; +import static com.graduationproject.studentinformationsystem.common.util.controller.endpoint.SisControllerEndpoint.Path.FEATURE_TOGGLE; +import static com.graduationproject.studentinformationsystem.common.util.controller.response.SisResponseUtil.successResponse; + +@RestController +@RequestMapping(FEATURE_TOGGLE) +@Api(tags = FEATURE_TOGGLE_API_TAG) +@RequiredArgsConstructor +public class FeatureToggleController { + + private final FeatureToggleService featureToggleService; + + @GetMapping + @ApiOperation(value = "Get All Feature Toggles") + public ResponseEntity>> getAllFeatureToggles() { + + final List featureToggleResponses = featureToggleService.getAllFeatureToggles(); + return successResponse(featureToggleResponses); + } + + @GetMapping(FeatureToggleControllerEndpoint.NAME) + @ApiOperation(value = "Get Feature Toggle By Name") + public ResponseEntity> getFeatureToggleByName( + @PathVariable final FeatureToggleName name) + throws SisNotExistException { + + final FeatureToggleResponse featureToggleResponse = featureToggleService.getFeatureToggleByName(name); + return successResponse(featureToggleResponse); + } + + @GetMapping(FeatureToggleControllerEndpoint.ENABLED_BY_NAME) + @ApiOperation(value = "Is Feature Toggle Enabled") + public ResponseEntity> isFeatureToggleEnabled( + @PathVariable final FeatureToggleName name) + throws SisNotExistException { + + final FeatureToggleIsEnabledResponse featureToggleIsEnabledResponse = featureToggleService.isFeatureToggleEnabled(name); + return successResponse(featureToggleIsEnabledResponse); + } + + @PatchMapping(FeatureToggleControllerEndpoint.ENABLE) + @ApiOperation(value = "Enable Feature Toggle") + public ResponseEntity> enableFeatureToggle( + @Valid @RequestBody final FeatureToggleRequest featureToggleRequest) + throws SisNotExistException { + + final FeatureToggleResponse featureToggleResponse = featureToggleService.enableFeatureToggle(featureToggleRequest); + return successResponse(featureToggleResponse); + } + + @PatchMapping(FeatureToggleControllerEndpoint.DISABLE) + @ApiOperation(value = "Disable Feature Toggle") + public ResponseEntity> disableFeatureToggle( + @Valid @RequestBody final FeatureToggleRequest featureToggleRequest) + throws SisNotExistException { + + final FeatureToggleResponse featureToggleResponse = featureToggleService.disableFeatureToggle(featureToggleRequest); + return successResponse(featureToggleResponse); + } +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/controller/endpoint/FeatureToggleControllerEndpoint.java b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/controller/endpoint/FeatureToggleControllerEndpoint.java new file mode 100644 index 00000000..3a7bceac --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/controller/endpoint/FeatureToggleControllerEndpoint.java @@ -0,0 +1,12 @@ +package com.graduationproject.studentinformationsystem.university.featuretoggle.controller.endpoint; + +public class FeatureToggleControllerEndpoint { + + private FeatureToggleControllerEndpoint() { + } + + public static final String NAME = "/{name}"; + public static final String ENABLE = "/enable"; + public static final String DISABLE = "/disable"; + public static final String ENABLED_BY_NAME = "/enabled" + NAME; +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/model/dto/converter/FeatureToggleInfoConverter.java b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/model/dto/converter/FeatureToggleInfoConverter.java new file mode 100644 index 00000000..daace44e --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/model/dto/converter/FeatureToggleInfoConverter.java @@ -0,0 +1,43 @@ +package com.graduationproject.studentinformationsystem.university.featuretoggle.model.dto.converter; + +import com.graduationproject.studentinformationsystem.common.util.SisUtil; +import com.graduationproject.studentinformationsystem.university.featuretoggle.model.dto.request.FeatureToggleRequest; +import com.graduationproject.studentinformationsystem.university.featuretoggle.model.dto.response.FeatureToggleResponse; +import com.graduationproject.studentinformationsystem.university.featuretoggle.model.entity.FeatureToggleEntity; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@Component +public class FeatureToggleInfoConverter { + + public FeatureToggleEntity generateEntity(final FeatureToggleRequest featureToggleRequest) { + + return FeatureToggleEntity.builder() + .name(featureToggleRequest.getName()) + .modifiedUserId(featureToggleRequest.getOperationInfoRequest().getUserId()) + .modifiedDate(new Date()) + .build(); + } + + public FeatureToggleResponse entityToResponse(final FeatureToggleEntity featureToggleEntity) { + return FeatureToggleResponse.builder() + .id(featureToggleEntity.getId()) + .name(featureToggleEntity.getName()) + .isEnabled(featureToggleEntity.getIsEnabled()) + .date(featureToggleEntity.getDate()) + .createdUserId(featureToggleEntity.getCreatedUserId()) + .createdDate(SisUtil.getFormattedDateTime(featureToggleEntity.getCreatedDate())) + .modifiedUserId(featureToggleEntity.getModifiedUserId()) + .modifiedDate(SisUtil.getFormattedDateTime(featureToggleEntity.getModifiedDate())) + .build(); + } + + public List entitiesToResponses(final List facultyEntities) { + List featureToggleResponses = new ArrayList<>(); + facultyEntities.forEach(facultyEntity -> featureToggleResponses.add(entityToResponse(facultyEntity))); + return featureToggleResponses; + } +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/model/dto/request/FeatureToggleRequest.java b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/model/dto/request/FeatureToggleRequest.java new file mode 100644 index 00000000..97709c51 --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/model/dto/request/FeatureToggleRequest.java @@ -0,0 +1,23 @@ +package com.graduationproject.studentinformationsystem.university.featuretoggle.model.dto.request; + +import com.graduationproject.studentinformationsystem.common.model.dto.request.SisOperationInfoRequest; +import com.graduationproject.studentinformationsystem.university.featuretoggle.model.enums.FeatureToggleName; +import lombok.Getter; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import java.io.Serial; +import java.io.Serializable; + +@Getter +public class FeatureToggleRequest implements Serializable { + + @Serial + private static final long serialVersionUID = -4460192886349312510L; + + @NotNull + private FeatureToggleName name; + + @Valid + private SisOperationInfoRequest operationInfoRequest; +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/model/dto/response/FeatureToggleIsEnabledResponse.java b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/model/dto/response/FeatureToggleIsEnabledResponse.java new file mode 100644 index 00000000..3c53e259 --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/model/dto/response/FeatureToggleIsEnabledResponse.java @@ -0,0 +1,11 @@ +package com.graduationproject.studentinformationsystem.university.featuretoggle.model.dto.response; + +import lombok.Getter; +import lombok.experimental.SuperBuilder; + +@Getter +@SuperBuilder +public class FeatureToggleIsEnabledResponse { + + private Boolean isFeatureToggleEnabled; +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/model/dto/response/FeatureToggleResponse.java b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/model/dto/response/FeatureToggleResponse.java new file mode 100644 index 00000000..72fbbea1 --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/model/dto/response/FeatureToggleResponse.java @@ -0,0 +1,18 @@ +package com.graduationproject.studentinformationsystem.university.featuretoggle.model.dto.response; + +import com.graduationproject.studentinformationsystem.common.model.dto.response.SisBaseResponse; +import com.graduationproject.studentinformationsystem.university.featuretoggle.model.enums.FeatureToggleName; +import lombok.Getter; +import lombok.experimental.SuperBuilder; + +import java.util.Date; + +@Getter +@SuperBuilder +public class FeatureToggleResponse extends SisBaseResponse { + + private Long id; + private FeatureToggleName name; + private Boolean isEnabled; + private Date date; +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/model/entity/FeatureToggleEntity.java b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/model/entity/FeatureToggleEntity.java new file mode 100644 index 00000000..17e6cc0d --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/model/entity/FeatureToggleEntity.java @@ -0,0 +1,18 @@ +package com.graduationproject.studentinformationsystem.university.featuretoggle.model.entity; + +import com.graduationproject.studentinformationsystem.common.model.entity.SisBaseEntity; +import com.graduationproject.studentinformationsystem.university.featuretoggle.model.enums.FeatureToggleName; +import lombok.Getter; +import lombok.experimental.SuperBuilder; + +import java.util.Date; + +@Getter +@SuperBuilder +public class FeatureToggleEntity extends SisBaseEntity { + + private Long id; + private FeatureToggleName name; + private Boolean isEnabled; + private Date date; +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/model/enums/FeatureToggleName.java b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/model/enums/FeatureToggleName.java new file mode 100644 index 00000000..96c62146 --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/model/enums/FeatureToggleName.java @@ -0,0 +1,14 @@ +package com.graduationproject.studentinformationsystem.university.featuretoggle.model.enums; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum FeatureToggleName { + + LESSON_REGISTRATION_OPERATIONS("Ders Kayıt İşlemleri"), + NOTE_OPERATIONS("Not İşlemleri"); + + private final String tr; +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/model/exception/FeatureToggleException.java b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/model/exception/FeatureToggleException.java new file mode 100644 index 00000000..4e6f0eb6 --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/model/exception/FeatureToggleException.java @@ -0,0 +1,15 @@ +package com.graduationproject.studentinformationsystem.university.featuretoggle.model.exception; + +import com.graduationproject.studentinformationsystem.common.util.exception.SisException; +import com.graduationproject.studentinformationsystem.common.util.exception.SisNotExistException; +import com.graduationproject.studentinformationsystem.university.featuretoggle.model.enums.FeatureToggleName; + +public class FeatureToggleException extends SisException { + + private FeatureToggleException() { + } + + public static void throwNotExistException(final FeatureToggleName name) throws SisNotExistException { + SisException.throwNotExistException("FEATURE TOGGLE IS NOT EXIST! name:" + name); + } +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/model/mapping/FeatureToggleMapping.java b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/model/mapping/FeatureToggleMapping.java new file mode 100644 index 00000000..4cee9de6 --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/model/mapping/FeatureToggleMapping.java @@ -0,0 +1,28 @@ +package com.graduationproject.studentinformationsystem.university.featuretoggle.model.mapping; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@Getter +@RequiredArgsConstructor +public enum FeatureToggleMapping { + + ID("ID", "id"), + NAME("NAME", "name"), + IS_ENABLED("IS_ENABLED", "isEnabled"), + DATE("DATE", "date"), + CREATED_DATE("CREATED_DATE", "createdDate"), + CREATED_USER_ID("CREATED_USER_ID", "createdUserId"), + MODIFIED_DATE("MODIFIED_DATE", "modifiedDate"), + MODIFIED_USER_ID("MODIFIED_USER_ID", "modifiedUserId"); + + private final String columnName; + private final String modelName; + + public static final Map COLUMN_MAPPINGS = Stream.of(values()) + .collect(Collectors.toMap(FeatureToggleMapping::getColumnName, FeatureToggleMapping::getModelName)); +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/repository/FeatureToggleRepository.java b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/repository/FeatureToggleRepository.java new file mode 100644 index 00000000..964a87ed --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/repository/FeatureToggleRepository.java @@ -0,0 +1,21 @@ +package com.graduationproject.studentinformationsystem.university.featuretoggle.repository; + +import com.graduationproject.studentinformationsystem.university.featuretoggle.model.entity.FeatureToggleEntity; +import com.graduationproject.studentinformationsystem.university.featuretoggle.model.enums.FeatureToggleName; + +import java.util.List; + +public interface FeatureToggleRepository { + + List getAllFeatureToggles(); + + FeatureToggleEntity getFeatureToggleByName(FeatureToggleName name); + + void enableFeatureToggle(FeatureToggleEntity featureToggleEntity); + + void disableFeatureToggle(FeatureToggleEntity featureToggleEntity); + + boolean isFeatureToggleExist(FeatureToggleName name); + + boolean isFeatureToggleEnabled(FeatureToggleName name); +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/repository/impl/FeatureToggleRepositoryImpl.java b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/repository/impl/FeatureToggleRepositoryImpl.java new file mode 100644 index 00000000..87cf7802 --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/repository/impl/FeatureToggleRepositoryImpl.java @@ -0,0 +1,129 @@ +package com.graduationproject.studentinformationsystem.university.featuretoggle.repository.impl; + +import com.graduationproject.studentinformationsystem.common.util.exception.SisDatabaseException; +import com.graduationproject.studentinformationsystem.common.util.log.SisErrorLogMessageUtil; +import com.graduationproject.studentinformationsystem.common.util.log.SisInfoLogMessageUtil; +import com.graduationproject.studentinformationsystem.common.util.log.SisWarnLogMessageUtil; +import com.graduationproject.studentinformationsystem.university.featuretoggle.model.entity.FeatureToggleEntity; +import com.graduationproject.studentinformationsystem.university.featuretoggle.model.enums.FeatureToggleName; +import com.graduationproject.studentinformationsystem.university.featuretoggle.repository.FeatureToggleRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; +import org.sql2o.Connection; +import org.sql2o.Query; +import org.sql2o.Sql2o; + +import java.util.List; + +import static com.graduationproject.studentinformationsystem.university.featuretoggle.model.mapping.FeatureToggleMapping.*; +import static com.graduationproject.studentinformationsystem.university.featuretoggle.repository.impl.scripts.FeatureToggleSqlScripts.*; + +@Repository +@RequiredArgsConstructor +public class FeatureToggleRepositoryImpl implements FeatureToggleRepository { + + private static final String FEATURE_TOGGLE = "Feature Toggle"; + private final SisInfoLogMessageUtil info = SisInfoLogMessageUtil.builder().apiName(FEATURE_TOGGLE).build(); + private final SisWarnLogMessageUtil warn = SisWarnLogMessageUtil.builder().apiName(FEATURE_TOGGLE).build(); + private final SisErrorLogMessageUtil error = SisErrorLogMessageUtil.builder().apiName(FEATURE_TOGGLE).build(); + + private final Sql2o sql2o; + + public List getAllFeatureToggles() { + try (final Connection connection = sql2o.open(); final Query query = connection.createQuery(GET_ALL_FEATURE_TOGGLES)) { + + final List featureToggleEntities = query + .setColumnMappings(COLUMN_MAPPINGS) + .executeAndFetch(FeatureToggleEntity.class); + + info.foundAll(); + return featureToggleEntities; + } catch (Exception exception) { + error.errorWhenGettingAll(); + throw new SisDatabaseException(exception); + } + } + + @Override + public FeatureToggleEntity getFeatureToggleByName(final FeatureToggleName name) { + try (final Connection connection = sql2o.open(); final Query query = connection.createQuery(GET_FEATURE_TOGGLE_BY_NAME)) { + + final FeatureToggleEntity featureToggleEntity = query.addParameter(NAME.getModelName(), name) + .setColumnMappings(COLUMN_MAPPINGS) + .executeAndFetchFirst(FeatureToggleEntity.class); + + info.foundByName(name.toString()); + return featureToggleEntity; + } catch (Exception exception) { + error.errorWhenGettingByName(name.toString()); + throw new SisDatabaseException(exception); + } + } + + @Override + public void enableFeatureToggle(final FeatureToggleEntity featureToggleEntity) { + updateFeatureToggleValue(featureToggleEntity, ENABLE_FEATURE_TOGGLE); + } + + @Override + public void disableFeatureToggle(final FeatureToggleEntity featureToggleEntity) { + updateFeatureToggleValue(featureToggleEntity, DISABLE_FEATURE_TOGGLE); + } + + @Override + public boolean isFeatureToggleExist(final FeatureToggleName name) { + try (final Connection connection = sql2o.open(); final Query query = connection.createQuery(IS_FEATURE_TOGGLE_EXIST_BY_NAME)) { + + final boolean isFeatureToggleExist = query + .addParameter(NAME.getModelName(), name) + .executeScalar(Boolean.class); + + if (isFeatureToggleExist) { + info.foundByName(name.toString()); + return true; + } else { + warn.notFoundByName(name.toString()); + return false; + } + } catch (Exception exception) { + error.errorWhenGettingByName(name.toString()); + throw new SisDatabaseException(exception); + } + } + + @Override + public boolean isFeatureToggleEnabled(final FeatureToggleName name) { + try (final Connection connection = sql2o.open(); final Query query = connection.createQuery(IS_FEATURE_TOGGLE_ENABLED)) { + + final boolean isFeatureToggleEnabled = query + .addParameter(NAME.getModelName(), name) + .executeScalar(Boolean.class); + + if (isFeatureToggleEnabled) { + info.foundByName(name.toString()); + return true; + } else { + warn.notFoundByName(name.toString()); + return false; + } + } catch (Exception exception) { + error.errorWhenGettingByName(name.toString()); + throw new SisDatabaseException(exception); + } + } + + private void updateFeatureToggleValue(final FeatureToggleEntity featureToggleEntity, final String sql) { + try (final Connection connection = sql2o.open(); final Query query = connection.createQuery(sql)) { + + query.addParameter(NAME.getModelName(), featureToggleEntity.getName()) + .addParameter(MODIFIED_USER_ID.getModelName(), featureToggleEntity.getModifiedUserId()) + .addParameter(MODIFIED_DATE.getModelName(), featureToggleEntity.getModifiedDate()) + .executeUpdate(); + + info.updated(); + } catch (Exception exception) { + error.errorWhenUpdating(); + throw new SisDatabaseException(exception); + } + } +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/repository/impl/scripts/FeatureToggleSqlScripts.java b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/repository/impl/scripts/FeatureToggleSqlScripts.java new file mode 100644 index 00000000..369283b7 --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/repository/impl/scripts/FeatureToggleSqlScripts.java @@ -0,0 +1,74 @@ +package com.graduationproject.studentinformationsystem.university.featuretoggle.repository.impl.scripts; + +import com.graduationproject.studentinformationsystem.common.util.sql.SisSqlUtil; + +import static com.graduationproject.studentinformationsystem.university.featuretoggle.model.mapping.FeatureToggleMapping.NAME; + +public class FeatureToggleSqlScripts { + + private static final StringBuilder sqlBuilder = new StringBuilder(); + + private FeatureToggleSqlScripts() { + } + + /** + * SELECT ID, NAME, IS_ENABLED, DATE, + * CREATED_DATE, CREATED_USER_ID, MODIFIED_DATE, MODIFIED_USER_ID FROM UNIV_FEATURE_TOGGLE; + */ + public static final String GET_ALL_FEATURE_TOGGLES = + sqlBuilder.delete(0, sqlBuilder.length()) + .append("SELECT ID, NAME, IS_ENABLED, DATE, " + + "CREATED_DATE, CREATED_USER_ID, MODIFIED_DATE, MODIFIED_USER_ID " + + "FROM UNIV_FEATURE_TOGGLE ").toString(); + + /** + * SELECT ID, NAME, IS_ENABLED, DATE, + * CREATED_DATE, CREATED_USER_ID, MODIFIED_DATE, MODIFIED_USER_ID FROM UNIV_FEATURE_TOGGLE + * WHERE NAME=:name; + */ + public static final String GET_FEATURE_TOGGLE_BY_NAME = + sqlBuilder.delete(0, sqlBuilder.length()) + .append(GET_ALL_FEATURE_TOGGLES) + .append("WHERE NAME=:name").toString(); + + /** + * UPDATE UNIV_FEATURE_TOGGLE SET IS_ENABLED=1, + * MODIFIED_DATE=:modifiedDate, MODIFIED_USER_ID=:modifiedUserId + * WHERE NAME=:name; + */ + public static final String ENABLE_FEATURE_TOGGLE = + sqlBuilder.delete(0, sqlBuilder.length()) + .append("UPDATE UNIV_FEATURE_TOGGLE SET IS_ENABLED=1, " + + "MODIFIED_DATE=:modifiedDate, MODIFIED_USER_ID=:modifiedUserId " + + "WHERE NAME=:name").toString(); + + /** + * UPDATE UNIV_FEATURE_TOGGLE SET IS_ENABLED=0, + * MODIFIED_DATE=:modifiedDate, MODIFIED_USER_ID=:modifiedUserId + * WHERE NAME=:name; + */ + public static final String DISABLE_FEATURE_TOGGLE = + sqlBuilder.delete(0, sqlBuilder.length()) + .append("UPDATE UNIV_FEATURE_TOGGLE SET IS_ENABLED=0, " + + "MODIFIED_DATE=:modifiedDate, MODIFIED_USER_ID=:modifiedUserId " + + "WHERE NAME=:name").toString(); + + /** + * SELECT CASE WHEN MAX(NAME) IS NULL THEN 'false' ELSE 'true' END IS_EXIST + * FROM UNIV_FEATURE_TOGGLE WHERE NAME=:name; + */ + public static final String IS_FEATURE_TOGGLE_EXIST_BY_NAME = SisSqlUtil + .isExistByColumnName("UNIV_FEATURE_TOGGLE", + NAME.getColumnName(), + NAME.getModelName()); + + /** + * SELECT CASE WHEN MAX(NAME) IS NULL THEN 'false' ELSE 'true' END IS_EXIST + * FROM UNIV_FEATURE_TOGGLE WHERE NAME=:name AND IS_ENABLED=1 AND DATE < NOW(); + */ + public static final String IS_FEATURE_TOGGLE_ENABLED = + sqlBuilder.delete(0, sqlBuilder.length()) + .append("SELECT CASE WHEN MAX(NAME) IS NULL " + + "THEN 'false' ELSE 'true' END IS_EXIST FROM UNIV_FEATURE_TOGGLE " + + "WHERE NAME=:name AND IS_ENABLED='1' AND DATE < NOW()").toString(); +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/service/FeatureToggleService.java b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/service/FeatureToggleService.java new file mode 100644 index 00000000..2a0a940a --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/service/FeatureToggleService.java @@ -0,0 +1,22 @@ +package com.graduationproject.studentinformationsystem.university.featuretoggle.service; + +import com.graduationproject.studentinformationsystem.common.util.exception.SisNotExistException; +import com.graduationproject.studentinformationsystem.university.featuretoggle.model.dto.request.FeatureToggleRequest; +import com.graduationproject.studentinformationsystem.university.featuretoggle.model.dto.response.FeatureToggleIsEnabledResponse; +import com.graduationproject.studentinformationsystem.university.featuretoggle.model.dto.response.FeatureToggleResponse; +import com.graduationproject.studentinformationsystem.university.featuretoggle.model.enums.FeatureToggleName; + +import java.util.List; + +public interface FeatureToggleService { + + List getAllFeatureToggles(); + + FeatureToggleResponse getFeatureToggleByName(FeatureToggleName name) throws SisNotExistException; + + FeatureToggleResponse enableFeatureToggle(FeatureToggleRequest featureToggleRequest) throws SisNotExistException; + + FeatureToggleResponse disableFeatureToggle(FeatureToggleRequest featureToggleRequest) throws SisNotExistException; + + FeatureToggleIsEnabledResponse isFeatureToggleEnabled(FeatureToggleName name) throws SisNotExistException; +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/service/impl/FeatureToggleServiceImpl.java b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/service/impl/FeatureToggleServiceImpl.java new file mode 100644 index 00000000..013ba528 --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/featuretoggle/service/impl/FeatureToggleServiceImpl.java @@ -0,0 +1,94 @@ +package com.graduationproject.studentinformationsystem.university.featuretoggle.service.impl; + +import com.graduationproject.studentinformationsystem.common.util.exception.SisNotExistException; +import com.graduationproject.studentinformationsystem.university.featuretoggle.model.dto.converter.FeatureToggleInfoConverter; +import com.graduationproject.studentinformationsystem.university.featuretoggle.model.dto.request.FeatureToggleRequest; +import com.graduationproject.studentinformationsystem.university.featuretoggle.model.dto.response.FeatureToggleIsEnabledResponse; +import com.graduationproject.studentinformationsystem.university.featuretoggle.model.dto.response.FeatureToggleResponse; +import com.graduationproject.studentinformationsystem.university.featuretoggle.model.entity.FeatureToggleEntity; +import com.graduationproject.studentinformationsystem.university.featuretoggle.model.enums.FeatureToggleName; +import com.graduationproject.studentinformationsystem.university.featuretoggle.model.exception.FeatureToggleException; +import com.graduationproject.studentinformationsystem.university.featuretoggle.repository.FeatureToggleRepository; +import com.graduationproject.studentinformationsystem.university.featuretoggle.service.FeatureToggleService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class FeatureToggleServiceImpl implements FeatureToggleService { + + private final FeatureToggleRepository featureToggleRepository; + private final FeatureToggleInfoConverter featureToggleInfoConverter; + + @Override + public List getAllFeatureToggles() { + final List featureToggleEntities = featureToggleRepository.getAllFeatureToggles(); + return featureToggleInfoConverter.entitiesToResponses(featureToggleEntities); + } + + @Override + public FeatureToggleResponse getFeatureToggleByName(final FeatureToggleName name) throws SisNotExistException { + + checkBeforeProcessing(name); + + final FeatureToggleEntity featureToggleEntity = featureToggleRepository.getFeatureToggleByName(name); + return featureToggleInfoConverter.entityToResponse(featureToggleEntity); + } + + @Override + public FeatureToggleResponse enableFeatureToggle(final FeatureToggleRequest featureToggleRequest) throws SisNotExistException { + + checkBeforeProcessing(featureToggleRequest.getName()); + + final FeatureToggleEntity featureToggleEntity = featureToggleInfoConverter.generateEntity(featureToggleRequest); + featureToggleRepository.enableFeatureToggle(featureToggleEntity); + + return getFeatureToggleByName(featureToggleRequest.getName()); + } + + @Override + public FeatureToggleResponse disableFeatureToggle(final FeatureToggleRequest featureToggleRequest) throws SisNotExistException { + + checkBeforeProcessing(featureToggleRequest.getName()); + + final FeatureToggleEntity featureToggleEntity = featureToggleInfoConverter.generateEntity(featureToggleRequest); + featureToggleRepository.disableFeatureToggle(featureToggleEntity); + + return getFeatureToggleByName(featureToggleRequest.getName()); + } + + @Override + public FeatureToggleIsEnabledResponse isFeatureToggleEnabled(final FeatureToggleName name) throws SisNotExistException { + + ifFeatureToggleIsNotExistThrowNotExistException(name); + + final boolean isFeatureToggleEnabled = featureToggleRepository.isFeatureToggleEnabled(name); + if (isFeatureToggleEnabled) { + return FeatureToggleIsEnabledResponse.builder() + .isFeatureToggleEnabled(true).build(); + } + return FeatureToggleIsEnabledResponse.builder() + .isFeatureToggleEnabled(false).build(); + } + + + /** + * Checks Before Processing + */ + + private void checkBeforeProcessing(final FeatureToggleName name) throws SisNotExistException { + ifFeatureToggleIsNotExistThrowNotExistException(name); + } + + /** + * Throw Exceptions + */ + + private void ifFeatureToggleIsNotExistThrowNotExistException(final FeatureToggleName name) throws SisNotExistException { + if (!featureToggleRepository.isFeatureToggleExist(name)) { + FeatureToggleException.throwNotExistException(name); + } + } +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/student/registration/controller/StudentLessonRegistrationController.java b/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/student/registration/controller/StudentLessonRegistrationController.java index ebb2e954..d2d42ef5 100644 --- a/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/student/registration/controller/StudentLessonRegistrationController.java +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/student/registration/controller/StudentLessonRegistrationController.java @@ -1,5 +1,6 @@ package com.graduationproject.studentinformationsystem.university.lesson.student.registration.controller; +import com.graduationproject.studentinformationsystem.common.util.controller.response.SisApiResponse; import com.graduationproject.studentinformationsystem.common.util.controller.response.SisBaseApiResponse; import com.graduationproject.studentinformationsystem.common.util.exception.SisAlreadyException; import com.graduationproject.studentinformationsystem.common.util.exception.SisNotExistException; @@ -22,6 +23,7 @@ import static com.graduationproject.studentinformationsystem.common.config.SisSwaggerConfiguration.STUDENT_LESSON_REGISTRATION_API_TAG; import static com.graduationproject.studentinformationsystem.common.util.controller.endpoint.SisControllerEndpoint.Path.STUDENT_LESSON_REGISTRATION; +import static com.graduationproject.studentinformationsystem.common.util.controller.response.SisResponseUtil.failResponse; import static com.graduationproject.studentinformationsystem.common.util.controller.response.SisResponseUtil.successResponse; @RestController @@ -52,6 +54,34 @@ public ResponseEntity isStudentLessonRegistrationWaiting( + @PathVariable final String registrationId) { + + final boolean isStudentLessonRegistrationExist = studentLessonRegistrationService.isStudentLessonRegistrationWaiting(registrationId); + + if (isStudentLessonRegistrationExist) { + return successResponse(); + } else { + return failResponse(); + } + } + + @GetMapping(StudentLessonRegistrationControllerEndpoint.APPROVED_BY_REGISTRATION_ID) + @ApiOperation(value = "Is Student Lesson Registration Approved") + public ResponseEntity isStudentLessonRegistrationApproved( + @PathVariable final String registrationId) { + + final boolean isStudentLessonRegistrationExist = studentLessonRegistrationService.isStudentLessonRegistrationApproved(registrationId); + + if (isStudentLessonRegistrationExist) { + return successResponse(); + } else { + return failResponse(); + } + } + @PostMapping(StudentLessonRegistrationControllerEndpoint.SAVE) @ApiOperation(value = "Save Student Lesson Registration") public ResponseEntity> saveStudentLessonRegistration( diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/student/registration/controller/endpoint/StudentLessonRegistrationControllerEndpoint.java b/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/student/registration/controller/endpoint/StudentLessonRegistrationControllerEndpoint.java index ffa6ff7d..c023025d 100644 --- a/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/student/registration/controller/endpoint/StudentLessonRegistrationControllerEndpoint.java +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/student/registration/controller/endpoint/StudentLessonRegistrationControllerEndpoint.java @@ -11,4 +11,6 @@ private StudentLessonRegistrationControllerEndpoint() { public static final String SAVE = "/save"; public static final String APPROVE = "/approve"; public static final String REJECT = "/reject"; + public static final String WAITING_BY_REGISTRATION_ID = "/waiting" + REGISTRATION_ID; + public static final String APPROVED_BY_REGISTRATION_ID = "/approved" + REGISTRATION_ID; } diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/student/registration/service/StudentLessonRegistrationService.java b/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/student/registration/service/StudentLessonRegistrationService.java index 51bb103e..943fe67b 100644 --- a/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/student/registration/service/StudentLessonRegistrationService.java +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/student/registration/service/StudentLessonRegistrationService.java @@ -26,4 +26,8 @@ StudentLessonRegistrationDetailResponse approveStudentLessonRegistration(Student StudentLessonRegistrationDetailResponse rejectStudentLessonRegistration(StudentLessonRegistrationRejectRequest rejectRequest) throws SisAlreadyException, SisNotExistException; + + boolean isStudentLessonRegistrationWaiting(String registrationId); + + boolean isStudentLessonRegistrationApproved(String registrationId); } diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/student/registration/service/impl/StudentLessonRegistrationServiceImpl.java b/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/student/registration/service/impl/StudentLessonRegistrationServiceImpl.java index d0314846..db82c827 100644 --- a/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/student/registration/service/impl/StudentLessonRegistrationServiceImpl.java +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/student/registration/service/impl/StudentLessonRegistrationServiceImpl.java @@ -1,7 +1,9 @@ package com.graduationproject.studentinformationsystem.university.lesson.student.registration.service.impl; +import com.graduationproject.studentinformationsystem.common.model.dto.request.SisOperationInfoRequest; import com.graduationproject.studentinformationsystem.common.util.exception.SisAlreadyException; import com.graduationproject.studentinformationsystem.common.util.exception.SisNotExistException; +import com.graduationproject.studentinformationsystem.university.lesson.common.model.dto.response.LessonResponse; import com.graduationproject.studentinformationsystem.university.lesson.common.service.LessonOutService; import com.graduationproject.studentinformationsystem.university.lesson.student.common.service.StudentLessonOutService; import com.graduationproject.studentinformationsystem.university.lesson.student.registration.model.dto.converter.StudentLessonRegistrationInfoConverter; @@ -15,6 +17,7 @@ import com.graduationproject.studentinformationsystem.university.lesson.student.registration.model.exception.StudentLessonRegistrationException; import com.graduationproject.studentinformationsystem.university.lesson.student.registration.repository.StudentLessonRegistrationRepository; import com.graduationproject.studentinformationsystem.university.lesson.student.registration.service.StudentLessonRegistrationService; +import com.graduationproject.studentinformationsystem.university.note.service.StudentLessonNoteOutService; import com.graduationproject.studentinformationsystem.university.student.service.StudentOutService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -28,6 +31,7 @@ public class StudentLessonRegistrationServiceImpl implements StudentLessonRegist private final StudentOutService studentOutService; private final LessonOutService lessonOutService; private final StudentLessonOutService studentLessonOutService; + private final StudentLessonNoteOutService studentLessonNoteOutService; private final StudentLessonRegistrationRepository studentLessonRegistrationRepository; private final StudentLessonRegistrationInfoConverter studentLessonRegistrationInfoConverter; @@ -87,6 +91,11 @@ public StudentLessonRegistrationDetailResponse approveStudentLessonRegistration( if (StudentLessonRegistrationStatus.APPROVED.equals(registrationDetailResponse.getStatus())) { studentLessonOutService.saveStudentLessons(registrationDetailResponse); + + final Long studentId = registrationDetailResponse.getStudentInfoResponse().getStudentId(); + final List lessonResponses = registrationDetailResponse.getLessonResponses(); + final SisOperationInfoRequest operationInfoRequest = approveRequest.getOperationInfoRequest(); + studentLessonNoteOutService.saveStudentLessonsNotesRegistrations(studentId, lessonResponses, operationInfoRequest); } return registrationDetailResponse; @@ -107,6 +116,16 @@ public StudentLessonRegistrationDetailResponse rejectStudentLessonRegistration(f return getStudentLessonRegistrationDetailByRegistrationId(registrationId); } + @Override + public boolean isStudentLessonRegistrationWaiting(final String registrationId) { + return studentLessonRegistrationRepository.isStudentLessonRegistrationWaiting(registrationId); + } + + @Override + public boolean isStudentLessonRegistrationApproved(final String registrationId) { + return studentLessonRegistrationRepository.isStudentLessonRegistrationApproved(registrationId); + } + /** * Checks Before Processing diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/teacher/repository/TeacherLessonRepository.java b/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/teacher/repository/TeacherLessonRepository.java index 79b5b658..3f12e4c2 100644 --- a/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/teacher/repository/TeacherLessonRepository.java +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/teacher/repository/TeacherLessonRepository.java @@ -19,4 +19,6 @@ public interface TeacherLessonRepository { void deleteTeacherLesson(TeacherLessonDeleteEntity deleteLessonEntity); boolean isTeacherLessonExist(Long teacherId, Long lessonId); + + Long getTeacherIdByLessonId(Long lessonId); } diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/teacher/repository/impl/TeacherLessonRepositoryImpl.java b/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/teacher/repository/impl/TeacherLessonRepositoryImpl.java index d34e7055..57f0e0ab 100644 --- a/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/teacher/repository/impl/TeacherLessonRepositoryImpl.java +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/teacher/repository/impl/TeacherLessonRepositoryImpl.java @@ -137,4 +137,18 @@ public boolean isTeacherLessonExist(final Long teacherId, final Long lessonId) { throw new SisDatabaseException(exception); } } + + @Override + public Long getTeacherIdByLessonId(Long lessonId) { + try (final Connection connection = sql2o.open(); final Query query = connection.createQuery(GET_TEACHER_ID_BY_LESSON_ID)) { + + return query.addParameter(LESSON_ID.getModelName(), lessonId) + .setColumnMappings(COLUMN_MAPPINGS) + .executeScalar(Long.class); + + } catch (Exception exception) { + error.errorWhenGetting(); + throw new SisDatabaseException(exception); + } + } } diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/teacher/repository/impl/scripts/TeacherLessonSqlScripts.java b/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/teacher/repository/impl/scripts/TeacherLessonSqlScripts.java index 44faced6..d396a684 100644 --- a/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/teacher/repository/impl/scripts/TeacherLessonSqlScripts.java +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/teacher/repository/impl/scripts/TeacherLessonSqlScripts.java @@ -63,4 +63,11 @@ private TeacherLessonSqlScripts() { TEACHER_ID.getModelName(), LESSON_ID.getColumnName(), LESSON_ID.getModelName()); + + /** + * SELECT TEACHER_ID FROM TEACHER_LESSON WHERE LESSON_ID=:lessonId; + */ + public static final String GET_TEACHER_ID_BY_LESSON_ID = + sqlBuilder.delete(0, sqlBuilder.length()) + .append("SELECT TEACHER_ID FROM TEACHER_LESSON WHERE LESSON_ID=:lessonId").toString(); } diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/teacher/service/TeacherLessonOutService.java b/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/teacher/service/TeacherLessonOutService.java new file mode 100644 index 00000000..5495f99a --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/teacher/service/TeacherLessonOutService.java @@ -0,0 +1,6 @@ +package com.graduationproject.studentinformationsystem.university.lesson.teacher.service; + +public interface TeacherLessonOutService { + + Long getTeacherIdByLessonId(Long lessonId); +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/teacher/service/impl/TeacherLessonOutServiceImpl.java b/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/teacher/service/impl/TeacherLessonOutServiceImpl.java new file mode 100644 index 00000000..29d9ff0b --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/lesson/teacher/service/impl/TeacherLessonOutServiceImpl.java @@ -0,0 +1,18 @@ +package com.graduationproject.studentinformationsystem.university.lesson.teacher.service.impl; + +import com.graduationproject.studentinformationsystem.university.lesson.teacher.repository.TeacherLessonRepository; +import com.graduationproject.studentinformationsystem.university.lesson.teacher.service.TeacherLessonOutService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class TeacherLessonOutServiceImpl implements TeacherLessonOutService { + + private final TeacherLessonRepository teacherLessonRepository; + + @Override + public Long getTeacherIdByLessonId(Long lessonId) { + return teacherLessonRepository.getTeacherIdByLessonId(lessonId); + } +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/note/controller/StudentLessonNoteController.java b/src/main/java/com/graduationproject/studentinformationsystem/university/note/controller/StudentLessonNoteController.java new file mode 100644 index 00000000..8cca0cf2 --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/note/controller/StudentLessonNoteController.java @@ -0,0 +1,82 @@ +package com.graduationproject.studentinformationsystem.university.note.controller; + +import com.graduationproject.studentinformationsystem.common.util.controller.response.SisBaseApiResponse; +import com.graduationproject.studentinformationsystem.common.util.exception.SisNotExistException; +import com.graduationproject.studentinformationsystem.university.note.controller.endpoint.StudentLessonNoteControllerEndpoint; +import com.graduationproject.studentinformationsystem.university.note.model.dto.request.StudentLessonFinalNoteUpdateRequest; +import com.graduationproject.studentinformationsystem.university.note.model.dto.request.StudentLessonMidtermNoteUpdateRequest; +import com.graduationproject.studentinformationsystem.university.note.model.dto.request.StudentLessonResitNoteUpdateRequest; +import com.graduationproject.studentinformationsystem.university.note.model.dto.response.StudentLessonNoteResponse; +import com.graduationproject.studentinformationsystem.university.note.service.StudentLessonNoteService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.List; + +import static com.graduationproject.studentinformationsystem.common.config.SisSwaggerConfiguration.STUDENT_LESSON_NOTE_API_TAG; +import static com.graduationproject.studentinformationsystem.common.util.controller.endpoint.SisControllerEndpoint.Path.STUDENT_LESSON_NOTE; +import static com.graduationproject.studentinformationsystem.common.util.controller.response.SisResponseUtil.successResponse; + +@RestController +@RequestMapping(STUDENT_LESSON_NOTE) +@Api(tags = STUDENT_LESSON_NOTE_API_TAG) +@RequiredArgsConstructor +public class StudentLessonNoteController { + + + private final StudentLessonNoteService studentLessonNoteService; + + @GetMapping(StudentLessonNoteControllerEndpoint.GET_ALL_BY_LESSON_ID) + @ApiOperation(value = "Get All Students Lessons Notes By Lesson ID") + public ResponseEntity>> getAllStudentsLessonsNotesByLessonId( + @PathVariable final Long lessonId) + throws SisNotExistException { + + final List noteResponses = studentLessonNoteService.getAllStudentsLessonsNotesByLessonId(lessonId); + return successResponse(noteResponses); + } + + @GetMapping(StudentLessonNoteControllerEndpoint.GET_ALL_BY_STUDENT_ID) + @ApiOperation(value = "Get All Student Lessons Notes By Student ID") + public ResponseEntity>> getAllStudentLessonsNotesByStudentId( + @PathVariable final Long studentId) + throws SisNotExistException { + + final List noteResponses = studentLessonNoteService.getAllStudentLessonsNotesByStudentId(studentId); + return successResponse(noteResponses); + } + + @PutMapping(StudentLessonNoteControllerEndpoint.MIDTERM) + @ApiOperation(value = "Update Student Lesson Midterm Note") + public ResponseEntity> updateStudentLessonMidtermNote( + @RequestBody @Valid final StudentLessonMidtermNoteUpdateRequest updateRequest) + throws SisNotExistException { + + final StudentLessonNoteResponse noteResponse = studentLessonNoteService.updateStudentLessonMidtermNote(updateRequest); + return successResponse(noteResponse); + } + + @PutMapping(StudentLessonNoteControllerEndpoint.FINAL) + @ApiOperation(value = "Update Student Lesson Final Note") + public ResponseEntity> updateStudentLessonFinalNote( + @RequestBody @Valid final StudentLessonFinalNoteUpdateRequest updateRequest) + throws SisNotExistException { + + final StudentLessonNoteResponse noteResponse = studentLessonNoteService.updateStudentLessonFinalNote(updateRequest); + return successResponse(noteResponse); + } + + @PutMapping(StudentLessonNoteControllerEndpoint.RESIT) + @ApiOperation(value = "Update Student Lesson Resit Note") + public ResponseEntity> updateStudentLessonResitNote( + @RequestBody final StudentLessonResitNoteUpdateRequest updateRequest) + throws SisNotExistException { + + final StudentLessonNoteResponse noteResponse = studentLessonNoteService.updateStudentLessonResitNote(updateRequest); + return successResponse(noteResponse); + } +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/note/controller/endpoint/StudentLessonNoteControllerEndpoint.java b/src/main/java/com/graduationproject/studentinformationsystem/university/note/controller/endpoint/StudentLessonNoteControllerEndpoint.java new file mode 100644 index 00000000..2d618e3e --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/note/controller/endpoint/StudentLessonNoteControllerEndpoint.java @@ -0,0 +1,17 @@ +package com.graduationproject.studentinformationsystem.university.note.controller.endpoint; + +public class StudentLessonNoteControllerEndpoint { + + private StudentLessonNoteControllerEndpoint() { + } + + private static final String ID = "/{id}"; + private static final String STUDENT_ID = "/{studentId}"; + private static final String LESSON_ID = "/{lessonId}"; + // public static final String GET_BY_ID = "/get" + ID; + public static final String GET_ALL_BY_STUDENT_ID = "/get/student" + STUDENT_ID; + public static final String GET_ALL_BY_LESSON_ID = "/get/lesson" + LESSON_ID; + public static final String MIDTERM = "/midterm"; + public static final String FINAL = "/final"; + public static final String RESIT = "/resit"; +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/dto/converter/StudentLessonNoteInfoConverter.java b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/dto/converter/StudentLessonNoteInfoConverter.java new file mode 100644 index 00000000..8044da08 --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/dto/converter/StudentLessonNoteInfoConverter.java @@ -0,0 +1,125 @@ +package com.graduationproject.studentinformationsystem.university.note.model.dto.converter; + +import com.graduationproject.studentinformationsystem.common.model.dto.request.SisOperationInfoRequest; +import com.graduationproject.studentinformationsystem.common.util.SisUtil; +import com.graduationproject.studentinformationsystem.university.lesson.common.model.dto.response.LessonResponse; +import com.graduationproject.studentinformationsystem.university.lesson.common.service.LessonOutService; +import com.graduationproject.studentinformationsystem.university.note.model.dto.request.StudentLessonFinalNoteUpdateRequest; +import com.graduationproject.studentinformationsystem.university.note.model.dto.request.StudentLessonMidtermNoteUpdateRequest; +import com.graduationproject.studentinformationsystem.university.note.model.dto.request.StudentLessonNoteSaveRequest; +import com.graduationproject.studentinformationsystem.university.note.model.dto.request.StudentLessonResitNoteUpdateRequest; +import com.graduationproject.studentinformationsystem.university.note.model.dto.response.StudentLessonNoteResponse; +import com.graduationproject.studentinformationsystem.university.note.model.entity.*; +import com.graduationproject.studentinformationsystem.university.note.model.enums.StudentLessonNoteStatus; +import com.graduationproject.studentinformationsystem.university.note.util.StudentLessonNoteUtil; +import com.graduationproject.studentinformationsystem.university.student.model.dto.response.StudentInfoResponse; +import com.graduationproject.studentinformationsystem.university.student.service.StudentOutService; +import com.graduationproject.studentinformationsystem.university.teacher.model.dto.response.TeacherInfoResponse; +import com.graduationproject.studentinformationsystem.university.teacher.service.TeacherOutService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@Component +@RequiredArgsConstructor +public class StudentLessonNoteInfoConverter { + + private final TeacherOutService teacherOutService; + private final StudentOutService studentOutService; + private final LessonOutService lessonOutService; + + public StudentLessonNoteSaveEntity generateSaveEntity(final StudentLessonNoteSaveRequest saveRequest) { + + final SisOperationInfoRequest operationInfoRequest = saveRequest.getOperationInfoRequest(); + + return StudentLessonNoteSaveEntity.builder() + .id(SisUtil.generateRandomUUID()) + .teacherId(saveRequest.getTeacherId()) + .studentId(saveRequest.getStudentId()) + .lessonId(saveRequest.getLessonId()) + .status(StudentLessonNoteStatus.UNFINALISED) + .createdUserId(operationInfoRequest.getUserId()) + .createdDate(new Date()) + .build(); + } + + public StudentLessonMidtermNoteUpdateEntity generateMidtermNoteUpdateEntity(final StudentLessonMidtermNoteUpdateRequest updateRequest) { + + final SisOperationInfoRequest operationInfoRequest = updateRequest.getOperationInfoRequest(); + + return StudentLessonMidtermNoteUpdateEntity.builder() + .id(updateRequest.getId()) + .midtermNote(updateRequest.getMidtermNote()) + .modifiedUserId(operationInfoRequest.getUserId()) + .modifiedDate(new Date()) + .build(); + } + + public StudentLessonFinalNoteUpdateEntity generateFinalNoteUpdateEntity(final Double meanOfNote, + final StudentLessonNoteStatus status, + final StudentLessonFinalNoteUpdateRequest updateRequest) { + + final SisOperationInfoRequest operationInfoRequest = updateRequest.getOperationInfoRequest(); + + return StudentLessonFinalNoteUpdateEntity.builder() + .id(updateRequest.getId()) + .finalNote(updateRequest.getFinalNote()) + .meanOfNote(meanOfNote) + .status(status) + .modifiedUserId(operationInfoRequest.getUserId()) + .modifiedDate(new Date()) + .build(); + } + + public StudentLessonResitNoteUpdateEntity generateResitNoteUpdateEntity(final Double meanOfNote, + final StudentLessonNoteStatus status, + final StudentLessonResitNoteUpdateRequest updateRequest) { + + final SisOperationInfoRequest operationInfoRequest = updateRequest.getOperationInfoRequest(); + + return StudentLessonResitNoteUpdateEntity.builder() + .id(updateRequest.getId()) + .resitNote(updateRequest.getResitNote()) + .meanOfNote(meanOfNote) + .status(status) + .modifiedUserId(operationInfoRequest.getUserId()) + .modifiedDate(new Date()) + .build(); + } + + public StudentLessonNoteResponse entityToResponse(final StudentLessonNoteEntity noteEntity) { + + final Long teacherId = noteEntity.getTeacherId(); + final TeacherInfoResponse teacherResponse = teacherOutService.getTeacherInfoResponse(teacherId); + + final Long studentId = noteEntity.getStudentId(); + final StudentInfoResponse studentResponse = studentOutService.getStudentInfoResponse(studentId); + + final Long lessonId = noteEntity.getLessonId(); + final LessonResponse lessonResponse = lessonOutService.getLessonResponse(lessonId); + + return StudentLessonNoteResponse.builder() + .id(noteEntity.getId()) + .teacherResponse(teacherResponse) + .studentResponse(studentResponse) + .lessonResponse(lessonResponse) + .midtermNote(noteEntity.getMidtermNote()) + .finalNote(noteEntity.getFinalNote()) + .resitNote(noteEntity.getResitNote()) + .meanOfNote(StudentLessonNoteUtil.getMeanOfNoteWith2NumberAfterDot(noteEntity.getMeanOfNote())) + .status(noteEntity.getStatus()) + .createdDate(SisUtil.getFormattedDateTime(noteEntity.getCreatedDate())) + .createdUserId(noteEntity.getCreatedUserId()) + .modifiedDate(SisUtil.getFormattedDateTime(noteEntity.getModifiedDate())) + .modifiedUserId(noteEntity.getModifiedUserId()).build(); + } + + public List entitiesToResponses(final List noteEntities) { + List noteResponses = new ArrayList<>(); + noteEntities.forEach(noteEntity -> noteResponses.add(entityToResponse(noteEntity))); + return noteResponses; + } +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/dto/request/StudentLessonFinalNoteUpdateRequest.java b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/dto/request/StudentLessonFinalNoteUpdateRequest.java new file mode 100644 index 00000000..1d2b5c2e --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/dto/request/StudentLessonFinalNoteUpdateRequest.java @@ -0,0 +1,29 @@ +package com.graduationproject.studentinformationsystem.university.note.model.dto.request; + +import com.graduationproject.studentinformationsystem.common.model.dto.request.SisOperationInfoRequest; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import java.io.Serial; +import java.io.Serializable; + +@Getter +@SuperBuilder +@NoArgsConstructor +public class StudentLessonFinalNoteUpdateRequest implements Serializable { + + @Serial + private static final long serialVersionUID = -1731196715166066519L; + + @NotNull + private String id; + + @NotNull + private Double finalNote; + + @Valid + private SisOperationInfoRequest operationInfoRequest; +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/dto/request/StudentLessonMidtermNoteUpdateRequest.java b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/dto/request/StudentLessonMidtermNoteUpdateRequest.java new file mode 100644 index 00000000..7fbcb329 --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/dto/request/StudentLessonMidtermNoteUpdateRequest.java @@ -0,0 +1,29 @@ +package com.graduationproject.studentinformationsystem.university.note.model.dto.request; + +import com.graduationproject.studentinformationsystem.common.model.dto.request.SisOperationInfoRequest; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import java.io.Serial; +import java.io.Serializable; + +@Getter +@SuperBuilder +@NoArgsConstructor +public class StudentLessonMidtermNoteUpdateRequest implements Serializable { + + @Serial + private static final long serialVersionUID = 7596735869510130790L; + + @NotNull + private String id; + + @NotNull + private Double midtermNote; + + @Valid + private SisOperationInfoRequest operationInfoRequest; +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/dto/request/StudentLessonNoteSaveRequest.java b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/dto/request/StudentLessonNoteSaveRequest.java new file mode 100644 index 00000000..ada0d149 --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/dto/request/StudentLessonNoteSaveRequest.java @@ -0,0 +1,36 @@ +package com.graduationproject.studentinformationsystem.university.note.model.dto.request; + +import com.graduationproject.studentinformationsystem.common.model.dto.request.SisOperationInfoRequest; +import com.graduationproject.studentinformationsystem.common.util.validation.id.LessonID; +import com.graduationproject.studentinformationsystem.common.util.validation.id.StudentID; +import com.graduationproject.studentinformationsystem.common.util.validation.id.TeacherID; +import lombok.Getter; +import lombok.experimental.SuperBuilder; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import java.io.Serial; +import java.io.Serializable; + +@Getter +@SuperBuilder +public class StudentLessonNoteSaveRequest implements Serializable { + + @Serial + private static final long serialVersionUID = -7246638446202788931L; + + @NotNull + @TeacherID + private Long teacherId; + + @NotNull + @StudentID + private Long studentId; + + @NotNull + @LessonID + private Long lessonId; + + @Valid + private SisOperationInfoRequest operationInfoRequest; +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/dto/request/StudentLessonResitNoteUpdateRequest.java b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/dto/request/StudentLessonResitNoteUpdateRequest.java new file mode 100644 index 00000000..8da009f1 --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/dto/request/StudentLessonResitNoteUpdateRequest.java @@ -0,0 +1,29 @@ +package com.graduationproject.studentinformationsystem.university.note.model.dto.request; + +import com.graduationproject.studentinformationsystem.common.model.dto.request.SisOperationInfoRequest; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import java.io.Serial; +import java.io.Serializable; + +@Getter +@SuperBuilder +@NoArgsConstructor +public class StudentLessonResitNoteUpdateRequest implements Serializable { + + @Serial + private static final long serialVersionUID = -6303107915064579379L; + + @NotNull + private String id; + + @NotNull + private Double resitNote; + + @Valid + private SisOperationInfoRequest operationInfoRequest; +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/dto/response/StudentLessonNoteResponse.java b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/dto/response/StudentLessonNoteResponse.java new file mode 100644 index 00000000..35a0b505 --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/dto/response/StudentLessonNoteResponse.java @@ -0,0 +1,25 @@ +package com.graduationproject.studentinformationsystem.university.note.model.dto.response; + +import com.graduationproject.studentinformationsystem.common.model.dto.response.SisBaseResponse; +import com.graduationproject.studentinformationsystem.university.lesson.common.model.dto.response.LessonResponse; +import com.graduationproject.studentinformationsystem.university.note.model.enums.StudentLessonNoteStatus; +import com.graduationproject.studentinformationsystem.university.student.model.dto.response.StudentInfoResponse; +import com.graduationproject.studentinformationsystem.university.teacher.model.dto.response.TeacherInfoResponse; +import lombok.Getter; +import lombok.experimental.SuperBuilder; + +@Getter +@SuperBuilder +public class StudentLessonNoteResponse extends SisBaseResponse { + + private String id; + private Double midtermNote; + private Double finalNote; + private Double resitNote; + private Double meanOfNote; + private StudentLessonNoteStatus status; + + private TeacherInfoResponse teacherResponse; + private StudentInfoResponse studentResponse; + private LessonResponse lessonResponse; +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/entity/StudentLessonFinalNoteUpdateEntity.java b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/entity/StudentLessonFinalNoteUpdateEntity.java new file mode 100644 index 00000000..0d05cf52 --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/entity/StudentLessonFinalNoteUpdateEntity.java @@ -0,0 +1,19 @@ +package com.graduationproject.studentinformationsystem.university.note.model.entity; + +import com.graduationproject.studentinformationsystem.university.note.model.enums.StudentLessonNoteStatus; +import lombok.Builder; +import lombok.Getter; + +import java.util.Date; + +@Getter +@Builder +public class StudentLessonFinalNoteUpdateEntity { + + private String id; + private Double finalNote; + private Double meanOfNote; + private StudentLessonNoteStatus status; + private Long modifiedUserId; + private Date modifiedDate; +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/entity/StudentLessonMidtermNoteUpdateEntity.java b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/entity/StudentLessonMidtermNoteUpdateEntity.java new file mode 100644 index 00000000..38228f60 --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/entity/StudentLessonMidtermNoteUpdateEntity.java @@ -0,0 +1,16 @@ +package com.graduationproject.studentinformationsystem.university.note.model.entity; + +import lombok.Builder; +import lombok.Getter; + +import java.util.Date; + +@Getter +@Builder +public class StudentLessonMidtermNoteUpdateEntity { + + private String id; + private Double midtermNote; + private Long modifiedUserId; + private Date modifiedDate; +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/entity/StudentLessonNoteEntity.java b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/entity/StudentLessonNoteEntity.java new file mode 100644 index 00000000..0366b5b8 --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/entity/StudentLessonNoteEntity.java @@ -0,0 +1,21 @@ +package com.graduationproject.studentinformationsystem.university.note.model.entity; + +import com.graduationproject.studentinformationsystem.common.model.entity.SisBaseEntity; +import com.graduationproject.studentinformationsystem.university.note.model.enums.StudentLessonNoteStatus; +import lombok.Getter; +import lombok.experimental.SuperBuilder; + +@Getter +@SuperBuilder +public class StudentLessonNoteEntity extends SisBaseEntity { + + private String id; + private Long teacherId; + private Long studentId; + private Long lessonId; + private Double midtermNote; + private Double finalNote; + private Double resitNote; + private Double meanOfNote; + private StudentLessonNoteStatus status; +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/entity/StudentLessonNoteSaveEntity.java b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/entity/StudentLessonNoteSaveEntity.java new file mode 100644 index 00000000..6e3e0f8d --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/entity/StudentLessonNoteSaveEntity.java @@ -0,0 +1,20 @@ +package com.graduationproject.studentinformationsystem.university.note.model.entity; + +import com.graduationproject.studentinformationsystem.university.note.model.enums.StudentLessonNoteStatus; +import lombok.Builder; +import lombok.Getter; + +import java.util.Date; + +@Getter +@Builder +public class StudentLessonNoteSaveEntity { + + private String id; + private Long teacherId; + private Long studentId; + private Long lessonId; + private StudentLessonNoteStatus status; + private Long createdUserId; + private Date createdDate; +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/entity/StudentLessonResitNoteUpdateEntity.java b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/entity/StudentLessonResitNoteUpdateEntity.java new file mode 100644 index 00000000..30146ba3 --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/entity/StudentLessonResitNoteUpdateEntity.java @@ -0,0 +1,19 @@ +package com.graduationproject.studentinformationsystem.university.note.model.entity; + +import com.graduationproject.studentinformationsystem.university.note.model.enums.StudentLessonNoteStatus; +import lombok.Builder; +import lombok.Getter; + +import java.util.Date; + +@Getter +@Builder +public class StudentLessonResitNoteUpdateEntity { + + private String id; + private Double resitNote; + private Double meanOfNote; + private StudentLessonNoteStatus status; + private Long modifiedUserId; + private Date modifiedDate; +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/enums/StudentLessonNoteStatus.java b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/enums/StudentLessonNoteStatus.java new file mode 100644 index 00000000..78e30e4a --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/enums/StudentLessonNoteStatus.java @@ -0,0 +1,15 @@ +package com.graduationproject.studentinformationsystem.university.note.model.enums; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum StudentLessonNoteStatus { + + UNFINALISED("Sonuçlandırılmadı"), + PASSED("Geçti"), + FAILED("Kaldı"); + + private final String tr; +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/exception/StudentLessonNoteException.java b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/exception/StudentLessonNoteException.java new file mode 100644 index 00000000..9dc5ac7d --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/exception/StudentLessonNoteException.java @@ -0,0 +1,16 @@ +package com.graduationproject.studentinformationsystem.university.note.model.exception; + +import com.graduationproject.studentinformationsystem.common.util.exception.SisException; +import com.graduationproject.studentinformationsystem.common.util.exception.SisNotExistException; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class StudentLessonNoteException extends SisException { + + private StudentLessonNoteException() { + } + + public static void throwNotExistException(final String id) throws SisNotExistException { + SisException.throwNotExistException("STUDENT LESSON NOTES ARE NOT EXIST! id:" + id); + } +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/mapping/StudentLessonNoteMapping.java b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/mapping/StudentLessonNoteMapping.java new file mode 100644 index 00000000..235b681f --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/note/model/mapping/StudentLessonNoteMapping.java @@ -0,0 +1,33 @@ +package com.graduationproject.studentinformationsystem.university.note.model.mapping; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@Getter +@RequiredArgsConstructor +public enum StudentLessonNoteMapping { + + ID("ID", "id"), + TEACHER_ID("TEACHER_ID", "teacherId"), + STUDENT_ID("STUDENT_ID", "studentId"), + LESSON_ID("LESSON_ID", "lessonId"), + MIDTERM_NOTE("MIDTERM_NOTE", "midtermNote"), + FINAL_NOTE("FINAL_NOTE", "finalNote"), + RESIT_NOTE("RESIT_NOTE", "resitNote"), + MEAN_OF_NOTE("MEAN_OF_NOTE", "meanOfNote"), + STATUS("STATUS", "status"), + CREATED_DATE("CREATED_DATE", "createdDate"), + CREATED_USER_ID("CREATED_USER_ID", "createdUserId"), + MODIFIED_DATE("MODIFIED_DATE", "modifiedDate"), + MODIFIED_USER_ID("MODIFIED_USER_ID", "modifiedUserId"); + + private final String columnName; + private final String modelName; + + public static final Map COLUMN_MAPPINGS = Stream.of(values()) + .collect(Collectors.toMap(StudentLessonNoteMapping::getColumnName, StudentLessonNoteMapping::getModelName)); +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/note/repository/StudentLessonNoteRepository.java b/src/main/java/com/graduationproject/studentinformationsystem/university/note/repository/StudentLessonNoteRepository.java new file mode 100644 index 00000000..2943e42a --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/note/repository/StudentLessonNoteRepository.java @@ -0,0 +1,26 @@ +package com.graduationproject.studentinformationsystem.university.note.repository; + +import com.graduationproject.studentinformationsystem.university.note.model.entity.*; + +import java.util.List; + +public interface StudentLessonNoteRepository { + + List getAllStudentsLessonsNotesByLessonId(Long lessonId); + + List getAllStudentLessonsNotesByStudentId(Long studentId); + + StudentLessonNoteEntity getStudentLessonNotesById(String id); + + void saveStudentLessonNote(StudentLessonNoteSaveEntity saveEntity); + + void updateStudentLessonMidtermNote(StudentLessonMidtermNoteUpdateEntity updateEntity); + + void updateStudentLessonFinalNote(StudentLessonFinalNoteUpdateEntity updateEntity); + + void updateStudentLessonResitNote(StudentLessonResitNoteUpdateEntity updateEntity); + + Double getMidtermNoteById(String id); + + boolean isStudentLessonNotesExist(String id); +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/note/repository/impl/StudentLessonNoteRepositoryImpl.java b/src/main/java/com/graduationproject/studentinformationsystem/university/note/repository/impl/StudentLessonNoteRepositoryImpl.java new file mode 100644 index 00000000..5277c566 --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/note/repository/impl/StudentLessonNoteRepositoryImpl.java @@ -0,0 +1,205 @@ +package com.graduationproject.studentinformationsystem.university.note.repository.impl; + +import com.graduationproject.studentinformationsystem.common.util.exception.SisDatabaseException; +import com.graduationproject.studentinformationsystem.common.util.log.SisErrorLogMessageUtil; +import com.graduationproject.studentinformationsystem.common.util.log.SisInfoLogMessageUtil; +import com.graduationproject.studentinformationsystem.common.util.log.SisWarnLogMessageUtil; +import com.graduationproject.studentinformationsystem.university.note.model.entity.*; +import com.graduationproject.studentinformationsystem.university.note.repository.StudentLessonNoteRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; +import org.sql2o.Connection; +import org.sql2o.Query; +import org.sql2o.Sql2o; + +import java.util.List; + +import static com.graduationproject.studentinformationsystem.university.note.model.mapping.StudentLessonNoteMapping.*; +import static com.graduationproject.studentinformationsystem.university.note.repository.impl.scripts.StudentLessonNoteSqlScripts.*; + +@Repository +@RequiredArgsConstructor +public class StudentLessonNoteRepositoryImpl implements StudentLessonNoteRepository { + + private static final String STUDENT_LESSON_NOTE = "Student Lesson Note"; + private final SisInfoLogMessageUtil info = SisInfoLogMessageUtil.builder().apiName(STUDENT_LESSON_NOTE).build(); + private final SisWarnLogMessageUtil warn = SisWarnLogMessageUtil.builder().apiName(STUDENT_LESSON_NOTE).build(); + private final SisErrorLogMessageUtil error = SisErrorLogMessageUtil.builder().apiName(STUDENT_LESSON_NOTE).build(); + + private final Sql2o sql2o; + + @Override + public List getAllStudentsLessonsNotesByLessonId(final Long lessonId) { + try (final Connection connection = sql2o.open(); final Query query = connection.createQuery(GET_ALL_STUDENTS_LESSON_NOTES_BY_LESSON_ID)) { + + final List noteEntities = query + .addParameter(LESSON_ID.getModelName(), lessonId) + .setColumnMappings(COLUMN_MAPPINGS) + .executeAndFetch(StudentLessonNoteEntity.class); + + if (!noteEntities.isEmpty()) { + info.foundAllByLessonId(lessonId); + } else { + warn.notFoundAllByLessonId(lessonId); + } + return noteEntities; + } catch (Exception exception) { + error.errorWhenGettingAllByLessonId(lessonId); + throw new SisDatabaseException(exception); + } + } + + @Override + public List getAllStudentLessonsNotesByStudentId(final Long studentId) { + try (final Connection connection = sql2o.open(); final Query query = connection.createQuery(GET_ALL_STUDENT_LESSONS_NOTES_BY_STUDENT_ID)) { + + final List noteEntities = query + .addParameter(STUDENT_ID.getModelName(), studentId) + .setColumnMappings(COLUMN_MAPPINGS) + .executeAndFetch(StudentLessonNoteEntity.class); + + if (!noteEntities.isEmpty()) { + info.foundAllByStudentId(studentId); + } else { + warn.notFoundAllByStudentId(studentId); + } + return noteEntities; + } catch (Exception exception) { + error.errorWhenGettingAllByStudentId(studentId); + throw new SisDatabaseException(exception); + } + } + + @Override + public StudentLessonNoteEntity getStudentLessonNotesById(final String id) { + try (final Connection connection = sql2o.open(); final Query query = connection.createQuery(GET_STUDENT_LESSON_NOTES_BY_ID)) { + + final StudentLessonNoteEntity noteEntity = query + .addParameter(ID.getModelName(), id) + .setColumnMappings(COLUMN_MAPPINGS) + .executeAndFetchFirst(StudentLessonNoteEntity.class); + + if (noteEntity != null) { + info.foundById(id); + } else { + warn.notFoundById(id); + } + return noteEntity; + } catch (Exception exception) { + error.errorWhenGettingById(id); + throw new SisDatabaseException(exception); + } + } + + @Override + public void saveStudentLessonNote(final StudentLessonNoteSaveEntity saveEntity) { + try (final Connection connection = sql2o.open(); final Query query = connection.createQuery(SAVE_STUDENT_LESSON_NOTE)) { + + query.addParameter(ID.getModelName(), saveEntity.getId()) + .addParameter(TEACHER_ID.getModelName(), saveEntity.getTeacherId()) + .addParameter(STUDENT_ID.getModelName(), saveEntity.getStudentId()) + .addParameter(LESSON_ID.getModelName(), saveEntity.getLessonId()) + .addParameter(STATUS.getModelName(), saveEntity.getStatus()) + .addParameter(CREATED_DATE.getModelName(), saveEntity.getCreatedDate()) + .addParameter(CREATED_USER_ID.getModelName(), saveEntity.getCreatedUserId()) + .executeUpdate(); + + } catch (Exception exception) { + error.errorWhenSaving(); + throw new SisDatabaseException(exception); + } + } + + @Override + public void updateStudentLessonMidtermNote(final StudentLessonMidtermNoteUpdateEntity updateEntity) { + try (final Connection connection = sql2o.open(); final Query query = connection.createQuery(UPDATE_STUDENT_LESSON_MIDTERM_NOTE)) { + + query.addParameter(ID.getModelName(), updateEntity.getId()) + .addParameter(MIDTERM_NOTE.getModelName(), updateEntity.getMidtermNote()) + .addParameter(MODIFIED_DATE.getModelName(), updateEntity.getModifiedDate()) + .addParameter(MODIFIED_USER_ID.getModelName(), updateEntity.getModifiedUserId()) + .executeUpdate(); + + } catch (Exception exception) { + error.errorWhenUpdating(); + throw new SisDatabaseException(exception); + } + } + + @Override + public void updateStudentLessonFinalNote(final StudentLessonFinalNoteUpdateEntity updateEntity) { + try (final Connection connection = sql2o.open(); final Query query = connection.createQuery(UPDATE_STUDENT_LESSON_FINAL_AND_MEAN_OF_NOTES)) { + + query.addParameter(ID.getModelName(), updateEntity.getId()) + .addParameter(FINAL_NOTE.getModelName(), updateEntity.getFinalNote()) + .addParameter(MEAN_OF_NOTE.getModelName(), updateEntity.getMeanOfNote()) + .addParameter(STATUS.getModelName(), updateEntity.getStatus()) + .addParameter(MODIFIED_DATE.getModelName(), updateEntity.getModifiedDate()) + .addParameter(MODIFIED_USER_ID.getModelName(), updateEntity.getModifiedUserId()) + .executeUpdate(); + + } catch (Exception exception) { + error.errorWhenUpdating(); + throw new SisDatabaseException(exception); + } + } + + @Override + public void updateStudentLessonResitNote(final StudentLessonResitNoteUpdateEntity updateEntity) { + try (final Connection connection = sql2o.open(); final Query query = connection.createQuery(UPDATE_STUDENT_LESSON_RESIT_AND_MEAN_OF_NOTES)) { + + query.addParameter(ID.getModelName(), updateEntity.getId()) + .addParameter(RESIT_NOTE.getModelName(), updateEntity.getResitNote()) + .addParameter(MEAN_OF_NOTE.getModelName(), updateEntity.getMeanOfNote()) + .addParameter(STATUS.getModelName(), updateEntity.getStatus()) + .addParameter(MODIFIED_DATE.getModelName(), updateEntity.getModifiedDate()) + .addParameter(MODIFIED_USER_ID.getModelName(), updateEntity.getModifiedUserId()) + .executeUpdate(); + + } catch (Exception exception) { + error.errorWhenUpdating(); + throw new SisDatabaseException(exception); + } + } + + @Override + public Double getMidtermNoteById(final String id) { + try (final Connection connection = sql2o.open(); final Query query = connection.createQuery(GET_MIDTERM_NOTE_BY_ID)) { + + final Double midtermNote = query + .addParameter(ID.getModelName(), id) + .setColumnMappings(COLUMN_MAPPINGS) + .executeScalar(Double.class); + + if (midtermNote != null) { + info.foundById(id); + } else { + warn.notFoundById(id); + } + return midtermNote; + } catch (Exception exception) { + error.errorWhenGettingById(id); + throw new SisDatabaseException(exception); + } + } + + @Override + public boolean isStudentLessonNotesExist(final String id) { + try (final Connection connection = sql2o.open(); final Query query = connection.createQuery(IS_STUDENT_LESSON_NOTES_EXIST_BY_ID)) { + + final boolean isStudentLessonNotesExist = query.addParameter(ID.getModelName(), id) + .executeAndFetchFirst(Boolean.class); + + if (isStudentLessonNotesExist) { + info.foundById(id); + return true; + } else { + warn.notFoundById(id); + return false; + } + } catch (Exception exception) { + error.errorWhenGettingById(id); + throw new SisDatabaseException(exception); + } + } +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/note/repository/impl/scripts/StudentLessonNoteSqlScripts.java b/src/main/java/com/graduationproject/studentinformationsystem/university/note/repository/impl/scripts/StudentLessonNoteSqlScripts.java new file mode 100644 index 00000000..98f4708b --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/note/repository/impl/scripts/StudentLessonNoteSqlScripts.java @@ -0,0 +1,113 @@ +package com.graduationproject.studentinformationsystem.university.note.repository.impl.scripts; + +import com.graduationproject.studentinformationsystem.common.util.sql.SisSqlUtil; + +import static com.graduationproject.studentinformationsystem.university.note.model.mapping.StudentLessonNoteMapping.ID; + +public class StudentLessonNoteSqlScripts { + + private static final StringBuilder sqlBuilder = new StringBuilder(); + + private StudentLessonNoteSqlScripts() { + } + + /** + * SELECT ID, TEACHER_ID, STUDENT_ID, LESSON_ID, MIDTERM_NOTE, FINAL_NOTE, RESIT_NOTE, MEAN_OF_NOTE, STATUS, + * CREATED_DATE, CREATED_USER_ID, MODIFIED_DATE, MODIFIED_USER_ID FROM STUDENT_LESSON_NOTE; + */ + private static final String GET_ALL_STUDENTS_LESSONS_NOTES = + sqlBuilder.delete(0, sqlBuilder.length()) + .append("SELECT ID, TEACHER_ID, STUDENT_ID, LESSON_ID, MIDTERM_NOTE, FINAL_NOTE, " + + "RESIT_NOTE, MEAN_OF_NOTE, STATUS, " + + "CREATED_DATE, CREATED_USER_ID, MODIFIED_DATE, MODIFIED_USER_ID " + + "FROM STUDENT_LESSON_NOTE ").toString(); + + /** + * SELECT ID, TEACHER_ID, STUDENT_ID, LESSON_ID, MIDTERM_NOTE, FINAL_NOTE, RESIT_NOTE, MEAN_OF_NOTE, STATUS, + * CREATED_DATE, CREATED_USER_ID, MODIFIED_DATE, MODIFIED_USER_ID FROM STUDENT_LESSON_NOTE + * WHERE LESSON_ID=:lessonId; + */ + public static final String GET_ALL_STUDENTS_LESSON_NOTES_BY_LESSON_ID = + sqlBuilder.delete(0, sqlBuilder.length()) + .append(GET_ALL_STUDENTS_LESSONS_NOTES) + .append("WHERE LESSON_ID=:lessonId").toString(); + + /** + * SELECT ID, TEACHER_ID, STUDENT_ID, LESSON_ID, MIDTERM_NOTE, FINAL_NOTE, RESIT_NOTE, MEAN_OF_NOTE, STATUS, + * CREATED_DATE, CREATED_USER_ID, MODIFIED_DATE, MODIFIED_USER_ID FROM STUDENT_LESSON_NOTE + * WHERE STUDENT_ID=:studentId; + */ + public static final String GET_ALL_STUDENT_LESSONS_NOTES_BY_STUDENT_ID = + sqlBuilder.delete(0, sqlBuilder.length()) + .append(GET_ALL_STUDENTS_LESSONS_NOTES) + .append("WHERE STUDENT_ID=:studentId").toString(); + + /** + * SELECT ID, TEACHER_ID, STUDENT_ID, LESSON_ID, MIDTERM_NOTE, FINAL_NOTE, RESIT_NOTE, MEAN_OF_NOTE, STATUS, + * CREATED_DATE, CREATED_USER_ID, MODIFIED_DATE, MODIFIED_USER_ID FROM STUDENT_LESSON_NOTE + * WHERE LESSON_ID=:lessonId; + */ + public static final String GET_STUDENT_LESSON_NOTES_BY_ID = + sqlBuilder.delete(0, sqlBuilder.length()) + .append(GET_ALL_STUDENTS_LESSONS_NOTES) + .append("WHERE ID=:id").toString(); + + /** + * INSERT INTO STUDENT_LESSON_NOTE (ID, TEACHER_ID, STUDENT_ID, LESSON_ID, STATUS, CREATED_DATE, CREATED_USER_ID) + * VALUES (:id, :teacherId, :studentId, :lessonId, :status, :createdDate, :createdUserId); + */ + public static final String SAVE_STUDENT_LESSON_NOTE = + sqlBuilder.delete(0, sqlBuilder.length()) + .append("INSERT INTO STUDENT_LESSON_NOTE (ID, TEACHER_ID, STUDENT_ID, LESSON_ID, STATUS, " + + "CREATED_DATE, CREATED_USER_ID) VALUES (:id, :teacherId, :studentId, :lessonId, :status, " + + ":createdDate, :createdUserId)").toString(); + + /** + * UPDATE STUDENT_LESSON_NOTE SET MIDTERM_NOTE=:midtermNote, + * MODIFIED_DATE=:modifiedDate, MODIFIED_USER_ID=:modifiedUserId + * WHERE ID=:id; + */ + public static final String UPDATE_STUDENT_LESSON_MIDTERM_NOTE = + sqlBuilder.delete(0, sqlBuilder.length()) + .append("UPDATE STUDENT_LESSON_NOTE SET MIDTERM_NOTE=:midtermNote, " + + "MODIFIED_DATE=:modifiedDate, MODIFIED_USER_ID=:modifiedUserId " + + "WHERE ID=:id").toString(); + + /** + * UPDATE STUDENT_LESSON_NOTE SET FINAL_NOTE=:finalNote, MEAN_OF_NOTE=:meanOfNote, STATUS=:status, + * MODIFIED_DATE=:modifiedDate, MODIFIED_USER_ID=:modifiedUserId + * WHERE ID=:id; + */ + public static final String UPDATE_STUDENT_LESSON_FINAL_AND_MEAN_OF_NOTES = + sqlBuilder.delete(0, sqlBuilder.length()) + .append("UPDATE STUDENT_LESSON_NOTE SET FINAL_NOTE=:finalNote, MEAN_OF_NOTE=:meanOfNote, " + + "STATUS=:status, MODIFIED_DATE=:modifiedDate, MODIFIED_USER_ID=:modifiedUserId " + + "WHERE ID=:id").toString(); + + /** + * UPDATE STUDENT_LESSON_NOTE SET RESIT_NOTE=:resitNote, MEAN_OF_NOTE=:meanOfNote, STATUS=:status, + * MODIFIED_DATE=:modifiedDate, MODIFIED_USER_ID=:modifiedUserId + * WHERE ID=:id; + */ + public static final String UPDATE_STUDENT_LESSON_RESIT_AND_MEAN_OF_NOTES = + sqlBuilder.delete(0, sqlBuilder.length()) + .append("UPDATE STUDENT_LESSON_NOTE SET RESIT_NOTE=:resitNote, MEAN_OF_NOTE=:meanOfNote, " + + "STATUS=:status, MODIFIED_DATE=:modifiedDate, MODIFIED_USER_ID=:modifiedUserId " + + "WHERE ID=:id").toString(); + + /** + * SELECT CASE WHEN MAX(ID) IS NULL THEN 'false' ELSE 'true' END IS_EXIST + * FROM STUDENT_LESSON_NOTE WHERE ID=:id; + */ + public static final String IS_STUDENT_LESSON_NOTES_EXIST_BY_ID = SisSqlUtil + .isExistByColumnName("STUDENT_LESSON_NOTE", + ID.getColumnName(), + ID.getModelName()); + + /** + * SELECT MIDTERM_NOTE FROM STUDENT_LESSON_NOTE WHERE ID=:id; + */ + public static final String GET_MIDTERM_NOTE_BY_ID = + sqlBuilder.delete(0, sqlBuilder.length()) + .append("SELECT MIDTERM_NOTE FROM STUDENT_LESSON_NOTE WHERE ID=:id").toString(); +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/note/service/StudentLessonNoteOutService.java b/src/main/java/com/graduationproject/studentinformationsystem/university/note/service/StudentLessonNoteOutService.java new file mode 100644 index 00000000..323a3db3 --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/note/service/StudentLessonNoteOutService.java @@ -0,0 +1,13 @@ +package com.graduationproject.studentinformationsystem.university.note.service; + +import com.graduationproject.studentinformationsystem.common.model.dto.request.SisOperationInfoRequest; +import com.graduationproject.studentinformationsystem.university.lesson.common.model.dto.response.LessonResponse; + +import java.util.List; + +public interface StudentLessonNoteOutService { + + void saveStudentLessonsNotesRegistrations(Long studentId, + List lessonResponses, + SisOperationInfoRequest operationInfoRequest); +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/note/service/StudentLessonNoteService.java b/src/main/java/com/graduationproject/studentinformationsystem/university/note/service/StudentLessonNoteService.java new file mode 100644 index 00000000..86440378 --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/note/service/StudentLessonNoteService.java @@ -0,0 +1,22 @@ +package com.graduationproject.studentinformationsystem.university.note.service; + +import com.graduationproject.studentinformationsystem.common.util.exception.SisNotExistException; +import com.graduationproject.studentinformationsystem.university.note.model.dto.request.StudentLessonFinalNoteUpdateRequest; +import com.graduationproject.studentinformationsystem.university.note.model.dto.request.StudentLessonMidtermNoteUpdateRequest; +import com.graduationproject.studentinformationsystem.university.note.model.dto.request.StudentLessonResitNoteUpdateRequest; +import com.graduationproject.studentinformationsystem.university.note.model.dto.response.StudentLessonNoteResponse; + +import java.util.List; + +public interface StudentLessonNoteService { + + List getAllStudentsLessonsNotesByLessonId(Long lessonId) throws SisNotExistException; + + List getAllStudentLessonsNotesByStudentId(Long studentId) throws SisNotExistException; + + StudentLessonNoteResponse updateStudentLessonMidtermNote(StudentLessonMidtermNoteUpdateRequest updateRequest) throws SisNotExistException; + + StudentLessonNoteResponse updateStudentLessonFinalNote(StudentLessonFinalNoteUpdateRequest updateRequest) throws SisNotExistException; + + StudentLessonNoteResponse updateStudentLessonResitNote(StudentLessonResitNoteUpdateRequest updateRequest) throws SisNotExistException; +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/note/service/impl/StudentLessonNoteOutServiceImpl.java b/src/main/java/com/graduationproject/studentinformationsystem/university/note/service/impl/StudentLessonNoteOutServiceImpl.java new file mode 100644 index 00000000..216054f1 --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/note/service/impl/StudentLessonNoteOutServiceImpl.java @@ -0,0 +1,45 @@ +package com.graduationproject.studentinformationsystem.university.note.service.impl; + +import com.graduationproject.studentinformationsystem.common.model.dto.request.SisOperationInfoRequest; +import com.graduationproject.studentinformationsystem.university.lesson.common.model.dto.response.LessonResponse; +import com.graduationproject.studentinformationsystem.university.lesson.teacher.service.TeacherLessonOutService; +import com.graduationproject.studentinformationsystem.university.note.model.dto.converter.StudentLessonNoteInfoConverter; +import com.graduationproject.studentinformationsystem.university.note.model.dto.request.StudentLessonNoteSaveRequest; +import com.graduationproject.studentinformationsystem.university.note.model.entity.StudentLessonNoteSaveEntity; +import com.graduationproject.studentinformationsystem.university.note.repository.StudentLessonNoteRepository; +import com.graduationproject.studentinformationsystem.university.note.service.StudentLessonNoteOutService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class StudentLessonNoteOutServiceImpl implements StudentLessonNoteOutService { + + private final TeacherLessonOutService teacherLessonOutService; + + private final StudentLessonNoteRepository lessonNoteRepository; + private final StudentLessonNoteInfoConverter lessonNoteInfoConverter; + + @Override + public void saveStudentLessonsNotesRegistrations(final Long studentId, + final List lessonResponses, + final SisOperationInfoRequest operationInfoRequest) { + + for (LessonResponse lessonResponse : lessonResponses) { + final Long lessonId = lessonResponse.getLessonId(); + final Long teacherId = teacherLessonOutService.getTeacherIdByLessonId(lessonId); + + StudentLessonNoteSaveRequest saveRequest = StudentLessonNoteSaveRequest.builder() + .teacherId(teacherId) + .studentId(studentId) + .lessonId(lessonId) + .operationInfoRequest(operationInfoRequest) + .build(); + + final StudentLessonNoteSaveEntity saveEntity = lessonNoteInfoConverter.generateSaveEntity(saveRequest); + lessonNoteRepository.saveStudentLessonNote(saveEntity); + } + } +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/note/service/impl/StudentLessonNoteServiceImpl.java b/src/main/java/com/graduationproject/studentinformationsystem/university/note/service/impl/StudentLessonNoteServiceImpl.java new file mode 100644 index 00000000..a36bf889 --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/note/service/impl/StudentLessonNoteServiceImpl.java @@ -0,0 +1,174 @@ +package com.graduationproject.studentinformationsystem.university.note.service.impl; + +import com.graduationproject.studentinformationsystem.common.util.exception.SisNotExistException; +import com.graduationproject.studentinformationsystem.university.lesson.common.service.LessonOutService; +import com.graduationproject.studentinformationsystem.university.note.model.dto.converter.StudentLessonNoteInfoConverter; +import com.graduationproject.studentinformationsystem.university.note.model.dto.request.StudentLessonFinalNoteUpdateRequest; +import com.graduationproject.studentinformationsystem.university.note.model.dto.request.StudentLessonMidtermNoteUpdateRequest; +import com.graduationproject.studentinformationsystem.university.note.model.dto.request.StudentLessonResitNoteUpdateRequest; +import com.graduationproject.studentinformationsystem.university.note.model.dto.response.StudentLessonNoteResponse; +import com.graduationproject.studentinformationsystem.university.note.model.entity.StudentLessonFinalNoteUpdateEntity; +import com.graduationproject.studentinformationsystem.university.note.model.entity.StudentLessonMidtermNoteUpdateEntity; +import com.graduationproject.studentinformationsystem.university.note.model.entity.StudentLessonNoteEntity; +import com.graduationproject.studentinformationsystem.university.note.model.entity.StudentLessonResitNoteUpdateEntity; +import com.graduationproject.studentinformationsystem.university.note.model.enums.StudentLessonNoteStatus; +import com.graduationproject.studentinformationsystem.university.note.model.exception.StudentLessonNoteException; +import com.graduationproject.studentinformationsystem.university.note.repository.StudentLessonNoteRepository; +import com.graduationproject.studentinformationsystem.university.note.service.StudentLessonNoteService; +import com.graduationproject.studentinformationsystem.university.student.service.StudentOutService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class StudentLessonNoteServiceImpl implements StudentLessonNoteService { + + private final LessonOutService lessonOutService; + private final StudentOutService studentOutService; + + private final StudentLessonNoteRepository lessonNoteRepository; + private final StudentLessonNoteInfoConverter lessonNoteInfoConverter; + + @Override + public List getAllStudentsLessonsNotesByLessonId(final Long lessonId) + throws SisNotExistException { + + ifLessonIsNotExistThrowNotExistException(lessonId); + + final List entities = lessonNoteRepository.getAllStudentsLessonsNotesByLessonId(lessonId); + return lessonNoteInfoConverter.entitiesToResponses(entities); + } + + @Override + public List getAllStudentLessonsNotesByStudentId(final Long studentId) + throws SisNotExistException { + + ifStudentIsNotExistThrowNotExistException(studentId); + + final List entities = lessonNoteRepository.getAllStudentLessonsNotesByStudentId(studentId); + return lessonNoteInfoConverter.entitiesToResponses(entities); + } + + @Override + public StudentLessonNoteResponse updateStudentLessonMidtermNote(final StudentLessonMidtermNoteUpdateRequest updateRequest) + throws SisNotExistException { + + final String id = updateRequest.getId(); + + ifStudentLessonNotesAreNotExistThrowNotExistException(id); + + final StudentLessonMidtermNoteUpdateEntity noteUpdateEntity = lessonNoteInfoConverter + .generateMidtermNoteUpdateEntity(updateRequest); + + lessonNoteRepository.updateStudentLessonMidtermNote(noteUpdateEntity); + + return getStudentLessonNoteById(id); + } + + @Override + public StudentLessonNoteResponse updateStudentLessonFinalNote(final StudentLessonFinalNoteUpdateRequest updateRequest) + throws SisNotExistException { + + final String id = updateRequest.getId(); + + ifStudentLessonNotesAreNotExistThrowNotExistException(id); + + final Double midtermNote = lessonNoteRepository.getMidtermNoteById(id); + + Double meanOfNote; + StudentLessonNoteStatus status; + + final Double finalNote = updateRequest.getFinalNote(); + if (finalNote >= 50.0) { + + meanOfNote = calculateMeanOfNoteWithFinalNote(midtermNote, finalNote); + + if (meanOfNote >= 60.0) { + status = StudentLessonNoteStatus.PASSED; + } else { + status = StudentLessonNoteStatus.UNFINALISED; + } + } else { + meanOfNote = calculateMeanOfNoteWithFinalNote(midtermNote, finalNote); + status = StudentLessonNoteStatus.UNFINALISED; + } + + final StudentLessonFinalNoteUpdateEntity noteUpdateEntity = lessonNoteInfoConverter + .generateFinalNoteUpdateEntity(meanOfNote, status, updateRequest); + + lessonNoteRepository.updateStudentLessonFinalNote(noteUpdateEntity); + + return getStudentLessonNoteById(id); + } + + @Override + public StudentLessonNoteResponse updateStudentLessonResitNote(final StudentLessonResitNoteUpdateRequest updateRequest) + throws SisNotExistException { + + final String id = updateRequest.getId(); + + ifStudentLessonNotesAreNotExistThrowNotExistException(id); + + final Double midtermNote = lessonNoteRepository.getMidtermNoteById(id); + + Double meanOfNote; + StudentLessonNoteStatus status; + + final Double resitNote = updateRequest.getResitNote(); + if (resitNote >= 50.0) { + + meanOfNote = calculateMeanOfNoteWithResitNote(midtermNote, resitNote); + + if (meanOfNote >= 60.0) { + status = StudentLessonNoteStatus.PASSED; + } else { + status = StudentLessonNoteStatus.FAILED; + } + } else { + meanOfNote = calculateMeanOfNoteWithResitNote(midtermNote, resitNote); + status = StudentLessonNoteStatus.FAILED; + } + + final StudentLessonResitNoteUpdateEntity noteUpdateEntity = lessonNoteInfoConverter + .generateResitNoteUpdateEntity(meanOfNote, status, updateRequest); + + lessonNoteRepository.updateStudentLessonResitNote(noteUpdateEntity); + + return getStudentLessonNoteById(id); + } + + + private StudentLessonNoteResponse getStudentLessonNoteById(final String id) { + final StudentLessonNoteEntity entity = lessonNoteRepository.getStudentLessonNotesById(id); + return lessonNoteInfoConverter.entityToResponse(entity); + } + + protected final Double calculateMeanOfNoteWithFinalNote(final Double midtermNote, Double finalNote) { + return midtermNote * 0.4 + finalNote * 0.6; + } + + protected final Double calculateMeanOfNoteWithResitNote(final Double midtermNote, Double finalNote) { + return midtermNote * 0.4 + finalNote * 0.6; + } + + + /** + * Throw Exceptions + */ + + private void ifLessonIsNotExistThrowNotExistException(final Long lessonId) throws SisNotExistException { + lessonOutService.ifLessonIsNotExistThrowNotExistException(lessonId); + } + + private void ifStudentIsNotExistThrowNotExistException(final Long studentId) throws SisNotExistException { + studentOutService.ifStudentIsNotExistThrowNotExistException(studentId); + } + + private void ifStudentLessonNotesAreNotExistThrowNotExistException(final String id) throws SisNotExistException { + if (!lessonNoteRepository.isStudentLessonNotesExist(id)) { + StudentLessonNoteException.throwNotExistException(id); + } + } +} diff --git a/src/main/java/com/graduationproject/studentinformationsystem/university/note/util/StudentLessonNoteUtil.java b/src/main/java/com/graduationproject/studentinformationsystem/university/note/util/StudentLessonNoteUtil.java new file mode 100644 index 00000000..d2f1a1cd --- /dev/null +++ b/src/main/java/com/graduationproject/studentinformationsystem/university/note/util/StudentLessonNoteUtil.java @@ -0,0 +1,14 @@ +package com.graduationproject.studentinformationsystem.university.note.util; + +public class StudentLessonNoteUtil { + + private StudentLessonNoteUtil() { + } + + public static Double getMeanOfNoteWith2NumberAfterDot(final Double meanOfNote) { + if (meanOfNote != null) { + return Math.floor(meanOfNote * 100) / 100; + } + return null; + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 54aee3a9..0ae6b3e6 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,6 +1,6 @@ sis: title: Student Information System API - version: v1.2.0 + version: v1.3.0 server: port: 8585