From fbc74cac5715a1f5420062d08f7a654d8e68d81f Mon Sep 17 00:00:00 2001 From: Kimsangwon Date: Thu, 23 May 2024 19:32:36 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat=20:=20=ED=80=B4=EC=A6=88=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20api=20=EB=B0=8F=20node.js=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 예외 : 퀴즈 생성 시 organization의 멤버가 아니면 퀴즈 생성 못 하게 막음 --- .../DTOs/quizdto/QuizCreateDTO.java | 16 +++++ .../controller/QuizController.java | 21 +++++++ .../Oraganization/entity/Organization.java | 29 +++++++++ .../repository/QuizRepository.java | 9 +++ .../Oraganization/service/NoteService.java | 1 + .../Oraganization/service/QuizService.java | 62 +++++++++++++++++++ nodejs/server.js | 16 ++--- 7 files changed, 142 insertions(+), 12 deletions(-) create mode 100644 backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizCreateDTO.java create mode 100644 backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/controller/QuizController.java create mode 100644 backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/repository/QuizRepository.java create mode 100644 backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/service/QuizService.java diff --git a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizCreateDTO.java b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizCreateDTO.java new file mode 100644 index 00000000..9674fa25 --- /dev/null +++ b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizCreateDTO.java @@ -0,0 +1,16 @@ +package com.Backend.shareNote.domain.Oraganization.DTOs.quizdto; + +import lombok.Data; + +import java.util.List; + +@Data +public class QuizCreateDTO { + private String organizationId; + private String noteId; + private String userId; + private String quizType; + private String problem; + private Integer answer; + private List solutions; +} diff --git a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/controller/QuizController.java b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/controller/QuizController.java new file mode 100644 index 00000000..607ff5f9 --- /dev/null +++ b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/controller/QuizController.java @@ -0,0 +1,21 @@ +package com.Backend.shareNote.domain.Oraganization.controller; + +import com.Backend.shareNote.domain.Oraganization.DTOs.quizdto.QuizCreateDTO; +import com.Backend.shareNote.domain.Oraganization.service.QuizService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api") +public class QuizController { + private final QuizService quizService; + @PostMapping("/quiz") + public ResponseEntity createQuiz(@RequestBody QuizCreateDTO quizCreateDTO){ + return quizService.createQuiz(quizCreateDTO); + } +} diff --git a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/entity/Organization.java b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/entity/Organization.java index 77d25493..5b75b01c 100644 --- a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/entity/Organization.java +++ b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/entity/Organization.java @@ -62,6 +62,7 @@ public static class Note { private LocalDateTime createdAt; + private List quiz; // 생성자, 게터, 세터 등 필요한 메서드들 추가 } @@ -79,6 +80,34 @@ public static class Page { private LocalDateTime createdAt; } + + @Getter + @Builder + @Document(collection = "quizs") + public static class Quiz { + @Id + private String id; + // 생성자 + private String userId; + // 객관식 or 주관식 + private String quizType; + // 문제 설명 + private String problem; + // 답안 + private int answer; + // 객관식 보기 + private List solutions; + @CreatedDate + private LocalDateTime createdAt; + + // 정답 맞춘 유저 + private List correctUser; + // 정답 틀린 유저 + private List wrongUser; + + } + + @Getter @Slf4j public static class LikesInfo { diff --git a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/repository/QuizRepository.java b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/repository/QuizRepository.java new file mode 100644 index 00000000..48f00f94 --- /dev/null +++ b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/repository/QuizRepository.java @@ -0,0 +1,9 @@ +package com.Backend.shareNote.domain.Oraganization.repository; + +import com.Backend.shareNote.domain.Oraganization.entity.Organization; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.stereotype.Repository; +@Repository +public interface QuizRepository extends MongoRepository{ +} + diff --git a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/service/NoteService.java b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/service/NoteService.java index efb655d6..ba5cd173 100644 --- a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/service/NoteService.java +++ b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/service/NoteService.java @@ -37,6 +37,7 @@ public ResponseEntity createNote(NoteCreateDTO noteCreateDTO) { .pages(new ArrayList()) .noteImageUrl(noteCreateDTO.getNoteImageUrl()) .likesInfo(new Organization.LikesInfo()) + .quiz(new ArrayList()) .build(); noteRepository.save(note); // organization에 note 추가 diff --git a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/service/QuizService.java b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/service/QuizService.java new file mode 100644 index 00000000..b3dcfe81 --- /dev/null +++ b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/service/QuizService.java @@ -0,0 +1,62 @@ +package com.Backend.shareNote.domain.Oraganization.service; + +import com.Backend.shareNote.domain.Oraganization.DTOs.quizdto.QuizCreateDTO; +import com.Backend.shareNote.domain.Oraganization.entity.Organization; +import com.Backend.shareNote.domain.Oraganization.repository.NoteRepository; +import com.Backend.shareNote.domain.Oraganization.repository.OrganizationRepository; +import com.Backend.shareNote.domain.Oraganization.repository.QuizRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; + +@Service +@RequiredArgsConstructor +public class QuizService { + private final OrganizationRepository organizationRepository; + private final NoteRepository noteRepository; + private final QuizRepository quizRepository; + + public ResponseEntity createQuiz(QuizCreateDTO quizCreateDTO) { + try { + // organization 찾기 + Organization organization = organizationRepository.findById(quizCreateDTO.getOrganizationId()) + .orElseThrow(() -> new IllegalArgumentException("해당하는 organization이 없습니다.")); + + // note 찾기 + Organization.Note note = organization.getNotes().stream() + .filter(n -> n.getId().equals(quizCreateDTO.getNoteId())) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("해당하는 note가 없습니다.")); + + // quiz 생성 + Organization.Quiz quiz = Organization.Quiz.builder() + .quizType(quizCreateDTO.getQuizType()) + .problem(quizCreateDTO.getProblem()) + .answer(quizCreateDTO.getAnswer()) + .solutions(quizCreateDTO.getSolutions()) + .correctUser(new ArrayList()) + .wrongUser(new ArrayList()) + .userId(quizCreateDTO.getUserId()) + .build(); + + // organization 멤버인지 확인하는 코드 + if (!organization.getMembers().contains(quizCreateDTO.getUserId())) { + throw new IllegalArgumentException("해당하는 organization의 멤버가 아닙니다."); + } + + quizRepository.save(quiz); + + // note에 quiz 추가 + note.getQuiz().add(quiz); + + return ResponseEntity.ok().build(); + }catch (IllegalArgumentException e) { + return ResponseEntity.badRequest().body("Invalid input: " + e.getMessage()); + } + catch (Exception e) { + return ResponseEntity.badRequest().body("Unexpected error: " + e.getMessage()); + } + } +} diff --git a/nodejs/server.js b/nodejs/server.js index b925f55f..f83b0766 100644 --- a/nodejs/server.js +++ b/nodejs/server.js @@ -24,8 +24,8 @@ const databaseName = 'shareDB'; function createConnectionString(databaseName) { logger.info(`@@@@@@@@@@@mongodb://root:1234@localhost:27017/${databaseName}?authSource=admin`); - //return `mongodb://root:1234@localhost:27017/${databaseName}?authSource=admin`; - return `mongodb://root:1234@mongodbService:27017/${databaseName}?authSource=admin`; + return `mongodb://root:1234@localhost:27017/${databaseName}?authSource=admin`; + //return `mongodb://root:1234@mongodbService:27017/${databaseName}?authSource=admin`; } const server = http.createServer((req, res) => { @@ -58,7 +58,7 @@ wss.on('connection', (ws, req) => { }); const mdb = new MongodbPersistence(createConnectionString(databaseName), { - collectionName: 'Pages', + collectionName: 'transactions', flushSize: 100, multipleCollections: true, }); @@ -69,15 +69,7 @@ yUtils.setPersistence({ const persistedYdoc = await mdb.getYDoc(docName); const newUpdates = Y.encodeStateAsUpdate(ydoc); - //작성자의 nickname 추가 - const authorNickname = 'nickname'; - //추가 부분 - const updateWithAuthor = Y.encodeStateAsUpdate({ - ...Y.applyUpdate(Y.emptyUpdate, newUpdates), - author: authorNickname, - }); - - await mdb.storeUpdate(docName, updateWithAuthor); + await mdb.storeUpdate(docName, newUpdates); Y.applyUpdate(ydoc, Y.encodeStateAsUpdate(persistedYdoc)); ydoc.on('update', async (update) => { await mdb.storeUpdate(docName, update); From 77e9d357ebf454d991630a28249a67ba2b7f7a2f Mon Sep 17 00:00:00 2001 From: Kimsangwon Date: Fri, 24 May 2024 21:08:54 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feat=20:=20=ED=80=B4=EC=A6=88=20=ED=92=80?= =?UTF-8?q?=EA=B8=B0=20api,=20=ED=80=B4=EC=A6=88=20=EC=A1=B0=ED=9A=8C=20ap?= =?UTF-8?q?i?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DTOs/quizdto/QuizSearchDTO.java | 11 ++ .../DTOs/quizdto/QuizSolveDTO.java | 13 ++ .../controller/QuizController.java | 19 ++- .../Oraganization/entity/Organization.java | 3 + .../service/OrganizationService.java | 1 - .../Oraganization/service/QuizService.java | 123 +++++++++++++++++- .../shareNote/domain/Quiz/entity/Quiz.java | 38 ------ 7 files changed, 160 insertions(+), 48 deletions(-) create mode 100644 backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizSearchDTO.java create mode 100644 backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizSolveDTO.java delete mode 100644 backend/shareNote/src/main/java/com/Backend/shareNote/domain/Quiz/entity/Quiz.java diff --git a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizSearchDTO.java b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizSearchDTO.java new file mode 100644 index 00000000..bc05a4f9 --- /dev/null +++ b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizSearchDTO.java @@ -0,0 +1,11 @@ +package com.Backend.shareNote.domain.Oraganization.DTOs.quizdto; + +import lombok.Data; + +@Data +public class QuizSearchDTO { + private String quizId; + private String quizTitle; + private Integer correct; + private String nickname; +} diff --git a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizSolveDTO.java b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizSolveDTO.java new file mode 100644 index 00000000..5b858bcc --- /dev/null +++ b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizSolveDTO.java @@ -0,0 +1,13 @@ +package com.Backend.shareNote.domain.Oraganization.DTOs.quizdto; + +import lombok.Data; + +@Data +public class QuizSolveDTO { + private String organizationId; + private String noteId; + private String userId; + private String quizId; + private Integer answer; + private String nickname; +} diff --git a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/controller/QuizController.java b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/controller/QuizController.java index 607ff5f9..0614cd23 100644 --- a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/controller/QuizController.java +++ b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/controller/QuizController.java @@ -1,13 +1,14 @@ package com.Backend.shareNote.domain.Oraganization.controller; import com.Backend.shareNote.domain.Oraganization.DTOs.quizdto.QuizCreateDTO; +import com.Backend.shareNote.domain.Oraganization.DTOs.quizdto.QuizSearchDTO; +import com.Backend.shareNote.domain.Oraganization.DTOs.quizdto.QuizSolveDTO; import com.Backend.shareNote.domain.Oraganization.service.QuizService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @RestController @RequiredArgsConstructor @@ -18,4 +19,14 @@ public class QuizController { public ResponseEntity createQuiz(@RequestBody QuizCreateDTO quizCreateDTO){ return quizService.createQuiz(quizCreateDTO); } + + @PostMapping("/quiz-solutions") + public ResponseEntity createQuizSolutions(@RequestBody QuizSolveDTO quizCreateDTO){ + return quizService.createQuizSolutions(quizCreateDTO); + } + + @GetMapping("/quiz/{organizationId}/{noteId}/{userId}") + public ResponseEntity getQuiz(@PathVariable String organizationId, @PathVariable String noteId, @PathVariable String userId){ + return quizService.getQuiz(organizationId, noteId, userId); + } } diff --git a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/entity/Organization.java b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/entity/Organization.java index 5b75b01c..6eaf8413 100644 --- a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/entity/Organization.java +++ b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/entity/Organization.java @@ -105,6 +105,9 @@ public static class Quiz { // 정답 틀린 유저 private List wrongUser; + // 닉네임 + private String nickname; + } diff --git a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/service/OrganizationService.java b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/service/OrganizationService.java index d00aa591..16d136e7 100644 --- a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/service/OrganizationService.java +++ b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/service/OrganizationService.java @@ -37,7 +37,6 @@ public ResponseEntity createOrganization(OrganizationCrea .owner(organizationCreateDTO.getOwner()) .emoji(organizationCreateDTO.getEmoji()) // 이모지 추가 .notes(new ArrayList()) - .quiz(new ArrayList()) .members(members) .description("") .build(); diff --git a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/service/QuizService.java b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/service/QuizService.java index b3dcfe81..12488074 100644 --- a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/service/QuizService.java +++ b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/service/QuizService.java @@ -1,23 +1,31 @@ package com.Backend.shareNote.domain.Oraganization.service; import com.Backend.shareNote.domain.Oraganization.DTOs.quizdto.QuizCreateDTO; +import com.Backend.shareNote.domain.Oraganization.DTOs.quizdto.QuizSearchDTO; +import com.Backend.shareNote.domain.Oraganization.DTOs.quizdto.QuizSolveDTO; import com.Backend.shareNote.domain.Oraganization.entity.Organization; import com.Backend.shareNote.domain.Oraganization.repository.NoteRepository; import com.Backend.shareNote.domain.Oraganization.repository.OrganizationRepository; import com.Backend.shareNote.domain.Oraganization.repository.QuizRepository; +import com.Backend.shareNote.domain.User.entity.Users; +import com.Backend.shareNote.domain.User.repository.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; +import java.util.List; +import java.util.Optional; @Service @RequiredArgsConstructor public class QuizService { private final OrganizationRepository organizationRepository; - private final NoteRepository noteRepository; - private final QuizRepository quizRepository; + private final QuizRepository quizRepository; + private final UserRepository userRepository; + @Transactional public ResponseEntity createQuiz(QuizCreateDTO quizCreateDTO) { try { // organization 찾기 @@ -30,6 +38,7 @@ public ResponseEntity createQuiz(QuizCreateDTO quizCreateDTO) { .findFirst() .orElseThrow(() -> new IllegalArgumentException("해당하는 note가 없습니다.")); + Users user = userRepository.findById(quizCreateDTO.getUserId()).get(); // quiz 생성 Organization.Quiz quiz = Organization.Quiz.builder() .quizType(quizCreateDTO.getQuizType()) @@ -39,8 +48,14 @@ public ResponseEntity createQuiz(QuizCreateDTO quizCreateDTO) { .correctUser(new ArrayList()) .wrongUser(new ArrayList()) .userId(quizCreateDTO.getUserId()) + .nickname(user.getNickname()) .build(); + + + // 퀴즈를 note에 추가 + note.getQuiz().add(quiz); + // organization 멤버인지 확인하는 코드 if (!organization.getMembers().contains(quizCreateDTO.getUserId())) { throw new IllegalArgumentException("해당하는 organization의 멤버가 아닙니다."); @@ -48,10 +63,11 @@ public ResponseEntity createQuiz(QuizCreateDTO quizCreateDTO) { quizRepository.save(quiz); - // note에 quiz 추가 - note.getQuiz().add(quiz); - return ResponseEntity.ok().build(); + + organizationRepository.save(organization); + + return ResponseEntity.ok().body("퀴즈 생성 성공"); }catch (IllegalArgumentException e) { return ResponseEntity.badRequest().body("Invalid input: " + e.getMessage()); } @@ -59,4 +75,101 @@ public ResponseEntity createQuiz(QuizCreateDTO quizCreateDTO) { return ResponseEntity.badRequest().body("Unexpected error: " + e.getMessage()); } } + @Transactional + public ResponseEntity createQuizSolutions(QuizSolveDTO quizCreateDTO) { + try { + // organization 찾기 + Organization organization = organizationRepository.findById(quizCreateDTO.getOrganizationId()) + .orElseThrow(() -> new IllegalArgumentException("해당하는 organization이 없습니다.")); + + // note 찾기 + Organization.Note note = organization.getNotes().stream() + .filter(n -> n.getId().equals(quizCreateDTO.getNoteId())) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("해당하는 note가 없습니다.")); + + // quiz 찾기 + Organization.Quiz quiz = note.getQuiz().stream() + .filter(q -> q.getId().equals(quizCreateDTO.getQuizId())) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("해당하는 quiz가 없습니다.")); + + // organization 멤버인지 확인하는 코드 + if (!organization.getMembers().contains(quizCreateDTO.getUserId())) { + throw new IllegalArgumentException("해당하는 organization의 멤버가 아닙니다."); + } + + // 자기가 낸 문제 푸는 경우 + if (quiz.getUserId().equals(quizCreateDTO.getUserId())) { + throw new IllegalArgumentException("자신이 낸 문제는 풀 수 없습니다."); + } + + // CorrectUser, WrongUser에 userId가 있으면 이미 풀었다는 뜻 + // 이미 푼 문제에 대해서 제출을 시도할 때 + if (quiz.getCorrectUser().contains(quizCreateDTO.getUserId()) || + quiz.getWrongUser().contains(quizCreateDTO.getUserId())) { + throw new IllegalArgumentException("이미 풀었습니다."); + } + + // 정답 확인 + if (quiz.getAnswer() == quizCreateDTO.getAnswer()) { + quiz.getCorrectUser().add(quizCreateDTO.getUserId()); + organizationRepository.save(organization); + return ResponseEntity.ok().body("퀴즈 정답!!"); + } else { + quiz.getWrongUser().add(quizCreateDTO.getUserId()); + organizationRepository.save(organization); + return ResponseEntity.ok().body("퀴즈 실패!! 정답은 " + quiz.getAnswer() + "입니다"); + } + + }catch (IllegalArgumentException e) { + return ResponseEntity.badRequest().body("Invalid input: " + e.getMessage()); + } + catch (Exception e) { + return ResponseEntity.badRequest().body("Unexpected error: " + e.getMessage()); + } + } + + + public ResponseEntity getQuiz(String organizationId, String noteId, String userId) { + try { + // organization 찾기 + Organization organization = organizationRepository.findById(organizationId) + .orElseThrow(() -> new IllegalArgumentException("해당하는 organization이 없습니다.")); + + // note 찾기 + Organization.Note note = organization.getNotes().stream() + .filter(n -> n.getId().equals(noteId)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("해당하는 note가 없습니다.")); + List quizList = new ArrayList<>(); + + + note.getQuiz().stream().filter(quiz -> !quiz.getUserId().equals(userId)).forEach(quiz -> { + QuizSearchDTO quizSearchDTO = new QuizSearchDTO(); + quizSearchDTO.setQuizId(quiz.getId()); + quizSearchDTO.setQuizTitle(quiz.getProblem()); + quizSearchDTO.setNickname(quiz.getNickname()); + if(quiz.getCorrectUser().contains(userId)){ + quizSearchDTO.setCorrect(1); + } + else if(quiz.getWrongUser().contains(userId)){ + quizSearchDTO.setCorrect(0); + } + else{ + quizSearchDTO.setCorrect(-1); + } + quizList.add(quizSearchDTO); + }); + + // quiz 찾기 + return ResponseEntity.ok().body(quizList); + }catch (IllegalArgumentException e) { + return ResponseEntity.badRequest().body("Invalid input: " + e.getMessage()); + } + catch (Exception e) { + return ResponseEntity.badRequest().body("Unexpected error: " + e.getMessage()); + } + + } } diff --git a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Quiz/entity/Quiz.java b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Quiz/entity/Quiz.java deleted file mode 100644 index 24e7f4c7..00000000 --- a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Quiz/entity/Quiz.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.Backend.shareNote.domain.Quiz.entity; - -import org.springframework.data.annotation.Id; -import org.springframework.data.mongodb.core.mapping.Document; -import org.springframework.data.mongodb.core.mapping.Field; - -import java.util.Date; -import java.util.List; - -@Document(collection = "quizzes") -public class Quiz { - - @Id - private String id; - - @Field("noteId") - private String noteId; - - @Field("ownerId") - private String ownerId; - - @Field("created_at") - private Date createdAt; - - @Field("question_type") - private String questionType; - - private String question; - - private List choices; // 객관식 옵션 - - private String answer; - - @Field("solverUser") - private List solverUsers; - - // 생성자, 게터, 세터 등 필요한 메서드들 추가 -} \ No newline at end of file From fc36595f7ed64f13a0fe1d2a95eb6585dd471d30 Mon Sep 17 00:00:00 2001 From: Kimsangwon Date: Sat, 25 May 2024 12:42:56 +0900 Subject: [PATCH 3/3] =?UTF-8?q?feat=20:=20=ED=80=B4=EC=A6=88=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=EC=A1=B0=ED=9A=8C=20+=20=ED=80=B4=EC=A6=88=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DTOs/quizdto/QuizCreateDTO.java | 3 +- .../DTOs/quizdto/QuizDeleteDTO.java | 11 +++ .../DTOs/quizdto/QuizDetailReqDTO.java | 11 +++ .../DTOs/quizdto/QuizDetailResDTO.java | 16 ++++ .../controller/QuizController.java | 14 ++- .../Oraganization/entity/Organization.java | 3 +- .../Oraganization/service/QuizService.java | 96 +++++++++++++++++-- 7 files changed, 143 insertions(+), 11 deletions(-) create mode 100644 backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizDeleteDTO.java create mode 100644 backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizDetailReqDTO.java create mode 100644 backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizDetailResDTO.java diff --git a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizCreateDTO.java b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizCreateDTO.java index 9674fa25..fad15c90 100644 --- a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizCreateDTO.java +++ b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizCreateDTO.java @@ -12,5 +12,6 @@ public class QuizCreateDTO { private String quizType; private String problem; private Integer answer; - private List solutions; + private List problems; + private String quizTitle; } diff --git a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizDeleteDTO.java b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizDeleteDTO.java new file mode 100644 index 00000000..285ae2d7 --- /dev/null +++ b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizDeleteDTO.java @@ -0,0 +1,11 @@ +package com.Backend.shareNote.domain.Oraganization.DTOs.quizdto; + +import lombok.Data; + +@Data +public class QuizDeleteDTO { + private String organizationId; + private String noteId; + private String userId; + private String quizId; +} diff --git a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizDetailReqDTO.java b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizDetailReqDTO.java new file mode 100644 index 00000000..5bb2588c --- /dev/null +++ b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizDetailReqDTO.java @@ -0,0 +1,11 @@ +package com.Backend.shareNote.domain.Oraganization.DTOs.quizdto; + +import lombok.Data; + +@Data +public class QuizDetailReqDTO { + private String organizationId; + private String noteId; + private String userId; + private String quizId; +} diff --git a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizDetailResDTO.java b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizDetailResDTO.java new file mode 100644 index 00000000..13bd1234 --- /dev/null +++ b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/DTOs/quizdto/QuizDetailResDTO.java @@ -0,0 +1,16 @@ +package com.Backend.shareNote.domain.Oraganization.DTOs.quizdto; + +import lombok.Builder; +import lombok.Data; + +import java.util.List; + +@Data +@Builder +public class QuizDetailResDTO { + private String quizTitle; + private String quizType; + private String noteName; // 노트 이름 + private List problems; + private Integer correct; +} diff --git a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/controller/QuizController.java b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/controller/QuizController.java index 0614cd23..77a25676 100644 --- a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/controller/QuizController.java +++ b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/controller/QuizController.java @@ -1,8 +1,6 @@ package com.Backend.shareNote.domain.Oraganization.controller; -import com.Backend.shareNote.domain.Oraganization.DTOs.quizdto.QuizCreateDTO; -import com.Backend.shareNote.domain.Oraganization.DTOs.quizdto.QuizSearchDTO; -import com.Backend.shareNote.domain.Oraganization.DTOs.quizdto.QuizSolveDTO; +import com.Backend.shareNote.domain.Oraganization.DTOs.quizdto.*; import com.Backend.shareNote.domain.Oraganization.service.QuizService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -29,4 +27,14 @@ public ResponseEntity createQuizSolutions(@RequestBody QuizSolveDTO quiz public ResponseEntity getQuiz(@PathVariable String organizationId, @PathVariable String noteId, @PathVariable String userId){ return quizService.getQuiz(organizationId, noteId, userId); } + + @PostMapping("/quiz/detail") + public ResponseEntity getQuizDetail(@RequestBody QuizDetailReqDTO quizDetailReqDTO){ + return quizService.getQuizDetail(quizDetailReqDTO); + } + + @DeleteMapping("/quiz") + public ResponseEntity deleteQuiz(@RequestBody QuizDeleteDTO quizDeleteDTO){ + return quizService.deleteQuiz(quizDeleteDTO); + } } diff --git a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/entity/Organization.java b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/entity/Organization.java index 6eaf8413..1ba9d2f6 100644 --- a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/entity/Organization.java +++ b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/entity/Organization.java @@ -96,7 +96,7 @@ public static class Quiz { // 답안 private int answer; // 객관식 보기 - private List solutions; + private List problems; @CreatedDate private LocalDateTime createdAt; @@ -107,6 +107,7 @@ public static class Quiz { // 닉네임 private String nickname; + private String quizTitle; } diff --git a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/service/QuizService.java b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/service/QuizService.java index 12488074..714cb087 100644 --- a/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/service/QuizService.java +++ b/backend/shareNote/src/main/java/com/Backend/shareNote/domain/Oraganization/service/QuizService.java @@ -1,10 +1,7 @@ package com.Backend.shareNote.domain.Oraganization.service; -import com.Backend.shareNote.domain.Oraganization.DTOs.quizdto.QuizCreateDTO; -import com.Backend.shareNote.domain.Oraganization.DTOs.quizdto.QuizSearchDTO; -import com.Backend.shareNote.domain.Oraganization.DTOs.quizdto.QuizSolveDTO; +import com.Backend.shareNote.domain.Oraganization.DTOs.quizdto.*; import com.Backend.shareNote.domain.Oraganization.entity.Organization; -import com.Backend.shareNote.domain.Oraganization.repository.NoteRepository; import com.Backend.shareNote.domain.Oraganization.repository.OrganizationRepository; import com.Backend.shareNote.domain.Oraganization.repository.QuizRepository; import com.Backend.shareNote.domain.User.entity.Users; @@ -16,7 +13,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.Optional; @Service @RequiredArgsConstructor @@ -44,11 +40,12 @@ public ResponseEntity createQuiz(QuizCreateDTO quizCreateDTO) { .quizType(quizCreateDTO.getQuizType()) .problem(quizCreateDTO.getProblem()) .answer(quizCreateDTO.getAnswer()) - .solutions(quizCreateDTO.getSolutions()) + .problems(quizCreateDTO.getProblems()) .correctUser(new ArrayList()) .wrongUser(new ArrayList()) .userId(quizCreateDTO.getUserId()) .nickname(user.getNickname()) + .quizTitle(quizCreateDTO.getQuizTitle()) .build(); @@ -172,4 +169,91 @@ else if(quiz.getWrongUser().contains(userId)){ } } + + public ResponseEntity getQuizDetail(QuizDetailReqDTO quizDetailReqDTO) { + try { + // organization 찾기 + Organization organization = organizationRepository.findById(quizDetailReqDTO.getOrganizationId()) + .orElseThrow(() -> new IllegalArgumentException("해당하는 organization이 없습니다.")); + + // note 찾기 + Organization.Note note = organization.getNotes().stream() + .filter(n -> n.getId().equals(quizDetailReqDTO.getNoteId())) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("해당하는 note가 없습니다.")); + + // quiz 찾기 + Organization.Quiz quiz = note.getQuiz().stream() + .filter(q -> q.getId().equals(quizDetailReqDTO.getQuizId())) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("해당하는 quiz가 없습니다.")); + + // + int corret; + if(quiz.getCorrectUser().contains(quizDetailReqDTO.getUserId())){ + corret = 1; + } + else if(quiz.getWrongUser().contains(quizDetailReqDTO.getUserId())){ + corret = 0; + } + else{ + corret = -1; + } + + QuizDetailResDTO dto = QuizDetailResDTO.builder() + .quizTitle(quiz.getProblem()) + .quizType(quiz.getQuizType()) + .noteName(note.getTitle()) + .problems(quiz.getProblems()) + .correct(corret) + .build(); + + return ResponseEntity.ok().body(dto); + }catch (IllegalArgumentException e) { + return ResponseEntity.badRequest().body("Invalid input: " + e.getMessage()); + } + catch (Exception e) { + return ResponseEntity.badRequest().body("Unexpected error: " + e.getMessage()); + } + } + + public ResponseEntity deleteQuiz(QuizDeleteDTO quizDeleteDTO) { + try { + // organization 찾기 + Organization organization = organizationRepository.findById(quizDeleteDTO.getOrganizationId()) + .orElseThrow(() -> new IllegalArgumentException("해당하는 organization이 없습니다.")); + + // note 찾기 + Organization.Note note = organization.getNotes().stream() + .filter(n -> n.getId().equals(quizDeleteDTO.getNoteId())) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("해당하는 note가 없습니다.")); + + // quiz 찾기 + Organization.Quiz quiz = note.getQuiz().stream() + .filter(q -> q.getId().equals(quizDeleteDTO.getQuizId())) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("해당하는 quiz가 없습니다.")); + + // organization 멤버인지 확인하는 코드 + if (!organization.getMembers().contains(quizDeleteDTO.getUserId())) { + throw new IllegalArgumentException("해당하는 organization의 멤버가 아닙니다."); + } + + // 자기가 낸 문제인 경우만 삭제 가능 + if (quiz.getUserId().equals(quizDeleteDTO.getUserId())) { + note.getQuiz().remove(quiz); + organizationRepository.save(organization); + } else{ + throw new IllegalArgumentException("자신이 낸 문제만 삭제 가능합니다."); + } + + return ResponseEntity.ok().body("퀴즈 삭제 성공"); + }catch (IllegalArgumentException e) { + return ResponseEntity.badRequest().body("Invalid input: " + e.getMessage()); + } + catch (Exception e) { + return ResponseEntity.badRequest().body("Unexpected error: " + e.getMessage()); + } + } }