Skip to content

Commit 0aa3f10

Browse files
authored
Added view for all demo projects (#1860)
1 parent 50c94b8 commit 0aa3f10

8 files changed

Lines changed: 403 additions & 181 deletions

File tree

save-backend/src/main/kotlin/com/saveourtool/save/backend/controllers/DemoManagerController.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ class DemoManagerController(
271271
}
272272
.flatMap {
273273
webClientDemo.get()
274-
.uri("/demo/internal/manager/$organizationName/$projectName/status")
274+
.uri("/demo/api/manager/$organizationName/$projectName/status")
275275
.retrieve()
276276
.onStatus({ it == HttpStatus.NOT_FOUND }) {
277277
Mono.error(
@@ -312,7 +312,7 @@ class DemoManagerController(
312312
}
313313
.flatMap {
314314
webClientDemo.get()
315-
.uri("/demo/internal/manager/$organizationName/$projectName")
315+
.uri("/demo/api/manager/$organizationName/$projectName")
316316
.retrieve()
317317
.onStatus({ it == HttpStatus.NOT_FOUND }) {
318318
Mono.error(

save-demo/src/main/kotlin/com/saveourtool/save/demo/controller/DemoController.kt

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,23 @@
11
package com.saveourtool.save.demo.controller
22

33
import com.saveourtool.save.configs.ApiSwaggerSupport
4+
import com.saveourtool.save.demo.DemoDto
45
import com.saveourtool.save.demo.DemoResult
56
import com.saveourtool.save.demo.DemoRunRequest
67
import com.saveourtool.save.demo.runners.cli.CliRunnerFactory
78
import com.saveourtool.save.demo.service.DemoService
89
import com.saveourtool.save.demo.utils.KOTLIN_TEST_NAME
10+
import com.saveourtool.save.utils.blockingToFlux
911
import com.saveourtool.save.utils.blockingToMono
1012
import io.swagger.v3.oas.annotations.tags.Tag
1113
import io.swagger.v3.oas.annotations.tags.Tags
14+
import org.springframework.web.bind.annotation.GetMapping
1215
import org.springframework.web.bind.annotation.PathVariable
1316
import org.springframework.web.bind.annotation.PostMapping
1417
import org.springframework.web.bind.annotation.RequestBody
1518
import org.springframework.web.bind.annotation.RequestMapping
1619
import org.springframework.web.bind.annotation.RestController
20+
import reactor.core.publisher.Flux
1721
import reactor.core.publisher.Mono
1822
import kotlin.io.path.createTempDirectory
1923

@@ -25,20 +29,28 @@ import kotlin.io.path.createTempDirectory
2529
Tag(name = "demo"),
2630
)
2731
@RestController
28-
@RequestMapping("/demo/api/{organizationName}/{projectName}")
32+
@RequestMapping("/demo/api")
2933
class DemoController(
3034
private val demoService: DemoService,
3135
private val demoCliRunnerFactory: CliRunnerFactory,
3236
) {
3337
private val tmpDir = createTempDirectory("demo-")
3438

39+
/**
40+
* @return all [DemoDto]s as [Flux]
41+
*/
42+
@GetMapping("/all")
43+
fun all(): Flux<DemoDto> = blockingToFlux {
44+
demoService.getAllDemos().map { it.toDto() }
45+
}
46+
3547
/**
3648
* @param organizationName
3749
* @param projectName
3850
* @param demoRunRequest request data class with all required additional info
3951
* @return [DemoResult]
4052
*/
41-
@PostMapping("/run")
53+
@PostMapping("/{organizationName}/{projectName}/run")
4254
fun runCheckDemo(
4355
@PathVariable organizationName: String,
4456
@PathVariable projectName: String,
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package com.saveourtool.save.demo.controller
2+
3+
import com.saveourtool.save.demo.DemoInfo
4+
import com.saveourtool.save.demo.DemoStatus
5+
import com.saveourtool.save.demo.entity.*
6+
import com.saveourtool.save.demo.service.*
7+
import com.saveourtool.save.utils.*
8+
import io.swagger.v3.oas.annotations.tags.Tag
9+
import io.swagger.v3.oas.annotations.tags.Tags
10+
11+
import org.springframework.web.bind.annotation.*
12+
import reactor.core.publisher.Mono
13+
import reactor.kotlin.core.util.function.component1
14+
import reactor.kotlin.core.util.function.component2
15+
16+
/**
17+
* Controller that allows to query management's api
18+
*/
19+
@Tags(
20+
Tag(name = "demo"),
21+
Tag(name = "management"),
22+
)
23+
@RestController
24+
@RequestMapping("/demo/api/manager")
25+
class ManagementApiController(
26+
private val toolService: ToolService,
27+
private val demoService: DemoService,
28+
) {
29+
/**
30+
* @param organizationName name of GitHub user/organization
31+
* @param projectName name of GitHub repository
32+
* @return [Mono] of [DemoStatus] of current demo
33+
*/
34+
@GetMapping("/{organizationName}/{projectName}/status")
35+
fun getDemoStatus(
36+
@PathVariable organizationName: String,
37+
@PathVariable projectName: String,
38+
): Mono<DemoStatus> = demoService.findBySaveourtoolProjectOrNotFound(organizationName, projectName) {
39+
"Could not find demo for $organizationName/$projectName."
40+
}
41+
.map {
42+
/*
43+
* todo:
44+
* kubernetesService.getStatus(it)
45+
*/
46+
DemoStatus.STOPPED
47+
}
48+
49+
/**
50+
* @param organizationName name of GitHub user/organization
51+
* @param projectName name of GitHub repository
52+
* @return [Mono] of [DemoStatus] of current demo
53+
*/
54+
@GetMapping("/{organizationName}/{projectName}")
55+
fun getDemoInfo(
56+
@PathVariable organizationName: String,
57+
@PathVariable projectName: String,
58+
): Mono<DemoInfo> = demoService.findBySaveourtoolProjectOrNotFound(organizationName, projectName) {
59+
"Could not find demo for $organizationName/$projectName."
60+
}
61+
.zipWith(getDemoStatus(organizationName, projectName))
62+
.map { (demo, status) ->
63+
DemoInfo(
64+
demo.toDto().copy(vcsTagName = ""),
65+
status,
66+
)
67+
}
68+
.zipWhen { demoInfo ->
69+
blockingToMono {
70+
demoInfo.demoDto
71+
.githubProjectCoordinates
72+
?.let { repo ->
73+
toolService.findCurrentVersion(repo)
74+
} ?: "manual"
75+
}
76+
}
77+
.map { (demoInfo, currentVersion) ->
78+
demoInfo.copy(
79+
demoDto = demoInfo.demoDto.copy(
80+
vcsTagName = currentVersion
81+
)
82+
)
83+
}
84+
}

0 commit comments

Comments
 (0)