PUT /image/tags/{id} renames a tag globally; DELETE /image/tags/{id}
removes a tag and every photo's reference. Rename returns 200/404/409
(case-insensitive name conflict) / 400 (empty name); delete returns
204/404. New migration adds a UNIQUE COLLATE NOCASE index on
tags.name with a pre-flight pass that collapses existing case-
insensitive duplicates onto the lowest id.
The connection setup now sets PRAGMA foreign_keys = ON. The schema
already declares ON DELETE CASCADE / SET NULL on several tables —
those clauses were documentation-only because SQLite has FK
enforcement off per-connection by default. Audited every
diesel::delete site; each touches either no inbound FKs or has a
matching policy. delete_tag relies on the tagged_photo cascade
instead of doing manual cleanup.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
*.db-shm / *.db-wal show up in the working tree whenever the server
runs (the WAL/journal pragmas in connect()), and /docs and /specs
hold per-feature design notes that stay local per the project's
"spec docs not in git" convention.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
PATCH /image/faces/{id} can return 503 from three places (face client
disabled, transient embed error, mid-flight disable) and none of them
were logging — operator sees the status code but nothing in the Rust
log explaining why. Add warn! lines at each so future bbox-edit
failures aren't silent. Response body is unchanged so existing clients
keep working.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
cameron
merged commit 3d162105f7 into master2026-05-01 01:03:41 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Edit + Delete Tags
PUT /image/tags/{id} renames a tag globally; DELETE /image/tags/{id} removes a tag and every photo's reference. Rename returns 200/404/409 (case-insensitive name conflict) / 400 (empty name); delete returns 204/404. New migration adds a UNIQUE COLLATE NOCASE index on tags.name with a pre-flight pass that collapses existing case- insensitive duplicates onto the lowest id. The connection setup now sets PRAGMA foreign_keys = ON. The schema already declares ON DELETE CASCADE / SET NULL on several tables — those clauses were documentation-only because SQLite has FK enforcement off per-connection by default. Audited every diesel::delete site; each touches either no inbound FKs or has a matching policy. delete_tag relies on the tagged_photo cascade instead of doing manual cleanup. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>PATCH /image/faces/{id} can return 503 from three places (face client disabled, transient embed error, mid-flight disable) and none of them were logging — operator sees the status code but nothing in the Rust log explaining why. Add warn! lines at each so future bbox-edit failures aren't silent. Response body is unchanged so existing clients keep working. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>