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:00 +08:00
2026-09-06 22:49:00 +08:00
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-07-21 12:39:29 +08:00
2026-06-27 17:01:59 +08:00
2026-09-06 22:48:58 +08:00
2026-07-27 15:56:21 +08:00
2026-02-02 14:37:31 +08:00
2026-06-27 17:01:59 +08:00
2026-06-27 17:01:59 +08:00
2026-08-29 18:51:57 +08:00
2026-09-08 15:15:55 +08:00
2026-09-08 15:15:55 +08:00
2026-09-06 22:48:58 +08:00
2026-09-06 15:47:45 +08:00
2026-08-18 17:31:21 +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-09-08 15:15:55 +08:00
2026-01-02 23:00:33 +08:00
2026-07-20 18:11:22 +08:00
2026-09-06 22:49:00 +08:00
2026-01-03 12:37:50 +08:00
2026-09-06 22:49:00 +08:00
2025-10-30 21:16:42 +08:00
2025-03-15 19:10:12 +08:00
2026-09-03 11:28:57 +08:00
2026-09-06 22:49:02 +08:00
2026-08-13 22:06:40 +08:00
2026-07-29 16:27:15 +08:00
2026-09-06 22:49:00 +08:00
2025-10-11 15:30:09 +08:00
2026-09-06 22:49:02 +08:00
2026-09-08 17:03:10 +08:00
2026-09-08 17:03:10 +08:00
2026-08-01 23:19:01 +08:00
2026-09-06 22:49:02 +08:00
2026-09-06 22:49:02 +08:00
2026-09-04 20:45:52 +08:00
2026-09-06 22:49:00 +08:00
2026-07-27 15:56:21 +08:00
2026-07-27 15:56:21 +08:00
2026-09-06 22:48:59 +08:00
2026-09-06 22:48:59 +08:00
2026-09-06 22:49:02 +08:00
2026-05-13 22:18:46 +08:00
2026-05-22 11:00:58 +08:00
2026-05-22 11:00:58 +08:00
2026-05-20 11:38:09 +08:00
2026-03-21 20:40:39 +08:00
2026-07-27 15:56:21 +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-08-29 18:51:57 +08:00
2026-08-29 18:51:57 +08:00
2026-09-03 14:37:47 +08:00
2026-08-29 18:51:57 +08:00
2025-10-11 15:30:09 +08:00
2026-04-07 15:56:28 +08:00
2026-05-16 14:54:47 +08:00
2026-09-06 22:49:02 +08:00
2026-09-06 22:49:02 +08:00
2026-09-06 22:49:02 +08:00
2026-09-08 20:47:01 +08:00
2026-09-08 20:47:01 +08:00
2026-09-01 21:53:35 +08:00
2026-09-03 11:28:57 +08:00
2026-08-29 18:51:57 +08:00
2026-09-06 22:48:58 +08:00
2026-07-20 16:48:43 +08:00
2026-07-20 16:48:43 +08:00
2026-09-03 20:42:57 +08:00
2026-09-06 22:49:00 +08:00
2026-09-06 22:49:02 +08:00
2026-09-06 22:49:02 +08:00
2026-09-06 22:49:00 +08:00
2026-05-13 22:18:46 +08:00
2026-07-20 16:48:43 +08:00
2026-07-20 16:48:43 +08:00
2026-05-24 16:19:27 +08:00
2026-09-06 22:49:01 +08:00
2026-07-07 21:22:49 +08:00
2026-07-26 20:47:52 +08:00
2026-06-24 17:16:21 +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-08-29 18:51:57 +08:00
2026-09-08 15:15:55 +08:00
2026-09-08 15:15:55 +08:00
2026-08-29 18:51:57 +08:00
2026-09-06 22:49:00 +08:00
2026-09-06 22:48:59 +08:00
2026-07-20 16:48:43 +08:00
2026-08-01 23:19:01 +08:00
2026-09-06 22:49:01 +08:00
2026-09-06 22:49:01 +08:00
2026-08-14 17:34:57 +08:00
2026-08-26 20:57:54 +08:00
2026-08-14 17:34:57 +08:00
2026-04-18 14:22:54 +08:00
2026-08-14 17:34:57 +08:00
2026-08-14 17:34:57 +08:00
2026-08-26 20:57:54 +08:00
2026-09-06 22:49:02 +08:00
2025-10-11 15:30:09 +08:00
2026-06-20 18:57:47 +08:00
2026-06-20 18:57:47 +08:00
2026-09-06 22:49:01 +08:00
2026-09-06 22:49:01 +08:00
2026-09-06 22:49:02 +08:00
2026-09-06 22:49:02 +08:00
2026-08-29 18:51:57 +08:00
2026-09-06 22:49:00 +08:00