implemented 07-server-mode.md: added server profile with REST API for builds, artifacts, live logs, and control tokens; lifecycle management for watcher; controller and service tests

This commit is contained in:
Michael Hoennig
2026-07-07 11:27:27 +02:00
parent a1db450bdb
commit 490914de0b
25 changed files with 1128 additions and 6 deletions
@@ -0,0 +1,55 @@
package de.hoennig.gittally.server
import de.hoennig.gittally.build.BuildResultRepository
import de.hoennig.gittally.gitea.GiteaClient
import de.hoennig.gittally.gitea.GiteaStatusResult
import org.springframework.http.HttpStatus
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RestController
/**
* Replaces the legacy `/control/status` proxy. The response always answers with
* HTTP 200 and an explicit status — a Gitea failure becomes `giteaError` plus the
* local fallback (or `unknown`), never a hanging request (the [GiteaClient]
* requests time out).
*/
@RestController
class StatusApiController(
private val repository: BuildResultRepository,
private val giteaClient: GiteaClient,
) {
@GetMapping("/api/status/{commit}")
fun status(
@PathVariable commit: String,
): ResponseEntity<Any> {
if (!COMMIT_PATTERN.matches(commit)) {
return ResponseEntity
.status(HttpStatus.BAD_REQUEST)
.body(mapOf("error" to "'$commit' is not an abbreviated or full commit hash"))
}
val localStatus =
repository
.history()
.firstOrNull { it.commit.startsWith(commit, ignoreCase = true) }
?.status
val giteaResult = giteaClient.readStatus(commit)
val giteaStatus = (giteaResult as? GiteaStatusResult.Found)?.status
val effective = giteaStatus ?: localStatus
return ResponseEntity.ok(
CommitStatusDto(
commit = commit,
status = effective?.jsonName ?: CommitStatusDto.UNKNOWN_STATUS,
localStatus = localStatus?.jsonName,
giteaStatus = giteaStatus?.jsonName,
giteaError = (giteaResult as? GiteaStatusResult.Error)?.message,
),
)
}
companion object {
/** Like the legacy handler: 7 to 40 hex digits. */
private val COMMIT_PATTERN = Regex("[0-9a-fA-F]{7,40}")
}
}