Skip to content
This repository has been archived by the owner on Apr 27, 2024. It is now read-only.

feat: add logic check session #230

Merged
merged 1 commit into from
Apr 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions src/main/java/com/example/codeE/controller/AuthController.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.example.codeE.request.user.UserAuthenRequest;
import com.example.codeE.request.user.forgetPasswordRequest;
import com.example.codeE.service.authentication.AuthenService;
import com.example.codeE.service.exercise.common.SessionExerciseService;
import com.example.codeE.service.user.UserService;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
Expand All @@ -29,6 +30,9 @@ public class AuthController {
private JWTUtils jwtHelper;
@Autowired
private UserService userService;
@Autowired
private SessionExerciseService SessionExerciseService;


@PostMapping
@RequestMapping(value = "/login/user", method = RequestMethod.POST)
Expand Down Expand Up @@ -198,6 +202,12 @@ private void clearAuthenticationTokens(HttpServletRequest request, HttpServletRe
cookie.setPath("/");
response.addCookie(cookie);
}
if ("LoginSessionId".equals(cookie.getName())) {
this.SessionExerciseService.removeSession(response, request, cookie.getValue());
cookie.setMaxAge(0);
cookie.setPath("/");
response.addCookie(cookie);
}
}
}
}
Expand Down
47 changes: 28 additions & 19 deletions src/main/java/com/example/codeE/controller/ExerciseController.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import com.example.codeE.request.exercise.quiz.*;
import com.example.codeE.service.course.CourseService;
import com.example.codeE.service.exercise.*;
import com.example.codeE.service.exercise.common.SessionExerciseService;
import com.example.codeE.service.exercise.common.SubmissionTestCaseService;
import com.example.codeE.service.exercise.problem.CodeExerciseTestcaseService;
import com.example.codeE.service.exercise.submission.CodeSubmissionService;
Expand All @@ -31,6 +32,7 @@
import com.example.codeE.service.judge.JudgeService;
import com.example.codeE.service.user.UserService;
import com.mongodb.client.MongoDatabase;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
Expand Down Expand Up @@ -87,6 +89,8 @@ public class ExerciseController {

@Autowired
private CourseService courseService;
@Autowired
private SessionExerciseService sessionExerciseService;

@PostMapping
@RequestMapping(value = "code",method = RequestMethod.POST)
Expand Down Expand Up @@ -193,46 +197,48 @@ public ResponseEntity<?> getExerciseById(@PathVariable String exerciseId){

@PostMapping
@RequestMapping(value = "detail", method = RequestMethod.POST)
public ResponseEntity<?> getExerciseDetail(@RequestBody GetDetailExerciseRequest request){
Exercise exercise = this.exerciseService.getDetailExercise(request.getExerciseId(), request.getKey(), request.getStudentId());
public ResponseEntity<?> getExerciseDetail(@RequestBody GetDetailExerciseRequest requestGetDetail, HttpServletRequest request, HttpServletResponse response) {
Exercise exercise = this.exerciseService.getDetailExercise(requestGetDetail.getExerciseId(), requestGetDetail.getKey(), requestGetDetail.getStudentId(), requestGetDetail.getUserUrgent(), request, response);
if (exercise == null) {
return ResponseEntity.status(HttpStatus.CONFLICT).body(Map.of("message", "Student can not enroll exercise now."));
}
switch (exercise.getType()){
case "code" :
CodeDetailResponse response = this.codeExerciseService.getCodeExerciseDetail(request.getExerciseId());
return ResponseEntity.status(HttpStatus.OK).body(response);
return ResponseEntity.status(HttpStatus.OK).body(this.codeExerciseService.getCodeExerciseDetail(requestGetDetail.getExerciseId(), request));
case "quiz":
return ResponseEntity.status(HttpStatus.OK).body(this.quizExerciseService.getQuizExerciseDetail(request.getExerciseId()));
return ResponseEntity.status(HttpStatus.OK).body(this.quizExerciseService.getQuizExerciseDetail(requestGetDetail.getExerciseId(), request));
case "essay":
return ResponseEntity.status(HttpStatus.OK).body(this.essayExerciseService.getEssayExerciseDetail(request.getExerciseId() ));
return ResponseEntity.status(HttpStatus.OK).body(this.essayExerciseService.getEssayExerciseDetail(requestGetDetail.getExerciseId(), request));
case "file":
return ResponseEntity.status(HttpStatus.OK).body(this.fileExerciseService.getFileExerciseDetail(request.getExerciseId()));
return ResponseEntity.status(HttpStatus.OK).body(this.fileExerciseService.getFileExerciseDetail(requestGetDetail.getExerciseId()));
default:
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(Map.of("message","Something went wrong, type must be quiz/essay/code"));
}
}

@PostMapping
@RequestMapping(value = "code/submit", method = RequestMethod.POST)
public ResponseEntity<?> submitCodeExercise(@Valid @RequestBody SubmitCodeExerciseRequest request){
public ResponseEntity<?> submitCodeExercise(@Valid @RequestBody SubmitCodeExerciseRequest requestSubmit, HttpServletRequest request, HttpServletResponse response) {
MongoDatabase database = mongoTemplate.getDb();
AutoIncrement autoIncrement = new AutoIncrement(database);

try{
CodeSubmission submission = new CodeSubmission(judgeService);
submission.setSubmissionId(String.valueOf(autoIncrement.getNextSequence("code_submission")));
submission.setExerciseId(request.getExerciseId());
submission.setLanguageId(request.getLanguageId());
submission.setSource(request.getSource());
submission.setStudentId(request.getStudentId());
submission.setExerciseId(requestSubmit.getExerciseId());
submission.setLanguageId(requestSubmit.getLanguageId());
submission.setSource(requestSubmit.getSource());
submission.setStudentId(requestSubmit.getStudentId());
submission.setPretested(false);

CodeExercise codeExercise = this.codeExerciseService.getCodeExerciseById(request.getExerciseId());
CodeExercise codeExercise = this.codeExerciseService.getCodeExerciseById(requestSubmit.getExerciseId());
submission.setTime(codeExercise.getTimeLimit());
submission.setMemory(codeExercise.getMemoryLimit());
submission.setLockedAfter(codeExercise.getEndTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());

CodeSubmission savedSubmission = codeSubmissionService.saveCodeSubmission(submission);
savedSubmission.judge(false, false);

sessionExerciseService.removeSession(response, request, requestSubmit.getExerciseId());
} catch (Exception e){
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(Map.of("message", e.getMessage()));
}
Expand Down Expand Up @@ -291,18 +297,21 @@ public ResponseEntity<?> runCodeExercise(@PathVariable String submissionId, @Req

@PostMapping
@RequestMapping(value = "quiz/submit", method = RequestMethod.POST)
public ResponseEntity<?> submitQuizExercise(@Valid @RequestBody CreateQuizSubmissionRequest quizSubmission){
public ResponseEntity<?> submitQuizExercise(@Valid @RequestBody CreateQuizSubmissionRequest quizSubmission, HttpServletRequest request, HttpServletResponse response) {
QuizExercise quizExercise = this.quizExerciseService.getQuizExerciseById(quizSubmission.getExerciseId());
float score = this.quizSubmissionService.gradeSubmission(quizSubmission.getSubmission(), quizExercise.getQuestions());
var submission = new QuizSubmission(quizSubmission, score);
QuizSubmission response = this.quizSubmissionService.createSubmission(submission);
return ResponseEntity.status(HttpStatus.OK).body(response);
QuizSubmission responseExercise = this.quizSubmissionService.createSubmission(submission);
sessionExerciseService.removeSession(response, request, quizExercise.getExerciseId());
return ResponseEntity.status(HttpStatus.OK).body(responseExercise);
}

@PostMapping
@RequestMapping(value = "essay/submit", method = RequestMethod.POST)
public ResponseEntity<?> submitEssayExercise(@Valid @RequestBody CreateEssaySubmissionRequest essaySubmission){
return ResponseEntity.status(HttpStatus.OK).body(this.essaySubmissionService.createSubmission(essaySubmission));
public ResponseEntity<?> submitEssayExercise(@Valid @RequestBody CreateEssaySubmissionRequest essaySubmission, HttpServletRequest request, HttpServletResponse response) {
var essayExercise = this.essaySubmissionService.createSubmission(essaySubmission);
sessionExerciseService.removeSession(response, request, essayExercise.getExerciseId());
return ResponseEntity.status(HttpStatus.OK).body(essayExercise);
}

@PostMapping
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.example.codeE.controller.exception;

import jakarta.validation.ConstraintViolationException;
import javassist.NotFoundException;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.example.codeE.helper;

import com.example.codeE.constant.Constant;
import com.example.codeE.model.exercise.Exercise;
import com.example.codeE.model.exercise.Submission;
import com.example.codeE.util.DateTimeUtil;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.example.codeE.model.exercise.common;

import jakarta.persistence.Id;
import jakarta.validation.constraints.NotBlank;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Document(collection = "session_exercise")
public class SessionExercise {
@Id
private String sessionId;
@NotBlank
@Field("login_id")
private String loginId;
@NotBlank
@Field("student_id")
private String studentId;
@NotBlank
@Field("exercise_id")
private String exerciseId;
@NotBlank
@Field("time_start")
private String timeStart;
@NotBlank
@Field("user_urgent")
private String userUrgent;
public SessionExercise(String loginId,String studentId, String exerciseId, String timeStart, String userUrgent){
this.loginId =loginId;
this.studentId = studentId;
this.exerciseId = exerciseId;
this.timeStart = timeStart;
this.userUrgent = userUrgent;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.example.codeE.repository;

import com.example.codeE.model.exercise.common.SessionExercise;
import org.springframework.data.mongodb.repository.MongoRepository;

import java.util.List;

public interface SessionExerciseRepository extends MongoRepository<SessionExercise, String> {
List<SessionExercise> findByStudentIdAndLoginId(String studentId, String loginId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,6 @@ public class GetDetailExerciseRequest {
private String studentId;
@NotNull(message = "Exercise key is required")
private String key;

@NotNull(message = "User urgent is request is required")
private String userUrgent;
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public class CodeDetailResponse {
private HashMap<String, String> languageTemplate;
private boolean isUsingAiGrading = false;

public CodeDetailResponse(CodeExercise codeExercise) {
public CodeDetailResponse(CodeExercise codeExercise, Date timeDoExercise) {
this.exerciseId = codeExercise.getExerciseId();
this.exerciseName = codeExercise.getExerciseName();
this.topicId = codeExercise.getTopicId();
Expand All @@ -44,18 +44,18 @@ public CodeDetailResponse(CodeExercise codeExercise) {
this.durationTime = codeExercise.getDurationTime();
this.reAttempt = codeExercise.getReAttempt();
this.type = codeExercise.getType();
this.timeLess = GetTimeLess(codeExercise.getStartTime(), codeExercise.getEndTime(), codeExercise.getDurationTime());
this.timeLess = GetTimeLess(codeExercise.getStartTime(), codeExercise.getEndTime(), codeExercise.getDurationTime(),timeDoExercise);
this.description = codeExercise.getDescription();
this.testCases = codeExercise.getTestCases();
this.languageTemplate = getTemplateMap(codeExercise.getAllowedLanguageIds());
this.isUsingAiGrading = codeExercise.isUsingAiGrading();
}

private Date GetTimeLess(Date startTime, Date endTime, int durationTime) {
private Date GetTimeLess(Date startTime, Date endTime, int durationTime, Date timeDoExercise) {
if(startTime == endTime){
return new Date(0);
}
var current = new Date().getTime();
var current = timeDoExercise.getTime();
if(current > endTime.getTime()){
return new Date(0);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public class EssayDetailResponse {
private String question;
private boolean isUsingAiGrading = false;

public EssayDetailResponse(EssayExercise essayExercise){
public EssayDetailResponse(EssayExercise essayExercise, Date timeDoExercise){
this.exerciseId = essayExercise.getExerciseId();
this.exerciseName = essayExercise.getExerciseName();
this.topicId = essayExercise.getTopicId();
Expand All @@ -41,22 +41,24 @@ public EssayDetailResponse(EssayExercise essayExercise){
this.reAttempt = essayExercise.getReAttempt();
this.type = essayExercise.getType();
this.exerciseDescription = essayExercise.getExerciseDescription();
this.timeLess = GetTimeLess(essayExercise.getStartTime(), essayExercise.getEndTime(), essayExercise.getDurationTime());
this.timeLess = GetTimeLess(essayExercise.getStartTime(), essayExercise.getEndTime(), essayExercise.getDurationTime(), timeDoExercise);
this.question = essayExercise.getQuestion();
this.isUsingAiGrading = essayExercise.isUsingAiGrading();
}
private Date GetTimeLess(Date startTime, Date endTime, int durationTime) {
private Date GetTimeLess(Date startTime, Date endTime, int durationTime,Date timeDoExercise) {
if(startTime == endTime){
return new Date(0);
}
var current = new Date().getTime();
if(current > endTime.getTime()){
var currentStart = timeDoExercise.getTime();
var timeNow = new Date().getTime();
if(timeNow > endTime.getTime()){
return new Date(0);
}
if (current + ((long) durationTime * 60 * 1000) < endTime.getTime()) {
return new Date((long) durationTime * 60 * 1000);
if (currentStart + ((long) durationTime * 60 * 1000) < endTime.getTime()) {
var a = currentStart + ((long) durationTime * 60 * 1000);
return new Date((long) a - timeNow);
} else {
return new Date((long) endTime.getTime() - current);
return new Date((long) endTime.getTime() - timeNow);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public class QuizDetailResponse {
private String exerciseDescription;
private List<QuizQuestionResponse> questions;

public QuizDetailResponse(QuizExercise quizExercise) {
public QuizDetailResponse(QuizExercise quizExercise, Date timeDoExercise) {
this.exerciseId = quizExercise.getExerciseId();
this.exerciseName = quizExercise.getExerciseName();
this.topicId = quizExercise.getTopicId();
Expand All @@ -42,16 +42,16 @@ public QuizDetailResponse(QuizExercise quizExercise) {
this.durationTime = quizExercise.getDurationTime();
this.reAttempt = quizExercise.getReAttempt();
this.type = quizExercise.getType();
this.timeLess = GetTimeLess(quizExercise.getStartTime(), quizExercise.getEndTime(), quizExercise.getDurationTime());
this.timeLess = GetTimeLess(quizExercise.getStartTime(), quizExercise.getEndTime(), quizExercise.getDurationTime(), timeDoExercise);
this.exerciseDescription = quizExercise.getExerciseDescription();
this.questions = convertQuestion(quizExercise.getQuestions());
}

private Date GetTimeLess(Date startTime, Date endTime, int durationTime) {
private Date GetTimeLess(Date startTime, Date endTime, int durationTime, Date timeDoExercise) {
if(startTime == endTime){
return new Date(0);
}
var current = new Date().getTime();
var current = timeDoExercise.getTime();
if(current > endTime.getTime()){
return new Date(0);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.example.codeE.request.user.UserAuthenRequest;
import com.example.codeE.security.BCryptPassword;
import com.example.codeE.service.course.CourseService;
import com.example.codeE.service.exercise.common.SessionExerciseService;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
Expand All @@ -23,6 +24,7 @@
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Random;
import java.util.UUID;

@Service
public class AuthenImpl implements AuthenService{
Expand Down Expand Up @@ -56,7 +58,14 @@ public UserAuthenRequest signIn(LoginRequest signInRequest, HttpServletResponse
.httpOnly(true)
.secure(false)
.path("/")
.maxAge(3600)
.maxAge(3600 * 4)
.build();
response.addHeader(HttpHeaders.SET_COOKIE, cookie.toString());
cookie = ResponseCookie.from("LoginSessionId", UUID.randomUUID().toString())
.httpOnly(true)
.secure(false)
.path("/")
.maxAge(3600 * 4)
.build();
response.addHeader(HttpHeaders.SET_COOKIE, cookie.toString());
}catch (Exception e){
Expand Down Expand Up @@ -131,7 +140,6 @@ public UserAuthenRequest createNewSessionUser(String token, HttpServletResponse

@Override
public void SendForgetPasswordOTP(String userName, HttpServletResponse response) throws NoSuchMethodException {
// System.out.println(AuthenImpl.class.getResourceAsStream("/credential_gmail_api.json"));
var user = this.userRepository.findUserByUserName(userName);
System.out.println(user.getEmail());
if (user == null) throw new NoSuchMethodException("No user found by: " + userName);
Expand Down
Loading
Loading