diff --git a/src/main/kotlin/io/csbroker/apiserver/model/LongProblem.kt b/src/main/kotlin/io/csbroker/apiserver/model/LongProblem.kt index 1192ee15..9ca815ec 100644 --- a/src/main/kotlin/io/csbroker/apiserver/model/LongProblem.kt +++ b/src/main/kotlin/io/csbroker/apiserver/model/LongProblem.kt @@ -25,7 +25,7 @@ class LongProblem( @OneToMany(mappedBy = "problem", cascade = [CascadeType.ALL]) var userAnswers: MutableList = mutableListOf(), - @OneToMany(mappedBy = "longProblem", cascade = [CascadeType.ALL]) + @OneToMany(mappedBy = "longProblem", cascade = [CascadeType.ALL], orphanRemoval = true) var standardAnswers: MutableList = mutableListOf(), ) : Problem( title = title, @@ -45,6 +45,7 @@ class LongProblem( description = upsertRequestDto.description isGradable = upsertRequestDto.isGradable isActive = upsertRequestDto.isActive + updateStandardAnswers(upsertRequestDto.standardAnswers) } fun toLongProblemResponseDto(): LongProblemResponseDto { @@ -111,4 +112,18 @@ class LongProblem( problemBookmark.any { it.user.email == email }, ) } + + fun updateStandardAnswers(standardAnswers: List) { + if (this.standardAnswers.map { it.content }.toSet() != standardAnswers.toSet()) { + this.standardAnswers.clear() + this.standardAnswers.addAll( + standardAnswers.map { + StandardAnswer( + content = it, + longProblem = this, + ) + }, + ) + } + } } diff --git a/src/main/kotlin/io/csbroker/apiserver/service/problem/admin/AdminLongProblemServiceImpl.kt b/src/main/kotlin/io/csbroker/apiserver/service/problem/admin/AdminLongProblemServiceImpl.kt index 7c663f34..0f6b0e9d 100644 --- a/src/main/kotlin/io/csbroker/apiserver/service/problem/admin/AdminLongProblemServiceImpl.kt +++ b/src/main/kotlin/io/csbroker/apiserver/service/problem/admin/AdminLongProblemServiceImpl.kt @@ -71,18 +71,6 @@ class AdminLongProblemServiceImpl( ?: throw EntityNotFoundException("${id}번 문제는 존재하지 않는 서술형 문제입니다.") val gradingStandardList = updateRequestDto.getGradingStandardList(longProblem) - if (longProblem.standardAnswers.map { it.content }.toSet() != updateRequestDto.standardAnswers.toSet()) { - standardAnswerRepository.deleteAllByLongProblem(longProblem) - standardAnswerRepository.saveAll( - updateRequestDto.standardAnswers.map { - StandardAnswer( - content = it, - longProblem = longProblem, - ) - }, - ) - } - if (longProblem.gradingStandards.map { it.content }.toSet() != gradingStandardList.map { it.content }.toSet()) { gradingStandardRepository.deleteAllById(longProblem.gradingStandards.map { it.id }) longProblem.addGradingStandards(gradingStandardList) diff --git a/src/test/kotlin/io/csbroker/apiserver/controller/v1/admin/problem/AdminLongProblemControllerIntegrationTest.kt b/src/test/kotlin/io/csbroker/apiserver/controller/v1/admin/problem/AdminLongProblemControllerIntegrationTest.kt new file mode 100644 index 00000000..af94c377 --- /dev/null +++ b/src/test/kotlin/io/csbroker/apiserver/controller/v1/admin/problem/AdminLongProblemControllerIntegrationTest.kt @@ -0,0 +1,52 @@ +package io.csbroker.apiserver.controller.v1.admin.problem + +import io.csbroker.apiserver.controller.IntegrationTest +import io.csbroker.apiserver.dto.problem.longproblem.LongProblemUpsertRequestDto +import io.csbroker.apiserver.model.LongProblem +import io.csbroker.apiserver.model.StandardAnswer +import io.csbroker.apiserver.model.Tag +import io.kotest.matchers.shouldBe +import org.junit.jupiter.api.Test + +import org.springframework.http.HttpMethod +import org.springframework.test.web.servlet.result.MockMvcResultMatchers.status + +class AdminLongProblemControllerIntegrationTest : IntegrationTest() { + + @Test + fun `문제 업데이트`() { + // given + val problem = save( + LongProblem( + title = "문제 제목", + description = "문제 설명", + creator = adminUser, + ), + ) + save(StandardAnswer(content = "삭제될 모범 답안", longProblem = problem)) + save(Tag(name="tag1")) + val updateRequestDto = LongProblemUpsertRequestDto( + title = "Test problem", + description = "This is a test problem", + tags = mutableListOf("tag1"), + standardAnswers = listOf("업데이트될 모범 답안"), + gradingStandards = mutableListOf(), + ) + + // when + val response = request( + method = HttpMethod.PUT, + url = "/api/admin/problems/long/${problem.id}", + isAdmin = true, + body = updateRequestDto, + ) + + // then + response.andExpect(status().isOk) + .andExpect { + val standardAnswers = findAll("SELECT s FROM StandardAnswer s where s.longProblem.id = :id", mapOf("id" to problem.id)) + standardAnswers.map { it.content }.toSet() shouldBe updateRequestDto.standardAnswers.toSet() + } + + } +}