Files
werkator/src/main/kotlin/de/hoennig/gittally/server/StatusApiController.kt
T

56 lines
2.1 KiB
Kotlin

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}")
}
}