feat: Quiz 수정 추가

This commit is contained in:
kgc91747 2024-08-05 14:35:13 +09:00
parent 65a26f74d6
commit f29ca87ee7
9 changed files with 175 additions and 4 deletions

View File

@ -13,7 +13,9 @@ import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
@RestController @RestController
@RequestMapping("/quiz") @RequestMapping("/quiz")
@ -42,13 +44,57 @@ public class QuizController {
return new ResponseEntity<>(HttpStatus.CREATED); return new ResponseEntity<>(HttpStatus.CREATED);
} }
@GetMapping("/{quizsetId}") @GetMapping("/student/{quizsetId}")
public ResponseEntity<?> getQuizzes(@PathVariable Long quizsetId) { public ResponseEntity<?> getQuizzes(@PathVariable Long quizsetId) {
QuizSetResponse quizSet = quizSetService.findQuizSetResponse(quizsetId); QuizSetResponse quizSet = quizSetService.findQuizSetResponse(quizsetId);
return new ResponseEntity<>(quizSet, HttpStatus.OK); return new ResponseEntity<>(quizSet, HttpStatus.OK);
} }
@GetMapping("/teacher/{quizsetId}")
public ResponseEntity<?> getQuizzesIncludeAnswer(@RequestHeader("Authorization") String accessToken, @PathVariable Long quizsetId) {
long userId = Long.parseLong(jwtUtil.getUserId(accessToken));
QuizSet quizSet = quizSetService.findQuizSet(quizsetId);
if (quizSet.getUser().getId() != userId) {
return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
}
return new ResponseEntity<>(quizSet, HttpStatus.OK);
}
@PutMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<?> updateQuizSet(@RequestHeader("Authorization") String accessToken, @RequestPart QuizSetUpdateRequest quizSetUpdateRequest
, @RequestPart(value = "images", required = false) List<MultipartFile> images) throws IOException {
long userId = Long.parseLong(jwtUtil.getUserId(accessToken));
QuizSet quizset = quizSetService.findQuizSet(quizSetUpdateRequest.getId());
if (userId != quizset.getUser().getId()) {
return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
}
quizSetService.updateQuizSet(quizSetUpdateRequest.getId(), quizSetUpdateRequest.getTitle());
Map<Long, Boolean> quizUpdatedCheckMap = new HashMap<>();
for (Quiz quiz : quizset.getQuizzes()) {
quizUpdatedCheckMap.put(quiz.getId(), false);
}
int imageIdx = 0;
for (QuizUpdateRequest quizUpdateRequest : quizSetUpdateRequest.getQuizzes()) {
quizService.updateQuiz(quizUpdateRequest, images.get(imageIdx++));
quizUpdatedCheckMap.put(quizUpdateRequest.getId(), true);
}
for (Long quizId : quizUpdatedCheckMap.keySet()) {
if (!quizUpdatedCheckMap.get(quizId)) {
quizService.removeQuiz(quizId);
}
}
return new ResponseEntity<>(HttpStatus.OK);
}
@DeleteMapping("/{quizsetId}") @DeleteMapping("/{quizsetId}")
public ResponseEntity<?> deleteQuizSet(@RequestHeader("Authorization") String accessToken, @PathVariable long quizsetId) { public ResponseEntity<?> deleteQuizSet(@RequestHeader("Authorization") String accessToken, @PathVariable long quizsetId) {
long userId = Long.parseLong(jwtUtil.getUserId(accessToken)); long userId = Long.parseLong(jwtUtil.getUserId(accessToken));

View File

@ -0,0 +1,20 @@
package com.edufocus.edufocus.quiz.entity;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import java.util.List;
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class QuizSetUpdateRequest {
private long id;
private String title;
private List<QuizUpdateRequest> quizzes;
}

View File

@ -0,0 +1,21 @@
package com.edufocus.edufocus.quiz.entity;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import java.util.List;
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class QuizUpdateRequest {
private long id;
private String question;
private String answer;
private List<ChoiceCreateRequest> choices;
}

View File

@ -0,0 +1,7 @@
package com.edufocus.edufocus.quiz.repository;
import com.edufocus.edufocus.quiz.entity.Choice;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ChoiceRepository extends JpaRepository<Choice, Long> {
}

View File

@ -1,7 +1,9 @@
package com.edufocus.edufocus.quiz.service; package com.edufocus.edufocus.quiz.service;
import com.edufocus.edufocus.quiz.entity.Quiz;
import com.edufocus.edufocus.quiz.entity.QuizCreateRequest; import com.edufocus.edufocus.quiz.entity.QuizCreateRequest;
import com.edufocus.edufocus.quiz.entity.QuizSet; import com.edufocus.edufocus.quiz.entity.QuizSet;
import com.edufocus.edufocus.quiz.entity.QuizUpdateRequest;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -13,4 +15,9 @@ public interface QuizService {
void createQuiz(QuizSet quizSet, QuizCreateRequest quizCreateRequest, MultipartFile quizImage) throws IOException; void createQuiz(QuizSet quizSet, QuizCreateRequest quizCreateRequest, MultipartFile quizImage) throws IOException;
void updateQuiz(QuizUpdateRequest quizUpdateRequest, MultipartFile quizImage) throws IOException;
Quiz findQuiz(long quizId);
void removeQuiz(long quizId);
} }

View File

@ -2,6 +2,7 @@ package com.edufocus.edufocus.quiz.service;
import com.edufocus.edufocus.global.properties.ImagePathProperties; import com.edufocus.edufocus.global.properties.ImagePathProperties;
import com.edufocus.edufocus.quiz.entity.*; import com.edufocus.edufocus.quiz.entity.*;
import com.edufocus.edufocus.quiz.repository.ChoiceRepository;
import com.edufocus.edufocus.quiz.repository.QuizRepository; import com.edufocus.edufocus.quiz.repository.QuizRepository;
import jakarta.transaction.Transactional; import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -12,6 +13,7 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.NoSuchElementException;
import java.util.UUID; import java.util.UUID;
@ -24,6 +26,8 @@ public class QuizServiceImpl implements QuizService {
private final QuizRepository quizRepository; private final QuizRepository quizRepository;
private final ChoiceRepository choiceRepository;
@Override @Override
public void createQuiz(QuizSet quizSet, QuizCreateRequest quizCreateRequest, MultipartFile quizImage) throws IOException { public void createQuiz(QuizSet quizSet, QuizCreateRequest quizCreateRequest, MultipartFile quizImage) throws IOException {
Quiz quiz = Quiz.builder() Quiz quiz = Quiz.builder()
@ -66,4 +70,67 @@ public class QuizServiceImpl implements QuizService {
} }
@Override
public void updateQuiz(QuizUpdateRequest quizUpdateRequest, MultipartFile quizImage) throws IOException {
Quiz quiz = quizRepository.findById(quizUpdateRequest.getId()).orElseThrow(NoSuchElementException::new);
quiz.setQuestion(quizUpdateRequest.getQuestion());
quiz.setAnswer(quizUpdateRequest.getAnswer());
quiz.getChoices().clear();
quizRepository.save(quiz);
for (ChoiceCreateRequest choiceCreateRequest : quizUpdateRequest.getChoices()) {
Choice choice = Choice.builder()
.quiz(quiz)
.num(choiceCreateRequest.getNum())
.content(choiceCreateRequest.getContent())
.build();
quiz.addChoice(choice);
}
if (quizImage != null && !quizImage.isEmpty()) {
if (quiz.getImage() != null) {
File file = new File(quiz.getImage());
file.delete();
}
String uid = UUID.randomUUID().toString();
String imagePath = imagePathProperties.getPath();
File checkPathFile = new File(imagePath);
if (!checkPathFile.exists()) {
checkPathFile.mkdirs();
}
File savingImage = new File(imagePath + "/" + uid + "_" + quizImage.getOriginalFilename());
quizImage.transferTo(savingImage.toPath());
String savePath = savingImage.toPath().toString();
quiz.setImage(savePath);
}
quizRepository.save(quiz);
}
@Override
public Quiz findQuiz(long quizId) {
return quizRepository.findById(quizId).orElseThrow(NoSuchElementException::new);
}
@Override
public void removeQuiz(long quizId) {
Quiz quiz = quizRepository.findById(quizId).orElseThrow(NoSuchElementException::new);
String image = quiz.getImage();
if (image != null) {
File file = new File(quiz.getImage());
file.delete();
quiz.setImage(null);
}
quizRepository.delete(quiz);
}
} }

View File

@ -12,7 +12,7 @@ public interface QuizSetService {
QuizSet createQuizSet(long userId, String title); QuizSet createQuizSet(long userId, String title);
void updateQuizSet(QuizSet quizSet); void updateQuizSet(long quizSetId, String title);
boolean deleteQuizSet(long userId, long quizSetId); boolean deleteQuizSet(long userId, long quizSetId);

View File

@ -34,8 +34,11 @@ public class QuizSetServiceImpl implements QuizSetService {
} }
@Override @Override
public void updateQuizSet(QuizSet quizSet) { public void updateQuizSet(long quizSetId, String title) {
QuizSet quizSet = quizSetRepository.findById(quizSetId).orElseThrow(NoSuchElementException::new);
quizSet.setTitle(title);
quizSetRepository.save(quizSet);
} }
@Override @Override

View File

@ -17,7 +17,7 @@ jwt.salt=${SALT}
# Access Token ?? ?? (??? ??) # Access Token ?? ?? (??? ??)
#jwt.access-token.expiretime=3600000 #jwt.access-token.expiretime=3600000
jwt.access-token.expiretime=300 jwt.access-token.expiretime=360000
# Refresh Token ?? ?? (??? ??) # Refresh Token ?? ?? (??? ??)
jwt.refresh-token.expiretime=50400000 jwt.refresh-token.expiretime=50400000