From 4af499c792485f63bebff85e99256a3740af7315 Mon Sep 17 00:00:00 2001 From: Jeff Hwang Date: Mon, 28 Apr 2025 16:09:05 -0400 Subject: [PATCH 1/4] add softdelete button and column --- .../dashboard/GetBackfillRunsAction.kt | 2 + .../dashboard/GetBackfillStatusAction.kt | 2 + .../dashboard/SoftDeleteBackfillAction.kt | 55 +++++++++++++++++++ .../service/persistence/BackfillRunQuery.kt | 3 + .../service/persistence/BackfillSoftDelete.kt | 5 ++ .../service/persistence/DbBackfillRun.kt | 3 + .../BackfillShowButtonHandlerAction.kt | 6 ++ .../backfila/ui/pages/BackfillShowAction.kt | 48 +++++++++++++++- .../migrations/v020__add_soft_delete.sql | 3 + 9 files changed, 124 insertions(+), 3 deletions(-) create mode 100644 service/src/main/kotlin/app/cash/backfila/dashboard/SoftDeleteBackfillAction.kt create mode 100644 service/src/main/kotlin/app/cash/backfila/service/persistence/BackfillSoftDelete.kt create mode 100644 service/src/main/resources/migrations/v020__add_soft_delete.sql diff --git a/service/src/main/kotlin/app/cash/backfila/dashboard/GetBackfillRunsAction.kt b/service/src/main/kotlin/app/cash/backfila/dashboard/GetBackfillRunsAction.kt index 44c27f064..6163156da 100644 --- a/service/src/main/kotlin/app/cash/backfila/dashboard/GetBackfillRunsAction.kt +++ b/service/src/main/kotlin/app/cash/backfila/dashboard/GetBackfillRunsAction.kt @@ -83,6 +83,7 @@ class GetBackfillRunsAction @Inject constructor( val runningBackfills = queryFactory.newQuery() .serviceId(dbService.id) .state(BackfillState.RUNNING) + .notSoftDeleted() .orderByIdDesc() .filterByArgs(filterArgs) .list(session) @@ -102,6 +103,7 @@ class GetBackfillRunsAction @Inject constructor( val (pausedBackfills, nextOffset) = queryFactory.newQuery() .serviceId(dbService.id) .stateNot(BackfillState.RUNNING) + .notSoftDeleted() .filterByArgs(filterArgs) .newPager( idDescPaginator(), diff --git a/service/src/main/kotlin/app/cash/backfila/dashboard/GetBackfillStatusAction.kt b/service/src/main/kotlin/app/cash/backfila/dashboard/GetBackfillStatusAction.kt index 1574b5bdf..a5455fdbe 100644 --- a/service/src/main/kotlin/app/cash/backfila/dashboard/GetBackfillStatusAction.kt +++ b/service/src/main/kotlin/app/cash/backfila/dashboard/GetBackfillStatusAction.kt @@ -65,6 +65,7 @@ data class GetBackfillStatusResponse( val backoff_schedule: String?, val partitions: List, val event_logs: List, + val soft_deleted: Boolean, ) class GetBackfillStatusAction @Inject constructor( @@ -98,6 +99,7 @@ class GetBackfillStatusAction @Inject constructor( run.backoff_schedule, partitions.map { dbToUi(it) }, events(session, run, partitions), + run.soft_deleted, ) } } diff --git a/service/src/main/kotlin/app/cash/backfila/dashboard/SoftDeleteBackfillAction.kt b/service/src/main/kotlin/app/cash/backfila/dashboard/SoftDeleteBackfillAction.kt new file mode 100644 index 000000000..bdb8391e0 --- /dev/null +++ b/service/src/main/kotlin/app/cash/backfila/dashboard/SoftDeleteBackfillAction.kt @@ -0,0 +1,55 @@ +package app.cash.backfila.dashboard + +import app.cash.backfila.service.persistence.BackfilaDb +import app.cash.backfila.service.persistence.BackfillState +import app.cash.backfila.service.persistence.DbBackfillRun +import app.cash.backfila.service.persistence.DbEventLog +import javax.inject.Inject +import misk.MiskCaller +import misk.exceptions.BadRequestException +import misk.hibernate.Id +import misk.hibernate.Transacter +import misk.hibernate.load +import misk.scope.ActionScoped +import misk.security.authz.Authenticated +import misk.web.PathParam +import misk.web.Post +import misk.web.RequestContentType +import misk.web.ResponseContentType +import misk.web.actions.WebAction +import misk.web.mediatype.MediaTypes + +class SoftDeleteBackfillAction @Inject constructor( + @BackfilaDb private val transacter: Transacter, + private val caller: @JvmSuppressWildcards ActionScoped, +) : WebAction { + @Post("/backfill/delete/{id}") + @RequestContentType(MediaTypes.APPLICATION_JSON) + @ResponseContentType(MediaTypes.APPLICATION_JSON) + @Authenticated + fun softDelete( + @PathParam id: Long, + ) { + transacter.transaction { session -> + val backfillRun = session.load(Id(id)) + + // Only allow soft delete for COMPLETE or CANCELLED backfills + if (backfillRun.state != BackfillState.COMPLETE && backfillRun.state != BackfillState.CANCELLED) { + throw BadRequestException("Can only delete completed or cancelled backfills") + } + + backfillRun.soft_deleted = true + + // Log the deletion event + session.save( + DbEventLog( + backfillRun.id, + partition_id = null, + user = caller.get()?.principal ?: "", + type = DbEventLog.Type.STATE_CHANGE, + message = "backfill soft deleted", + ), + ) + } + } +} diff --git a/service/src/main/kotlin/app/cash/backfila/service/persistence/BackfillRunQuery.kt b/service/src/main/kotlin/app/cash/backfila/service/persistence/BackfillRunQuery.kt index 8ddbe8f90..e04c667e7 100644 --- a/service/src/main/kotlin/app/cash/backfila/service/persistence/BackfillRunQuery.kt +++ b/service/src/main/kotlin/app/cash/backfila/service/persistence/BackfillRunQuery.kt @@ -30,4 +30,7 @@ interface BackfillRunQuery : Query { @Order("updated_at", asc = false) fun orderByUpdatedAtDesc(): BackfillRunQuery + + @Constraint("soft_deleted", Operator.EQ) + fun notSoftDeleted(softDeleted: Boolean = false): BackfillRunQuery } diff --git a/service/src/main/kotlin/app/cash/backfila/service/persistence/BackfillSoftDelete.kt b/service/src/main/kotlin/app/cash/backfila/service/persistence/BackfillSoftDelete.kt new file mode 100644 index 000000000..b62dc2edf --- /dev/null +++ b/service/src/main/kotlin/app/cash/backfila/service/persistence/BackfillSoftDelete.kt @@ -0,0 +1,5 @@ +package app.cash.backfila.service.persistence + +enum class BackfillSoftDelete { + SOFT_DELETED, +} diff --git a/service/src/main/kotlin/app/cash/backfila/service/persistence/DbBackfillRun.kt b/service/src/main/kotlin/app/cash/backfila/service/persistence/DbBackfillRun.kt index 2e6d4fea8..3daa50964 100644 --- a/service/src/main/kotlin/app/cash/backfila/service/persistence/DbBackfillRun.kt +++ b/service/src/main/kotlin/app/cash/backfila/service/persistence/DbBackfillRun.kt @@ -90,6 +90,9 @@ class DbBackfillRun() : DbUnsharded, DbTimestampedEntity { @Column(nullable = false) var dry_run: Boolean = false + @Column(nullable = false) + var soft_deleted: Boolean = false + /** Comma separated list of delays for consecutive retries in milliseconds, e.g. 1000,2000 */ @Column var backoff_schedule: String? = null diff --git a/service/src/main/kotlin/app/cash/backfila/ui/actions/BackfillShowButtonHandlerAction.kt b/service/src/main/kotlin/app/cash/backfila/ui/actions/BackfillShowButtonHandlerAction.kt index 426734dae..435fdc10a 100644 --- a/service/src/main/kotlin/app/cash/backfila/ui/actions/BackfillShowButtonHandlerAction.kt +++ b/service/src/main/kotlin/app/cash/backfila/ui/actions/BackfillShowButtonHandlerAction.kt @@ -1,12 +1,14 @@ package app.cash.backfila.ui.actions import app.cash.backfila.dashboard.CancelBackfillAction +import app.cash.backfila.dashboard.SoftDeleteBackfillAction import app.cash.backfila.dashboard.StartBackfillAction import app.cash.backfila.dashboard.StartBackfillRequest import app.cash.backfila.dashboard.StopBackfillAction import app.cash.backfila.dashboard.StopBackfillRequest import app.cash.backfila.dashboard.UpdateBackfillAction import app.cash.backfila.dashboard.UpdateBackfillRequest +import app.cash.backfila.service.persistence.BackfillSoftDelete import app.cash.backfila.service.persistence.BackfillState import app.cash.backfila.ui.components.AlertError import app.cash.backfila.ui.components.DashboardPageLayout @@ -33,6 +35,7 @@ class BackfillShowButtonHandlerAction @Inject constructor( private val stopBackfillAction: StopBackfillAction, private val updateBackfillAction: UpdateBackfillAction, private val cancelBackfillAction: CancelBackfillAction, + private val softDeleteBackfillAction: SoftDeleteBackfillAction, ) : WebAction { @Get(PATH) @ResponseContentType(MediaTypes.TEXT_HTML) @@ -56,6 +59,9 @@ class BackfillShowButtonHandlerAction @Inject constructor( BackfillState.CANCELLED.name -> { cancelBackfillAction.cancel(id.toLong()) } + BackfillSoftDelete.SOFT_DELETED.name -> { + softDeleteBackfillAction.softDelete(id.toLong()) + } } } diff --git a/service/src/main/kotlin/app/cash/backfila/ui/pages/BackfillShowAction.kt b/service/src/main/kotlin/app/cash/backfila/ui/pages/BackfillShowAction.kt index 68aae084f..7984a2540 100644 --- a/service/src/main/kotlin/app/cash/backfila/ui/pages/BackfillShowAction.kt +++ b/service/src/main/kotlin/app/cash/backfila/ui/pages/BackfillShowAction.kt @@ -3,6 +3,7 @@ package app.cash.backfila.ui.pages import app.cash.backfila.dashboard.GetBackfillStatusAction import app.cash.backfila.dashboard.GetBackfillStatusResponse import app.cash.backfila.dashboard.ViewLogsAction +import app.cash.backfila.service.persistence.BackfillSoftDelete import app.cash.backfila.service.persistence.BackfillState import app.cash.backfila.ui.actions.BackfillShowButtonHandlerAction import app.cash.backfila.ui.components.AutoReload @@ -260,6 +261,7 @@ class BackfillShowAction @Inject constructor( val button: Link? = null, val updateFieldId: String? = null, val cancelButton: Link? = null, + val deleteButton: Link? = null, ) private fun getStateButton(state: BackfillState): Link? { @@ -283,9 +285,18 @@ class BackfillShowAction @Inject constructor( label = CANCEL_STATE_BUTTON_LABEL, href = BackfillState.CANCELLED.name, ) - BackfillState.COMPLETE -> Link( - label = CANCEL_STATE_BUTTON_LABEL, - href = BackfillState.CANCELLED.name, + else -> null + } + } + + private fun getDeleteButton(state: BackfillState, softDeleted: Boolean): Link? { + if (softDeleted) { + return null + } + return when (state) { + BackfillState.COMPLETE, BackfillState.CANCELLED -> Link( + label = DELETE_STATE_BUTTON_LABEL, + href = BackfillSoftDelete.SOFT_DELETED.name, ) else -> null } @@ -298,6 +309,7 @@ class BackfillShowAction @Inject constructor( button = getStateButton(state), updateFieldId = "state", cancelButton = getCancelButton(state), + deleteButton = getDeleteButton(state, soft_deleted), ), DescriptionListRow( label = "Dry Run", @@ -536,6 +548,35 @@ class BackfillShowAction @Inject constructor( } } } + + it.deleteButton?.let { deleteButton -> + span("ml-2") { + form { + action = BackfillShowButtonHandlerAction.path(id) + + it.updateFieldId?.let { + input { + type = InputType.hidden + name = "field_id" + value = it + } + + input { + type = InputType.hidden + name = "field_value" + value = deleteButton.href + } + } + + button( + classes = "rounded-full bg-gray-600 px-3 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-gray-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-gray-600", + ) { + type = ButtonType.submit + +deleteButton.label + } + } + } + } } } } @@ -585,6 +626,7 @@ class BackfillShowAction @Inject constructor( const val START_STATE_BUTTON_LABEL = "Start" const val PAUSE_STATE_BUTTON_LABEL = "Pause" const val CANCEL_STATE_BUTTON_LABEL = "Cancel" + const val DELETE_STATE_BUTTON_LABEL = "Delete" const val UPDATE_BUTTON_LABEL = "Update" const val VIEW_LOGS_BUTTON_LABEL = "View Logs" } diff --git a/service/src/main/resources/migrations/v020__add_soft_delete.sql b/service/src/main/resources/migrations/v020__add_soft_delete.sql new file mode 100644 index 000000000..42fab51e9 --- /dev/null +++ b/service/src/main/resources/migrations/v020__add_soft_delete.sql @@ -0,0 +1,3 @@ +-- Add soft_deleted column to backfill_runs +ALTER TABLE backfill_runs + ADD COLUMN soft_deleted BOOLEAN NOT NULL DEFAULT FALSE; \ No newline at end of file From a523eb07414c10eee9d458837371059d6002faea Mon Sep 17 00:00:00 2001 From: Jeff Hwang Date: Tue, 29 Apr 2025 11:51:56 -0400 Subject: [PATCH 2/4] add user to authentication --- .../app/cash/backfila/dashboard/SoftDeleteBackfillAction.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/service/src/main/kotlin/app/cash/backfila/dashboard/SoftDeleteBackfillAction.kt b/service/src/main/kotlin/app/cash/backfila/dashboard/SoftDeleteBackfillAction.kt index bdb8391e0..271e5445a 100644 --- a/service/src/main/kotlin/app/cash/backfila/dashboard/SoftDeleteBackfillAction.kt +++ b/service/src/main/kotlin/app/cash/backfila/dashboard/SoftDeleteBackfillAction.kt @@ -26,7 +26,7 @@ class SoftDeleteBackfillAction @Inject constructor( @Post("/backfill/delete/{id}") @RequestContentType(MediaTypes.APPLICATION_JSON) @ResponseContentType(MediaTypes.APPLICATION_JSON) - @Authenticated + @Authenticated(capabilities = ["users"]) fun softDelete( @PathParam id: Long, ) { From 3b744b81cbc00bd70c9009b72d9321b0f19ecc0b Mon Sep 17 00:00:00 2001 From: Jeff Hwang Date: Tue, 29 Apr 2025 13:00:33 -0400 Subject: [PATCH 3/4] modify is_deleted to deleted_at with nullable timestamp --- .../app/cash/backfila/dashboard/GetBackfillRunsAction.kt | 1 - .../app/cash/backfila/dashboard/GetBackfillStatusAction.kt | 4 ++-- .../cash/backfila/dashboard/SoftDeleteBackfillAction.kt | 2 +- .../cash/backfila/service/persistence/BackfillRunQuery.kt | 4 ++-- .../app/cash/backfila/service/persistence/DbBackfillRun.kt | 4 ++-- .../app/cash/backfila/ui/pages/BackfillShowAction.kt | 7 ++++--- service/src/main/resources/migrations/v019__backfila.sql | 2 ++ 7 files changed, 13 insertions(+), 11 deletions(-) create mode 100644 service/src/main/resources/migrations/v019__backfila.sql diff --git a/service/src/main/kotlin/app/cash/backfila/dashboard/GetBackfillRunsAction.kt b/service/src/main/kotlin/app/cash/backfila/dashboard/GetBackfillRunsAction.kt index 6163156da..d423a1023 100644 --- a/service/src/main/kotlin/app/cash/backfila/dashboard/GetBackfillRunsAction.kt +++ b/service/src/main/kotlin/app/cash/backfila/dashboard/GetBackfillRunsAction.kt @@ -83,7 +83,6 @@ class GetBackfillRunsAction @Inject constructor( val runningBackfills = queryFactory.newQuery() .serviceId(dbService.id) .state(BackfillState.RUNNING) - .notSoftDeleted() .orderByIdDesc() .filterByArgs(filterArgs) .list(session) diff --git a/service/src/main/kotlin/app/cash/backfila/dashboard/GetBackfillStatusAction.kt b/service/src/main/kotlin/app/cash/backfila/dashboard/GetBackfillStatusAction.kt index a5455fdbe..4d853b353 100644 --- a/service/src/main/kotlin/app/cash/backfila/dashboard/GetBackfillStatusAction.kt +++ b/service/src/main/kotlin/app/cash/backfila/dashboard/GetBackfillStatusAction.kt @@ -65,7 +65,7 @@ data class GetBackfillStatusResponse( val backoff_schedule: String?, val partitions: List, val event_logs: List, - val soft_deleted: Boolean, + val deleted_at: Instant?, ) class GetBackfillStatusAction @Inject constructor( @@ -99,7 +99,7 @@ class GetBackfillStatusAction @Inject constructor( run.backoff_schedule, partitions.map { dbToUi(it) }, events(session, run, partitions), - run.soft_deleted, + run.deleted_at, ) } } diff --git a/service/src/main/kotlin/app/cash/backfila/dashboard/SoftDeleteBackfillAction.kt b/service/src/main/kotlin/app/cash/backfila/dashboard/SoftDeleteBackfillAction.kt index 271e5445a..51cc0d3f8 100644 --- a/service/src/main/kotlin/app/cash/backfila/dashboard/SoftDeleteBackfillAction.kt +++ b/service/src/main/kotlin/app/cash/backfila/dashboard/SoftDeleteBackfillAction.kt @@ -38,7 +38,7 @@ class SoftDeleteBackfillAction @Inject constructor( throw BadRequestException("Can only delete completed or cancelled backfills") } - backfillRun.soft_deleted = true + backfillRun.deleted_at = java.time.Instant.now() // Log the deletion event session.save( diff --git a/service/src/main/kotlin/app/cash/backfila/service/persistence/BackfillRunQuery.kt b/service/src/main/kotlin/app/cash/backfila/service/persistence/BackfillRunQuery.kt index e04c667e7..8730ce627 100644 --- a/service/src/main/kotlin/app/cash/backfila/service/persistence/BackfillRunQuery.kt +++ b/service/src/main/kotlin/app/cash/backfila/service/persistence/BackfillRunQuery.kt @@ -31,6 +31,6 @@ interface BackfillRunQuery : Query { @Order("updated_at", asc = false) fun orderByUpdatedAtDesc(): BackfillRunQuery - @Constraint("soft_deleted", Operator.EQ) - fun notSoftDeleted(softDeleted: Boolean = false): BackfillRunQuery + @Constraint("deleted_at", Operator.IS_NULL) + fun notSoftDeleted(): BackfillRunQuery } diff --git a/service/src/main/kotlin/app/cash/backfila/service/persistence/DbBackfillRun.kt b/service/src/main/kotlin/app/cash/backfila/service/persistence/DbBackfillRun.kt index 3daa50964..75782e390 100644 --- a/service/src/main/kotlin/app/cash/backfila/service/persistence/DbBackfillRun.kt +++ b/service/src/main/kotlin/app/cash/backfila/service/persistence/DbBackfillRun.kt @@ -90,8 +90,8 @@ class DbBackfillRun() : DbUnsharded, DbTimestampedEntity { @Column(nullable = false) var dry_run: Boolean = false - @Column(nullable = false) - var soft_deleted: Boolean = false + @Column(nullable = true) + var deleted_at: Instant? = null /** Comma separated list of delays for consecutive retries in milliseconds, e.g. 1000,2000 */ @Column diff --git a/service/src/main/kotlin/app/cash/backfila/ui/pages/BackfillShowAction.kt b/service/src/main/kotlin/app/cash/backfila/ui/pages/BackfillShowAction.kt index 750fb5569..71d332f95 100644 --- a/service/src/main/kotlin/app/cash/backfila/ui/pages/BackfillShowAction.kt +++ b/service/src/main/kotlin/app/cash/backfila/ui/pages/BackfillShowAction.kt @@ -11,6 +11,7 @@ import app.cash.backfila.ui.components.DashboardPageLayout import app.cash.backfila.ui.components.PageTitle import app.cash.backfila.ui.components.ProgressBar import app.cash.backfila.ui.pages.BackfillCreateAction.BackfillCreateField.CUSTOM_PARAMETER_PREFIX +import java.time.Instant import javax.inject.Inject import javax.inject.Singleton import kotlinx.html.ButtonType @@ -289,8 +290,8 @@ class BackfillShowAction @Inject constructor( } } - private fun getDeleteButton(state: BackfillState, softDeleted: Boolean): Link? { - if (softDeleted) { + private fun getDeleteButton(state: BackfillState, deletedAt: Instant?): Link? { + if (deletedAt != null) { return null } return when (state) { @@ -309,7 +310,7 @@ class BackfillShowAction @Inject constructor( button = getStateButton(state), updateFieldId = "state", cancelButton = getCancelButton(state), - deleteButton = getDeleteButton(state, soft_deleted), + deleteButton = getDeleteButton(state, deleted_at), ), DescriptionListRow( label = "Dry Run", diff --git a/service/src/main/resources/migrations/v019__backfila.sql b/service/src/main/resources/migrations/v019__backfila.sql new file mode 100644 index 000000000..451d63e21 --- /dev/null +++ b/service/src/main/resources/migrations/v019__backfila.sql @@ -0,0 +1,2 @@ +ALTER TABLE backfill_runs + ADD COLUMN `deleted_at` TIMESTAMP NULL DEFAULT NULL; \ No newline at end of file From ed161ebf5469c741d6c59af93090af6af6d9afe5 Mon Sep 17 00:00:00 2001 From: Jeff Hwang Date: Wed, 30 Apr 2025 13:37:10 -0400 Subject: [PATCH 4/4] address comments --- .../cash/backfila/service/persistence/BackfillSoftDelete.kt | 5 ----- .../backfila/ui/actions/BackfillShowButtonHandlerAction.kt | 3 +-- .../kotlin/app/cash/backfila/ui/pages/BackfillShowAction.kt | 3 +-- service/src/main/resources/migrations/v019__backfila.sql | 2 +- .../src/main/resources/migrations/v020__add_soft_delete.sql | 3 --- 5 files changed, 3 insertions(+), 13 deletions(-) delete mode 100644 service/src/main/kotlin/app/cash/backfila/service/persistence/BackfillSoftDelete.kt delete mode 100644 service/src/main/resources/migrations/v020__add_soft_delete.sql diff --git a/service/src/main/kotlin/app/cash/backfila/service/persistence/BackfillSoftDelete.kt b/service/src/main/kotlin/app/cash/backfila/service/persistence/BackfillSoftDelete.kt deleted file mode 100644 index b62dc2edf..000000000 --- a/service/src/main/kotlin/app/cash/backfila/service/persistence/BackfillSoftDelete.kt +++ /dev/null @@ -1,5 +0,0 @@ -package app.cash.backfila.service.persistence - -enum class BackfillSoftDelete { - SOFT_DELETED, -} diff --git a/service/src/main/kotlin/app/cash/backfila/ui/actions/BackfillShowButtonHandlerAction.kt b/service/src/main/kotlin/app/cash/backfila/ui/actions/BackfillShowButtonHandlerAction.kt index 435fdc10a..c79822267 100644 --- a/service/src/main/kotlin/app/cash/backfila/ui/actions/BackfillShowButtonHandlerAction.kt +++ b/service/src/main/kotlin/app/cash/backfila/ui/actions/BackfillShowButtonHandlerAction.kt @@ -8,7 +8,6 @@ import app.cash.backfila.dashboard.StopBackfillAction import app.cash.backfila.dashboard.StopBackfillRequest import app.cash.backfila.dashboard.UpdateBackfillAction import app.cash.backfila.dashboard.UpdateBackfillRequest -import app.cash.backfila.service.persistence.BackfillSoftDelete import app.cash.backfila.service.persistence.BackfillState import app.cash.backfila.ui.components.AlertError import app.cash.backfila.ui.components.DashboardPageLayout @@ -59,7 +58,7 @@ class BackfillShowButtonHandlerAction @Inject constructor( BackfillState.CANCELLED.name -> { cancelBackfillAction.cancel(id.toLong()) } - BackfillSoftDelete.SOFT_DELETED.name -> { + "soft_delete" -> { softDeleteBackfillAction.softDelete(id.toLong()) } } diff --git a/service/src/main/kotlin/app/cash/backfila/ui/pages/BackfillShowAction.kt b/service/src/main/kotlin/app/cash/backfila/ui/pages/BackfillShowAction.kt index 49e9abfcf..0d861e803 100644 --- a/service/src/main/kotlin/app/cash/backfila/ui/pages/BackfillShowAction.kt +++ b/service/src/main/kotlin/app/cash/backfila/ui/pages/BackfillShowAction.kt @@ -3,7 +3,6 @@ package app.cash.backfila.ui.pages import app.cash.backfila.dashboard.GetBackfillStatusAction import app.cash.backfila.dashboard.GetBackfillStatusResponse import app.cash.backfila.dashboard.ViewLogsAction -import app.cash.backfila.service.persistence.BackfillSoftDelete import app.cash.backfila.service.persistence.BackfillState import app.cash.backfila.ui.actions.BackfillShowButtonHandlerAction import app.cash.backfila.ui.components.AutoReload @@ -298,7 +297,7 @@ class BackfillShowAction @Inject constructor( return when (state) { BackfillState.COMPLETE, BackfillState.CANCELLED -> Link( label = DELETE_STATE_BUTTON_LABEL, - href = BackfillSoftDelete.SOFT_DELETED.name, + href = "soft_delete", ) else -> null } diff --git a/service/src/main/resources/migrations/v019__backfila.sql b/service/src/main/resources/migrations/v019__backfila.sql index 451d63e21..7b6bd1ada 100644 --- a/service/src/main/resources/migrations/v019__backfila.sql +++ b/service/src/main/resources/migrations/v019__backfila.sql @@ -1,2 +1,2 @@ ALTER TABLE backfill_runs - ADD COLUMN `deleted_at` TIMESTAMP NULL DEFAULT NULL; \ No newline at end of file + ADD COLUMN `deleted_at` timestamp(3) NULL DEFAULT NULL; \ No newline at end of file diff --git a/service/src/main/resources/migrations/v020__add_soft_delete.sql b/service/src/main/resources/migrations/v020__add_soft_delete.sql deleted file mode 100644 index 42fab51e9..000000000 --- a/service/src/main/resources/migrations/v020__add_soft_delete.sql +++ /dev/null @@ -1,3 +0,0 @@ --- Add soft_deleted column to backfill_runs -ALTER TABLE backfill_runs - ADD COLUMN soft_deleted BOOLEAN NOT NULL DEFAULT FALSE; \ No newline at end of file