Skip to content

Commit 2aae95c

Browse files
committed
Show error in UI when update field fails
Bump Misk 2025.04.09.202256-90dc722 which fixes old Backfila UI failing on missing web assets
1 parent 712d86b commit 2aae95c

File tree

3 files changed

+59
-34
lines changed

3 files changed

+59
-34
lines changed

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ jooq = "3.18.25"
33
kotlin = "2.0.21"
44
kotlinxCoroutines = "1.10.1"
55
ktlint = "0.47.1"
6-
misk = "2025.04.04.132805-43bcba0"
6+
misk = "2025.04.09.202256-90dc722"
77
okhttp = "5.0.0-alpha.14"
88
sqldelight = "2.0.2"
99
wire = "5.2.1"

service/src/main/kotlin/app/cash/backfila/ui/actions/BackfillCreateHandlerAction.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class BackfillCreateHandlerAction @Inject constructor(
7171
val errorHtmlResponseBody = dashboardPageLayout.newBuilder()
7272
.buildHtmlResponseBody {
7373
div("py-20") {
74-
AlertError(message = "Backfill Create Failed: $e", label = "Try Again", onClick = "history.back(); return false;")
74+
AlertError(message = "Backfill create or clone failed: $e", label = "Try Again", onClick = "history.back(); return false;")
7575
}
7676
}
7777
return Response(

service/src/main/kotlin/app/cash/backfila/ui/actions/BackfillShowButtonHandlerAction.kt

Lines changed: 57 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ import app.cash.backfila.dashboard.StopBackfillRequest
77
import app.cash.backfila.dashboard.UpdateBackfillAction
88
import app.cash.backfila.dashboard.UpdateBackfillRequest
99
import app.cash.backfila.service.persistence.BackfillState
10-
import javax.inject.Inject
11-
import javax.inject.Singleton
10+
import app.cash.backfila.ui.components.AlertError
11+
import app.cash.backfila.ui.components.DashboardPageLayout
12+
import kotlinx.html.div
1213
import misk.security.authz.Authenticated
1314
import misk.web.Get
1415
import misk.web.PathParam
@@ -20,9 +21,12 @@ import misk.web.actions.WebAction
2021
import misk.web.mediatype.MediaTypes
2122
import misk.web.toResponseBody
2223
import okhttp3.Headers
24+
import javax.inject.Inject
25+
import javax.inject.Singleton
2326

2427
@Singleton
2528
class BackfillShowButtonHandlerAction @Inject constructor(
29+
private val dashboardPageLayout: DashboardPageLayout,
2630
private val startBackfillAction: StartBackfillAction,
2731
private val stopBackfillAction: StopBackfillAction,
2832
private val updateBackfillAction: UpdateBackfillAction,
@@ -35,43 +39,64 @@ class BackfillShowButtonHandlerAction @Inject constructor(
3539
@QueryParam field_id: String?,
3640
@QueryParam field_value: String?,
3741
): Response<ResponseBody> {
38-
if (!field_id.isNullOrBlank()) {
39-
when (field_id) {
40-
"state" -> {
41-
if (field_value == BackfillState.PAUSED.name) {
42-
stopBackfillAction.stop(id.toLong(), StopBackfillRequest())
43-
} else if (field_value == BackfillState.RUNNING.name) {
44-
startBackfillAction.start(id.toLong(), StartBackfillRequest())
42+
try {
43+
44+
if (!field_id.isNullOrBlank()) {
45+
when (field_id) {
46+
"state" -> {
47+
if (field_value == BackfillState.PAUSED.name) {
48+
stopBackfillAction.stop(id.toLong(), StopBackfillRequest())
49+
} else if (field_value == BackfillState.RUNNING.name) {
50+
startBackfillAction.start(id.toLong(), StartBackfillRequest())
51+
}
4552
}
46-
}
47-
"num_threads" -> {
48-
val numThreads = field_value?.toIntOrNull()
49-
if (numThreads != null) {
50-
updateBackfillAction.update(id.toLong(), UpdateBackfillRequest(num_threads = numThreads))
53+
54+
"num_threads" -> {
55+
val numThreads = field_value?.toIntOrNull()
56+
if (numThreads != null) {
57+
updateBackfillAction.update(id.toLong(), UpdateBackfillRequest(num_threads = numThreads))
58+
}
5159
}
52-
}
53-
"scan_size" -> {
54-
val scanSize = field_value?.toLongOrNull()
55-
if (scanSize != null) {
56-
updateBackfillAction.update(id.toLong(), UpdateBackfillRequest(scan_size = scanSize))
60+
61+
"scan_size" -> {
62+
val scanSize = field_value?.toLongOrNull()
63+
if (scanSize != null) {
64+
updateBackfillAction.update(id.toLong(), UpdateBackfillRequest(scan_size = scanSize))
65+
}
5766
}
58-
}
59-
"batch_size" -> {
60-
val batchSize = field_value?.toLongOrNull()
61-
if (batchSize != null) {
62-
updateBackfillAction.update(id.toLong(), UpdateBackfillRequest(batch_size = batchSize))
67+
68+
"batch_size" -> {
69+
val batchSize = field_value?.toLongOrNull()
70+
if (batchSize != null) {
71+
updateBackfillAction.update(id.toLong(), UpdateBackfillRequest(batch_size = batchSize))
72+
}
6373
}
64-
}
65-
"extra_sleep_ms" -> {
66-
val extraSleepMs = field_value?.toLongOrNull()
67-
if (extraSleepMs != null) {
68-
updateBackfillAction.update(id.toLong(), UpdateBackfillRequest(extra_sleep_ms = extraSleepMs))
74+
75+
"extra_sleep_ms" -> {
76+
val extraSleepMs = field_value?.toLongOrNull()
77+
if (extraSleepMs != null) {
78+
updateBackfillAction.update(id.toLong(), UpdateBackfillRequest(extra_sleep_ms = extraSleepMs))
79+
}
80+
}
81+
82+
"backoff_schedule" -> {
83+
updateBackfillAction.update(id.toLong(), UpdateBackfillRequest(backoff_schedule = field_value))
6984
}
70-
}
71-
"backoff_schedule" -> {
72-
updateBackfillAction.update(id.toLong(), UpdateBackfillRequest(backoff_schedule = field_value))
7385
}
7486
}
87+
} catch (e: Exception) {
88+
// Since this action is only hit from the UI, catch any validation errors and show them to the user
89+
val errorHtmlResponseBody = dashboardPageLayout.newBuilder()
90+
.buildHtmlResponseBody {
91+
div("py-20") {
92+
AlertError(message = "Update backfill field failed: $e", label = "Try Again", onClick = "history.back(); return false;")
93+
}
94+
}
95+
return Response(
96+
body = errorHtmlResponseBody,
97+
statusCode = 200,
98+
headers = Headers.headersOf("Content-Type", MediaTypes.TEXT_HTML),
99+
)
75100
}
76101

77102
return Response(

0 commit comments

Comments
 (0)