CaIon
524455fac3
feat(redemptions): add batch deletion and optional file exports
...
Add confirmed multi-select deletion through one batch API request and one
soft-delete statement. Record the affected count and requested IDs in a
separate batch audit event, and identify legacy events with missing counts.
After creation, offer an unchecked Save as a file option with TXT/Markdown
formats and optional name/quota fields. Keep Done as the default completion
action. Include translations for all seven frontend locales.
Validation:
- Redemption and audit frontend regression tests, typecheck, and scoped lint.
- go build ./...
- go test ./controller -run '^TestDeleteRedemptionBatch$' -count=1 -v
with TEST_MYSQL_DSN, TEST_MYSQL_LOG_DSN, TEST_POSTGRES_DSN,
and TEST_POSTGRES_LOG_DSN set to isolated primary and log databases.
- Real SQLite 3.50.4, MySQL 8.4.11, and PostgreSQL 16.15 passed, including
deletion of 15 records, duplicate/missing IDs, zero-row retries, audit
deduplication, invalid input, and exclusion of credentials from logs.
2026-09-08 20:47:01 +08:00
..
2026-09-06 22:49:02 +08:00
2026-09-06 22:49:02 +08:00
2026-09-06 22:48:58 +08:00
2026-09-06 22:48:58 +08:00
2026-07-20 16:48:43 +08:00
2026-09-06 22:49:02 +08:00
2026-06-27 17:01:59 +08:00
2026-06-27 17:01:59 +08:00
2026-09-06 22:49:02 +08:00
2026-08-29 18:51:57 +08:00
2026-08-29 18:51:57 +08:00
2026-09-04 20:45:52 +08:00
2026-07-27 21:41:13 +08:00
2026-08-11 22:03:47 +08:00
2026-09-01 21:53:35 +08:00
2026-06-22 18:41:26 +08:00
2026-06-27 17:03:25 +08:00
2026-09-06 22:48:59 +08:00
2026-06-22 18:41:26 +08:00
2026-09-06 22:49:00 +08:00
2026-07-20 16:48:43 +08:00
2026-07-20 16:48:43 +08:00
2026-09-06 22:48:59 +08:00
2026-07-20 16:48:43 +08:00
2026-07-20 16:48:43 +08:00
2026-08-30 20:06:32 +08:00
2026-08-30 20:06:32 +08:00
2026-08-30 21:13:21 +08:00
2026-07-07 12:40:09 +08:00
2026-07-07 12:40:09 +08:00
2026-09-03 14:37:47 +08:00
2026-09-03 14:37:47 +08:00
2026-09-03 14:37:47 +08:00
2026-09-06 22:49:01 +08:00
2026-09-06 22:49:02 +08:00
2026-09-06 22:48:58 +08:00
2026-08-13 22:06:40 +08:00
2026-09-06 22:48:58 +08:00
2026-09-06 22:48:58 +08:00
2025-08-10 12:11:31 +08:00
2025-08-11 14:40:01 +08:00
2026-09-08 17:03:10 +08:00
2026-09-06 22:49:02 +08:00
2026-05-21 11:16:17 +08:00
2026-09-06 22:49:02 +08:00
2026-08-01 23:19:01 +08:00
2026-09-07 22:38:09 +08:00
2026-09-07 22:38:09 +08:00
2026-09-06 22:48:59 +08:00
2026-08-29 20:11:36 +08:00
2026-08-26 20:57:54 +08:00
2026-06-18 12:00:03 +08:00
2026-08-30 23:02:58 +08:00
2026-08-30 23:02:58 +08:00
2026-08-30 21:13:21 +08:00
2026-09-06 22:49:02 +08:00
2026-07-27 15:56:21 +08:00
2025-08-10 12:11:31 +08:00
2026-09-08 15:15:55 +08:00
2026-09-08 17:03:10 +08:00
2026-08-26 20:57:54 +08:00
2026-09-06 22:49:01 +08:00
2026-08-26 20:57:54 +08:00
2026-09-08 20:47:01 +08:00
2025-04-03 18:57:15 +08:00
2026-07-20 16:48:43 +08:00
2026-07-07 12:47:41 +08:00
2026-08-26 20:57:54 +08:00
2026-07-07 21:22:49 +08:00
2026-09-01 20:54:17 +08:00
2026-09-01 20:54:17 +08:00
2026-09-03 14:37:47 +08:00
2026-08-30 19:13:51 +08:00
2026-08-29 18:51:57 +08:00
2026-08-29 18:51:57 +08:00
2026-08-29 18:51:57 +08:00
2026-09-08 15:15:55 +08:00
2026-09-03 14:37:47 +08:00
2026-08-11 22:03:47 +08:00
2026-08-11 22:03:47 +08:00
2026-08-31 11:51:59 +08:00
2026-08-31 11:51:59 +08:00
2026-08-11 22:03:47 +08:00
2026-08-26 20:57:54 +08:00
2026-09-06 22:48:59 +08:00
2026-09-06 22:49:02 +08:00
2026-06-20 18:57:47 +08:00
2026-06-20 18:57:47 +08:00
2026-06-22 18:41:26 +08:00
2026-06-20 18:57:47 +08:00
2026-07-20 16:48:43 +08:00
2026-09-06 22:48:59 +08:00
2026-07-20 16:48:43 +08:00
2026-08-11 22:03:47 +08:00
2026-06-18 12:16:23 +08:00
2026-07-17 19:36:44 +08:00
2026-09-06 22:49:01 +08:00
2026-09-06 22:48:58 +08:00
2026-07-20 16:48:43 +08:00
2026-09-06 22:49:02 +08:00
2026-08-13 22:06:40 +08:00
2026-09-06 22:49:02 +08:00
2026-08-26 20:57:54 +08:00
2026-09-06 22:49:02 +08:00
2026-09-06 22:49:02 +08:00