Skip to content

Commit

Permalink
feat: remove one to many
Browse files Browse the repository at this point in the history
  • Loading branch information
jbj338033 committed Jan 16, 2025
1 parent 939d38d commit 2a7f7b9
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 18 deletions.
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
package com.solve.domain.admin.contest.service.impl

import com.solve.domain.admin.contest.dto.request.AdminContestProblemAddRequest
import com.solve.domain.admin.contest.dto.response.*
import com.solve.domain.admin.contest.service.AdminContestProblemService
import com.solve.domain.contest.domain.entity.Contest
import com.solve.domain.contest.domain.entity.ContestProblem
import com.solve.domain.contest.error.ContestError
import com.solve.domain.contest.error.ContestProblemError
import com.solve.domain.contest.repository.ContestOperatorRepository
import com.solve.domain.contest.repository.ContestProblemRepository
import com.solve.domain.contest.repository.ContestRepository
import com.solve.domain.problem.error.ProblemError
import com.solve.domain.problem.repository.ProblemRepository
Expand All @@ -19,7 +17,8 @@ import org.springframework.transaction.annotation.Transactional
@Service
class AdminContestProblemServiceImpl(
private val contestRepository: ContestRepository,
private val problemRepository: ProblemRepository
private val problemRepository: ProblemRepository,
private val contestProblemRepository: ContestProblemRepository
) : AdminContestProblemService {
@Transactional
override fun addContestProblem(contestId: Long, request: AdminContestProblemAddRequest) {
Expand All @@ -28,20 +27,21 @@ class AdminContestProblemServiceImpl(
val problem =
problemRepository.findByIdOrNull(request.problemId) ?: throw CustomException(ProblemError.PROBLEM_NOT_FOUND)

if (contest.problems.any { it.problem == problem }) {
if (contestProblemRepository.existsByContestAndProblem(contest, problem))
throw CustomException(ContestProblemError.CONTEST_PROBLEM_ALREADY_EXISTS)
}

contest.problems.add(ContestProblem(contest = contest, problem = problem))
contestProblemRepository.save(ContestProblem(contest = contest, problem = problem))
}

@Transactional
override fun removeContestProblem(contestId: Long, problemId: Long) {
val contest =
contestRepository.findByIdOrNull(contestId) ?: throw CustomException(ContestError.CONTEST_NOT_FOUND)
val problem = contest.problems.find { it.problem.id == problemId }
?: throw CustomException(ProblemError.PROBLEM_NOT_FOUND)
val problem =
problemRepository.findByIdOrNull(problemId) ?: throw CustomException(ProblemError.PROBLEM_NOT_FOUND)
val contestProblem = contestProblemRepository.findByContestAndProblem(contest, problem)
?: throw CustomException(ContestProblemError.CONTEST_PROBLEM_NOT_FOUND)

contest.problems.remove(problem)
contestProblemRepository.delete(contestProblem)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import com.solve.domain.contest.domain.entity.ContestParticipant
import com.solve.domain.contest.domain.entity.ContestProblem
import com.solve.domain.contest.error.ContestError
import com.solve.domain.contest.repository.ContestOperatorRepository
import com.solve.domain.contest.repository.ContestParticipantRepository
import com.solve.domain.contest.repository.ContestProblemRepository
import com.solve.domain.contest.repository.ContestRepository
import com.solve.domain.problem.repository.ProblemRepository
import com.solve.domain.user.repository.UserRepository
Expand All @@ -27,7 +29,9 @@ class AdminContestServiceImpl(
private val userRepository: UserRepository,
private val problemRepository: ProblemRepository,
private val contestRepository: ContestRepository,
private val contestOperatorRepository: ContestOperatorRepository
private val contestOperatorRepository: ContestOperatorRepository,
private val contestParticipantRepository: ContestParticipantRepository,
private val contestProblemRepository: ContestProblemRepository
) : AdminContestService {
@Transactional(readOnly = true)
override fun getContests(pageable: Pageable): Page<AdminContestResponse> {
Expand Down Expand Up @@ -58,26 +62,28 @@ class AdminContestServiceImpl(
visibility = request.visibility
)

contestRepository.save(contest)

contestOperatorRepository.saveAll(operators.map {
ContestOperator(
contest = contest,
user = it
)
})
contest.participants.addAll(participants.map {

contestParticipantRepository.saveAll(participants.map {
ContestParticipant(
contest = contest,
user = it
)
})
contest.problems.addAll(problems.map {

contestProblemRepository.saveAll(problems.map {
ContestProblem(
contest = contest,
problem = it
)
})

contestRepository.save(contest)
}

@Transactional
Expand All @@ -100,17 +106,18 @@ class AdminContestServiceImpl(
contestRepository.delete(contest)
}

private fun Contest.toResponse() = AdminContestResponse(
private fun Contest.toResponse() = AdminContestResponse(
id = id!!,
title = title,
description = description,
startAt = startAt,
endAt = endAt,
createdAt = createdAt,
updatedAt = updatedAt,
participants = participants.map { AdminContestParticipantResponse.of(it) },
participants = contestParticipantRepository.findAllByContest(this)
.map { AdminContestParticipantResponse.of(it) },
operators = contestOperatorRepository.findAllByContest(this).map { AdminContestOperatorResponse.of(it) },
problems = problems.map { AdminContestProblemResponse.of(it) },
problems = contestProblemRepository.findAllByContest(this).map { AdminContestProblemResponse.of(it) },
visibility = visibility,
owner = AdminContestOwnerResponse.of(owner)
)
Expand Down

0 comments on commit 2a7f7b9

Please sign in to comment.