diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2d7a70a --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Insert + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/src/main/java/com/insert/ioj/domain/Testcase/domain/Testcase.java b/src/main/java/com/insert/ioj/domain/Testcase/domain/Testcase.java index ed842ff..f39bf4a 100644 --- a/src/main/java/com/insert/ioj/domain/Testcase/domain/Testcase.java +++ b/src/main/java/com/insert/ioj/domain/Testcase/domain/Testcase.java @@ -1,7 +1,15 @@ package com.insert.ioj.domain.Testcase.domain; import com.insert.ioj.domain.problem.domain.Problem; -import jakarta.persistence.*; +import com.insert.ioj.global.entity.BaseTimeEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -11,7 +19,7 @@ @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity -public class Testcase { +public class Testcase extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.UUID) private UUID id; diff --git a/src/main/java/com/insert/ioj/domain/auth/presentation/AuthController.java b/src/main/java/com/insert/ioj/domain/auth/presentation/AuthController.java index 27ccb55..ca76f79 100644 --- a/src/main/java/com/insert/ioj/domain/auth/presentation/AuthController.java +++ b/src/main/java/com/insert/ioj/domain/auth/presentation/AuthController.java @@ -13,7 +13,13 @@ import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +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.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; @Tag(name = "Auth API") @RequiredArgsConstructor diff --git a/src/main/java/com/insert/ioj/domain/compiler/presentation/dto/res/ProblemCompileResponse.java b/src/main/java/com/insert/ioj/domain/compiler/presentation/dto/res/ProblemCompileResponse.java index 0451795..958a222 100644 --- a/src/main/java/com/insert/ioj/domain/compiler/presentation/dto/res/ProblemCompileResponse.java +++ b/src/main/java/com/insert/ioj/domain/compiler/presentation/dto/res/ProblemCompileResponse.java @@ -1,12 +1,9 @@ package com.insert.ioj.domain.compiler.presentation.dto.res; -import com.insert.ioj.domain.contest.domain.Contest; import com.insert.ioj.domain.execution.domain.type.Verdict; import com.insert.ioj.domain.execution.language.Language; import com.insert.ioj.domain.problem.domain.Problem; -import com.insert.ioj.domain.problemContest.domain.ProblemContest; -import com.insert.ioj.domain.solve.domain.Solve; -import com.insert.ioj.domain.solveContest.domain.SolveContest; +import com.insert.ioj.domain.solve.solve.Solve; import com.insert.ioj.domain.user.domain.User; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/com/insert/ioj/domain/contest/domain/Contest.java b/src/main/java/com/insert/ioj/domain/contest/domain/Contest.java index b67ce8b..108012f 100644 --- a/src/main/java/com/insert/ioj/domain/contest/domain/Contest.java +++ b/src/main/java/com/insert/ioj/domain/contest/domain/Contest.java @@ -1,9 +1,15 @@ package com.insert.ioj.domain.contest.domain; import com.insert.ioj.domain.user.domain.type.Authority; +import com.insert.ioj.global.entity.BaseTimeEntity; import com.insert.ioj.global.error.exception.ErrorCode; import com.insert.ioj.global.error.exception.IojException; -import jakarta.persistence.*; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -13,7 +19,7 @@ @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity -public class Contest { +public class Contest extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; diff --git a/src/main/java/com/insert/ioj/domain/contest/domain/repository/ContestRepository.java b/src/main/java/com/insert/ioj/domain/contest/domain/repository/ContestRepository.java index 8ce90ce..4d173c9 100644 --- a/src/main/java/com/insert/ioj/domain/contest/domain/repository/ContestRepository.java +++ b/src/main/java/com/insert/ioj/domain/contest/domain/repository/ContestRepository.java @@ -1,10 +1,7 @@ package com.insert.ioj.domain.contest.domain.repository; import com.insert.ioj.domain.contest.domain.Contest; -import com.insert.ioj.domain.contest.presentation.dto.res.ListContestAdminResponse; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; import java.time.LocalDateTime; import java.util.List; diff --git a/src/main/java/com/insert/ioj/domain/contest/presentation/ContestController.java b/src/main/java/com/insert/ioj/domain/contest/presentation/ContestController.java index 1a5177c..2ec04bc 100644 --- a/src/main/java/com/insert/ioj/domain/contest/presentation/ContestController.java +++ b/src/main/java/com/insert/ioj/domain/contest/presentation/ContestController.java @@ -6,14 +6,24 @@ import com.insert.ioj.domain.contest.presentation.dto.res.ListContestAdminResponse; import com.insert.ioj.domain.contest.presentation.dto.res.ListContestResponse; import com.insert.ioj.domain.contest.presentation.dto.res.RankingResponse; -import com.insert.ioj.domain.contest.service.*; +import com.insert.ioj.domain.contest.service.GetContestService; +import com.insert.ioj.domain.contest.service.ListContestAdminService; +import com.insert.ioj.domain.contest.service.ListContestService; +import com.insert.ioj.domain.contest.service.RankingService; +import com.insert.ioj.domain.contest.service.SaveContestService; +import com.insert.ioj.domain.contest.service.SubmitContestService; import com.insert.ioj.domain.execution.domain.type.Verdict; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +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 java.util.List; diff --git a/src/main/java/com/insert/ioj/domain/contest/presentation/dto/res/ListContestAdminResponse.java b/src/main/java/com/insert/ioj/domain/contest/presentation/dto/res/ListContestAdminResponse.java index a0d7b91..f156031 100644 --- a/src/main/java/com/insert/ioj/domain/contest/presentation/dto/res/ListContestAdminResponse.java +++ b/src/main/java/com/insert/ioj/domain/contest/presentation/dto/res/ListContestAdminResponse.java @@ -3,7 +3,6 @@ import com.insert.ioj.domain.contest.domain.Contest; import com.insert.ioj.domain.problem.domain.Problem; import com.insert.ioj.domain.user.domain.type.Authority; -import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/com/insert/ioj/domain/contest/service/RankingService.java b/src/main/java/com/insert/ioj/domain/contest/service/RankingService.java index 2fc4bc2..7c3efb8 100644 --- a/src/main/java/com/insert/ioj/domain/contest/service/RankingService.java +++ b/src/main/java/com/insert/ioj/domain/contest/service/RankingService.java @@ -7,7 +7,7 @@ import com.insert.ioj.domain.contest.presentation.dto.res.RankingResponse; import com.insert.ioj.domain.problem.facade.ProblemFacade; import com.insert.ioj.domain.problem.presentation.dto.res.ProblemStatusDto; -import com.insert.ioj.domain.solveContest.domain.repository.CustomSolveContestRepository; +import com.insert.ioj.domain.solve.contest.repository.CustomSolveContestRepository; import com.insert.ioj.domain.user.domain.User; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/insert/ioj/domain/contest/service/SubmitContestService.java b/src/main/java/com/insert/ioj/domain/contest/service/SubmitContestService.java index e25f33a..b5451d5 100644 --- a/src/main/java/com/insert/ioj/domain/contest/service/SubmitContestService.java +++ b/src/main/java/com/insert/ioj/domain/contest/service/SubmitContestService.java @@ -12,9 +12,9 @@ import com.insert.ioj.domain.execution.service.ExecutionService; import com.insert.ioj.domain.problem.domain.Problem; import com.insert.ioj.domain.problem.domain.repository.ProblemRepository; -import com.insert.ioj.domain.solveContest.domain.SolveContest; -import com.insert.ioj.domain.solveContest.domain.repository.CustomSolveContestRepository; -import com.insert.ioj.domain.solveContest.domain.repository.SolveContestRepository; +import com.insert.ioj.domain.solve.contest.SolveContest; +import com.insert.ioj.domain.solve.contest.repository.CustomSolveContestRepository; +import com.insert.ioj.domain.solve.contest.repository.SolveContestRepository; import com.insert.ioj.domain.user.domain.User; import com.insert.ioj.domain.user.facade.UserFacade; import com.insert.ioj.global.constants.FileConstants; diff --git a/src/main/java/com/insert/ioj/domain/entry/domain/Entry.java b/src/main/java/com/insert/ioj/domain/entry/domain/Entry.java index f086b13..a43fa2d 100644 --- a/src/main/java/com/insert/ioj/domain/entry/domain/Entry.java +++ b/src/main/java/com/insert/ioj/domain/entry/domain/Entry.java @@ -2,7 +2,13 @@ import com.insert.ioj.domain.room.domain.Room; import com.insert.ioj.domain.user.domain.User; -import jakarta.persistence.*; +import com.insert.ioj.global.entity.BaseTimeEntity; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -10,7 +16,7 @@ @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity -public class Entry { +public class Entry extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Boolean ready = false; diff --git a/src/main/java/com/insert/ioj/domain/execution/language/CExecution.java b/src/main/java/com/insert/ioj/domain/execution/language/CExecution.java index 361aecc..00235c7 100644 --- a/src/main/java/com/insert/ioj/domain/execution/language/CExecution.java +++ b/src/main/java/com/insert/ioj/domain/execution/language/CExecution.java @@ -2,7 +2,6 @@ import com.insert.ioj.domain.Testcase.domain.Testcase; import com.insert.ioj.domain.execution.domain.Execution; -import com.insert.ioj.global.constants.CommandConstants; import com.insert.ioj.global.constants.ExtensionConstants; import com.insert.ioj.global.constants.FileConstants; import com.insert.ioj.infra.file.FileUtil; diff --git a/src/main/java/com/insert/ioj/domain/execution/presentation/dto/res/TestcaseResult.java b/src/main/java/com/insert/ioj/domain/execution/presentation/dto/res/TestcaseResult.java index 549ea41..4179dbc 100644 --- a/src/main/java/com/insert/ioj/domain/execution/presentation/dto/res/TestcaseResult.java +++ b/src/main/java/com/insert/ioj/domain/execution/presentation/dto/res/TestcaseResult.java @@ -4,7 +4,7 @@ import com.insert.ioj.domain.execution.domain.type.Verdict; import com.insert.ioj.domain.execution.language.Language; import com.insert.ioj.domain.problem.domain.Problem; -import com.insert.ioj.domain.solve.domain.Solve; +import com.insert.ioj.domain.solve.solve.Solve; import com.insert.ioj.domain.user.domain.User; import lombok.Getter; diff --git a/src/main/java/com/insert/ioj/domain/problem/domain/Problem.java b/src/main/java/com/insert/ioj/domain/problem/domain/Problem.java index c54f407..e95ff8b 100644 --- a/src/main/java/com/insert/ioj/domain/problem/domain/Problem.java +++ b/src/main/java/com/insert/ioj/domain/problem/domain/Problem.java @@ -1,6 +1,11 @@ package com.insert.ioj.domain.problem.domain; -import jakarta.persistence.*; +import com.insert.ioj.global.entity.BaseTimeEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -8,12 +13,14 @@ @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity -public class Problem { +public class Problem extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; + private String source; + @Column(columnDefinition = "TEXT") private String content; @@ -29,9 +36,10 @@ public class Problem { private int timeLimit; - public Problem(String title, String content, String inputContent, String outputContent, int level, int memoryLimit, int timeLimit) { + public Problem(String title, String content, String source, String inputContent, String outputContent, int level, int memoryLimit, int timeLimit) { this.title = title; this.content = content; + this.source = source; this.inputContent = inputContent; this.outputContent = outputContent; this.level = level; diff --git a/src/main/java/com/insert/ioj/domain/problem/facade/ProblemFacade.java b/src/main/java/com/insert/ioj/domain/problem/facade/ProblemFacade.java index 6933fe1..8be3a8f 100644 --- a/src/main/java/com/insert/ioj/domain/problem/facade/ProblemFacade.java +++ b/src/main/java/com/insert/ioj/domain/problem/facade/ProblemFacade.java @@ -5,8 +5,8 @@ import com.insert.ioj.domain.problem.domain.Problem; import com.insert.ioj.domain.problem.domain.repository.CustomProblemRepository; import com.insert.ioj.domain.problem.presentation.dto.res.ProblemStatusDto; -import com.insert.ioj.domain.solveContest.domain.SolveContest; -import com.insert.ioj.domain.solveContest.domain.repository.CustomSolveContestRepository; +import com.insert.ioj.domain.solve.contest.SolveContest; +import com.insert.ioj.domain.solve.contest.repository.CustomSolveContestRepository; import com.insert.ioj.domain.user.domain.User; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -47,7 +47,7 @@ private static List getProblemStatus(List problems, status = "failed"; } - LocalDateTime solveTime = solveContest != null ? solveContest.getCreateDate() : null; + LocalDateTime solveTime = solveContest != null ? solveContest.getCreatedAt() : null; problemStatuses.add(new ProblemStatusDto(problem, status, solveTime)); } return problemStatuses; diff --git a/src/main/java/com/insert/ioj/domain/problem/presentation/ProblemController.java b/src/main/java/com/insert/ioj/domain/problem/presentation/ProblemController.java index 01976d5..4e46ef4 100644 --- a/src/main/java/com/insert/ioj/domain/problem/presentation/ProblemController.java +++ b/src/main/java/com/insert/ioj/domain/problem/presentation/ProblemController.java @@ -8,13 +8,23 @@ import com.insert.ioj.domain.problem.presentation.dto.res.ListProblemResponse; import com.insert.ioj.domain.problem.presentation.dto.res.ProblemResponse; import com.insert.ioj.domain.problem.presentation.dto.res.TestcasesResponse; -import com.insert.ioj.domain.problem.service.*; +import com.insert.ioj.domain.problem.service.ExecutionProblemService; +import com.insert.ioj.domain.problem.service.GetProblemService; +import com.insert.ioj.domain.problem.service.ListProblemService; +import com.insert.ioj.domain.problem.service.SaveProblemService; +import com.insert.ioj.domain.problem.service.SubmitProblemService; +import com.insert.ioj.domain.problem.service.VerifyTestcasesService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +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 java.util.List; diff --git a/src/main/java/com/insert/ioj/domain/problem/presentation/dto/req/SaveProblemRequest.java b/src/main/java/com/insert/ioj/domain/problem/presentation/dto/req/SaveProblemRequest.java index b956b2f..b87021f 100644 --- a/src/main/java/com/insert/ioj/domain/problem/presentation/dto/req/SaveProblemRequest.java +++ b/src/main/java/com/insert/ioj/domain/problem/presentation/dto/req/SaveProblemRequest.java @@ -23,6 +23,9 @@ public class SaveProblemRequest { @NotNull(message = "content가 비어있습니다.") private String content; + @NotNull(message = "source가 비어있습니다.") + private String source; + @NotNull(message = "inputContent가 비어있습니다.") private String inputContent; @@ -47,7 +50,7 @@ public class SaveProblemRequest { public Problem toProblem() { return new Problem( - title, content, inputContent, outputContent, level, memoryLimit, timeLimit + title, content, source, inputContent, outputContent, level, memoryLimit, timeLimit ); } diff --git a/src/main/java/com/insert/ioj/domain/problem/presentation/dto/res/ListProblemResponse.java b/src/main/java/com/insert/ioj/domain/problem/presentation/dto/res/ListProblemResponse.java index 2b4fbba..d4235b1 100644 --- a/src/main/java/com/insert/ioj/domain/problem/presentation/dto/res/ListProblemResponse.java +++ b/src/main/java/com/insert/ioj/domain/problem/presentation/dto/res/ListProblemResponse.java @@ -10,10 +10,12 @@ public class ListProblemResponse { private Long id; private String title; private int level; + private String source; public ListProblemResponse(Problem problem) { this.id = problem.getId(); this.title = problem.getTitle(); this.level = problem.getLevel(); + this.source = problem.getSource(); } } diff --git a/src/main/java/com/insert/ioj/domain/problem/presentation/dto/res/ProblemResponse.java b/src/main/java/com/insert/ioj/domain/problem/presentation/dto/res/ProblemResponse.java index cf1d690..e343623 100644 --- a/src/main/java/com/insert/ioj/domain/problem/presentation/dto/res/ProblemResponse.java +++ b/src/main/java/com/insert/ioj/domain/problem/presentation/dto/res/ProblemResponse.java @@ -1,7 +1,6 @@ package com.insert.ioj.domain.problem.presentation.dto.res; import com.insert.ioj.domain.problem.domain.Problem; -import com.insert.ioj.domain.problem.presentation.dto.req.TestcaseDto; import lombok.Getter; import lombok.NoArgsConstructor; @@ -12,6 +11,7 @@ public class ProblemResponse { private String title; private String content; + private String source; private String inputContent; private String outputContent; private int level; @@ -22,6 +22,7 @@ public class ProblemResponse { public ProblemResponse(Problem problem, List testcases) { this.title = problem.getTitle(); this.content = problem.getContent(); + this.source = problem.getSource(); this.inputContent = problem.getInputContent(); this.outputContent = problem.getOutputContent(); this.level = problem.getLevel(); diff --git a/src/main/java/com/insert/ioj/domain/problem/service/ExecutionProblemService.java b/src/main/java/com/insert/ioj/domain/problem/service/ExecutionProblemService.java index 9d02858..708b248 100644 --- a/src/main/java/com/insert/ioj/domain/problem/service/ExecutionProblemService.java +++ b/src/main/java/com/insert/ioj/domain/problem/service/ExecutionProblemService.java @@ -10,7 +10,7 @@ import com.insert.ioj.domain.problem.domain.Problem; import com.insert.ioj.domain.problem.domain.repository.ProblemRepository; import com.insert.ioj.domain.problem.presentation.dto.req.ExecutionProblemRequest; -import com.insert.ioj.domain.solve.domain.repository.SolveRepository; +import com.insert.ioj.domain.solve.solve.repository.SolveRepository; import com.insert.ioj.domain.user.domain.User; import com.insert.ioj.domain.user.facade.UserFacade; import com.insert.ioj.global.constants.FileConstants; diff --git a/src/main/java/com/insert/ioj/domain/problem/service/GetProblemService.java b/src/main/java/com/insert/ioj/domain/problem/service/GetProblemService.java index 0c407ad..d3ba356 100644 --- a/src/main/java/com/insert/ioj/domain/problem/service/GetProblemService.java +++ b/src/main/java/com/insert/ioj/domain/problem/service/GetProblemService.java @@ -3,7 +3,6 @@ import com.insert.ioj.domain.Testcase.domain.repository.TestcaseRepository; import com.insert.ioj.domain.problem.domain.Problem; import com.insert.ioj.domain.problem.domain.repository.ProblemRepository; -import com.insert.ioj.domain.problem.presentation.dto.req.TestcaseDto; import com.insert.ioj.domain.problem.presentation.dto.res.ProblemResponse; import com.insert.ioj.domain.problem.presentation.dto.res.TestcaseResponse; import com.insert.ioj.global.error.exception.ErrorCode; diff --git a/src/main/java/com/insert/ioj/domain/problem/service/SubmitProblemService.java b/src/main/java/com/insert/ioj/domain/problem/service/SubmitProblemService.java index 290dbda..8958703 100644 --- a/src/main/java/com/insert/ioj/domain/problem/service/SubmitProblemService.java +++ b/src/main/java/com/insert/ioj/domain/problem/service/SubmitProblemService.java @@ -7,7 +7,7 @@ import com.insert.ioj.domain.problem.domain.Problem; import com.insert.ioj.domain.problem.domain.repository.ProblemRepository; import com.insert.ioj.domain.problem.presentation.dto.req.SubmitProblemRequest; -import com.insert.ioj.domain.solve.domain.repository.SolveRepository; +import com.insert.ioj.domain.solve.solve.repository.SolveRepository; import com.insert.ioj.domain.user.domain.User; import com.insert.ioj.domain.user.facade.UserFacade; import com.insert.ioj.global.error.exception.ErrorCode; diff --git a/src/main/java/com/insert/ioj/domain/problemContest/domain/ProblemContest.java b/src/main/java/com/insert/ioj/domain/problemContest/domain/ProblemContest.java index 3edd7a2..d988b27 100644 --- a/src/main/java/com/insert/ioj/domain/problemContest/domain/ProblemContest.java +++ b/src/main/java/com/insert/ioj/domain/problemContest/domain/ProblemContest.java @@ -2,7 +2,13 @@ import com.insert.ioj.domain.contest.domain.Contest; import com.insert.ioj.domain.problem.domain.Problem; -import jakarta.persistence.*; +import com.insert.ioj.global.entity.BaseTimeEntity; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -10,7 +16,7 @@ @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity -public class ProblemContest { +public class ProblemContest extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; diff --git a/src/main/java/com/insert/ioj/domain/room/domain/Room.java b/src/main/java/com/insert/ioj/domain/room/domain/Room.java index b619d9e..d676717 100644 --- a/src/main/java/com/insert/ioj/domain/room/domain/Room.java +++ b/src/main/java/com/insert/ioj/domain/room/domain/Room.java @@ -2,9 +2,17 @@ import com.insert.ioj.domain.room.domain.type.RoomStatus; import com.insert.ioj.domain.user.domain.User; +import com.insert.ioj.global.entity.BaseTimeEntity; import com.insert.ioj.global.error.exception.ErrorCode; import com.insert.ioj.global.error.exception.IojException; -import jakarta.persistence.*; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -14,7 +22,7 @@ @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity -public class Room { +public class Room extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.UUID) private UUID id; private String title; diff --git a/src/main/java/com/insert/ioj/domain/room/presentation/RoomController.java b/src/main/java/com/insert/ioj/domain/room/presentation/RoomController.java index 8292ad8..fe7b4c5 100644 --- a/src/main/java/com/insert/ioj/domain/room/presentation/RoomController.java +++ b/src/main/java/com/insert/ioj/domain/room/presentation/RoomController.java @@ -11,7 +11,13 @@ import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +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.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.UUID; diff --git a/src/main/java/com/insert/ioj/domain/room/presentation/RoomWebSocketController.java b/src/main/java/com/insert/ioj/domain/room/presentation/RoomWebSocketController.java index dc18103..b13b875 100644 --- a/src/main/java/com/insert/ioj/domain/room/presentation/RoomWebSocketController.java +++ b/src/main/java/com/insert/ioj/domain/room/presentation/RoomWebSocketController.java @@ -1,6 +1,10 @@ package com.insert.ioj.domain.room.presentation; -import com.insert.ioj.domain.room.service.*; +import com.insert.ioj.domain.room.service.DeleteRoomService; +import com.insert.ioj.domain.room.service.JoinRoomService; +import com.insert.ioj.domain.room.service.LeaveRoomService; +import com.insert.ioj.domain.room.service.ReadyService; +import com.insert.ioj.domain.room.service.StartGameService; import lombok.RequiredArgsConstructor; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.web.bind.annotation.GetMapping; diff --git a/src/main/java/com/insert/ioj/domain/solve/contest/SolveContest.java b/src/main/java/com/insert/ioj/domain/solve/contest/SolveContest.java new file mode 100644 index 0000000..a653395 --- /dev/null +++ b/src/main/java/com/insert/ioj/domain/solve/contest/SolveContest.java @@ -0,0 +1,33 @@ +package com.insert.ioj.domain.solve.contest; + +import com.insert.ioj.domain.contest.domain.Contest; +import com.insert.ioj.domain.execution.domain.type.Verdict; +import com.insert.ioj.domain.execution.language.Language; +import com.insert.ioj.domain.problem.domain.Problem; +import com.insert.ioj.domain.solve.solve.Solve; +import com.insert.ioj.domain.user.domain.User; +import jakarta.persistence.Entity; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Entity +public class SolveContest extends Solve { + @ManyToOne + @JoinColumn(name = "contest_id") + private Contest contest; + + public SolveContest(User user, + Contest contest, + Problem problem, + String sourcecode, + Verdict verdict, + Language language) { + super(user, problem, sourcecode, verdict, language); + this.contest = contest; + } +} diff --git a/src/main/java/com/insert/ioj/domain/solveContest/domain/repository/CustomSolveContestRepository.java b/src/main/java/com/insert/ioj/domain/solve/contest/repository/CustomSolveContestRepository.java similarity index 80% rename from src/main/java/com/insert/ioj/domain/solveContest/domain/repository/CustomSolveContestRepository.java rename to src/main/java/com/insert/ioj/domain/solve/contest/repository/CustomSolveContestRepository.java index 00b5339..a0d071d 100644 --- a/src/main/java/com/insert/ioj/domain/solveContest/domain/repository/CustomSolveContestRepository.java +++ b/src/main/java/com/insert/ioj/domain/solve/contest/repository/CustomSolveContestRepository.java @@ -1,9 +1,9 @@ -package com.insert.ioj.domain.solveContest.domain.repository; +package com.insert.ioj.domain.solve.contest.repository; import com.insert.ioj.domain.contest.domain.Contest; import com.insert.ioj.domain.contest.presentation.dto.res.ListRankResponse; import com.insert.ioj.domain.problem.domain.Problem; -import com.insert.ioj.domain.solveContest.domain.SolveContest; +import com.insert.ioj.domain.solve.contest.SolveContest; import com.insert.ioj.domain.user.domain.User; import java.util.List; diff --git a/src/main/java/com/insert/ioj/domain/solveContest/domain/repository/CustomSolveContestRepositoryImpl.java b/src/main/java/com/insert/ioj/domain/solve/contest/repository/CustomSolveContestRepositoryImpl.java similarity index 86% rename from src/main/java/com/insert/ioj/domain/solveContest/domain/repository/CustomSolveContestRepositoryImpl.java rename to src/main/java/com/insert/ioj/domain/solve/contest/repository/CustomSolveContestRepositoryImpl.java index 253e15b..a97c8ac 100644 --- a/src/main/java/com/insert/ioj/domain/solveContest/domain/repository/CustomSolveContestRepositoryImpl.java +++ b/src/main/java/com/insert/ioj/domain/solve/contest/repository/CustomSolveContestRepositoryImpl.java @@ -1,10 +1,10 @@ -package com.insert.ioj.domain.solveContest.domain.repository; +package com.insert.ioj.domain.solve.contest.repository; import com.insert.ioj.domain.contest.domain.Contest; import com.insert.ioj.domain.contest.presentation.dto.res.ListRankResponse; import com.insert.ioj.domain.execution.domain.type.Verdict; import com.insert.ioj.domain.problem.domain.Problem; -import com.insert.ioj.domain.solveContest.domain.SolveContest; +import com.insert.ioj.domain.solve.contest.SolveContest; import com.insert.ioj.domain.user.domain.User; import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.RequiredArgsConstructor; @@ -12,7 +12,7 @@ import java.util.List; -import static com.insert.ioj.domain.solveContest.domain.QSolveContest.solveContest; +import static com.insert.ioj.domain.solve.contest.QSolveContest.solveContest; import static com.querydsl.core.types.Projections.constructor; @Repository @@ -26,7 +26,7 @@ public List getUserSolveContest(User user, Contest contest) { .selectFrom(solveContest) .where(solveContest.user.eq(user) .and(solveContest.contest.eq(contest))) - .orderBy(solveContest.problem.id.asc(), solveContest.createDate.desc()) + .orderBy(solveContest.problem.id.asc(), solveContest.createdAt.desc()) .fetch(); } @@ -36,13 +36,13 @@ public List getRankingUser(Contest contest) { .select(constructor(ListRankResponse.class, solveContest.user, solveContest.verdict.count(), - solveContest.createDate.max())) + solveContest.createdAt.max())) .from(solveContest) .where(solveContest.contest.eq(contest) .and(solveContest.verdict.eq(Verdict.ACCEPTED))) .groupBy(solveContest.user) .orderBy(solveContest.verdict.count().desc(), - solveContest.createDate.max().asc()) + solveContest.createdAt.max().asc()) .fetch(); } diff --git a/src/main/java/com/insert/ioj/domain/solveContest/domain/repository/SolveContestRepository.java b/src/main/java/com/insert/ioj/domain/solve/contest/repository/SolveContestRepository.java similarity index 54% rename from src/main/java/com/insert/ioj/domain/solveContest/domain/repository/SolveContestRepository.java rename to src/main/java/com/insert/ioj/domain/solve/contest/repository/SolveContestRepository.java index f1621c7..b718081 100644 --- a/src/main/java/com/insert/ioj/domain/solveContest/domain/repository/SolveContestRepository.java +++ b/src/main/java/com/insert/ioj/domain/solve/contest/repository/SolveContestRepository.java @@ -1,6 +1,6 @@ -package com.insert.ioj.domain.solveContest.domain.repository; +package com.insert.ioj.domain.solve.contest.repository; -import com.insert.ioj.domain.solveContest.domain.SolveContest; +import com.insert.ioj.domain.solve.contest.SolveContest; import org.springframework.data.jpa.repository.JpaRepository; public interface SolveContestRepository extends JpaRepository { diff --git a/src/main/java/com/insert/ioj/domain/solve/domain/Solve.java b/src/main/java/com/insert/ioj/domain/solve/solve/Solve.java similarity index 63% rename from src/main/java/com/insert/ioj/domain/solve/domain/Solve.java rename to src/main/java/com/insert/ioj/domain/solve/solve/Solve.java index e8d556d..be60957 100644 --- a/src/main/java/com/insert/ioj/domain/solve/domain/Solve.java +++ b/src/main/java/com/insert/ioj/domain/solve/solve/Solve.java @@ -1,10 +1,21 @@ -package com.insert.ioj.domain.solve.domain; +package com.insert.ioj.domain.solve.solve; import com.insert.ioj.domain.execution.domain.type.Verdict; import com.insert.ioj.domain.execution.language.Language; import com.insert.ioj.domain.problem.domain.Problem; import com.insert.ioj.domain.user.domain.User; -import jakarta.persistence.*; +import com.insert.ioj.global.entity.BaseTimeEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Inheritance; +import jakarta.persistence.InheritanceType; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -12,7 +23,8 @@ @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity -public class Solve { +@Inheritance(strategy = InheritanceType.JOINED) +public class Solve extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; diff --git a/src/main/java/com/insert/ioj/domain/solve/domain/repository/SolveRepository.java b/src/main/java/com/insert/ioj/domain/solve/solve/repository/SolveRepository.java similarity index 56% rename from src/main/java/com/insert/ioj/domain/solve/domain/repository/SolveRepository.java rename to src/main/java/com/insert/ioj/domain/solve/solve/repository/SolveRepository.java index 22b2a54..bcc6eca 100644 --- a/src/main/java/com/insert/ioj/domain/solve/domain/repository/SolveRepository.java +++ b/src/main/java/com/insert/ioj/domain/solve/solve/repository/SolveRepository.java @@ -1,6 +1,6 @@ -package com.insert.ioj.domain.solve.domain.repository; +package com.insert.ioj.domain.solve.solve.repository; -import com.insert.ioj.domain.solve.domain.Solve; +import com.insert.ioj.domain.solve.solve.Solve; import org.springframework.data.jpa.repository.JpaRepository; public interface SolveRepository extends JpaRepository { diff --git a/src/main/java/com/insert/ioj/domain/solveContest/domain/SolveContest.java b/src/main/java/com/insert/ioj/domain/solveContest/domain/SolveContest.java deleted file mode 100644 index a16cd4c..0000000 --- a/src/main/java/com/insert/ioj/domain/solveContest/domain/SolveContest.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.insert.ioj.domain.solveContest.domain; - -import com.insert.ioj.domain.contest.domain.Contest; -import com.insert.ioj.domain.execution.domain.type.Verdict; -import com.insert.ioj.domain.execution.language.Language; -import com.insert.ioj.domain.problem.domain.Problem; -import com.insert.ioj.domain.user.domain.User; -import com.insert.ioj.global.entity.BaseTimeEntity; -import jakarta.persistence.*; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@Entity -public class SolveContest extends BaseTimeEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne - @JoinColumn(name = "user_id") - private User user; - - @ManyToOne - @JoinColumn(name = "contest") - private Contest contest; - - @ManyToOne - @JoinColumn(name = "problem") - private Problem problem; - - @Column(columnDefinition = "TEXT") - private String sourcecode; - - @Enumerated(EnumType.STRING) - private Verdict verdict; - - @Enumerated(EnumType.STRING) - private Language language; - - public SolveContest(User user, - Contest contest, - Problem problem, - String sourcecode, - Verdict verdict, - Language language) { - this.user = user; - this.contest = contest; - this.problem = problem; - this.sourcecode = sourcecode; - this.verdict = verdict; - this.language = language; - } -} diff --git a/src/main/java/com/insert/ioj/domain/user/domain/User.java b/src/main/java/com/insert/ioj/domain/user/domain/User.java index d18efa6..7931096 100644 --- a/src/main/java/com/insert/ioj/domain/user/domain/User.java +++ b/src/main/java/com/insert/ioj/domain/user/domain/User.java @@ -2,7 +2,14 @@ import com.insert.ioj.domain.user.domain.type.Authority; import com.insert.ioj.domain.user.domain.type.Color; -import jakarta.persistence.*; +import com.insert.ioj.global.entity.BaseTimeEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.Size; import lombok.AccessLevel; @@ -12,7 +19,7 @@ @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity(name = "tbl_user") -public class User { +public class User extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; diff --git a/src/main/java/com/insert/ioj/global/config/LanguageConfig.java b/src/main/java/com/insert/ioj/global/config/LanguageConfig.java index 776ba3e..ae75a95 100644 --- a/src/main/java/com/insert/ioj/global/config/LanguageConfig.java +++ b/src/main/java/com/insert/ioj/global/config/LanguageConfig.java @@ -2,7 +2,11 @@ import com.insert.ioj.domain.execution.domain.AbstractExecutionFactory; import com.insert.ioj.domain.execution.domain.ExecutionFactory; -import com.insert.ioj.domain.execution.language.*; +import com.insert.ioj.domain.execution.language.CExecution; +import com.insert.ioj.domain.execution.language.CppExecution; +import com.insert.ioj.domain.execution.language.JavaExecution; +import com.insert.ioj.domain.execution.language.Language; +import com.insert.ioj.domain.execution.language.PythonExecution; import org.springframework.context.annotation.Configuration; @Configuration diff --git a/src/main/java/com/insert/ioj/global/config/SecurityConfig.java b/src/main/java/com/insert/ioj/global/config/SecurityConfig.java index 511238a..bcca38c 100644 --- a/src/main/java/com/insert/ioj/global/config/SecurityConfig.java +++ b/src/main/java/com/insert/ioj/global/config/SecurityConfig.java @@ -1,6 +1,5 @@ package com.insert.ioj.global.config; -import com.insert.ioj.domain.user.domain.type.Authority; import com.insert.ioj.global.security.jwt.JwtTokenFilter; import com.insert.ioj.global.security.jwt.JwtTokenProvider; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/com/insert/ioj/global/entity/BaseTimeEntity.java b/src/main/java/com/insert/ioj/global/entity/BaseTimeEntity.java index 1a3377f..452fdd2 100644 --- a/src/main/java/com/insert/ioj/global/entity/BaseTimeEntity.java +++ b/src/main/java/com/insert/ioj/global/entity/BaseTimeEntity.java @@ -1,9 +1,11 @@ package com.insert.ioj.global.entity; +import jakarta.persistence.Column; import jakarta.persistence.EntityListeners; import jakarta.persistence.MappedSuperclass; import lombok.Getter; import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import java.time.LocalDateTime; @@ -11,7 +13,12 @@ @Getter @MappedSuperclass @EntityListeners(AuditingEntityListener.class) -public class BaseTimeEntity { +public abstract class BaseTimeEntity { @CreatedDate - private LocalDateTime createDate; + @Column(name = "created_at", updatable = false) + private LocalDateTime createdAt; + + @LastModifiedDate + @Column(name = "updated_at") + private LocalDateTime updatedAt; } diff --git a/src/main/java/com/insert/ioj/infra/cmd/CmdUtil.java b/src/main/java/com/insert/ioj/infra/cmd/CmdUtil.java index cc531a9..feddd6d 100644 --- a/src/main/java/com/insert/ioj/infra/cmd/CmdUtil.java +++ b/src/main/java/com/insert/ioj/infra/cmd/CmdUtil.java @@ -4,7 +4,11 @@ import com.insert.ioj.global.error.exception.IojException; import com.insert.ioj.infra.cmd.dto.res.ProcessOutput; -import java.io.*; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; import java.util.concurrent.TimeUnit; import java.util.function.Consumer;