diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..dea924c --- /dev/null +++ b/.classpath @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project index e40ff58..cb29ace 100644 --- a/.project +++ b/.project @@ -5,7 +5,30 @@ + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.springframework.ide.eclipse.boot.validation.springbootbuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.jdt.core.javanature diff --git a/.settings/org.eclipse.jdt.apt.core.prefs b/.settings/org.eclipse.jdt.apt.core.prefs new file mode 100644 index 0000000..d4313d4 --- /dev/null +++ b/.settings/org.eclipse.jdt.apt.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.apt.aptEnabled=false diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..e82d82e --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,12 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=17 +org.eclipse.jdt.core.compiler.compliance=17 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.processAnnotations=disabled +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=17 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/.settings/org.eclipse.wst.common.project.facet.core.xml b/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000..48ff4f3 --- /dev/null +++ b/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,4 @@ + + + + diff --git a/.settings/org.springframework.ide.eclipse.prefs b/.settings/org.springframework.ide.eclipse.prefs new file mode 100644 index 0000000..a12794d --- /dev/null +++ b/.settings/org.springframework.ide.eclipse.prefs @@ -0,0 +1,2 @@ +boot.validation.initialized=true +eclipse.preferences.version=1 diff --git a/bin/com/codeboy/CodeBoyBackendApplication.class b/bin/com/codeboy/CodeBoyBackendApplication.class new file mode 100644 index 0000000..ad03b8e Binary files /dev/null and b/bin/com/codeboy/CodeBoyBackendApplication.class differ diff --git a/bin/com/codeboy/CodeBoyBackendApplicationTests.class b/bin/com/codeboy/CodeBoyBackendApplicationTests.class new file mode 100644 index 0000000..072a481 Binary files /dev/null and b/bin/com/codeboy/CodeBoyBackendApplicationTests.class differ diff --git a/bin/com/codeboy/common/Category.class b/bin/com/codeboy/common/Category.class new file mode 100644 index 0000000..fda0c6a Binary files /dev/null and b/bin/com/codeboy/common/Category.class differ diff --git a/bin/com/codeboy/common/Status.class b/bin/com/codeboy/common/Status.class new file mode 100644 index 0000000..c5f01af Binary files /dev/null and b/bin/com/codeboy/common/Status.class differ diff --git a/bin/com/codeboy/mvc/config/SwaggerConfig.class b/bin/com/codeboy/mvc/config/SwaggerConfig.class new file mode 100644 index 0000000..2e54993 Binary files /dev/null and b/bin/com/codeboy/mvc/config/SwaggerConfig.class differ diff --git a/bin/com/codeboy/mvc/controller/MemberController.class b/bin/com/codeboy/mvc/controller/MemberController.class new file mode 100644 index 0000000..9b32456 Binary files /dev/null and b/bin/com/codeboy/mvc/controller/MemberController.class differ diff --git a/bin/com/codeboy/mvc/model/dao/CommentDao.class b/bin/com/codeboy/mvc/model/dao/CommentDao.class new file mode 100644 index 0000000..26d5a0e Binary files /dev/null and b/bin/com/codeboy/mvc/model/dao/CommentDao.class differ diff --git a/bin/com/codeboy/mvc/model/dao/IncorrectNoteDao.class b/bin/com/codeboy/mvc/model/dao/IncorrectNoteDao.class new file mode 100644 index 0000000..da97c4b Binary files /dev/null and b/bin/com/codeboy/mvc/model/dao/IncorrectNoteDao.class differ diff --git a/bin/com/codeboy/mvc/model/dao/MemberDao.class b/bin/com/codeboy/mvc/model/dao/MemberDao.class new file mode 100644 index 0000000..775c4f4 Binary files /dev/null and b/bin/com/codeboy/mvc/model/dao/MemberDao.class differ diff --git a/bin/com/codeboy/mvc/model/dao/ProblemDao.class b/bin/com/codeboy/mvc/model/dao/ProblemDao.class new file mode 100644 index 0000000..2dfb2b1 Binary files /dev/null and b/bin/com/codeboy/mvc/model/dao/ProblemDao.class differ diff --git a/bin/com/codeboy/mvc/model/dao/QuizRoomDao.class b/bin/com/codeboy/mvc/model/dao/QuizRoomDao.class new file mode 100644 index 0000000..b99a818 Binary files /dev/null and b/bin/com/codeboy/mvc/model/dao/QuizRoomDao.class differ diff --git a/bin/com/codeboy/mvc/model/dao/ScoreDao.class b/bin/com/codeboy/mvc/model/dao/ScoreDao.class new file mode 100644 index 0000000..2d9d910 Binary files /dev/null and b/bin/com/codeboy/mvc/model/dao/ScoreDao.class differ diff --git a/bin/com/codeboy/mvc/model/dao/UserIncorrectNoteDao.class b/bin/com/codeboy/mvc/model/dao/UserIncorrectNoteDao.class new file mode 100644 index 0000000..caf04d0 Binary files /dev/null and b/bin/com/codeboy/mvc/model/dao/UserIncorrectNoteDao.class differ diff --git a/bin/com/codeboy/mvc/model/dao/UserProblemDao.class b/bin/com/codeboy/mvc/model/dao/UserProblemDao.class new file mode 100644 index 0000000..48c9073 Binary files /dev/null and b/bin/com/codeboy/mvc/model/dao/UserProblemDao.class differ diff --git a/bin/com/codeboy/mvc/model/dto/Comment.class b/bin/com/codeboy/mvc/model/dto/Comment.class new file mode 100644 index 0000000..0af17be Binary files /dev/null and b/bin/com/codeboy/mvc/model/dto/Comment.class differ diff --git a/bin/com/codeboy/mvc/model/dto/IncorrectNote.class b/bin/com/codeboy/mvc/model/dto/IncorrectNote.class new file mode 100644 index 0000000..7718f2a Binary files /dev/null and b/bin/com/codeboy/mvc/model/dto/IncorrectNote.class differ diff --git a/bin/com/codeboy/mvc/model/dto/Member.class b/bin/com/codeboy/mvc/model/dto/Member.class new file mode 100644 index 0000000..95a6fbb Binary files /dev/null and b/bin/com/codeboy/mvc/model/dto/Member.class differ diff --git a/bin/com/codeboy/mvc/model/dto/MemberUpdateRequest.class b/bin/com/codeboy/mvc/model/dto/MemberUpdateRequest.class new file mode 100644 index 0000000..61a0d62 Binary files /dev/null and b/bin/com/codeboy/mvc/model/dto/MemberUpdateRequest.class differ diff --git a/bin/com/codeboy/mvc/model/dto/Problem.class b/bin/com/codeboy/mvc/model/dto/Problem.class new file mode 100644 index 0000000..5cea3fc Binary files /dev/null and b/bin/com/codeboy/mvc/model/dto/Problem.class differ diff --git a/bin/com/codeboy/mvc/model/dto/QuizRoom.class b/bin/com/codeboy/mvc/model/dto/QuizRoom.class new file mode 100644 index 0000000..dc60dc5 Binary files /dev/null and b/bin/com/codeboy/mvc/model/dto/QuizRoom.class differ diff --git a/bin/com/codeboy/mvc/model/dto/QuizRoomMember.class b/bin/com/codeboy/mvc/model/dto/QuizRoomMember.class new file mode 100644 index 0000000..4883913 Binary files /dev/null and b/bin/com/codeboy/mvc/model/dto/QuizRoomMember.class differ diff --git a/bin/com/codeboy/mvc/model/dto/UserIncorrectNote.class b/bin/com/codeboy/mvc/model/dto/UserIncorrectNote.class new file mode 100644 index 0000000..0db1604 Binary files /dev/null and b/bin/com/codeboy/mvc/model/dto/UserIncorrectNote.class differ diff --git a/bin/com/codeboy/mvc/model/dto/UserProblem.class b/bin/com/codeboy/mvc/model/dto/UserProblem.class new file mode 100644 index 0000000..df5b7b0 Binary files /dev/null and b/bin/com/codeboy/mvc/model/dto/UserProblem.class differ diff --git a/bin/com/codeboy/mvc/model/dto/UserProblemSet.class b/bin/com/codeboy/mvc/model/dto/UserProblemSet.class new file mode 100644 index 0000000..5b3cb6d Binary files /dev/null and b/bin/com/codeboy/mvc/model/dto/UserProblemSet.class differ diff --git a/bin/com/codeboy/mvc/model/dto/UserScore.class b/bin/com/codeboy/mvc/model/dto/UserScore.class new file mode 100644 index 0000000..484e95a Binary files /dev/null and b/bin/com/codeboy/mvc/model/dto/UserScore.class differ diff --git a/bin/com/codeboy/mvc/model/service/CommentService.class b/bin/com/codeboy/mvc/model/service/CommentService.class new file mode 100644 index 0000000..d44b062 Binary files /dev/null and b/bin/com/codeboy/mvc/model/service/CommentService.class differ diff --git a/bin/com/codeboy/mvc/model/service/IncorrectNoteService.class b/bin/com/codeboy/mvc/model/service/IncorrectNoteService.class new file mode 100644 index 0000000..eea54f0 Binary files /dev/null and b/bin/com/codeboy/mvc/model/service/IncorrectNoteService.class differ diff --git a/bin/com/codeboy/mvc/model/service/MemberService.class b/bin/com/codeboy/mvc/model/service/MemberService.class new file mode 100644 index 0000000..0d73745 Binary files /dev/null and b/bin/com/codeboy/mvc/model/service/MemberService.class differ diff --git a/bin/com/codeboy/mvc/model/service/ProblemService.class b/bin/com/codeboy/mvc/model/service/ProblemService.class new file mode 100644 index 0000000..53d84b2 Binary files /dev/null and b/bin/com/codeboy/mvc/model/service/ProblemService.class differ diff --git a/bin/com/codeboy/mvc/model/service/QuizRoomService.class b/bin/com/codeboy/mvc/model/service/QuizRoomService.class new file mode 100644 index 0000000..11f4bb1 Binary files /dev/null and b/bin/com/codeboy/mvc/model/service/QuizRoomService.class differ diff --git a/bin/com/codeboy/mvc/model/service/QuizRoomServiceImpl.class b/bin/com/codeboy/mvc/model/service/QuizRoomServiceImpl.class new file mode 100644 index 0000000..bf485f0 Binary files /dev/null and b/bin/com/codeboy/mvc/model/service/QuizRoomServiceImpl.class differ diff --git a/bin/com/codeboy/mvc/model/service/ScoreService.class b/bin/com/codeboy/mvc/model/service/ScoreService.class new file mode 100644 index 0000000..384f9b4 Binary files /dev/null and b/bin/com/codeboy/mvc/model/service/ScoreService.class differ diff --git a/bin/com/codeboy/mvc/model/service/UserProblemService.class b/bin/com/codeboy/mvc/model/service/UserProblemService.class new file mode 100644 index 0000000..3f98a1d Binary files /dev/null and b/bin/com/codeboy/mvc/model/service/UserProblemService.class differ diff --git a/codeBoy_backend/.gitignore b/codeBoy_backend/.gitignore index 667aaef..4f0d27e 100644 --- a/codeBoy_backend/.gitignore +++ b/codeBoy_backend/.gitignore @@ -31,3 +31,6 @@ build/ ### VS Code ### .vscode/ +/.metadata/ + +.class \ No newline at end of file diff --git a/codeBoy_backend/pom.xml b/codeBoy_backend/pom.xml index aa498cf..1605b95 100644 --- a/codeBoy_backend/pom.xml +++ b/codeBoy_backend/pom.xml @@ -1,6 +1,6 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 org.springframework.boot @@ -30,6 +30,7 @@ 17 + org.springframework.boot spring-boot-starter-web @@ -63,11 +64,11 @@ test - - org.springdoc - springdoc-openapi-starter-webmvc-ui - 2.3.0 - + + org.springdoc + springdoc-openapi-starter-webmvc-ui + 2.3.0 + org.springframework.boot spring-boot-starter @@ -75,8 +76,10 @@ org.projectlombok lombok - true + 1.18.42 + provided + @@ -85,27 +88,15 @@ org.springframework.boot spring-boot-maven-plugin - - - org.projectlombok - lombok - - + org.apache.maven.plugins maven-compiler-plugin - - - - org.projectlombok - lombok - - - + - + \ No newline at end of file diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/config/MyBatisConfig.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/config/MyBatisConfig.java new file mode 100644 index 0000000..f657d4d --- /dev/null +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/config/MyBatisConfig.java @@ -0,0 +1,10 @@ +package com.codeboy.mvc.config; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@MapperScan("com.codeboy.mvc.model.dao") +public class MyBatisConfig { + +} diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/CommentController.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/CommentController.java new file mode 100644 index 0000000..ec4166a --- /dev/null +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/CommentController.java @@ -0,0 +1,166 @@ +package com.codeboy.mvc.controller; + +import java.util.ArrayList; +import java.util.List; + +import com.codeboy.mvc.model.dto.request.CommentUpdateRequest; +import com.codeboy.mvc.model.dto.response.ApiResponse; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpSession; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +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 com.codeboy.mvc.model.dto.Comment; +import com.codeboy.mvc.model.service.CommentService; + +@RestController +@RequestMapping("/api/comments") +@Tag(name="Comment RESTful API", description = "Comment CRUD를 할 수 있는 REST API") +public class CommentController { + private final CommentService commentService; + + + @Autowired + public CommentController(CommentService commentService) { + this.commentService = commentService; + } + + + @GetMapping("{userProblemSetId}") + //숫자가 아닌 값이 userProblemSetId에 오면 스프링이 컨트롤러에 도달하기전에 400BAD_REQUEST를 보내줌 + public ResponseEntity>> getAllCommentsById(@PathVariable("userProblemSetId") long userProblemSetId){ + List comments = commentService.getAllCommentsById(userProblemSetId); + + if (comments.isEmpty()) { + //댓글이 달리지 않은 경우 + return ResponseEntity.status(HttpStatus.OK) + .body(ApiResponse.success(HttpStatus.OK, "댓글이 없습니다.", new ArrayList())); + } + //댓글 조회에 성공한 경우 + return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.success(HttpStatus.OK, "댓글 조회 성공", comments)); + + } + + @PostMapping("{userProblemSetId}") + public ResponseEntity> addComment(@PathVariable long userProblemSetId, + @RequestBody Comment comment, HttpSession session) { + if (comment.getContent() == null || comment.getContent().isBlank()) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(ApiResponse.failure(HttpStatus.BAD_REQUEST, "댓글 내용은 비어 있을 수 없습니다.")); + } + Long memberId = (Long) session.getAttribute("memberId"); + if (memberId == null) { + // 인증 안 됨 + return ResponseEntity.status(HttpStatus.UNAUTHORIZED) + .body(ApiResponse.failure(HttpStatus.UNAUTHORIZED, "로그인이 필요합니다.")); + } + comment.setMemberId(memberId); + int result = commentService.addComment(userProblemSetId, comment); + + if (result == 0) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(ApiResponse.failure(HttpStatus.BAD_REQUEST, "잘못된 요청. 댓글 추가 실패")); + } + + return ResponseEntity.status(HttpStatus.CREATED) + .body(ApiResponse.success(HttpStatus.CREATED, "댓글 추가 성공", null)); + } + + + //리소스의 일부(content)만 수정하므로 패치매핑 + @PatchMapping("{userProblemSetId}/{commentId}") + public ResponseEntity> updateComment( + @PathVariable long userProblemSetId, + @PathVariable long commentId, + @RequestBody CommentUpdateRequest commentUpdateRequest, + HttpSession session) { + + Long memberId = (Long) session.getAttribute("memberId"); + if (memberId == null) { + // 인증 안 됨 + return ResponseEntity.status(HttpStatus.UNAUTHORIZED) + .body(ApiResponse.failure(HttpStatus.UNAUTHORIZED, "로그인이 필요합니다.")); + } + + if (!memberId.equals(commentUpdateRequest.getMemberId())) { + // 인가 실패 + // 로그인 중인 회원이 자신이 작성한 댓글이 아닌 것을 수정하려할 때 + return ResponseEntity.status(HttpStatus.FORBIDDEN) + .body(ApiResponse.failure(HttpStatus.FORBIDDEN, "본인의 댓글만 수정할 수 있습니다.")); + } + + //댓글이 비어있을 때 + if (commentUpdateRequest.getContent() == null || commentUpdateRequest.getContent().isBlank()) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(ApiResponse.failure(HttpStatus.BAD_REQUEST, "수정할 댓글 내용을 입력해주세요.")); + } + + Comment comment = new Comment(); + comment.setContent(commentUpdateRequest.getContent()); + + int result = commentService.updateComment(commentId, comment); + + if (result == 0) { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(ApiResponse.failure(HttpStatus.NOT_FOUND, "존재하지 않는 댓글입니다.")); + + } + + return ResponseEntity.status(HttpStatus.OK) + .body(ApiResponse.success(HttpStatus.OK, "댓글 수정 성공", null)); + } + + + @DeleteMapping("{userProblemSetId}/{commentId}") + public ResponseEntity> deleteComment(@PathVariable long userProblemSetId, + @PathVariable long commentId, + HttpSession session) { + + Long memberId = (Long) session.getAttribute("memberId"); + + // 로그인 안한 상태 + if (memberId == null) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED) + .body(ApiResponse.failure(HttpStatus.UNAUTHORIZED, "로그인이 필요합니다.")); + } + + // DB에서 댓글 작성자 ID 조회 + Long ownerId = commentService.getCommentOwnerId(commentId); + + // 댓글ID가 존재하지 않는 경우 + if (ownerId == null) { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(ApiResponse.failure(HttpStatus.NOT_FOUND, "존재하지 않는 댓글입니다.")); + } + + // 권한 없음 (본인 댓글 아님) + if (!memberId.equals(ownerId)) { + return ResponseEntity.status(HttpStatus.FORBIDDEN) + .body(ApiResponse.failure(HttpStatus.FORBIDDEN, "본인이 작성한 댓글만 삭제할 수 있습니다.")); + } + + // 삭제 실행 + int result = commentService.deleteComment(commentId); + + if (result == 0) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(ApiResponse.failure(HttpStatus.INTERNAL_SERVER_ERROR, "댓글 삭제에 실패했습니다.")); + } + + // 삭제 실패 (DB 오류 등의 상황) + + return ResponseEntity.status(HttpStatus.OK) + .body(ApiResponse.success(HttpStatus.OK, "댓글 삭제 성공", null)); + } + + +} diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/IncorrectNoteController.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/IncorrectNoteController.java new file mode 100644 index 0000000..405b907 --- /dev/null +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/IncorrectNoteController.java @@ -0,0 +1,73 @@ +package com.codeboy.mvc.controller; + +import com.codeboy.mvc.model.dto.request.IncorrectNoteRequest; +import com.codeboy.mvc.model.dto.response.ApiResponse; +import com.codeboy.mvc.model.dto.response.IncorrectNoteResponse; +import com.codeboy.mvc.model.service.IncorrectNoteService; + +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpSession; + +import org.apache.ibatis.javassist.NotFoundException; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("api/incorrect-note") +@Tag(name="Incorrect-note RESTful API", description = "Incorrect-note CRUD를 할 수 있는 REST API") +public class IncorrectNoteController { + + private final IncorrectNoteService incorrectNoteService; + + public IncorrectNoteController(IncorrectNoteService incorrectNoteService) { + this.incorrectNoteService = incorrectNoteService; + } + + //한 회원의 오답노트를 모두 조회 + @GetMapping + public ResponseEntity>> getIncorrectNote(HttpSession session) { + try { + //TODO : 세션 or spring security에서 memberId 가져오기 + Long memberId = (Long) session.getAttribute("memberId"); + List incorrectNoteList = incorrectNoteService.getIncorrectNoteList(memberId); + return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.success(HttpStatus.OK, "오답노트가 성공적으로 조회되었습니다", incorrectNoteList)); + } catch (IllegalArgumentException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage())); + } catch (NotFoundException e) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ApiResponse.failure(HttpStatus.NOT_FOUND, e.getMessage())); + } + } + + //오답노트에 문제 넣기 + @PostMapping + public ResponseEntity> addIncorrectNote(@RequestBody IncorrectNoteRequest incorrectNoteRequest, HttpSession session) { + //TODO : 세션에서 멤버 id 가져오기 + Long memberId = (Long) session.getAttribute("memberId"); + Long problemId = incorrectNoteRequest.getProblemId(); + Long userProblemId = incorrectNoteRequest.getUserProblemId(); + Boolean isUserProblem = incorrectNoteRequest.getIsUserProblem(); + + try { + Long incorrectNoteId = incorrectNoteService.addIncorrectNote(memberId, problemId, userProblemId, isUserProblem); + return ResponseEntity.status(HttpStatus.CREATED).body(ApiResponse.success(HttpStatus.CREATED, "오답노트를 성공적으로 생성하였습니다.", incorrectNoteId)); + + } catch (IllegalArgumentException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage())); + } + + } + + @DeleteMapping("/{incorrectNoteId}") + public ResponseEntity> deleteIncorrectNote(@PathVariable long incorrectNoteId) { + + try { + incorrectNoteService.deleteIncorrectNote(incorrectNoteId); + return ResponseEntity.ok(ApiResponse.success(HttpStatus.OK, "오답노트가 삭제되었습니다")); + } catch (IllegalArgumentException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage())); + } + } +} diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/MemberController.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/MemberController.java index 0a18715..be695a1 100644 --- a/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/MemberController.java +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/MemberController.java @@ -1,32 +1,240 @@ package com.codeboy.mvc.controller; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; import com.codeboy.mvc.model.dto.Member; - +import com.codeboy.mvc.model.dto.request.DuplicateCheckRequest; +import com.codeboy.mvc.model.dto.request.LoginRequest; +import com.codeboy.mvc.model.dto.request.MemberUpdateRequest; +import com.codeboy.mvc.model.dto.response.ApiResponse; +import com.codeboy.mvc.model.dto.response.DuplicateCheckResponse; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpSession; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatusCode; + +import org.springframework.http.HttpStatus; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import com.codeboy.mvc.model.service.MemberService; + + +import java.net.URI; +import java.util.HashMap; +import java.util.NoSuchElementException; @RestController -@RequestMapping("/api-member") +@RequestMapping("/api") @Tag(name="Member RESTful API", description = "Member CRUD를 할 수 있는 REST API") public class MemberController { - -// @Autowired -// private MemberService memberService; - - - @PostMapping("/signup") - public String signup(@ModelAttribute Member member){ - return "회원가입 성공?"; - } - - @GetMapping(){ - - } - - + private final MemberService memberService; + + @Autowired + public MemberController(MemberService memberService) { + this.memberService = memberService; + } + + /** + * 회원가입 + * POST /api/members + * RequestBody: { id, password, nickname, email } + * Response: + * 201 생성 성공 + * 400 잘못된 요청 + * 409 아이디/이메일 중복 + */ + @PostMapping("/member") + public ResponseEntity signUp(@RequestBody Member member) { + // TODO: 아이디/이메일 중복 체크 로직은 나중에 추가 + int result = memberService.signUp(member); + + if (result == 1) { + // Location 헤더에 새로 생성된 리소스 URI 넣어줄 수도 있음 + URI location = URI.create("/api/members/" + member.getMemberId()); + return ResponseEntity + .status(HttpStatusCode.valueOf(201)) + .location(location) + .body("회원가입 성공"); + } else { + return ResponseEntity + .status(HttpStatusCode.valueOf(400)) + .body("회원가입 실패"); + } + //아이디/이메일 중복로직은 나중에 구 + } + + /** + * 로그인 + * POST /api/auth/login + * RequestBody: { id, password } + * Response: + * 200 성공 시 { token, memberId, nickname } + * 401 실패 시 { error: "로그인 실패" } + */ + @PostMapping("/auth/login") + public ResponseEntity> login(@RequestBody LoginRequest request, HttpSession session) { + try { + // Service를 통해 로그인 처리 + Member member = memberService.login(request.getId(), request.getPassword()); + + // 세션에 member_id 저장 + session.setAttribute("memberId", member.getMemberId()); + session.setAttribute("id", member.getId()); + session.setAttribute("nickname", member.getNickname()); + + // 성공 응답 반환 + + return ResponseEntity.status(HttpStatus.OK) + .body(ApiResponse.success(HttpStatus.OK, "로그인 성공", + new HashMap() {private static final long serialVersionUID = 5698154608853982208L; + + { + put("memberId", member.getMemberId()); + put("nickname", member.getNickname()); + put("id", member.getId()); + }})); + } catch (IllegalArgumentException e) { + // 로그인 실패 (ID/비밀번호 오류 등) + return ResponseEntity.status(HttpStatus.UNAUTHORIZED) + .body(ApiResponse.failure(HttpStatus.UNAUTHORIZED, e.getMessage())); + } catch (Exception e) { + // 기타 오류 + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(ApiResponse.failure(HttpStatus.INTERNAL_SERVER_ERROR, "로그인 처리 중 오류가 발생했습니다.")); + } + } + /** + * 로그아웃 + * POST /api/auth/logout + * RequestBody: 없음 + * Response: + * 204 성공 시 본문 없음 + */ + @PostMapping("/auth/logout") + public ResponseEntity> logout(HttpSession session) { + // 세션 무효화 + session.invalidate(); + + return ResponseEntity.status(HttpStatus.OK) + .body(ApiResponse.success(HttpStatus.OK, "로그아웃 성공", null)); + + } + /** + * 내 정보 수정 + * PUT /api/members/me + * RequestBody: { nickname?, email?, password? } + * Response: + * 200 성공 시 수정된 정보 or 메시지 + * 400 잘못된 요청 + * 401 인증 실패 + */ + //회원정보 전체를 업데이트하지않고 일부만 수정하는 거라서 Put에서 Patch매핑으로 변경 + @PatchMapping("/members/{memberId}") + public ResponseEntity updateMe(@RequestBody MemberUpdateRequest request, @PathVariable long memberId ) { + //파라미터로 memberId받아서 해당회원의 정보를 수정 + + Member member = memberService.getMemberById(memberId); + //회원을 못찾는 경우 ->존재하지 않는 memberId인경우 + if (member == null) { + return ResponseEntity + .status(HttpStatusCode.valueOf(401)) + .body("인증된 회원을 찾을 수 없습니다."); + } + + //닉네임과 이메일은 바꿀 수 있다고 가정. 필요하면 ID도..? + //닉네임, 아이디, 이메일 + if (request == null) { + return ResponseEntity + .status(HttpStatusCode.valueOf(401)) + .body("요청값이 null 입니다."); + } + + return ResponseEntity + .status(HttpStatusCode.valueOf(200)) + .body("회원정보 수정 성공"); + } + + //회원 조회 + @GetMapping("/members/") + public ResponseEntity> getMemberInfo(HttpSession session) { + Long memberId = 1L; + try { + Member member = memberService.getMemberById(memberId); + return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.success(HttpStatus.OK, "회원정보가 조회되었습니다", member)); + + } catch (NoSuchElementException e) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ApiResponse.failure(HttpStatus.NOT_FOUND, e.getMessage())); + + } catch (IllegalArgumentException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage())); + } + } + + //회원 탈퇴 + @DeleteMapping + public ResponseEntity> deleteMember() { + //TODO : memberId 받아오기 + Long memberId = 1L; + try { + memberService.deactivateMember(memberId); + return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.success(HttpStatus.OK, "회원이 성공적으로 삭제되었습니다.")); + + } catch (IllegalArgumentException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage())); + } catch (NoSuchElementException e) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ApiResponse.failure(HttpStatus.NOT_FOUND, e.getMessage())); + } + } + + //회원 정보 업데이트 + @PatchMapping + public ResponseEntity> updateMember(@RequestBody MemberUpdateRequest request) { + //TODO : memberId 받아오기 + Long memberId = 1L; + try { + memberService.updateMember(memberId, request); + return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.success(HttpStatus.OK, "회원정보 업데이트에 성공했습니다.")); + } catch (IllegalArgumentException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage())); + } catch (IllegalStateException e) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ApiResponse.failure(HttpStatus.NOT_FOUND, e.getMessage())); + } + } + + //ID, 닉네임, 이메일 중복체크 + @PostMapping("/check-id") + public ResponseEntity> checkId(@RequestBody DuplicateCheckRequest request) { + try { + boolean duplicated = memberService.checkIdDuplicate(request.getValue()); + DuplicateCheckResponse response = new DuplicateCheckResponse(duplicated); + return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.success(HttpStatus.OK, "아이디 중복 확인 완료", response)); + } catch (IllegalArgumentException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage())); + } + } + + @PostMapping("/check-email") + public ResponseEntity> checkEmail(@RequestBody DuplicateCheckRequest request) { + try { + boolean duplicated = memberService.checkEmailDuplicate(request.getValue()); + DuplicateCheckResponse response = new DuplicateCheckResponse(duplicated); + return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.success(HttpStatus.OK, "이메일 중복 확인 완료", response)); + } catch (IllegalArgumentException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage())); + } + } + + @PostMapping("/check-nickname") + public ResponseEntity> checkNickname(@RequestBody DuplicateCheckRequest request) { + try { + boolean duplicated = memberService.checkNicknameDuplicate(request.getValue()); + DuplicateCheckResponse response = new DuplicateCheckResponse(duplicated); + return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.success(HttpStatus.OK, "닉네임 중복 확인 완료", response)); + } catch (IllegalArgumentException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage())); + } + } } diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/ProblemController.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/ProblemController.java new file mode 100644 index 0000000..a666f9a --- /dev/null +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/ProblemController.java @@ -0,0 +1,34 @@ + +package com.codeboy.mvc.controller; + +import com.codeboy.common.Category; +import com.codeboy.mvc.model.dto.response.ApiResponse; +import com.codeboy.mvc.model.dto.Problem; +import com.codeboy.mvc.model.service.ProblemServiceImpl; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/problem") +@Tag(name="Problem RESTful API", description = "Problem CRUD를 할 수 있는 REST API") +public class ProblemController { + + @Autowired + private ProblemServiceImpl problemService; + + @GetMapping + public ResponseEntity>> getProblems(@RequestParam int limit, @RequestParam Category category) { + try { + List problems = problemService.getProblems(limit, category); + return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.success(HttpStatus.OK, "문제가 성공적으로 반환되었습니다.", problems)); + + } catch (IllegalArgumentException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST , e.getMessage())); + } + } +} diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/QuizRoomController.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/QuizRoomController.java new file mode 100644 index 0000000..37abdb6 --- /dev/null +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/QuizRoomController.java @@ -0,0 +1,107 @@ +package com.codeboy.mvc.controller; + +import com.codeboy.mvc.model.dto.*; +import com.codeboy.mvc.model.dto.request.JoinQuizRoomRequest; +import com.codeboy.mvc.model.dto.response.ApiResponse; +import com.codeboy.mvc.model.dto.response.GetQuizRoomMembersResponse; +import com.codeboy.mvc.model.service.QuizRoomService; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/quiz-room") +@Tag(name="Quiz-room RESTful API", description = "Quiz-room CRUD를 할 수 있는 REST API") +public class QuizRoomController { + private final QuizRoomService quizRoomService; + + public QuizRoomController(QuizRoomService quizRoomService) { + this.quizRoomService = quizRoomService; + } + + //호스트 - 퀴즈방 만들기 + //TODO : 테스트용으로 memberId를 PathVariable로 넘김 + @PostMapping("/create/{memberId}") + //TODO : 로그인 구현되면 memberId를 requestBody로 넘기지 말고 세션에서 가져오도록 하기 + public ResponseEntity> createQuizRoom(@PathVariable long memberId) { + try { + //새로운 채팅방 생성하기 + long quizRoomId = quizRoomService.createQuizRoom(); + //3. QuizRoomMember 객체 생성 +// Long memberId = 1L; + QuizRoomMember quizRoomMember = new QuizRoomMember(); + //4. setter로 객체 만들기 + quizRoomMember.setMemberId(memberId); + quizRoomMember.setRoomId(quizRoomId); + quizRoomMember.setIsHost(true); + + //5. 채팅방에 넣기 + quizRoomService.joinQuizRoom(quizRoomMember); + return ResponseEntity.status(HttpStatus.CREATED).body(ApiResponse.success(HttpStatus.CREATED, "퀴즈방이 성공적으로 생성되었습니다.", quizRoomId)); + + } catch (IllegalStateException | IllegalArgumentException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage())); + } + } + + //채팅방 참여하기 + @PostMapping("/join") + //TODO : 로그인 구현되면 memberId를 requestBody로 넘기지 말고 세션에서 가져오도록 하기 + public ResponseEntity> joinQuizRoom(@RequestBody JoinQuizRoomRequest request) { + long memberId = request.getMemberId(); + long roomId = request.getRoomId(); + try { + //QuizRoomMember 생성 + QuizRoomMember quizRoomMember = new QuizRoomMember(); + quizRoomMember.setIsHost(false); + quizRoomMember.setMemberId(memberId); + quizRoomMember.setRoomId(roomId); + + //채팅방에 참가 + quizRoomService.joinQuizRoom(quizRoomMember); + return ResponseEntity.status(HttpStatus.CREATED).body(ApiResponse.success(HttpStatus.CREATED, "퀴즈방 입장에 성공하였습니다.")); + + } catch (IllegalArgumentException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage())); + } + } + + //채팅방 목록 보여주기 + @GetMapping + public ResponseEntity>> getQuizRoomList() { + try { + List quizRooms = quizRoomService.getQuizRoomList(); + return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.success(HttpStatus.OK, "퀴즈방 목록 조회 성공", quizRooms)); + + } catch (IllegalStateException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage())); + } + } + + + //현재 참가자 목록 보여주기 + @GetMapping("/{roomId}/member") + public ResponseEntity>> getQuizRoomMembers(@PathVariable long roomId) { + try { + List memberList = quizRoomService.getOneQuizRoomMember(roomId); + return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.success(HttpStatus.OK, "멤버 리스트를 반환합니다.", memberList)); + } catch (IllegalStateException | IllegalArgumentException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage())); + } + } + + //채팅방 삭제하기 + @DeleteMapping("/{roomId}") + public ResponseEntity> deleteQuizRoom(@PathVariable long roomId) { + try { + quizRoomService.deleteQuizRoom(roomId); + return ResponseEntity.status(HttpStatus.OK).body(ApiResponse.success(HttpStatus.OK, "채팅방이 성공적으로 삭제되었습니다.")); + + } catch (IllegalStateException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage())); + } + } +} diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/UserProblemController.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/UserProblemController.java new file mode 100644 index 0000000..dd89b65 --- /dev/null +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/UserProblemController.java @@ -0,0 +1,154 @@ +package com.codeboy.mvc.controller; + +import com.codeboy.mvc.model.dto.UserProblem; +import com.codeboy.mvc.model.dto.response.ApiResponse; // 실제 패키지에 맞게 수정 +import com.codeboy.mvc.model.service.UserProblemService; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpSession; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/user-problems") +@Tag(name="User-problems RESTful API", description = "User-problems CRUD를 할 수 있는 REST API") +public class UserProblemController { + + + private final UserProblemService userProblemService; + + public UserProblemController(UserProblemService userProblemService) { + this.userProblemService = userProblemService; + } + + // 특정 문제세트 안의 모든 문제 조회 + @GetMapping("/sets/{userProblemSetId}") + public ResponseEntity>> getProblemsByUserProblemSetId( + @PathVariable Long userProblemSetId + ) { + try { + List problems = userProblemService.getProblemsByUserProblemSetId(userProblemSetId); + + if (problems == null || problems.isEmpty()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(ApiResponse.failure(HttpStatus.NOT_FOUND, "해당 문제세트에 등록된 문제가 없습니다.")); + } + + return ResponseEntity.status(HttpStatus.OK) + .body(ApiResponse.success(HttpStatus.OK, "문제 목록 조회 성공", problems)); + + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(ApiResponse.failure(HttpStatus.INTERNAL_SERVER_ERROR, "서버 오류로 문제 목록을 조회하지 못했습니다.")); + } + } + + // user_problem테이블에 문제들 일괄 등록 + @PostMapping("/sets/{userProblemSetId}") + public ResponseEntity> createUserProblems( + @PathVariable Long userProblemSetId, + @RequestBody List userProblems, + HttpSession session + ) { + Long memberId = (Long) session.getAttribute("memberId"); + if (memberId == null) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED) + .body(ApiResponse.failure(HttpStatus.UNAUTHORIZED, "로그인이 필요합니다.")); + } + + try { + // 세트 ID 세팅 + for (UserProblem p : userProblems) { + p.setUserProblemSetId(userProblemSetId); + } + + int inserted = userProblemService.addUserProblems(userProblems); + + if (inserted == 0) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(ApiResponse.failure(HttpStatus.BAD_REQUEST, "문제 등록에 실패했습니다.")); + } + + return ResponseEntity.status(HttpStatus.CREATED) + .body(ApiResponse.success(HttpStatus.CREATED, "문제 등록 성공", null)); + + } catch (IllegalArgumentException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage())); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(ApiResponse.failure(HttpStatus.INTERNAL_SERVER_ERROR, "서버 오류로 문제를 등록하지 못했습니다.")); + } + } + + // 문제 수정 + @PutMapping("/{userProblemId}") + public ResponseEntity> updateUserProblem( + @PathVariable Long userProblemId, + @RequestBody UserProblem userProblem, + HttpSession session + ) { + Long memberId = (Long) session.getAttribute("memberId"); + if (memberId == null) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED) + .body(ApiResponse.failure(HttpStatus.UNAUTHORIZED, "로그인이 필요합니다.")); + } + + try { + userProblem.setUserProblemId(userProblemId); + + int result = userProblemService.updateUserProblem(userProblem); + + if (result == 0) { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(ApiResponse.failure(HttpStatus.NOT_FOUND, "수정할 문제가 존재하지 않습니다.")); + } + + return ResponseEntity.status(HttpStatus.OK) + .body(ApiResponse.success(HttpStatus.OK, "문제 수정 성공", null)); + + } catch (IllegalArgumentException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage())); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(ApiResponse.failure(HttpStatus.INTERNAL_SERVER_ERROR, "서버 오류로 문제를 수정하지 못했습니다.")); + } + } + + // 문제 삭제 + @DeleteMapping("/{userProblemId}") + public ResponseEntity> deleteUserProblem( + @PathVariable Long userProblemId, + HttpSession session + ) { + Long memberId = (Long) session.getAttribute("memberId"); + if (memberId == null) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED) + .body(ApiResponse.failure(HttpStatus.UNAUTHORIZED, "로그인이 필요합니다.")); + } + + try { + int result = userProblemService.deleteUserProblem(userProblemId); + + if (result == 0) { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(ApiResponse.failure(HttpStatus.NOT_FOUND, "삭제할 문제가 존재하지 않습니다.")); + } + + return ResponseEntity.status(HttpStatus.OK) + .body(ApiResponse.success(HttpStatus.OK, "문제 삭제 성공", null)); + + } catch (IllegalArgumentException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage())); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(ApiResponse.failure(HttpStatus.INTERNAL_SERVER_ERROR, "서버 오류로 문제를 삭제하지 못했습니다.")); + } + } +} diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/UserProblemSetController.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/UserProblemSetController.java new file mode 100644 index 0000000..b60fe26 --- /dev/null +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/controller/UserProblemSetController.java @@ -0,0 +1,139 @@ +package com.codeboy.mvc.controller; + +import com.codeboy.mvc.model.dto.UserProblemSet; +import com.codeboy.mvc.model.dto.response.ApiResponse; // 실제 패키지에 맞게 수정 +import com.codeboy.mvc.model.service.UserProblemSetService; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpSession; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/user-problem-sets") +@Tag(name="User-problems-sets RESTful API", description = "User-problems-sets CRUD를 할 수 있는 REST API") + +public class UserProblemSetController { + + + private final UserProblemSetService userProblemSetService; + + public UserProblemSetController(UserProblemSetService userProblemSetService) { + this.userProblemSetService = userProblemSetService; + } + + // 모든 문제 세트 조회 + @GetMapping + public ResponseEntity>> getAllUserProblemSets() { + try { + List sets = userProblemSetService.getAllUserProblemSets(); + return ResponseEntity.status(HttpStatus.OK) + .body(ApiResponse.success(HttpStatus.OK, "유저 문제세트 전체 조회 성공", sets)); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(ApiResponse.failure(HttpStatus.INTERNAL_SERVER_ERROR, "서버 오류로 문제세트를 조회하지 못했습니다.")); + } + } + + // 마이페이지 - 내가 만든 문제세트 조회 + @GetMapping("/me") + public ResponseEntity> getMyUserProblemSet(HttpSession session) { + Long memberId = (Long) session.getAttribute("memberId"); + if (memberId == null) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED) + .body(ApiResponse.failure(HttpStatus.UNAUTHORIZED, "로그인이 필요합니다.")); + } + + try { + UserProblemSet set = userProblemSetService.getUserProblemSetByMemberId(memberId); + + if (set == null) { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(ApiResponse.failure(HttpStatus.NOT_FOUND, "등록된 유저 문제세트가 없습니다.")); + } + + return ResponseEntity.status(HttpStatus.OK) + .body(ApiResponse.success(HttpStatus.OK, "나의 유저 문제세트 조회 성공", set)); + + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(ApiResponse.failure(HttpStatus.INTERNAL_SERVER_ERROR, "서버 오류로 나의 문제세트를 조회하지 못했습니다.")); + } + } + + // 마이페이지 - 문제세트 생성 + @PostMapping + public ResponseEntity> createMyUserProblemSet(HttpSession session) { + Long memberId = (Long) session.getAttribute("memberId"); + if (memberId == null) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED) + .body(ApiResponse.failure(HttpStatus.UNAUTHORIZED, "로그인이 필요합니다.")); + } + + try { + //문제 세트가 생성되기전에는 PK가 존재하질 않아서 + //문제세트를 등록함과 동시에 이 PK값을 UserProblemController에도 넘겨줘야함. + //따라서 UserProblemSet 객체를 생성하여 memberId를 세팅해서 넘겨줌, + //프론트에서 이를 받아서 다시 문제 하나하나를 user_problem테이블에 저장 할 때 이 userProblemSetId를 같이 넘겨줘야함. + //이 부분은 프론트와 백엔드간의 협의가 필요. + //UserProblemSetMapper에도 generateKey를 추가해서 PK값을 set에 담을 수 있었다. + UserProblemSet set = new UserProblemSet(); + set.setMemberId(memberId); + System.out.println(set); + + int result = userProblemSetService.createUserProblemSet(set); + if (result == 0) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(ApiResponse.failure(HttpStatus.BAD_REQUEST, "유저 문제세트 생성에 실패했습니다.")); + } + + return ResponseEntity.status(HttpStatus.CREATED) + .body(ApiResponse.success(HttpStatus.CREATED, "유저 문제세트 생성 성공", null)); + + } catch (IllegalArgumentException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage())); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(ApiResponse.failure(HttpStatus.INTERNAL_SERVER_ERROR, "서버 오류로 문제세트를 생성하지 못했습니다.")); + } + } + + // 마이페이지 - 문제세트 삭제 + @DeleteMapping("/{userProblemSetId}") + public ResponseEntity> deleteUserProblemSet( + @PathVariable Long userProblemSetId, + HttpSession session + ) { + Long memberId = (Long) session.getAttribute("memberId"); + if (memberId == null) { + return ResponseEntity.status(HttpStatus.UNAUTHORIZED) + .body(ApiResponse.failure(HttpStatus.UNAUTHORIZED, "로그인이 필요합니다.")); + } + + // TODO: userProblemSetId가 memberId가 만든 세트인지 owner 체크 로직을 Service/Dao에 추가하면 더 안전함 + + try { + int result = userProblemSetService.deleteUserProblemSet(userProblemSetId); + + if (result == 0) { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(ApiResponse.failure(HttpStatus.NOT_FOUND, "삭제할 유저 문제세트가 존재하지 않습니다.")); + } + + return ResponseEntity.status(HttpStatus.OK) + .body(ApiResponse.success(HttpStatus.OK, "유저 문제세트 삭제 성공", null)); + + } catch (IllegalArgumentException e) { + return ResponseEntity.status(HttpStatus.BAD_REQUEST) + .body(ApiResponse.failure(HttpStatus.BAD_REQUEST, e.getMessage())); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(ApiResponse.failure(HttpStatus.INTERNAL_SERVER_ERROR, "서버 오류로 문제세트를 삭제하지 못했습니다.")); + } + } +} diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/CommentDao.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/CommentDao.java index df05e7e..1f75116 100644 --- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/CommentDao.java +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/CommentDao.java @@ -2,14 +2,24 @@ import java.util.List; +import org.apache.ibatis.annotations.Mapper; + import com.codeboy.mvc.model.dto.Comment; +@Mapper public interface CommentDao { - public List selectAllByProblemId(long problemId); - - public void insertComment(Comment comment); + public List selectCommentsByuserProblemSetId(Long userProblemSetId); + + //유저문제세트 id에다가 댓글을 달아야하므로 long userProblemSetId으로 지정 + public int insertComment(Long userProblemSetId, Comment comment); - public void updateComment(Comment comment); + //조회된 댓글의 id를 가져와서 수정하고 삭제함. + public int updateComment(Long commentId, Comment comment); + + //조회된 댓글의 id를 가져와서 수정하고 삭제함. + public int deleteComment(Long commentId); + + //댓글아이디로 댓글 작성자의 아이디를 가져옴 + public Long selectCommentOwnerId(Long commentId); - public void deleteComment(long commentId); } diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/IncorrectNoteDao.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/IncorrectNoteDao.java index 5a617b2..2782bb9 100644 --- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/IncorrectNoteDao.java +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/IncorrectNoteDao.java @@ -1,17 +1,32 @@ package com.codeboy.mvc.model.dao; import java.util.List; +import java.util.Map; -import com.codeboy.mvc.model.dto.Problem; +import com.codeboy.mvc.model.dto.response.IncorrectNoteResponse; +import org.apache.ibatis.annotations.Mapper; +@Mapper public interface IncorrectNoteDao { //유저의 아이디로 유저가 틀린 문제들의 모음을 조회 - public List selectIncorrectProblems(long memberId); + //sql의 관점에서 + // + public List selectIncorrectProblems(Long memberId); //유저가 자신의 오답노트 안에서 문제를 삭제 - public void deleteIncorrectProblem(long memberId, long problemId); - + public int deleteIncorrectProblem(Long incorrectNoteId); + //오답노트에 문제 추가 - public void insertIncorrectProblem(long memberId, long problemId); + public void insertIncorrectProblem(Map params); + + //문제 존재 여부 체크 + boolean existsProblemById(Long problemId); + + //유저 문제 존재 여부 체크 + boolean existsUserProblemById(Long userProblemId); + + //incorrectNoteId 존재 여부 체크 + boolean existsIncorrectNoteById(Long incorrectNoteId); + } diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/MemberDao.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/MemberDao.java index 6615b7c..b1dc5e2 100644 --- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/MemberDao.java +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/MemberDao.java @@ -1,18 +1,38 @@ package com.codeboy.mvc.model.dao; import com.codeboy.mvc.model.dto.Member; -import com.codeboy.mvc.model.dto.MemberUpdateRequest; - +import com.codeboy.mvc.model.dto.request.MemberUpdateRequest; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +@Mapper public interface MemberDao { - public void insertMember(Member member); - - public Member selectMember(String id, String password); - - //멤버 삭제 -> db에서는 status 변경 - public void delete(int memberId); - + int insertMember(Member member); + + Member selectMemberById(Long memberId); + + //멤버 삭제 -> db에서는 status 변경 + int deactivateMemberById(Long memberId); + //멤버 업데이트 -> db에서는 patch(nickname, email, id) - public void updateMember(long memberId, MemberUpdateRequest memberUpdateRequest); + int updateMemberById(@Param("memberId") Long memberId, @Param("update") MemberUpdateRequest memberUpdateRequest); + + //아이디 중복 체크 + Boolean existsId(String id); + + //닉네임 중복 체크 + Boolean existsNickname(String nickname); + + //이메일 중복 체크 + Boolean existsEmail(String email); + + //멤버가 활성화 상태인지 확인 + Boolean isMemberActive(Long memberId); + + // 회원 비활성화(탈퇴) - status, isDeleted 업데이트 + int deleteMember(long memberId); + + // 로그인 - ID와 password로 회원 조회 + Member selectMemberByIdAndPassword(@Param("id") String id, @Param("password") String password); } diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/ProblemDao.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/ProblemDao.java index d98bc01..8cbad50 100644 --- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/ProblemDao.java +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/ProblemDao.java @@ -4,9 +4,11 @@ import com.codeboy.common.Category; import com.codeboy.mvc.model.dto.Problem; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +@Mapper public interface ProblemDao { //문제 조회 - public List selectProblem(Category category); - + public List selectProblem(@Param("limit") int limit, @Param("category") Category category); } \ No newline at end of file diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/QuizRoomDao.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/QuizRoomDao.java index 67a7ce4..60f8a2d 100644 --- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/QuizRoomDao.java +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/QuizRoomDao.java @@ -4,28 +4,32 @@ import com.codeboy.mvc.model.dto.QuizRoom; import com.codeboy.mvc.model.dto.QuizRoomMember; +import com.codeboy.mvc.model.dto.response.GetQuizRoomMembersResponse; +import org.apache.ibatis.annotations.Mapper; +@Mapper public interface QuizRoomDao { - //quiz_room 테이블. 퀴즈룸 생성. 생성된 퀴즈룸 id 반환 - public int insertQuizRoom(); - - //quiz_room_member 테이블에 값 넣기 (퀴즈방 입장) - 참가자/호스트 - public void insertMemberToQuizRoom(QuizRoomMember quizRoomMember); + public void insertQuizRoom(QuizRoom room); - + //quiz_room_member 테이블에 값 넣기 (퀴즈방 입장) - 참가자/호스트 + public int insertMemberToQuizRoom(QuizRoomMember quizRoomMember); //모든 퀴즈룸 조회하기 public List selectAllQuizRoom(); - - //하나의 퀴즈룸 조회(참가 멤버확인) - public List selectOneQuizRoom(int roomId); - + public List selectOneQuizRoom(Long roomId); + //퀴즈룸 수정 - - //퀴즈룸 삭제 - public void deleteQuizRoom(long roomId); + //TODO : 지금은 멤버가 전체 퀴즈방 테이블에 중복으로 들어가면 에러 터짐 + //TODO : 채팅방이 끝나면 바로 삭제하는 로직 만들어야 함. + + public boolean deleteQuizRoom(Long roomId); + + //퀴즈룸 존재하는지 확인 + public int existsQuizRoom(Long roomId); + //퀴즈룸에 특정 멤버가 있는지 확인 + public int isDuplicatedMember(Long memberId); } diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/ScoreDao.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/ScoreDao.java index 40a981a..f61f3ab 100644 --- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/ScoreDao.java +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/ScoreDao.java @@ -7,15 +7,15 @@ public interface ScoreDao { //스코어 등록 public void insertScore(UserScore userScore); - - //모든 스코어 조회 + + //모든 스코어 조회 public List selectAllUserScore(); - + //한 멤버의 스코어 조회 - public int selectOneUserScore(int memberId); - + public int selectOneUserScore(Long memberId); + //멤버 스코어 업데이트 public void updateUserScore(UserScore userScore); - - + + } diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/UserIncorrectNoteDao.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/UserIncorrectNoteDao.java deleted file mode 100644 index 537c5e1..0000000 --- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/UserIncorrectNoteDao.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.codeboy.mvc.model.dao; - -import java.util.List; - -import com.codeboy.mvc.model.dto.Problem; -import com.codeboy.mvc.model.dto.UserProblem; - -public interface UserIncorrectNoteDao { - - //유저의 아이디로 유저가 틀린 문제들의 모음을 조회 - public List selectUserIncorrectProblems(long memberId); - - //유저가 자신의 오답노트 안에서 문제를 삭제 - public void deleteUserIncorrectProblem(long memberId, long userProblemId); - - //(중간자 테이블)오답노트에 문제 추가 - public void insertUserIncorrectProblem(long memberId, long userProblemId); -} diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/UserProblemDao.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/UserProblemDao.java index b2ad1ff..61f7b11 100644 --- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/UserProblemDao.java +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/UserProblemDao.java @@ -3,23 +3,22 @@ import java.util.List; import com.codeboy.common.Category; -import com.codeboy.mvc.model.dto.Problem; import com.codeboy.mvc.model.dto.UserProblem; public interface UserProblemDao extends ProblemDao{ - - //문제세트 조회 - public List selectUserProblem(Category category); - //문제 생성하기 - public void insertUserProblem(UserProblem userProblem); - - //문제 세트 만들기 - public void insertUserProblemSet(List userProblemList); - - //문제 수정 - public void updateUserProblem(UserProblem userProblem); - - //문제 삭제 - public int deleteUserProblem(int id); + + //유저제작 문제풀이 페이지에서 문제세트를 선택했을때, 그 문제세트에 속한문제들 조회 + List selectProblemsByUserProblemSetId(Long userProblemSetId); + + //문제 생성 시 문제세트를 등록함과 동시에 문제들을 전부 user_problem 테이블에 넣기 + int insertUserProblemList(List userProblems); + + //제작자 본인이 자신의 문제들을 수정하는 로직 + int updateUserProblem(UserProblem userProblem); + + //제작자 본인이 자신의 문제를 삭제하는 로직 + int deleteUserProblemById(Long userProblemId); + + } diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/UserProblemSetDao.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/UserProblemSetDao.java new file mode 100644 index 0000000..3607529 --- /dev/null +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dao/UserProblemSetDao.java @@ -0,0 +1,25 @@ +package com.codeboy.mvc.model.dao; + +import com.codeboy.mvc.model.dto.Problem; +import com.codeboy.mvc.model.dto.UserProblem; +import com.codeboy.mvc.model.dto.UserProblemSet; + +import java.util.List; + +public interface UserProblemSetDao { + //다른 사용자들이 만든 유저제작 문제세트들을 모두 조회 + List selectUserProblemSets(); + + + //마이페이지에서 자신이 제작한 문제세트 조회 + UserProblemSet selectUserProblemSetByMemberId(long memberId); + + //문제 세트 등록 memberId = 문제 제작자만 넘겨주고 문제들은 problemDao에서 insertUserProblem으로 넣음 (마이페이지에서 생성) + int insertUserProblemSet(Long memberId); + + // 문제세트 삭제 (마이페이지에서 삭제) + int deleteUserProblemSetById(Long userProblemSetId); + + + +} diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/Comment.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/Comment.java index 032ad95..bf7599c 100644 --- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/Comment.java +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/Comment.java @@ -13,7 +13,8 @@ @NoArgsConstructor @Getter @Setter -public class Comment { +public class +Comment { private long commentId; private long memberId; private String content; diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/IncorrectNote.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/IncorrectNote.java index f5d7ed0..288ba54 100644 --- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/IncorrectNote.java +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/IncorrectNote.java @@ -15,4 +15,7 @@ public class IncorrectNote { private long incorrectNoteId; private long memberId; private long problemId; + private long userProblemId; + private Boolean isUserProblem; + } diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/Member.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/Member.java index f657755..25f245b 100644 --- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/Member.java +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/Member.java @@ -1,7 +1,9 @@ package com.codeboy.mvc.model.dto; import java.sql.Timestamp; + import com.codeboy.common.Status; + import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Getter; @@ -20,7 +22,10 @@ public class Member { private String nickname; private String email; private Timestamp signupDate; - private Status status; + private Boolean isActive; private Timestamp deletedDate; + + + } diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/MemberUpdateRequest.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/MemberUpdateRequest.java deleted file mode 100644 index eb94e12..0000000 --- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/MemberUpdateRequest.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.codeboy.mvc.model.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@Schema(description="유저 정보 수정 DTO") -public class MemberUpdateRequest { - private String nickName; - private String id; - private String email; -} diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/Problem.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/Problem.java index e93caa9..195d199 100644 --- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/Problem.java +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/Problem.java @@ -22,5 +22,5 @@ public class Problem { private String choice4; private String answer; private Category category; - + } diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/QuizRoom.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/QuizRoom.java index 059c4aa..01ca516 100644 --- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/QuizRoom.java +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/QuizRoom.java @@ -13,4 +13,6 @@ @Schema(description="퀴즈방 DTO") public class QuizRoom { private long roomId; + + } diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/QuizRoomMember.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/QuizRoomMember.java index d6cdd6e..8079a50 100644 --- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/QuizRoomMember.java +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/QuizRoomMember.java @@ -12,8 +12,34 @@ @Setter @Schema(description="회원 퀴즈방 중간 DTO") public class QuizRoomMember { - private long quizRoomMemberId; - private long memberId; - private long roomId; + private Long quizRoomMemberId; + private Long memberId; + private Long roomId; private Boolean isHost; + public Long getQuizRoomMemberId() { + return quizRoomMemberId; + } + public void setQuizRoomMemberId(long quizRoomMemberId) { + this.quizRoomMemberId = quizRoomMemberId; + } + public Long getMemberId() { + return memberId; + } + public void setMemberId(long memberId) { + this.memberId = memberId; + } + public Long getRoomId() { + return roomId; + } + public void setRoomId(long roomId) { + this.roomId = roomId; + } + public Boolean getIsHost() { + return isHost; + } + public void setIsHost(Boolean isHost) { + this.isHost = isHost; + } + + } diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/UserProblem.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/UserProblem.java index fa4f9b3..85aecc3 100644 --- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/UserProblem.java +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/UserProblem.java @@ -14,7 +14,7 @@ @Getter @Setter public class UserProblem { - private long userProblemId; + private Long userProblemId; private String problemDescription; private Category category; private String choice1; @@ -23,5 +23,5 @@ public class UserProblem { private String choice4; private String answer; private int commentCount; - private long userProblemSetId; + private Long userProblemSetId; } diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/UserProblemSet.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/UserProblemSet.java index d460eb4..9a90aa1 100644 --- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/UserProblemSet.java +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/UserProblemSet.java @@ -5,13 +5,15 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import lombok.ToString; @Schema(description = "유저제작문제세트 DTO") @NoArgsConstructor @AllArgsConstructor @Getter @Setter +@ToString public class UserProblemSet { - private long userProblemSetId; - private long memberId; + private Long userProblemSetId; + private Long memberId; } diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/UserScore.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/UserScore.java index e65a711..03c3747 100644 --- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/UserScore.java +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/UserScore.java @@ -15,6 +15,6 @@ public class UserScore { private long memberId; private int score; - + } diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/CommentUpdateRequest.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/CommentUpdateRequest.java new file mode 100644 index 0000000..5614319 --- /dev/null +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/CommentUpdateRequest.java @@ -0,0 +1,17 @@ +package com.codeboy.mvc.model.dto.request; + + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +public class CommentUpdateRequest { + //댓글을 업데이트할 때 content만 수정하니 수정할 content만 전달하는 DTO + private String content; + private long memberId; +} diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/DuplicateCheckRequest.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/DuplicateCheckRequest.java new file mode 100644 index 0000000..8a366f4 --- /dev/null +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/DuplicateCheckRequest.java @@ -0,0 +1,14 @@ +package com.codeboy.mvc.model.dto.request; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Setter +public class DuplicateCheckRequest { + private String value; +} diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/IncorrectNoteRequest.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/IncorrectNoteRequest.java new file mode 100644 index 0000000..ffc92f4 --- /dev/null +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/IncorrectNoteRequest.java @@ -0,0 +1,14 @@ +package com.codeboy.mvc.model.dto.request; + +import lombok.*; + +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Setter +@ToString +public class IncorrectNoteRequest { + private Long problemId; + private Long userProblemId; + private Boolean isUserProblem; +} diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/JoinQuizRoomRequest.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/JoinQuizRoomRequest.java new file mode 100644 index 0000000..079bd8c --- /dev/null +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/JoinQuizRoomRequest.java @@ -0,0 +1,14 @@ +package com.codeboy.mvc.model.dto.request; + +import lombok.*; + +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Setter +@ToString +public class JoinQuizRoomRequest { + private long memberId; + private long roomId; + +} diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/LoginRequest.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/LoginRequest.java new file mode 100644 index 0000000..3ddd898 --- /dev/null +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/LoginRequest.java @@ -0,0 +1,16 @@ +package com.codeboy.mvc.model.dto.request; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +@AllArgsConstructor +@NoArgsConstructor +@Setter +@Getter +public class LoginRequest { + //로그인을 할 때에는 id와 password만 사용하니 이를 간편하게 전달하기 위한 DTO + private String id; + private String password; + +} diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/MemberUpdateRequest.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/MemberUpdateRequest.java new file mode 100644 index 0000000..c8b5e96 --- /dev/null +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/request/MemberUpdateRequest.java @@ -0,0 +1,18 @@ +package com.codeboy.mvc.model.dto.request; + + import io.swagger.v3.oas.annotations.media.Schema; + import lombok.AllArgsConstructor; + import lombok.Getter; + import lombok.NoArgsConstructor; + import lombok.Setter; + +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +@Schema(description="유저 정보 수정 DTO") +public class MemberUpdateRequest { + private String nickname; + private String id; + private String email; +} diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/response/ApiResponse.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/response/ApiResponse.java new file mode 100644 index 0000000..f257350 --- /dev/null +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/response/ApiResponse.java @@ -0,0 +1,34 @@ +package com.codeboy.mvc.model.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.http.HttpStatus; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ApiResponse { + private HttpStatus status; + private String message; + private T data; + +// public ApiResponse(HttpStatus status, String message, T data) { +// super(); +// this.status = status; +// this.message = message; +// this.data = data; +// } + + public static ApiResponse success(HttpStatus status, T data) { + return new ApiResponse(status, null, data); + } + + public static ApiResponse success(HttpStatus status, String message, T data) { + return new ApiResponse(status, message, data); + } + + public static ApiResponse failure(HttpStatus status, String message) { + return new ApiResponse(status, message, null); + } +} diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/response/DuplicateCheckResponse.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/response/DuplicateCheckResponse.java new file mode 100644 index 0000000..17a6543 --- /dev/null +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/response/DuplicateCheckResponse.java @@ -0,0 +1,15 @@ +package com.codeboy.mvc.model.dto.response; + + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +public class DuplicateCheckResponse { + private boolean duplicated; +} diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/response/GetQuizRoomMembersResponse.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/response/GetQuizRoomMembersResponse.java new file mode 100644 index 0000000..9ec59ed --- /dev/null +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/response/GetQuizRoomMembersResponse.java @@ -0,0 +1,13 @@ +package com.codeboy.mvc.model.dto.response; + +import lombok.*; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +public class GetQuizRoomMembersResponse { + private Long memberId; + private String nickname; +} diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/response/IncorrectNoteResponse.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/response/IncorrectNoteResponse.java new file mode 100644 index 0000000..f86a4c2 --- /dev/null +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/dto/response/IncorrectNoteResponse.java @@ -0,0 +1,20 @@ +package com.codeboy.mvc.model.dto.response; + +import com.codeboy.common.Category; +import lombok.*; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +public class IncorrectNoteResponse { + private Long incorrectNoteId; + private String problemDescription; + private String choice1; + private String choice2; + private String choice3; + private String choice4; + private String answer; + private Category category; +} diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/CommentService.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/CommentService.java index 962d5ec..d1b02dd 100644 --- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/CommentService.java +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/CommentService.java @@ -1,5 +1,24 @@ package com.codeboy.mvc.model.service; -public class CommentService { +import java.util.List; + +import com.codeboy.mvc.model.dto.Comment; + +public interface CommentService { + /** + * 유저제작 문제 세트Id로 조회 + * @param userProblemSetId + * @return + */ + public List getAllCommentsById(Long userProblemSetId); + + //유저제작 문제 세트Id로 조회후 해당 세트에 댓글 작성 + public int addComment(Long userProblemSetId, Comment comment); +// + public int updateComment(Long commentId, Comment comment); +// + public int deleteComment(Long commentId); + + public Long getCommentOwnerId(Long commentId); } diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/CommentServiceImpl.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/CommentServiceImpl.java new file mode 100644 index 0000000..2d1dedd --- /dev/null +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/CommentServiceImpl.java @@ -0,0 +1,58 @@ +package com.codeboy.mvc.model.service; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.codeboy.mvc.model.dao.CommentDao; +import com.codeboy.mvc.model.dto.Comment; + +@Service +public class CommentServiceImpl implements CommentService { + + private final CommentDao commentDao; + + @Autowired + public CommentServiceImpl(CommentDao commentDao) { + this.commentDao = commentDao; + } + + + + // 유저제작 문제 세트Id로 조회 + @Override + public List getAllCommentsById(Long userProblemSetId) { + return commentDao.selectCommentsByuserProblemSetId(userProblemSetId); + } + + @Override + public int addComment(Long userProblemSetId, Comment comment ) { + + return commentDao.insertComment(userProblemSetId, comment); + } + + + + @Override + public int updateComment(Long commentId, Comment comment) { + return commentDao.updateComment(commentId, comment); + + } + + + + @Override + public int deleteComment(Long commentId) { + return commentDao.deleteComment(commentId); + + } + + + @Override + public Long getCommentOwnerId(Long commentId){ + return commentDao.selectCommentOwnerId(commentId); + } + + +} diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/IncorrectNoteService.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/IncorrectNoteService.java index e8d653a..a3a64b2 100644 --- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/IncorrectNoteService.java +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/IncorrectNoteService.java @@ -1,5 +1,78 @@ package com.codeboy.mvc.model.service; +import com.codeboy.mvc.model.dao.IncorrectNoteDao; +import com.codeboy.mvc.model.dto.response.IncorrectNoteResponse; +import org.apache.ibatis.javassist.NotFoundException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.math.BigInteger; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service public class IncorrectNoteService { + @Autowired + private IncorrectNoteDao incorrectNoteDao; + + public Long addIncorrectNote(Long memberId, Long problemId, Long userProblemId, Boolean isUserProblem) { + if (!isUserProblem) { + boolean exists = incorrectNoteDao.existsProblemById(problemId); + if (!exists) { + throw new IllegalArgumentException("DB에 존재하지 않는 문제 ID입니다.:" + problemId); + } + } else { + boolean exists = incorrectNoteDao.existsUserProblemById(userProblemId); + if (!exists) { + throw new IllegalArgumentException("DB에 존재하지 않는 유저문제 ID입니다.:" + userProblemId); + } + } + + //TODO : DB에 존재하는지 검증하는 로직 필요 + if (memberId == null) { + throw new IllegalArgumentException("유효하지 않은 회원 ID입니다.: " + memberId); + } + if ((!isUserProblem && (problemId == null || userProblemId != null)) || + (isUserProblem && (problemId != null || userProblemId == null))) { + throw new IllegalArgumentException("유효하지 않은 문제 ID 입니다.:" ); + } + + Map params = new HashMap<>(); + params.put("memberId", memberId); + params.put("problemId", problemId); + params.put("userProblemId", userProblemId); + params.put("isUserProblem", isUserProblem); + + params.put("incorrectNoteId", null); + + incorrectNoteDao.insertIncorrectProblem(params); + + BigInteger id = (BigInteger) params.get("incorrectNoteId"); + return id != null ? id.longValue() : null; + + } + + public List getIncorrectNoteList(Long memberId) throws NotFoundException { + //TODO : DB에 존재하는지 검증하는 로직 +// if (memberId == null || !memberDao.existsById(memberId)) { +// throw new IllegalArgumentException("유효하지 않은 회원 ID입니다."); +// } + if (memberId == null) { + throw new IllegalArgumentException("유효하지 않은 회원 ID입니다."); + } + List list = incorrectNoteDao.selectIncorrectProblems(memberId); + + if (list == null || list.isEmpty()) { + throw new NotFoundException("오답노트를 조회할 수 없습니다."); + } + return list; + } + public void deleteIncorrectNote(long incorrectNoteId) { + boolean exists = incorrectNoteDao.existsIncorrectNoteById(incorrectNoteId); + if (!exists) { + throw new IllegalArgumentException("DB에 존재하지 않는 오답노트ID 입니다.: " + incorrectNoteId); + } + incorrectNoteDao.deleteIncorrectProblem(incorrectNoteId); + } } diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/MemberService.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/MemberService.java index 90316ff..697bd31 100644 --- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/MemberService.java +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/MemberService.java @@ -1,19 +1,31 @@ package com.codeboy.mvc.model.service; import com.codeboy.mvc.model.dto.Member; -import com.codeboy.mvc.model.dto.MemberUpdateRequest; -import com.codeboy.mvc.model.dto.MemberUpdateRequest; +import com.codeboy.mvc.model.dto.request.MemberUpdateRequest; public interface MemberService { - //회원가입 - public void signupMember(); - //회원 정보 가져오기기 - public Member readMember(String id, String password); + // 회원정보 조회 + Member getMemberById(Long memberId); - //회원 탈퇴 - public void withdrawal(int memberId); + // 회원 탈퇴 + void deactivateMember(Long memberId); + + // 회원 정보 수정 + void updateMember(Long memberId, MemberUpdateRequest memberUpdateRequest); + + // 중복검사 (ID) + boolean checkIdDuplicate(String id); + + // 중복검사 (Nickname) + boolean checkNicknameDuplicate(String nickname); + + // 중복검사 (Email) + boolean checkEmailDuplicate(String email); + + int signUp(Member member); + - //회원정보 수정-> db에서는 patch(nickname, email, id) - public void updateMember(long memberId, MemberUpdateRequest memberUpdateRequest); + // 로그인 + Member login(String id, String password); } diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/MemberServiceImpl.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/MemberServiceImpl.java new file mode 100644 index 0000000..b7fb51a --- /dev/null +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/MemberServiceImpl.java @@ -0,0 +1,118 @@ +package com.codeboy.mvc.model.service; + +import com.codeboy.mvc.model.dao.MemberDao; +import com.codeboy.mvc.model.dto.Member; +import com.codeboy.mvc.model.dto.request.MemberUpdateRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.NoSuchElementException; + +@Service +public class MemberServiceImpl implements MemberService { + @Autowired + MemberDao memberDao; + + //회원 정보 가져오기기 + public Member getMemberById(Long memberId) { + isMemberExist(memberId); + + Member member = memberDao.selectMemberById(memberId); + if (member == null) { + throw new NoSuchElementException("Id에 해당하는 회원 정보를 찾을 수 없습니다. memberId:" + memberId); + } + return member; + }; + + //회원 탈퇴 + public void deactivateMember(Long memberId){ + isMemberExist(memberId); + + int updatedRows = memberDao.deactivateMemberById(memberId); + if (updatedRows == 0) { + throw new IllegalStateException("회원 탈퇴 실패 : memberId: " + memberId); + } + } + + + public void updateMember(Long memberId, MemberUpdateRequest memberUpdateRequest){ + isMemberExist(memberId); + //중복된 id, email이 있는지 검증 로직 + String id = memberUpdateRequest.getId(); + String nickname = memberUpdateRequest.getNickname(); + String email = memberUpdateRequest.getEmail(); + validateMemberUpdate(id, nickname, email); + + int affectedRows = memberDao.updateMemberById(memberId, memberUpdateRequest); + + if (affectedRows == 0) { + throw new IllegalStateException("회원 정보 수정에 실패하였습니다. memberId: " + memberId); + } + + }; + public boolean checkIdDuplicate(String id) { + if (id == null) { + throw new IllegalArgumentException("유효하지 않은 Id 입니다."); + } + return memberDao.existsId(id); + } + + public boolean checkNicknameDuplicate(String nickname ) { + if (nickname == null) { + throw new IllegalArgumentException("유효하지 않은 Id 입니다."); + } + return memberDao.existsNickname(nickname); + } + + public boolean checkEmailDuplicate(String email) { + if (email == null) { + throw new IllegalArgumentException("유효하지 않은 Id 입니다."); + } + return memberDao.existsEmail(email); + } + + @Override + public int signUp(Member member) { + return memberDao.insertMember(member); + } + + public void isMemberExist(Long memberId) { + if (memberId == null) { + throw new IllegalArgumentException("유효하지 않은 memberId입니다. memberId: " ); + } + + boolean isActive = memberDao.isMemberActive(memberId); + if (!isActive) { + throw new IllegalArgumentException("비활성화된 멤버 id 입니다. memberId: " + memberId); + } + } + + // 최종 제출 시 전체 검증 + public void validateMemberUpdate(String id, String nickname, String email) { + if (id != null && memberDao.existsId(id)) { + throw new IllegalArgumentException("중복된 ID입니다."); + } + if (nickname != null && memberDao.existsNickname(nickname)) { + throw new IllegalArgumentException("중복된 닉네임입니다."); + } + if (email != null && memberDao.existsEmail(email)) { + throw new IllegalArgumentException("중복된 이메일입니다."); + } + } + + // 로그인 + public Member login(String id, String password) { + if (id == null || password == null) { + throw new IllegalArgumentException("ID와 비밀번호를 입력해주세요."); + } + + Member member = memberDao.selectMemberByIdAndPassword(id, password); + if (member == null) { + throw new IllegalArgumentException("ID 또는 비밀번호가 올바르지 않습니다."); + } + + return member; + } + + +}; \ No newline at end of file diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/ProblemService.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/ProblemService.java index 959188b..bd2fd88 100644 --- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/ProblemService.java +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/ProblemService.java @@ -1,5 +1,14 @@ package com.codeboy.mvc.model.service; -public class ProblemService { +import com.codeboy.common.Category; +import com.codeboy.mvc.model.dto.Problem; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public interface ProblemService { + + public List getProblems(int limit, Category category); } diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/ProblemServiceImpl.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/ProblemServiceImpl.java new file mode 100644 index 0000000..38ead0c --- /dev/null +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/ProblemServiceImpl.java @@ -0,0 +1,34 @@ +package com.codeboy.mvc.model.service; + +import com.codeboy.common.Category; +import com.codeboy.mvc.model.dao.ProblemDao; +import com.codeboy.mvc.model.dto.Problem; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ProblemServiceImpl implements ProblemService{ + @Autowired + private ProblemDao problemDao; + + @Override + public List getProblems(int limit, Category category) { + if (limit <= 0) { + throw new IllegalArgumentException("limit의 수는 0이상이어야 합니다. limit: " + limit); + } + if (category == null) { + throw new IllegalArgumentException("category의 값은 null이 될 수 없습니다. : category: "); + } + List problems = problemDao.selectProblem(limit,category); + + //만약 요청 수보다 존재하는 문제 수가 적다면 + if (limit > problems.size()) { + throw new IllegalArgumentException("limit의 값은 문제 수보다 클 수 없습니다. problems: " + problems.size()); + } + + return problems; + } + +} diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/QuizRoomService.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/QuizRoomService.java index cd3f65e..ea246e0 100644 --- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/QuizRoomService.java +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/QuizRoomService.java @@ -2,22 +2,84 @@ import java.util.List; +import com.codeboy.mvc.model.dto.response.GetQuizRoomMembersResponse; +import org.springframework.beans.factory.annotation.Autowired; + +import com.codeboy.mvc.model.dao.QuizRoomDao; import com.codeboy.mvc.model.dto.QuizRoom; +import com.codeboy.mvc.model.dto.QuizRoomMember; +import org.springframework.stereotype.Service; + +@Service +public class QuizRoomService{ + @Autowired + private QuizRoomDao quizRoomDao; + + public List getQuizRoomList() { + List quizRooms = quizRoomDao.selectAllQuizRoom(); + if (quizRooms == null) { + throw new IllegalStateException("퀴즈방 정보를 가져오지 못했습니다"); + } + return quizRooms; + } + + public List getOneQuizRoomMember(long roomId) { + validateRoomId(roomId); + + List memberList = quizRoomDao.selectOneQuizRoom(roomId); + if (memberList.isEmpty()) { + throw new IllegalStateException("퀴즈방에 참가자가 없습니다."); + } + return memberList; + } + + public long createQuizRoom() { + QuizRoom room = new QuizRoom(); + quizRoomDao.insertQuizRoom(room); + + Long roomId = room.getRoomId(); + + validateRoomId(roomId); + return roomId; + } + + public void joinQuizRoom(QuizRoomMember quizRoomMember) { + Long memberId = quizRoomMember.getMemberId(); + Long roomId = quizRoomMember.getRoomId(); + validateRoomId(roomId); + memberDuplicateCheck(memberId); + + //멤버 id가 실제로 존재하는지 확인 + if (memberId == null) { + throw new IllegalArgumentException("멤버 ID가 유효하지 않습니다. :" ); + } + //TODO : 채팅방 참여 인원이 초과되었는지 검증하는 로직 추가 + int rowAffected = quizRoomDao.insertMemberToQuizRoom(quizRoomMember); + if (rowAffected <= 0) { + throw new IllegalStateException("퀴즈방 입장에 실패하였습니다."); + } + } + + public void deleteQuizRoom(long roomId) { + validateRoomId(roomId); + boolean deleted = quizRoomDao.deleteQuizRoom(roomId); + if (!deleted) { + throw new IllegalStateException("퀴즈방 삭제에 실패했습니다."); + } + } + + private void validateRoomId(Long roomId) { + boolean existRoom = quizRoomDao.existsQuizRoom(roomId) > 0; + if (roomId == null || roomId <= 0 || !existRoom) { + throw new IllegalArgumentException("퀴즈방 ID가 유효하지 않습니다. : " + roomId); + } + } + + private void memberDuplicateCheck(Long memberId) { + boolean duplicated = quizRoomDao.isDuplicatedMember(memberId) > 0; + if (duplicated) { + throw new IllegalArgumentException("한 멤버는 하나의 채팅방에만 들어갈 수 있습니다."); + } + } -public interface QuizRoomService { - - //퀴즈방 전체 조회 - public List getQuizRoomList(); - - //퀴즈 방 만들기 -> 생성된 퀴즈방 id를 return - //퀴즈방 생성하고 생성된 퀴즈방에 방장 id 넣기 - public int createQuizRoom(long memberId); - - //참가자 채팅방 입장 - public void joinQuizRoom(long memberId, long quizRoomId); - - //퀴즈룸 삭제 - public boolean deleteQuizRoom() - - } diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/UserProblemService.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/UserProblemService.java index c315c3b..2a25a51 100644 --- a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/UserProblemService.java +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/UserProblemService.java @@ -1,5 +1,16 @@ package com.codeboy.mvc.model.service; -public class UserProblemService { +import com.codeboy.mvc.model.dto.UserProblem; +import java.util.List; + +public interface UserProblemService { + + List getProblemsByUserProblemSetId(Long userProblemSetId); + + int addUserProblems(List userProblems); + + int updateUserProblem(UserProblem userProblem); + + int deleteUserProblem(Long userProblemId); } diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/UserProblemServiceImpl.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/UserProblemServiceImpl.java new file mode 100644 index 0000000..d3c23a5 --- /dev/null +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/UserProblemServiceImpl.java @@ -0,0 +1,46 @@ +package com.codeboy.mvc.model.service; + +import com.codeboy.mvc.model.dao.UserProblemDao; +import com.codeboy.mvc.model.dto.UserProblem; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class UserProblemServiceImpl implements UserProblemService { + + private final UserProblemDao userProblemDao; + + public UserProblemServiceImpl(UserProblemDao userProblemDao) { + this.userProblemDao = userProblemDao; + } + + @Override + public List getProblemsByUserProblemSetId(Long userProblemSetId) { + return userProblemDao.selectProblemsByUserProblemSetId(userProblemSetId); + } + + @Override + public int addUserProblems(List userProblems) { + if (userProblems == null || userProblems.isEmpty()) { + throw new IllegalArgumentException("등록할 문제가 하나 이상 있어야 합니다."); + } + return userProblemDao.insertUserProblemList(userProblems); + } + + @Override + public int updateUserProblem(UserProblem userProblem) { + if (userProblem == null || userProblem.getUserProblemId() == null) { + throw new IllegalArgumentException("수정할 문제를 찾을 수 없습니다. 문제Id를 확인하세요."); + } + return userProblemDao.updateUserProblem(userProblem); + } + + @Override + public int deleteUserProblem(Long userProblemId) { + if (userProblemId == null) { + throw new IllegalArgumentException("삭제할 문제를 찾을 수 없습니다. 삭제할 문제 ID를 확인하세요."); + } + return userProblemDao.deleteUserProblemById(userProblemId); + } +} diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/UserProblemSetService.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/UserProblemSetService.java new file mode 100644 index 0000000..e063488 --- /dev/null +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/UserProblemSetService.java @@ -0,0 +1,15 @@ +package com.codeboy.mvc.model.service; + +import com.codeboy.mvc.model.dto.UserProblemSet; + +import java.util.List; + +public interface UserProblemSetService { + List getAllUserProblemSets(); + + UserProblemSet getUserProblemSetByMemberId(Long memberId); + + int createUserProblemSet(UserProblemSet set); + + int deleteUserProblemSet(Long userProblemSetId); +} diff --git a/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/UserProblemSetServiceImpl.java b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/UserProblemSetServiceImpl.java new file mode 100644 index 0000000..4d15576 --- /dev/null +++ b/codeBoy_backend/src/main/java/com/codeboy/mvc/model/service/UserProblemSetServiceImpl.java @@ -0,0 +1,46 @@ +package com.codeboy.mvc.model.service; + +import com.codeboy.mvc.model.dao.UserProblemSetDao; +import com.codeboy.mvc.model.dto.UserProblemSet; +import org.springframework.stereotype.Service; + + +import java.util.List; + +@Service +public class UserProblemSetServiceImpl implements UserProblemSetService { + + private final UserProblemSetDao userProblemSetDao; + + public UserProblemSetServiceImpl(UserProblemSetDao userProblemSetDao) { + this.userProblemSetDao = userProblemSetDao; + } + + @Override + public List getAllUserProblemSets() { + return userProblemSetDao.selectUserProblemSets(); + } + + @Override + public UserProblemSet getUserProblemSetByMemberId(Long memberId) { + long memberIdl = memberId; + return userProblemSetDao.selectUserProblemSetByMemberId(memberIdl); + } + + @Override + public int createUserProblemSet(UserProblemSet set) { + if (set.getMemberId() == null) { + throw new IllegalArgumentException("회원 ID가 필요합니다."); + } + long memberId = set.getMemberId(); + return userProblemSetDao.insertUserProblemSet(memberId); + } + + @Override + public int deleteUserProblemSet(Long userProblemSetId) { + if (userProblemSetId == null) { + throw new IllegalArgumentException("삭제할 문제세트 ID가 필요합니다."); + } + return userProblemSetDao.deleteUserProblemSetById(userProblemSetId); + } +} diff --git a/codeBoy_backend/src/main/resources/application.properties b/codeBoy_backend/src/main/resources/application.properties index 603f194..b8c6c8d 100644 --- a/codeBoy_backend/src/main/resources/application.properties +++ b/codeBoy_backend/src/main/resources/application.properties @@ -9,7 +9,7 @@ spring.application.name=codeBoy_backend # # spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver -spring.datasource.url=jdbc:mysql://localhost:3306/ssafy_board?serverTimezone=UTC +spring.datasource.url=jdbc:mysql://localhost:3306/board_test?serverTimezone=UTC spring.datasource.username=ssafy spring.datasource.password=ssafy diff --git a/codeBoy_backend/src/main/resources/mappers/CommentMapper.xml b/codeBoy_backend/src/main/resources/mappers/CommentMapper.xml new file mode 100644 index 0000000..21c1d0f --- /dev/null +++ b/codeBoy_backend/src/main/resources/mappers/CommentMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + INSERT INTO comment (member_id, content, comment_date, user_problem_set_id) + VALUES (#{comment.memberId}, #{comment.content}, NOW(), #{userProblemSetId}) + + + + UPDATE comment + SET content = #{comment.content} + WHERE comment_id = #{commentId} + + + + DELETE + FROM comment + WHERE comment_id = #{commentId} + + + + + + diff --git a/codeBoy_backend/src/main/resources/mappers/IncorrectNoteMapper.xml b/codeBoy_backend/src/main/resources/mappers/IncorrectNoteMapper.xml new file mode 100644 index 0000000..b9d4395 --- /dev/null +++ b/codeBoy_backend/src/main/resources/mappers/IncorrectNoteMapper.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + DELETE FROM incorrect_note + WHERE incorrect_note_id = #{incorrectNoteId} + + + + + INSERT INTO incorrect_note (member_id, problem_id, user_problem_id, is_user_problem) + VALUES (#{memberId}, #{problemId}, #{userProblemId}, #{isUserProblem}) + + + \ No newline at end of file diff --git a/codeBoy_backend/src/main/resources/mappers/MemberMapper.xml b/codeBoy_backend/src/main/resources/mappers/MemberMapper.xml new file mode 100644 index 0000000..d253890 --- /dev/null +++ b/codeBoy_backend/src/main/resources/mappers/MemberMapper.xml @@ -0,0 +1,70 @@ + + + + + + + UPDATE member + SET is_active = 0 + WHERE member_id = #{memberId} + + + + UPDATE member + + + nickname = #{update.nickname} + + + id = #{update.id} + + + email = #{update.email} + + + WHERE member_id = #{memberId} + + + + + + + + + + + + INSERT INTO member (ID, password, nickname, email, is_active, signup_date) + VALUES (#{id}, #{password}, #{nickname}, #{email}, 1, NOW()); + + + + + diff --git a/codeBoy_backend/src/main/resources/mappers/ProblemMapper.xml b/codeBoy_backend/src/main/resources/mappers/ProblemMapper.xml index b994f53..c48de03 100644 --- a/codeBoy_backend/src/main/resources/mappers/ProblemMapper.xml +++ b/codeBoy_backend/src/main/resources/mappers/ProblemMapper.xml @@ -1 +1,15 @@ - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/codeBoy_backend/src/main/resources/mappers/QuizRoomMapper.xml b/codeBoy_backend/src/main/resources/mappers/QuizRoomMapper.xml index d5660c4..29115a6 100644 --- a/codeBoy_backend/src/main/resources/mappers/QuizRoomMapper.xml +++ b/codeBoy_backend/src/main/resources/mappers/QuizRoomMapper.xml @@ -3,23 +3,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + INSERT INTO quiz_room() VALUES(); - + parameterType="QuizRoomMember" + > INSERT INTO quiz_room_member(member_id, room_id, is_host) - VALUES(#{memberId, roomId, isHost}); + VALUES(#{memberId}, #{roomId}, #{isHost}); @@ -31,21 +32,35 @@ - - - DELETE FROM quiz_room_member - WHERE room_id = #{roomId} - + DELETE FROM quiz_room WHERE room_id = #{roomId}; + + + + + + - \ No newline at end of file + \ No newline at end of file diff --git a/codeBoy_backend/src/main/resources/mappers/ScoreMapper.xml b/codeBoy_backend/src/main/resources/mappers/ScoreMapper.xml index b994f53..d0b38ce 100644 --- a/codeBoy_backend/src/main/resources/mappers/ScoreMapper.xml +++ b/codeBoy_backend/src/main/resources/mappers/ScoreMapper.xml @@ -1 +1,8 @@ - \ No newline at end of file + + + + + + \ No newline at end of file diff --git a/codeBoy_backend/src/main/resources/mappers/UserMapper.xml b/codeBoy_backend/src/main/resources/mappers/UserMapper.xml deleted file mode 100644 index b994f53..0000000 --- a/codeBoy_backend/src/main/resources/mappers/UserMapper.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/codeBoy_backend/src/main/resources/mappers/UserProblemMapper.xml b/codeBoy_backend/src/main/resources/mappers/UserProblemMapper.xml new file mode 100644 index 0000000..3168486 --- /dev/null +++ b/codeBoy_backend/src/main/resources/mappers/UserProblemMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + INSERT INTO user_problem + (problem_description, category, choice_1, choice_2, choice_3, choice_4, answer, comment_count, user_problem_set_id) + VALUES + + (#{item.problemDescription}, #{item.category}, #{item.choice1}, #{item.choice2}, #{item.choice3}, #{item.choice4}, #{item.answer}, #{item.commentCount}, #{item.userProblemSetId}) + + + + + + + UPDATE user_problem + SET problem_description = #{problemDescription}, + category = #{category}, + choice_1 = #{choice1}, + choice_2 = #{choice2}, + choice_3 = #{choice3}, + choice_4 = #{choice4}, + answer = #{answer}, + comment_count = #{commentCount} + WHERE user_problem_id = #{userProblemId} + + + + + DELETE FROM user_problem + WHERE user_problem_id = #{userProblemId} + + + + + + + diff --git a/codeBoy_backend/src/main/resources/mappers/UserProblemSetMapper.xml b/codeBoy_backend/src/main/resources/mappers/UserProblemSetMapper.xml new file mode 100644 index 0000000..3498e1b --- /dev/null +++ b/codeBoy_backend/src/main/resources/mappers/UserProblemSetMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + INSERT INTO user_problem_set (member_id) + VALUES (#{memberId}) + + + + + DELETE FROM user_problem_set + WHERE user_problem_set_id = #{userProblemSetId} + + + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..e38678b --- /dev/null +++ b/pom.xml @@ -0,0 +1,19 @@ + + 4.0.0 + Backend + Backend + 0.0.1-SNAPSHOT + + codeBoy_backend/src/main/java + codeBoy_backend/src/test/java + + + maven-compiler-plugin + 3.8.1 + + 17 + + + + + \ No newline at end of file diff --git a/target/classes/META-INF/MANIFEST.MF b/target/classes/META-INF/MANIFEST.MF new file mode 100644 index 0000000..b55046a --- /dev/null +++ b/target/classes/META-INF/MANIFEST.MF @@ -0,0 +1,4 @@ +Manifest-Version: 1.0 +Build-Jdk-Spec: 17 +Created-By: Maven Integration for Eclipse + diff --git a/target/classes/META-INF/maven/Backend/Backend/pom.properties b/target/classes/META-INF/maven/Backend/Backend/pom.properties new file mode 100644 index 0000000..4c142b9 --- /dev/null +++ b/target/classes/META-INF/maven/Backend/Backend/pom.properties @@ -0,0 +1,7 @@ +#Generated by Maven Integration for Eclipse +#Fri Nov 28 09:27:07 KST 2025 +m2e.projectLocation=C\:\\minseung\\Backend +m2e.projectName=Backend +groupId=Backend +artifactId=Backend +version=0.0.1-SNAPSHOT diff --git a/target/classes/META-INF/maven/Backend/Backend/pom.xml b/target/classes/META-INF/maven/Backend/Backend/pom.xml new file mode 100644 index 0000000..e38678b --- /dev/null +++ b/target/classes/META-INF/maven/Backend/Backend/pom.xml @@ -0,0 +1,19 @@ + + 4.0.0 + Backend + Backend + 0.0.1-SNAPSHOT + + codeBoy_backend/src/main/java + codeBoy_backend/src/test/java + + + maven-compiler-plugin + 3.8.1 + + 17 + + + + + \ No newline at end of file diff --git a/target/classes/com/codeboy/CodeBoyBackendApplication.class b/target/classes/com/codeboy/CodeBoyBackendApplication.class new file mode 100644 index 0000000..61bc0a9 Binary files /dev/null and b/target/classes/com/codeboy/CodeBoyBackendApplication.class differ diff --git a/target/classes/com/codeboy/common/Category.class b/target/classes/com/codeboy/common/Category.class new file mode 100644 index 0000000..fda0c6a Binary files /dev/null and b/target/classes/com/codeboy/common/Category.class differ diff --git a/target/classes/com/codeboy/common/Status.class b/target/classes/com/codeboy/common/Status.class new file mode 100644 index 0000000..c5f01af Binary files /dev/null and b/target/classes/com/codeboy/common/Status.class differ diff --git a/target/classes/com/codeboy/mvc/config/SwaggerConfig.class b/target/classes/com/codeboy/mvc/config/SwaggerConfig.class new file mode 100644 index 0000000..995d405 Binary files /dev/null and b/target/classes/com/codeboy/mvc/config/SwaggerConfig.class differ diff --git a/target/classes/com/codeboy/mvc/controller/MemberController.class b/target/classes/com/codeboy/mvc/controller/MemberController.class new file mode 100644 index 0000000..172042d Binary files /dev/null and b/target/classes/com/codeboy/mvc/controller/MemberController.class differ diff --git a/target/classes/com/codeboy/mvc/model/dao/CommentDao.class b/target/classes/com/codeboy/mvc/model/dao/CommentDao.class new file mode 100644 index 0000000..26d5a0e Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dao/CommentDao.class differ diff --git a/target/classes/com/codeboy/mvc/model/dao/IncorrectNoteDao.class b/target/classes/com/codeboy/mvc/model/dao/IncorrectNoteDao.class new file mode 100644 index 0000000..da97c4b Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dao/IncorrectNoteDao.class differ diff --git a/target/classes/com/codeboy/mvc/model/dao/MemberDao.class b/target/classes/com/codeboy/mvc/model/dao/MemberDao.class new file mode 100644 index 0000000..775c4f4 Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dao/MemberDao.class differ diff --git a/target/classes/com/codeboy/mvc/model/dao/ProblemDao.class b/target/classes/com/codeboy/mvc/model/dao/ProblemDao.class new file mode 100644 index 0000000..2dfb2b1 Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dao/ProblemDao.class differ diff --git a/target/classes/com/codeboy/mvc/model/dao/QuizRoomDao.class b/target/classes/com/codeboy/mvc/model/dao/QuizRoomDao.class new file mode 100644 index 0000000..b99a818 Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dao/QuizRoomDao.class differ diff --git a/target/classes/com/codeboy/mvc/model/dao/ScoreDao.class b/target/classes/com/codeboy/mvc/model/dao/ScoreDao.class new file mode 100644 index 0000000..2d9d910 Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dao/ScoreDao.class differ diff --git a/target/classes/com/codeboy/mvc/model/dao/UserIncorrectNoteDao.class b/target/classes/com/codeboy/mvc/model/dao/UserIncorrectNoteDao.class new file mode 100644 index 0000000..caf04d0 Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dao/UserIncorrectNoteDao.class differ diff --git a/target/classes/com/codeboy/mvc/model/dao/UserProblemDao.class b/target/classes/com/codeboy/mvc/model/dao/UserProblemDao.class new file mode 100644 index 0000000..48c9073 Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dao/UserProblemDao.class differ diff --git a/target/classes/com/codeboy/mvc/model/dto/Comment.class b/target/classes/com/codeboy/mvc/model/dto/Comment.class new file mode 100644 index 0000000..98fa9b5 Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dto/Comment.class differ diff --git a/target/classes/com/codeboy/mvc/model/dto/IncorrectNote.class b/target/classes/com/codeboy/mvc/model/dto/IncorrectNote.class new file mode 100644 index 0000000..f68c8d4 Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dto/IncorrectNote.class differ diff --git a/target/classes/com/codeboy/mvc/model/dto/Member.class b/target/classes/com/codeboy/mvc/model/dto/Member.class new file mode 100644 index 0000000..c2cd778 Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dto/Member.class differ diff --git a/target/classes/com/codeboy/mvc/model/dto/MemberUpdateRequest.class b/target/classes/com/codeboy/mvc/model/dto/MemberUpdateRequest.class new file mode 100644 index 0000000..d3baf05 Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dto/MemberUpdateRequest.class differ diff --git a/target/classes/com/codeboy/mvc/model/dto/Problem.class b/target/classes/com/codeboy/mvc/model/dto/Problem.class new file mode 100644 index 0000000..05724c8 Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dto/Problem.class differ diff --git a/target/classes/com/codeboy/mvc/model/dto/QuizRoom.class b/target/classes/com/codeboy/mvc/model/dto/QuizRoom.class new file mode 100644 index 0000000..23aa8f2 Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dto/QuizRoom.class differ diff --git a/target/classes/com/codeboy/mvc/model/dto/QuizRoomMember.class b/target/classes/com/codeboy/mvc/model/dto/QuizRoomMember.class new file mode 100644 index 0000000..bf7f780 Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dto/QuizRoomMember.class differ diff --git a/target/classes/com/codeboy/mvc/model/dto/UserIncorrectNote.class b/target/classes/com/codeboy/mvc/model/dto/UserIncorrectNote.class new file mode 100644 index 0000000..fa5024b Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dto/UserIncorrectNote.class differ diff --git a/target/classes/com/codeboy/mvc/model/dto/UserProblem.class b/target/classes/com/codeboy/mvc/model/dto/UserProblem.class new file mode 100644 index 0000000..3a1e832 Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dto/UserProblem.class differ diff --git a/target/classes/com/codeboy/mvc/model/dto/UserProblemSet.class b/target/classes/com/codeboy/mvc/model/dto/UserProblemSet.class new file mode 100644 index 0000000..d724a88 Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dto/UserProblemSet.class differ diff --git a/target/classes/com/codeboy/mvc/model/dto/UserScore.class b/target/classes/com/codeboy/mvc/model/dto/UserScore.class new file mode 100644 index 0000000..69aa0f0 Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/dto/UserScore.class differ diff --git a/target/classes/com/codeboy/mvc/model/service/CommentService.class b/target/classes/com/codeboy/mvc/model/service/CommentService.class new file mode 100644 index 0000000..d44b062 Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/service/CommentService.class differ diff --git a/target/classes/com/codeboy/mvc/model/service/IncorrectNoteService.class b/target/classes/com/codeboy/mvc/model/service/IncorrectNoteService.class new file mode 100644 index 0000000..eea54f0 Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/service/IncorrectNoteService.class differ diff --git a/target/classes/com/codeboy/mvc/model/service/MemberService.class b/target/classes/com/codeboy/mvc/model/service/MemberService.class new file mode 100644 index 0000000..0d73745 Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/service/MemberService.class differ diff --git a/target/classes/com/codeboy/mvc/model/service/ProblemService.class b/target/classes/com/codeboy/mvc/model/service/ProblemService.class new file mode 100644 index 0000000..53d84b2 Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/service/ProblemService.class differ diff --git a/target/classes/com/codeboy/mvc/model/service/QuizRoomService.class b/target/classes/com/codeboy/mvc/model/service/QuizRoomService.class new file mode 100644 index 0000000..11f4bb1 Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/service/QuizRoomService.class differ diff --git a/target/classes/com/codeboy/mvc/model/service/QuizRoomServiceImpl.class b/target/classes/com/codeboy/mvc/model/service/QuizRoomServiceImpl.class new file mode 100644 index 0000000..fc89017 Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/service/QuizRoomServiceImpl.class differ diff --git a/target/classes/com/codeboy/mvc/model/service/ScoreService.class b/target/classes/com/codeboy/mvc/model/service/ScoreService.class new file mode 100644 index 0000000..384f9b4 Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/service/ScoreService.class differ diff --git a/target/classes/com/codeboy/mvc/model/service/UserProblemService.class b/target/classes/com/codeboy/mvc/model/service/UserProblemService.class new file mode 100644 index 0000000..3f98a1d Binary files /dev/null and b/target/classes/com/codeboy/mvc/model/service/UserProblemService.class differ diff --git a/target/test-classes/com/codeboy/CodeBoyBackendApplicationTests.class b/target/test-classes/com/codeboy/CodeBoyBackendApplicationTests.class new file mode 100644 index 0000000..12896d7 Binary files /dev/null and b/target/test-classes/com/codeboy/CodeBoyBackendApplicationTests.class differ