A backup transfer target. config is a kind-specific JSON blob (credentials live here and are
never serialized raw — use BackupDestinationView). Not Serialize for exactly that reason.
Per-camera HikVision ISAPI configuration state, populated by the camera-config service. Mirrors
GET /ISAPI/System/deviceInfo (identity), /System/Network/Integrate (onvif_enabled), the
kernel-provisioned ONVIF user (onvif_user_created), and /System/time (time_mode/ntp_server).
Per-camera ONVIF device profile, populated by crate::services::onvif::probe. scopes is a
JSON array of ONVIF scope URIs. ptz_enabled is true when the device exposes a PTZ service and
the chosen media profile carries a PTZConfiguration.
A recurring per-camera recording window, applied when the camera’s record_mode is scheduled
or scheduled_event. days is a JSON array of weekday ints (0=Mon..6=Sun); time_start /
time_end are “HH:MM” 24h in the SERVER’s LOCAL timezone (chrono::Local). When time_start >
time_end the window wraps past midnight (its early-morning portion is attributed to the day it
started on).
A recording gap detected by the indexer (a hole > 3s between consecutive segments). The ANR loop
(services/anr.rs) tries to re-fill pending gaps from the camera’s onboard storage. fill_state is
pending | filled | failed.
A webhook subscription row as stored. secret (the HMAC signing key) is never serialized; use
WebhookSubscriptionView for output. event_types is a JSON array of type names; the sentinel
["*"] matches every event type, otherwise it is an exact-membership set. cursor_at is the
per-subscription delivery cursor (an events.created_at); NULL means “start at now” (no backlog).
Partial update; an ABSENT field is left unchanged. secret is three-state: omitted = unchanged,
null = clear the secret, a value = set it (the outer Option distinguishes “field omitted” from
an explicit null — see [de_field_present]).
Mask a webhook URL for display: keep only scheme://host[:port] and append /… so the path/token
is never revealed. Returns None for an empty url; a url without a scheme is masked to … (it may
be a bare token).