@@ -7,8 +7,9 @@ import app.cash.backfila.dashboard.StopBackfillRequest
7
7
import app.cash.backfila.dashboard.UpdateBackfillAction
8
8
import app.cash.backfila.dashboard.UpdateBackfillRequest
9
9
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
12
13
import misk.security.authz.Authenticated
13
14
import misk.web.Get
14
15
import misk.web.PathParam
@@ -20,9 +21,12 @@ import misk.web.actions.WebAction
20
21
import misk.web.mediatype.MediaTypes
21
22
import misk.web.toResponseBody
22
23
import okhttp3.Headers
24
+ import javax.inject.Inject
25
+ import javax.inject.Singleton
23
26
24
27
@Singleton
25
28
class BackfillShowButtonHandlerAction @Inject constructor(
29
+ private val dashboardPageLayout : DashboardPageLayout ,
26
30
private val startBackfillAction : StartBackfillAction ,
27
31
private val stopBackfillAction : StopBackfillAction ,
28
32
private val updateBackfillAction : UpdateBackfillAction ,
@@ -35,43 +39,64 @@ class BackfillShowButtonHandlerAction @Inject constructor(
35
39
@QueryParam field_id : String? ,
36
40
@QueryParam field_value : String? ,
37
41
): 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
+ }
45
52
}
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
+ }
51
59
}
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
+ }
57
66
}
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
+ }
63
73
}
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))
69
84
}
70
- }
71
- " backoff_schedule" -> {
72
- updateBackfillAction.update(id.toLong(), UpdateBackfillRequest (backoff_schedule = field_value))
73
85
}
74
86
}
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
+ )
75
100
}
76
101
77
102
return Response (
0 commit comments