Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
10 commits
Select commit Hold shift + click to select a range
c3775fe
[feat] ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ดˆ๊ธฐํ™” ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ ์„œ๋น„์Šค ์ถ”๊ฐ€
dolong2 Nov 6, 2025
04ca68f
[feat] CreateApplicationReqDto์— initialScripts ํ•„๋“œ ์ถ”๊ฐ€
dolong2 Nov 6, 2025
e635963
[feat] ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒ์„ฑ์‹œ ์ดˆ๊ธฐํ™” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋กœ์ง ์ถ”๊ฐ€
dolong2 Nov 6, 2025
e2dfe93
[feat] CreateApplicationRequest์— initialScripts ํ•„๋“œ ์ถ”๊ฐ€
dolong2 Nov 6, 2025
bfcb6e0
[refac] ์ดˆ๊ธฐํ™” ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ์‹œ ๊ธฐ์กด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋˜ ์ดˆ๊ธฐํ™”์Šคํฌ๋ฆฝํŠธ๋Š” ์ œ๊ฑฐํ•˜๋„๋ก ๋ฆฌํŽ™ํ† ๋ง
dolong2 Nov 6, 2025
3a46559
[feat] UpdateApplicationReqDto์— initialScripts ํ•„๋“œ ์ถ”๊ฐ€
dolong2 Nov 6, 2025
958f857
[feat] ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜์ •์‹œ ์ดˆ๊ธฐํ™” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐ˜์˜ํ•˜๋Š” ๋กœ์ง ์ถ”๊ฐ€
dolong2 Nov 6, 2025
0c7f626
[feat] UpdateApplicationRequest์— initialScripts ํ•„๋“œ ์ถ”๊ฐ€
dolong2 Nov 6, 2025
922e42d
[feat] ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ˆ˜์ •์‹œ ์ดˆ๊ธฐํ™” ์Šคํฌ๋ฆฝํŠธ๊ด€๋ จ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ถ”๊ฐ€
dolong2 Nov 6, 2025
f44b815
[feat] ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒ์„ฑ๋ฐ ์ˆ˜์ •์‹œ initialScripts ํ•„๋“œ์— ๊ธฐ๋ณธ๊ฐ’ ์ถ”๊ฐ€
dolong2 Nov 7, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@ data class CreateApplicationReqDto(
val applicationType: ApplicationType,
val port: Int,
val version: String,
val initialScripts: List<String>,
val labels: List<String>
)
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@ import com.dcd.server.core.domain.application.model.enums.ApplicationType
data class UpdateApplicationReqDto(
val name: String,
val description: String?,
val applicationType: ApplicationType,
val githubUrl: String?,
val applicationType: ApplicationType,
val port: Int,
val version: String,
val port: Int
val initialScripts: List<String>,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.dcd.server.core.domain.application.service

import com.dcd.server.core.domain.application.model.Application

interface InitialScriptService {
fun write(application: Application, initialScripts: List<String>)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.dcd.server.core.domain.application.service.impl

import com.dcd.server.core.domain.application.model.Application
import com.dcd.server.core.domain.application.model.ApplicationInitialScript
import com.dcd.server.core.domain.application.service.InitialScriptService
import com.dcd.server.core.domain.application.spi.CommandApplicationInitialScriptPort
import org.springframework.stereotype.Service
import java.util.UUID

@Service
class InitialScriptServiceImpl(
private val commandApplicationInitialScriptPort: CommandApplicationInitialScriptPort
) : InitialScriptService {
override fun write(
application: Application,
initialScripts: List<String>,
) {
commandApplicationInitialScriptPort.deleteByApplication(application)

val initialScriptList = initialScripts.map { script ->
ApplicationInitialScript(
id = UUID.randomUUID(),
script = script,
application = application,
)
}
commandApplicationInitialScriptPort.saveAll(initialScriptList)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ class CreateApplicationUseCase(
private val buildDockerImageService: BuildDockerImageService,
private val createContainerService: CreateContainerService,
private val deleteApplicationDirectoryService: DeleteApplicationDirectoryService,
private val envAutoMatchService: EnvAutoMatchService
private val envAutoMatchService: EnvAutoMatchService,
private val initialScriptService: InitialScriptService
) : CoroutineScope by CoroutineScope(Dispatchers.IO) {
fun execute(createApplicationReqDto: CreateApplicationReqDto): CreateApplicationResDto {
val workspace = workspaceInfo.workspace
Expand All @@ -44,6 +45,7 @@ class CreateApplicationUseCase(
val version = application.version

envAutoMatchService.match(workspace, application)
initialScriptService.write(application, createApplicationReqDto.initialScripts)

launch {
val applicationType = application.applicationType
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.dcd.server.core.domain.application.exception.ApplicationNotFoundExcep
import com.dcd.server.core.domain.application.model.enums.ApplicationStatus
import com.dcd.server.core.domain.application.service.DeleteContainerService
import com.dcd.server.core.domain.application.service.DeleteImageService
import com.dcd.server.core.domain.application.service.InitialScriptService
import com.dcd.server.core.domain.application.spi.CommandApplicationPort
import com.dcd.server.core.domain.application.spi.QueryApplicationPort
import kotlinx.coroutines.CoroutineScope
Expand All @@ -22,7 +23,8 @@ class UpdateApplicationUseCase(
private val commandApplicationPort: CommandApplicationPort,
private val deleteContainerService: DeleteContainerService,
private val deleteImageService: DeleteImageService,
private val eventPublisher: ApplicationEventPublisher
private val eventPublisher: ApplicationEventPublisher,
private val initialScriptService: InitialScriptService
) : CoroutineScope by CoroutineScope(Dispatchers.IO) {
@Lock("#id")
fun execute(id: String, updateApplicationReqDto: UpdateApplicationReqDto) {
Expand Down Expand Up @@ -50,5 +52,7 @@ class UpdateApplicationUseCase(
port = updateApplicationReqDto.port
)
commandApplicationPort.save(updatedApplication)

initialScriptService.write(updatedApplication, updateApplicationReqDto.initialScripts)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ fun CreateApplicationRequest.toDto(): CreateApplicationReqDto =
applicationType = this.applicationType,
port = this.port,
version = this.version,
initialScripts = this.initialScripts,
labels = this.labels
)

Expand All @@ -29,7 +30,8 @@ fun UpdateApplicationRequest.toDto(): UpdateApplicationReqDto =
applicationType = this.applicationType,
githubUrl = this.githubUrl,
version = this.version,
port = this.port
port = this.port,
initialScripts = this.initialScripts,
)

fun ExecuteCommandRequest.toDto(): ExecuteCommandReqDto =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,6 @@ data class CreateApplicationRequest(
val applicationType: ApplicationType,
val port: Int,
val version: String,
val initialScripts: List<String>,
val labels: List<String> = listOf()
)
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@ data class UpdateApplicationRequest(
@field:Pattern(regexp = "^[a-zA-Z0-9 ]{1,26}$")
val name: String,
val description: String?,
val applicationType: ApplicationType,
val githubUrl: String?,
val applicationType: ApplicationType,
val port: Int,
val version: String,
val port: Int
val initialScripts: List<String>,
)
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import com.dcd.server.core.domain.application.dto.request.CreateApplicationReqDt
import com.dcd.server.core.domain.application.exception.AlreadyExistsApplicationException
import com.dcd.server.core.domain.application.model.enums.ApplicationType
import com.dcd.server.core.domain.application.spi.CommandApplicationPort
import com.dcd.server.core.domain.application.spi.QueryApplicationInitialScriptPort
import com.dcd.server.core.domain.application.spi.QueryApplicationPort
import com.dcd.server.core.domain.env.model.ApplicationEnv
import com.dcd.server.core.domain.env.model.ApplicationEnvDetail
Expand All @@ -19,6 +20,7 @@ import io.kotest.core.spec.style.BehaviorSpec
import util.workspace.WorkspaceGenerator
import io.kotest.assertions.throwables.shouldThrow
import io.kotest.matchers.shouldBe
import io.kotest.matchers.shouldNotBe
import kotlinx.coroutines.cancel
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.test.context.ActiveProfiles
Expand All @@ -33,6 +35,7 @@ class CreateApplicationUseCaseTest(
private val queryUserPort: QueryUserPort,
private val commandWorkspacePort: CommandWorkspacePort,
private val queryApplicationPort: QueryApplicationPort,
private val queryApplicationInitialScriptPort: QueryApplicationInitialScriptPort,
private val queryWorkspacePort: QueryWorkspacePort,
private val commandApplicationPort: CommandApplicationPort,
private val commandApplicationEnvPort: CommandApplicationEnvPort,
Expand All @@ -56,6 +59,7 @@ class CreateApplicationUseCaseTest(
githubUrl = "testGithub",
version = "17",
port = 8080,
initialScripts = listOf(),
labels = listOf()
)

Expand All @@ -82,6 +86,7 @@ class CreateApplicationUseCaseTest(
githubUrl = "testGithub",
version = "17",
port = 8080,
initialScripts = listOf(),
labels = listOf()
)

Expand All @@ -104,6 +109,7 @@ class CreateApplicationUseCaseTest(
githubUrl = "testGithub",
version = "17",
port = 8080,
initialScripts = listOf(),
labels = listOf()
)

Expand Down Expand Up @@ -142,6 +148,7 @@ class CreateApplicationUseCaseTest(
githubUrl = "testGithub",
version = "17",
port = 8080,
initialScripts = listOf(),
labels = listOf("testLabel")
)

Expand All @@ -164,4 +171,28 @@ class CreateApplicationUseCaseTest(
}
}
}

given("์ดˆ๊ธฐํ™” ์Šคํฌ๋ฆฝํŠธ ๋‚ด์šฉ์„ ๊ฐ€์ง„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒ์„ฑ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง€๊ณ ") {
val request = CreateApplicationReqDto(
name = "testCreateApplication",
description = "testDescription",
applicationType = ApplicationType.SPRING_BOOT,
githubUrl = "testGithub",
version = "17",
port = 8080,
initialScripts = listOf("echo test"),
labels = listOf()
)

`when`("usecase๋ฅผ ์‹คํ–‰ํ•˜๋ฉด") {
val applicationId = createApplicationUseCase.execute(request).applicationId

then("์ƒ์„ฑ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ดˆ๊ธฐํ™” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์กด์žฌํ•ด์•ผํ•จ") {
val application = queryApplicationPort.findById(applicationId).also { it shouldNotBe null }!!
val initialScript = queryApplicationInitialScriptPort.findAllByApplication(application)
initialScript.size shouldBe 1
initialScript[0].script shouldBe request.initialScripts.first()
}
}
}
})
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,14 @@ import com.dcd.server.core.domain.application.exception.ApplicationNotFoundExcep
import com.dcd.server.core.domain.application.model.enums.ApplicationStatus
import com.dcd.server.core.domain.application.model.enums.ApplicationType
import com.dcd.server.core.domain.application.spi.CommandApplicationPort
import com.dcd.server.core.domain.application.spi.QueryApplicationInitialScriptPort
import com.dcd.server.core.domain.application.spi.QueryApplicationPort
import com.dcd.server.core.domain.user.spi.QueryUserPort
import com.dcd.server.core.domain.workspace.spi.QueryWorkspacePort
import com.ninjasquad.springmockk.MockkBean
import io.kotest.assertions.throwables.shouldThrow
import io.kotest.core.spec.style.BehaviorSpec
import io.kotest.matchers.collections.shouldHaveSize
import io.kotest.matchers.shouldBe
import io.kotest.matchers.shouldNotBe
import io.mockk.coVerify
Expand All @@ -29,13 +31,14 @@ class UpdateApplicationUseCaseTest(
private val queryUserPort: QueryUserPort,
private val queryWorkspacePort: QueryWorkspacePort,
private val queryApplicationPort: QueryApplicationPort,
private val queryApplicationInitialScriptPort: QueryApplicationInitialScriptPort,
private val commandApplicationPort: CommandApplicationPort,
@MockkBean(relaxed = true)
private val commandPort: CommandPort
) : BehaviorSpec({
val targetUserId = "923a6407-a5f8-4e1e-bffd-0621910ddfc8"

val updateReqDto = UpdateApplicationReqDto(name = "updated application", description = "dldl", applicationType = ApplicationType.SPRING_BOOT, githubUrl = null, version = "11", port = 8080)
val updateReqDto = UpdateApplicationReqDto(name = "updated application", description = "dldl", applicationType = ApplicationType.SPRING_BOOT, githubUrl = null, version = "11", port = 8080, initialScripts = listOf("echo test"))

given("์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„์ด๋””๊ฐ€ ์ฃผ์–ด์ง€๊ณ ") {
val targetUser = queryUserPort.findById(targetUserId)!!
Expand All @@ -59,6 +62,13 @@ class UpdateApplicationUseCaseTest(
coVerify { commandPort.executeShellCommand("docker rm ${targetApplication.containerName}") }
coVerify { commandPort.executeShellCommand("docker rmi ${targetApplication.containerName}") }
}

then("๋ณ€๊ฒฝ๋œ ์ดˆ๊ธฐํ™” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผํ•จ") {
val result = queryApplicationPort.findById(applicationId).also { it shouldNotBe null }!!
val initialScripts = queryApplicationInitialScriptPort.findAllByApplication(result)
initialScripts shouldHaveSize 1
initialScripts[0].script shouldBe updateReqDto.initialScripts.first()
}
}

`when`("์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰์ค‘์ด๋ผ๋ฉด") {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ class ApplicationWebAdapterTest : BehaviorSpec({
applicationType = ApplicationType.SPRING_BOOT,
githubUrl = "testUrl",
port = 8080,
initialScripts = emptyList(),
version = "17",
)

Expand Down Expand Up @@ -157,7 +158,7 @@ class ApplicationWebAdapterTest : BehaviorSpec({

given("UpdateRequest๊ฐ€ ์ฃผ์–ด์ง€๊ณ ") {
val testId ="testId"
val request = UpdateApplicationRequest(name = "update", description = null, applicationType = ApplicationType.SPRING_BOOT, githubUrl = null, version = "11", port = 8080)
val request = UpdateApplicationRequest(name = "update", description = null, applicationType = ApplicationType.SPRING_BOOT, githubUrl = null, version = "11", port = 8080, initialScripts = emptyList())

`when`("updateApplication ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ• ๋•Œ") {
val result = applicationWebAdapter.updateApplication(testWorkspaceId, testId, request)
Expand Down
4 changes: 2 additions & 2 deletions src/test/resources/data.sql
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ alter table if exists application_env_matcher_entity add constraint FKqfkw6tgy65
alter table if exists application_env_entity add constraint FKm22cqdjjl434jyqenpa4nf78p foreign key (workspace_id) references workspace_entity (id);
alter table if exists application_env_label_entity add constraint FKgd5b8upn11w2uh6voe20dm6df foreign key (application_env_id) references application_env_entity (id);
alter table if exists application_entity add constraint FKn9drxkrx2h6wlorxfy00mr45h foreign key (workspace_id) references workspace_entity;
alter table if exists application_label_entity add constraint FKq6iovxq5tdx2i1lwrx34kg0b9 foreign key (application_id) references application_entity;
alter table if exists application_initial_script_entity add constraint FKq6iovxq5tdx2i1lwrx34kg0b0 foreign key (application_id) references application_entity;
alter table if exists application_label_entity add constraint FKq6iovxq5tdx2i1lwrx34kg0b9 foreign key (application_id) references application_entity (id);
alter table if exists application_initial_script_entity add constraint FKq6iovxq5tdx2i1lwrx34kg0b0 foreign key (application_id) references application_entity (id);
alter table if exists role_entity add constraint FKrot6fehcor0f3sux5s6kgl0a4 foreign key (user_id) references user_entity;
alter table if exists workspace_entity add constraint FKlfxk1bhw5knckt8vv28xvx5g2 foreign key (owner_id) references user_entity;
alter table if exists domain_entity add constraint FKh7b0t3y0a7x5boh75j8lanww6 foreign key (application_id) references application_entity;
Expand Down