Two review findings on the database archiving target:
- An archive error now records the attempt as failed with the
error string and marks the delivery failed, instead of logging
the error and reporting success. A target that could not do its
one job must not claim it did.
- The archive expiry is now actually configurable: the add-target
form gains an expiry field for database targets, and the value
is validated at creation time via the new
delivery.ValidateArchiveExpiry (empty, "never", or a positive
Go duration), rejecting bad values with a 400 at the only place
a human can fix them, mirroring how Slack target URLs are
validated at creation.
Test updates: a forced archive failure asserts a failed delivery
with a recorded error and no archive file; config builder tests
cover empty/never/duration and rejection paths; the two engine
tests that exercise the database target now build engines with a
real webhook DB manager since archiving is no longer a no-op; the
reopen-debounce test uses a wider window so parallel test load
cannot make two rapid writes straddle it.