From d7a7bb5e74fd43463c3595fe5077675cb5fea18e Mon Sep 17 00:00:00 2001 From: raviendalpatadu <102800797+raviendalpatadu@users.noreply.github.com> Date: Mon, 2 Dec 2024 23:21:49 +0530 Subject: [PATCH 1/7] exam setter deletion --- .../controller/ExamManagementController.java | 5 +-- .../controller/ExamSetterController.java | 6 +++ .../testify/Testify_Backend/model/Exam.java | 1 + .../model/ExamSetterOrganization.java | 37 +++++++++++++++++++ .../ExamSetterOrganizationRepository.java | 22 +++++++++++ .../service/AuthenticationService.java | 10 +++++ .../service/CandidateServiceImpl.java | 5 ++- .../service/ExamManagementServiceImpl.java | 1 - .../service/ExamSetterService.java | 2 + .../service/ExamSetterServiceImpl.java | 28 ++++++++++++++ .../service/OrganizationServiceImpl.java | 16 +++++++- 11 files changed, 125 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/testify/Testify_Backend/model/ExamSetterOrganization.java create mode 100644 src/main/java/com/testify/Testify_Backend/repository/ExamSetterOrganizationRepository.java diff --git a/src/main/java/com/testify/Testify_Backend/controller/ExamManagementController.java b/src/main/java/com/testify/Testify_Backend/controller/ExamManagementController.java index 835c6db..5d8f02c 100644 --- a/src/main/java/com/testify/Testify_Backend/controller/ExamManagementController.java +++ b/src/main/java/com/testify/Testify_Backend/controller/ExamManagementController.java @@ -154,10 +154,9 @@ public ResponseEntity saveAnswer(@RequestBody SaveAnswerRequest request) return new ResponseEntity<>("Error saving answer: " + e.getMessage(), HttpStatus.BAD_REQUEST); } + } @PostMapping("/{examId}/proctors") - public ResponseEntity addOrUpdateProctors( - @PathVariable Long examId, - @RequestBody List emails) { + public ResponseEntity addOrUpdateProctors(@PathVariable Long examId, @RequestBody List emails) { log.info("Adding proctors to examId: " + examId); log.info("Emails: " + emails); return examManagementService.addProctorsToExam(examId, emails); diff --git a/src/main/java/com/testify/Testify_Backend/controller/ExamSetterController.java b/src/main/java/com/testify/Testify_Backend/controller/ExamSetterController.java index 36c0e89..0f4f59a 100644 --- a/src/main/java/com/testify/Testify_Backend/controller/ExamSetterController.java +++ b/src/main/java/com/testify/Testify_Backend/controller/ExamSetterController.java @@ -36,4 +36,10 @@ public ResponseEntity addSetterToOrganization(@PathV GenericAddOrUpdateResponse response = examSetterService.addSetterToOrganization(token); return ResponseEntity.ok(response); } + + @PutMapping("/{setterId}/{organizationId}/deleteSetter") + public ResponseEntity deleteSetter(@PathVariable("setterId") String setterId, @PathVariable("organizationId") String organizationId) { + GenericAddOrUpdateResponse response = examSetterService.deleteSetter(setterId, organizationId); + return ResponseEntity.ok(response); + } } diff --git a/src/main/java/com/testify/Testify_Backend/model/Exam.java b/src/main/java/com/testify/Testify_Backend/model/Exam.java index 6b1d95e..8289136 100644 --- a/src/main/java/com/testify/Testify_Backend/model/Exam.java +++ b/src/main/java/com/testify/Testify_Backend/model/Exam.java @@ -91,6 +91,7 @@ public class Exam { joinColumns = @JoinColumn(name = "exam_id"), inverseJoinColumns = @JoinColumn(name = "candidate_id") ) + private Set candidates; @OneToMany(mappedBy = "exam", cascade = CascadeType.ALL) diff --git a/src/main/java/com/testify/Testify_Backend/model/ExamSetterOrganization.java b/src/main/java/com/testify/Testify_Backend/model/ExamSetterOrganization.java new file mode 100644 index 0000000..ade0bdb --- /dev/null +++ b/src/main/java/com/testify/Testify_Backend/model/ExamSetterOrganization.java @@ -0,0 +1,37 @@ +package com.testify.Testify_Backend.model; + +import jakarta.annotation.Nullable; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import lombok.*; +import org.springframework.data.annotation.Id; + +@Entity +@Data +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class ExamSetterOrganization { + @Setter + @jakarta.persistence.Id + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) // Auto-generate the ID + @Column + private Long id; + + @Column(nullable = false) + private String organizationID; + + @Column(nullable = false) + private String examSetterID; + + private boolean isDeleted = false; + + public Long getId() { + return id; + } + +} diff --git a/src/main/java/com/testify/Testify_Backend/repository/ExamSetterOrganizationRepository.java b/src/main/java/com/testify/Testify_Backend/repository/ExamSetterOrganizationRepository.java new file mode 100644 index 0000000..f6149e0 --- /dev/null +++ b/src/main/java/com/testify/Testify_Backend/repository/ExamSetterOrganizationRepository.java @@ -0,0 +1,22 @@ +package com.testify.Testify_Backend.repository; + +import com.testify.Testify_Backend.model.ExamSetterOrganization; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface ExamSetterOrganizationRepository extends JpaRepository { +// write a method to update is deleted to true by organizationID and examSetterID +// write a method to find by organizationID and examSetterID + ExamSetterOrganization findByOrganizationIDAndExamSetterID(String organizationID, String examSetterID); + List findByOrganizationID(String organizationID); + ExamSetterOrganization findByExamSetterID(String examSetterID); + + @Query("SELECT e.examSetterID FROM ExamSetterOrganization e WHERE e.organizationID = :organizationId AND e.isDeleted = false") + List findActiveExamSetterIDs(@Param("organizationId") String organizationId); + +} diff --git a/src/main/java/com/testify/Testify_Backend/service/AuthenticationService.java b/src/main/java/com/testify/Testify_Backend/service/AuthenticationService.java index c194271..5167401 100644 --- a/src/main/java/com/testify/Testify_Backend/service/AuthenticationService.java +++ b/src/main/java/com/testify/Testify_Backend/service/AuthenticationService.java @@ -54,6 +54,8 @@ public class AuthenticationService { private final VerificationRequestRepository verificationRequestRepository; + private final ExamSetterOrganizationRepository examSetterOrganizationRepository; + private User user; @@ -114,6 +116,14 @@ public RegisterResponse register(@ModelAttribute RegistrationRequest request, bo invitation.setAccepted(true); examSetterInvitationRepository.save(invitation); }); + +// add to examSetterOrganization + ExamSetterOrganization examSetterOrganization = new ExamSetterOrganization(); + examSetterOrganization.setOrganizationID(String.valueOf(organization.getId())); + examSetterOrganization.setExamSetterID(String.valueOf(examSetter.getId())); + examSetterOrganizationRepository.save(examSetterOrganization); + + } else if (request.getRole().equals(UserRole.ORGANIZATION)) { System.out.println("Organization"); Organization organization = Organization.builder() diff --git a/src/main/java/com/testify/Testify_Backend/service/CandidateServiceImpl.java b/src/main/java/com/testify/Testify_Backend/service/CandidateServiceImpl.java index d72cd36..879c005 100644 --- a/src/main/java/com/testify/Testify_Backend/service/CandidateServiceImpl.java +++ b/src/main/java/com/testify/Testify_Backend/service/CandidateServiceImpl.java @@ -58,7 +58,8 @@ public class CandidateServiceImpl implements CandidateService { @Override public List getCandidateExams(String status) { // Get the current user's email (you can adapt this to your actual method of getting the logged-in user's email) - String currentUserEmail = "testcan@gmail.com"; + String currentUserEmail = UserUtil.getCurrentUserName(); + log.info("Current user email: {}", currentUserEmail); Candidate candidate = candidateRepository.findByEmail(currentUserEmail) .orElseThrow(() -> new EntityNotFoundException("Candidate not found")); @@ -96,7 +97,7 @@ public List getCandidateExams(String status) { @Override public CandidateExam getCandidateExamDetails(Integer examId) { - String currentUserEmail = "testcan@gmail.com"; + String currentUserEmail = UserUtil.getCurrentUserName(); Candidate candidate = candidateRepository.findByEmail(currentUserEmail) .orElseThrow(() -> new EntityNotFoundException("Candidate not found")); diff --git a/src/main/java/com/testify/Testify_Backend/service/ExamManagementServiceImpl.java b/src/main/java/com/testify/Testify_Backend/service/ExamManagementServiceImpl.java index d626c9c..1938389 100644 --- a/src/main/java/com/testify/Testify_Backend/service/ExamManagementServiceImpl.java +++ b/src/main/java/com/testify/Testify_Backend/service/ExamManagementServiceImpl.java @@ -45,7 +45,6 @@ public class ExamManagementServiceImpl implements ExamManagementService { private final CandidateExamAnswerRepository candidateExamAnswerRepository; private final MCQOptionRepository mcqOptionRepository; private final CandidateGroupRepository candidateGroupRepository; - private final CandidateGroupRepository candidateGroupRepository; private final EmailSender emailSender; private final ModelMapper modelMapper; diff --git a/src/main/java/com/testify/Testify_Backend/service/ExamSetterService.java b/src/main/java/com/testify/Testify_Backend/service/ExamSetterService.java index 1e06c7f..9389938 100644 --- a/src/main/java/com/testify/Testify_Backend/service/ExamSetterService.java +++ b/src/main/java/com/testify/Testify_Backend/service/ExamSetterService.java @@ -11,4 +11,6 @@ public interface ExamSetterService { long checkSetterRegistration(String token); GenericAddOrUpdateResponse addSetterToOrganization(String token); + + GenericAddOrUpdateResponse deleteSetter(String setterId, String organizationId); } diff --git a/src/main/java/com/testify/Testify_Backend/service/ExamSetterServiceImpl.java b/src/main/java/com/testify/Testify_Backend/service/ExamSetterServiceImpl.java index 7239611..e54b033 100644 --- a/src/main/java/com/testify/Testify_Backend/service/ExamSetterServiceImpl.java +++ b/src/main/java/com/testify/Testify_Backend/service/ExamSetterServiceImpl.java @@ -2,8 +2,10 @@ import com.testify.Testify_Backend.model.ExamSetter; import com.testify.Testify_Backend.model.ExamSetterInvitation; +import com.testify.Testify_Backend.model.ExamSetterOrganization; import com.testify.Testify_Backend.model.Organization; import com.testify.Testify_Backend.repository.ExamSetterInvitationRepository; +import com.testify.Testify_Backend.repository.ExamSetterOrganizationRepository; import com.testify.Testify_Backend.repository.ExamSetterRepository; import com.testify.Testify_Backend.repository.OrganizationRepository; import com.testify.Testify_Backend.responses.GenericAddOrUpdateResponse; @@ -27,10 +29,13 @@ public class ExamSetterServiceImpl implements ExamSetterService { @Autowired private ModelMapper modelMapper; + @Autowired + private ExamSetterOrganizationRepository examSetterOrganizationRepository; @Override public Set getOrganizations(long setterId) { Optional examSetter = examSetterRepository.findById(setterId); + Set organizationResponses = new HashSet<>(); if (examSetter.isPresent()) { Set organizations = examSetter.get().getOrganizations(); @@ -63,6 +68,12 @@ public GenericAddOrUpdateResponse addSetterToOrganization(String token) { examSetter.getOrganizations().add(organization); organization.getExamSetters().add(examSetter); +// add to examSetterOrganization + ExamSetterOrganization examSetterOrganization = new ExamSetterOrganization(); + examSetterOrganization.setOrganizationID(String.valueOf(organization.getId())); + examSetterOrganization.setExamSetterID(String.valueOf(examSetter.getId())); + examSetterOrganizationRepository.save(examSetterOrganization); + examSetterRepository.save(examSetter); organizationRepository.save(organization); @@ -70,4 +81,21 @@ public GenericAddOrUpdateResponse addSetterToOrganization(String token) { response.setMessage("Successfully added an organization"); return response; } + + @Override + public GenericAddOrUpdateResponse deleteSetter(String setterId, String organizationId) { + GenericAddOrUpdateResponse response = new GenericAddOrUpdateResponse(); + ExamSetterOrganization examSetter = examSetterOrganizationRepository.findByOrganizationIDAndExamSetterID(organizationId, setterId); + try{ + examSetter.setDeleted(true); + examSetterOrganizationRepository.save(examSetter); + response.setSuccess(true); + response.setMessage("Successfully deleted the setter"); + } + catch (Exception e){ + response.setSuccess(false); + response.setMessage("Failed to delete the setter"); + } + return response; + } } diff --git a/src/main/java/com/testify/Testify_Backend/service/OrganizationServiceImpl.java b/src/main/java/com/testify/Testify_Backend/service/OrganizationServiceImpl.java index bc51055..1063cf7 100644 --- a/src/main/java/com/testify/Testify_Backend/service/OrganizationServiceImpl.java +++ b/src/main/java/com/testify/Testify_Backend/service/OrganizationServiceImpl.java @@ -49,6 +49,8 @@ public class OrganizationServiceImpl implements OrganizationService{ @Autowired private ModelMapper modelMapper; + @Autowired + private ExamSetterOrganizationRepository examSetterOrganizationRepository; @Override public ResponseEntity addSetterToOrganization(long organizationId, AddExamSetterRequest request) { @@ -253,8 +255,18 @@ public GenericAddOrUpdateResponse updateCandidateGroup(long groupId, String grou @Override public Set getExamSetters(long organizationId) { - Organization organization = organizationRepository.findById(organizationId).orElseThrow(() -> new IllegalArgumentException("Organization not found")); - return organization.getExamSetters(); + // Fetch the organization and its associated ExamSetters + Organization organization = organizationRepository.findById(organizationId) + .orElseThrow(() -> new IllegalArgumentException("Organization not found")); + + // Fetch active ExamSetter IDs from ExamSetterOrganization table + List activeExamSetterIDs = examSetterOrganizationRepository.findActiveExamSetterIDs(String.valueOf(organizationId)); + + // Filter ExamSetters linked to the organization based on active IDs + return organization.getExamSetters().stream() + .filter(examSetter -> activeExamSetterIDs.contains(String.valueOf(examSetter.getId()))) + .collect(Collectors.toSet()); + } @Override From b171b9d99187672ca53dd9face8e10964ca99630 Mon Sep 17 00:00:00 2001 From: raviendalpatadu <102800797+raviendalpatadu@users.noreply.github.com> Date: Tue, 3 Dec 2024 14:47:22 +0530 Subject: [PATCH 2/7] candidateGradeRepo and model made --- .../model/ExamCandidateGrade.java | 40 +++++++++++++++++++ .../ExamCandidateGradeRepository.java | 9 +++++ 2 files changed, 49 insertions(+) create mode 100644 src/main/java/com/testify/Testify_Backend/model/ExamCandidateGrade.java create mode 100644 src/main/java/com/testify/Testify_Backend/repository/ExamCandidateGradeRepository.java diff --git a/src/main/java/com/testify/Testify_Backend/model/ExamCandidateGrade.java b/src/main/java/com/testify/Testify_Backend/model/ExamCandidateGrade.java new file mode 100644 index 0000000..3d52a44 --- /dev/null +++ b/src/main/java/com/testify/Testify_Backend/model/ExamCandidateGrade.java @@ -0,0 +1,40 @@ +package com.testify.Testify_Backend.model; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import lombok.*; +import org.springframework.data.annotation.Id; + +@Entity +@Data +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class ExamCandidateGrade { + + @Setter + @jakarta.persistence.Id + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) // Auto-generate the ID + @Column + private Long id; + + @Column(nullable = false) + private String examID; + + @Column(nullable = false) + private String candidateID; + + private String status; + + private String grade; + + private String score; + + public Long getId() { + return id; + } +} diff --git a/src/main/java/com/testify/Testify_Backend/repository/ExamCandidateGradeRepository.java b/src/main/java/com/testify/Testify_Backend/repository/ExamCandidateGradeRepository.java new file mode 100644 index 0000000..d2e255e --- /dev/null +++ b/src/main/java/com/testify/Testify_Backend/repository/ExamCandidateGradeRepository.java @@ -0,0 +1,9 @@ +package com.testify.Testify_Backend.repository; + +import com.testify.Testify_Backend.model.ExamCandidateGrade; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ExamCandidateGradeRepository extends JpaRepository { +} From 42ce1c5eb7e6b1b84bee9103f4bd23dbfb2ba905 Mon Sep 17 00:00:00 2001 From: raviendalpatadu <102800797+raviendalpatadu@users.noreply.github.com> Date: Tue, 3 Dec 2024 17:37:55 +0530 Subject: [PATCH 3/7] working --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index d65ac4c..ad6c1a1 100644 --- a/pom.xml +++ b/pom.xml @@ -14,9 +14,9 @@ Testify-Backend Spring Boot Backend for Testify - 21 - 21 - 21 + 22 + 22 + 22 From 16b6f64ddc5dba7aeb470e5c1de4246f1bbaa84c Mon Sep 17 00:00:00 2001 From: raviendalpatadu <102800797+raviendalpatadu@users.noreply.github.com> Date: Tue, 3 Dec 2024 17:57:34 +0530 Subject: [PATCH 4/7] fix --- .../Testify_Backend/controller/ExamManagementController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/testify/Testify_Backend/controller/ExamManagementController.java b/src/main/java/com/testify/Testify_Backend/controller/ExamManagementController.java index c93aa85..1403c64 100644 --- a/src/main/java/com/testify/Testify_Backend/controller/ExamManagementController.java +++ b/src/main/java/com/testify/Testify_Backend/controller/ExamManagementController.java @@ -169,7 +169,6 @@ public ResponseEntity submitExam(@PathVariable Long sessionId) { return ResponseEntity.ok("Exam submitted successfully."); } - } @PostMapping("/{examId}/proctors") public ResponseEntity addOrUpdateProctors(@PathVariable Long examId, @RequestBody List emails) { log.info("Adding proctors to examId: " + examId); From 7cbd7f7c1522e310d6b4679f99f6cd5732803d15 Mon Sep 17 00:00:00 2001 From: raviendalpatadu <102800797+raviendalpatadu@users.noreply.github.com> Date: Tue, 3 Dec 2024 18:13:31 +0530 Subject: [PATCH 5/7] set exam candidate grade end point done --- .../controller/GradingController.java | 11 ++++++---- .../ExamCandidateGradeRequest.java | 17 ++++++++++++++++ .../service/GradingService.java | 3 +++ .../service/GradingServiceImpl.java | 20 +++++++++++++++---- 4 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/testify/Testify_Backend/requests/exam_management/ExamCandidateGradeRequest.java diff --git a/src/main/java/com/testify/Testify_Backend/controller/GradingController.java b/src/main/java/com/testify/Testify_Backend/controller/GradingController.java index 33bcdff..9876606 100644 --- a/src/main/java/com/testify/Testify_Backend/controller/GradingController.java +++ b/src/main/java/com/testify/Testify_Backend/controller/GradingController.java @@ -2,16 +2,14 @@ import com.testify.Testify_Backend.model.CandidateExamSession; import com.testify.Testify_Backend.model.Grade; +import com.testify.Testify_Backend.requests.exam_management.ExamCandidateGradeRequest; import com.testify.Testify_Backend.responses.EssayDetailsResponse; import com.testify.Testify_Backend.responses.McqDetailsResponse; import com.testify.Testify_Backend.service.GradingService; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; @@ -46,5 +44,10 @@ public ResponseEntity>> getResultsBySessionId( return ResponseEntity.ok(results); } + @PostMapping("/setExamCandidateGrade") + public ResponseEntity setExamCandidateGrade(@RequestBody ExamCandidateGradeRequest examCandidateGradeRequest) { + String response = gradingService.setExamCandidateGrade(examCandidateGradeRequest); + return ResponseEntity.ok(response); + } } diff --git a/src/main/java/com/testify/Testify_Backend/requests/exam_management/ExamCandidateGradeRequest.java b/src/main/java/com/testify/Testify_Backend/requests/exam_management/ExamCandidateGradeRequest.java new file mode 100644 index 0000000..177db92 --- /dev/null +++ b/src/main/java/com/testify/Testify_Backend/requests/exam_management/ExamCandidateGradeRequest.java @@ -0,0 +1,17 @@ +package com.testify.Testify_Backend.requests.exam_management; + +import lombok.*; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +public class ExamCandidateGradeRequest +{ + private String examID; + private String candidateID; + private String status; + private String grade; + private String score; +} diff --git a/src/main/java/com/testify/Testify_Backend/service/GradingService.java b/src/main/java/com/testify/Testify_Backend/service/GradingService.java index 654fae6..cd1c6cf 100644 --- a/src/main/java/com/testify/Testify_Backend/service/GradingService.java +++ b/src/main/java/com/testify/Testify_Backend/service/GradingService.java @@ -2,6 +2,7 @@ import com.testify.Testify_Backend.model.CandidateExamSession; import com.testify.Testify_Backend.model.Grade; +import com.testify.Testify_Backend.requests.exam_management.ExamCandidateGradeRequest; import com.testify.Testify_Backend.responses.EssayDetailsResponse; import java.util.List; @@ -11,4 +12,6 @@ public interface GradingService { List getEssayDetails(Long examId, Long userId); List getGradingSchemeForExam(Long examId); List> getQuestionAndOptionBySessionId(Long sessionId); + + String setExamCandidateGrade(ExamCandidateGradeRequest examCandidateGradeRequest); } diff --git a/src/main/java/com/testify/Testify_Backend/service/GradingServiceImpl.java b/src/main/java/com/testify/Testify_Backend/service/GradingServiceImpl.java index 01ca17a..b9ea707 100644 --- a/src/main/java/com/testify/Testify_Backend/service/GradingServiceImpl.java +++ b/src/main/java/com/testify/Testify_Backend/service/GradingServiceImpl.java @@ -1,10 +1,8 @@ package com.testify.Testify_Backend.service; import com.testify.Testify_Backend.model.*; -import com.testify.Testify_Backend.repository.CandidateExamAnswerRepository; -import com.testify.Testify_Backend.repository.ExamSessionRepository; -import com.testify.Testify_Backend.repository.GradeRepository; -import com.testify.Testify_Backend.repository.QuestionRepository; +import com.testify.Testify_Backend.repository.*; +import com.testify.Testify_Backend.requests.exam_management.ExamCandidateGradeRequest; import com.testify.Testify_Backend.responses.EssayDetailsResponse; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; @@ -25,6 +23,7 @@ public class GradingServiceImpl implements GradingService { private final CandidateExamAnswerRepository candidateExamAnswerRepository; private final GradeRepository gradeRepository; private final ExamSessionRepository examSessionRepository; + private final ExamCandidateGradeRepository examCandidateGradeRepository; @Override @Transactional @@ -108,5 +107,18 @@ public List> getQuestionAndOptionBySessionId(Long sessionId) .collect(Collectors.toList()); } + @Override + @Transactional + public String setExamCandidateGrade(ExamCandidateGradeRequest examCandidateGradeRequest){ + ExamCandidateGrade examCandidateGrade = new ExamCandidateGrade(); + examCandidateGrade.setExamID(examCandidateGradeRequest.getExamID()); + examCandidateGrade.setCandidateID(examCandidateGradeRequest.getCandidateID()); + examCandidateGrade.setStatus(examCandidateGradeRequest.getStatus()); + examCandidateGrade.setGrade(examCandidateGradeRequest.getGrade()); + examCandidateGrade.setScore(examCandidateGradeRequest.getScore()); + examCandidateGradeRepository.save(examCandidateGrade); + return "Grade set successfully"; + } + } From f007dcf103f1ceac969aaf3af2b7597cf848806d Mon Sep 17 00:00:00 2001 From: raviendalpatadu <102800797+raviendalpatadu@users.noreply.github.com> Date: Tue, 3 Dec 2024 21:00:18 +0530 Subject: [PATCH 6/7] get exam grade details done --- .../controller/GradingController.java | 8 +++++ .../testify/Testify_Backend/model/Exam.java | 1 + .../ExamCandidateGradeRepository.java | 7 +++++ .../ExamCandidateGradeResponse.java | 23 ++++++++++++++ .../service/GradingService.java | 4 +++ .../service/GradingServiceImpl.java | 30 +++++++++++++++++++ 6 files changed, 73 insertions(+) create mode 100644 src/main/java/com/testify/Testify_Backend/responses/exam_management/ExamCandidateGradeResponse.java diff --git a/src/main/java/com/testify/Testify_Backend/controller/GradingController.java b/src/main/java/com/testify/Testify_Backend/controller/GradingController.java index 9876606..3128c15 100644 --- a/src/main/java/com/testify/Testify_Backend/controller/GradingController.java +++ b/src/main/java/com/testify/Testify_Backend/controller/GradingController.java @@ -1,10 +1,12 @@ package com.testify.Testify_Backend.controller; import com.testify.Testify_Backend.model.CandidateExamSession; +import com.testify.Testify_Backend.model.ExamCandidateGrade; import com.testify.Testify_Backend.model.Grade; import com.testify.Testify_Backend.requests.exam_management.ExamCandidateGradeRequest; import com.testify.Testify_Backend.responses.EssayDetailsResponse; import com.testify.Testify_Backend.responses.McqDetailsResponse; +import com.testify.Testify_Backend.responses.exam_management.ExamCandidateGradeResponse; import com.testify.Testify_Backend.service.GradingService; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; @@ -50,4 +52,10 @@ public ResponseEntity setExamCandidateGrade(@RequestBody ExamCandidateGr return ResponseEntity.ok(response); } + @GetMapping("/getExamCandidateGrade") + public ResponseEntity> getExamCandidateGrade() { + List response = gradingService.getExamCandidateGrade(); + return ResponseEntity.ok(response); + } + } diff --git a/src/main/java/com/testify/Testify_Backend/model/Exam.java b/src/main/java/com/testify/Testify_Backend/model/Exam.java index 63472bd..0cf2e03 100644 --- a/src/main/java/com/testify/Testify_Backend/model/Exam.java +++ b/src/main/java/com/testify/Testify_Backend/model/Exam.java @@ -117,4 +117,5 @@ public class Exam { @Column(nullable = false) private boolean hosted = false; + } diff --git a/src/main/java/com/testify/Testify_Backend/repository/ExamCandidateGradeRepository.java b/src/main/java/com/testify/Testify_Backend/repository/ExamCandidateGradeRepository.java index d2e255e..7889aaa 100644 --- a/src/main/java/com/testify/Testify_Backend/repository/ExamCandidateGradeRepository.java +++ b/src/main/java/com/testify/Testify_Backend/repository/ExamCandidateGradeRepository.java @@ -2,8 +2,15 @@ import com.testify.Testify_Backend.model.ExamCandidateGrade; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface ExamCandidateGradeRepository extends JpaRepository { + +// write a query to get the exam candidate grade details along with exam name and candidate name + @Query("SELECT ecg FROM ExamCandidateGrade ecg") + List getExamCandidateGradeDetails(); } diff --git a/src/main/java/com/testify/Testify_Backend/responses/exam_management/ExamCandidateGradeResponse.java b/src/main/java/com/testify/Testify_Backend/responses/exam_management/ExamCandidateGradeResponse.java new file mode 100644 index 0000000..12a5319 --- /dev/null +++ b/src/main/java/com/testify/Testify_Backend/responses/exam_management/ExamCandidateGradeResponse.java @@ -0,0 +1,23 @@ +package com.testify.Testify_Backend.responses.exam_management; + + +import com.testify.Testify_Backend.model.Candidate; +import com.testify.Testify_Backend.model.Exam; +import lombok.*; + +@Data +@Setter +@Getter +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ExamCandidateGradeResponse { + + private String examID; + private String examTitle; + private String candidateName; + private String candidateID; + private String status; + private String grade; + private String score; +} diff --git a/src/main/java/com/testify/Testify_Backend/service/GradingService.java b/src/main/java/com/testify/Testify_Backend/service/GradingService.java index cd1c6cf..3200ad8 100644 --- a/src/main/java/com/testify/Testify_Backend/service/GradingService.java +++ b/src/main/java/com/testify/Testify_Backend/service/GradingService.java @@ -1,9 +1,11 @@ package com.testify.Testify_Backend.service; import com.testify.Testify_Backend.model.CandidateExamSession; +import com.testify.Testify_Backend.model.ExamCandidateGrade; import com.testify.Testify_Backend.model.Grade; import com.testify.Testify_Backend.requests.exam_management.ExamCandidateGradeRequest; import com.testify.Testify_Backend.responses.EssayDetailsResponse; +import com.testify.Testify_Backend.responses.exam_management.ExamCandidateGradeResponse; import java.util.List; import java.util.Map; @@ -14,4 +16,6 @@ public interface GradingService { List> getQuestionAndOptionBySessionId(Long sessionId); String setExamCandidateGrade(ExamCandidateGradeRequest examCandidateGradeRequest); + + List getExamCandidateGrade(); } diff --git a/src/main/java/com/testify/Testify_Backend/service/GradingServiceImpl.java b/src/main/java/com/testify/Testify_Backend/service/GradingServiceImpl.java index b9ea707..6ffec7c 100644 --- a/src/main/java/com/testify/Testify_Backend/service/GradingServiceImpl.java +++ b/src/main/java/com/testify/Testify_Backend/service/GradingServiceImpl.java @@ -4,11 +4,13 @@ import com.testify.Testify_Backend.repository.*; import com.testify.Testify_Backend.requests.exam_management.ExamCandidateGradeRequest; import com.testify.Testify_Backend.responses.EssayDetailsResponse; +import com.testify.Testify_Backend.responses.exam_management.ExamCandidateGradeResponse; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -24,6 +26,8 @@ public class GradingServiceImpl implements GradingService { private final GradeRepository gradeRepository; private final ExamSessionRepository examSessionRepository; private final ExamCandidateGradeRepository examCandidateGradeRepository; + private final ExamRepository examRepository; + private final CandidateRepository candidateRepository; @Override @Transactional @@ -120,5 +124,31 @@ public String setExamCandidateGrade(ExamCandidateGradeRequest examCandidateGrad return "Grade set successfully"; } + @Override + @Transactional + public List getExamCandidateGrade() { +// initialize the response list + List examCandidateGradeResponses = new ArrayList<>(); + List examCandidateGrades = examCandidateGradeRepository.findAll(); + if (examCandidateGrades == null || examCandidateGrades.isEmpty()) { + throw new IllegalArgumentException("No exam candidate grades found"); + } + examCandidateGrades.forEach(examCandidateGrade -> { + ExamCandidateGradeResponse response = new ExamCandidateGradeResponse(); + Exam exam = examRepository.findById(Long.parseLong(examCandidateGrade.getExamID().toString())).orElseThrow(() -> new IllegalArgumentException("Exam not found")); + Candidate candidate = candidateRepository.findById(Long.parseLong(examCandidateGrade.getCandidateID().toString())).orElseThrow(() -> new IllegalArgumentException("Candidate not found")); + response.setExamID(String.valueOf(exam.getId())); + response.setCandidateID(String.valueOf(candidate.getId())); + response.setExamTitle(exam.getTitle()); + response.setCandidateName(candidate.getFirstName() + " " + candidate.getLastName()); + response.setStatus(examCandidateGrade.getStatus()); + response.setGrade(examCandidateGrade.getGrade()); + response.setScore(examCandidateGrade.getScore()); + + examCandidateGradeResponses.add(response); + }); + + return examCandidateGradeResponses; + } } From aeaf964e5a454aa86b6e671fc7aad5b057221a5c Mon Sep 17 00:00:00 2001 From: raviendalpatadu <102800797+raviendalpatadu@users.noreply.github.com> Date: Tue, 3 Dec 2024 23:02:45 +0530 Subject: [PATCH 7/7] add transactional --- .../Testify_Backend/service/OrganizationServiceImpl.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/testify/Testify_Backend/service/OrganizationServiceImpl.java b/src/main/java/com/testify/Testify_Backend/service/OrganizationServiceImpl.java index 1063cf7..e97e41d 100644 --- a/src/main/java/com/testify/Testify_Backend/service/OrganizationServiceImpl.java +++ b/src/main/java/com/testify/Testify_Backend/service/OrganizationServiceImpl.java @@ -175,6 +175,7 @@ public Set getCourseModulesByOrganization(Long organizatio .collect(Collectors.toSet()); } @Override + @Transactional public GenericAddOrUpdateResponse createCandidateGroup(long organizationId, CandidateGroupRequest candidateGroupRequest){ GenericAddOrUpdateResponse response = new GenericAddOrUpdateResponse<>(); @@ -198,6 +199,7 @@ public GenericAddOrUpdateResponse createCandidateGroup(lo } + @Transactional public Set getCandidateGroupsByOrganization(Long organizationId) { Set candidateGroupsResponse = new HashSet<>(); Set candidateGroups = new HashSet<>(); @@ -209,6 +211,7 @@ public Set getCandidateGroupsByOrganization(Long organiz } @Override + @Transactional public GenericAddOrUpdateResponse addCandidateToGroup(long groupId, String name, String email) { GenericAddOrUpdateResponse response = new GenericAddOrUpdateResponse<>(); CandidateGroup candidateGroup = candidateGroupRepository.findById(groupId).orElseThrow(() -> new IllegalArgumentException("Group not found")); @@ -222,6 +225,7 @@ public GenericAddOrUpdateResponse addCandidateToGroup(long groupId, String name, } @Override + @Transactional public GenericDeleteResponse deleteGroup(long groupId) { CandidateGroup candidateGroup = candidateGroupRepository.findById(groupId).orElseThrow(() -> new IllegalArgumentException("Group not found")); candidateGroupRepository.delete(candidateGroup); @@ -232,6 +236,7 @@ public GenericDeleteResponse deleteGroup(long groupId) { } @Override + @Transactional public GenericDeleteResponse deleteCandidate(long groupId, long candidateId) { CandidateGroup candidateGroup = candidateGroupRepository.findById(groupId).orElseThrow(() -> new IllegalArgumentException("Group not found")); candidateGroup.getCandidates().removeIf(candidate -> candidate.getId() == candidateId); @@ -243,6 +248,7 @@ public GenericDeleteResponse deleteCandidate(long groupId, long candidateId) { } @Override + @Transactional public GenericAddOrUpdateResponse updateCandidateGroup(long groupId, String groupName) { CandidateGroup candidateGroup = candidateGroupRepository.findById(groupId).orElseThrow(() -> new IllegalArgumentException("Group not found")); candidateGroup.setName(groupName);