logaritmisk
c4e0c4c834
style(api): merge use decl; assert status + breathing room in authority test
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-02 22:39:36 +02:00
logaritmisk
01abd5cbbc
feat(api): admin authority management (create + list by kind)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 22:33:44 +02:00
logaritmisk
d81b069b8f
style(api): merge use decl; breathing-room blank in vocab test
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-02 22:29:51 +02:00
logaritmisk
7a18e0e9bf
feat(api): admin vocabulary + term management
...
GET/POST /api/admin/vocabularies and GET/POST /api/admin/vocabularies/{id}/terms;
reads gated on ViewInternal, writes on EditCatalogue; labels round-trip verified.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 22:20:47 +02:00
logaritmisk
8b929c7180
refactor(api): descriptive closure params; exhaustive FieldError match; field-endpoint auth tests
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 22:16:50 +02:00
logaritmisk
b6a30c3995
feat(api): admin set flexible fields + field-definition listing
...
- GET /api/admin/field-definitions (ViewInternal) — lists all registered
field definitions with key, data_type, vocabulary_id, authority_kind,
required, group, and localized labels
- PUT /api/admin/objects/{id}/fields (EditCatalogue) — replaces an
object's flexible-field values with replace semantics; validates every
key against the registry (UnknownField → 422, TypeMismatch → 422,
Unresolved → 422, ObjectNotFound → 404, Db → 500)
- FieldDefinitionView DTO added; both handlers registered in OpenAPI
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 22:09:43 +02:00
logaritmisk
34e5754815
refactor(api): read object visibility inside update tx; breathing-room nits
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 22:05:54 +02:00
logaritmisk
3f4da46b78
feat(api): admin object create/update/delete (EditCatalogue, audited as user)
...
POST /api/admin/objects (draft|internal only; public rejected 422),
PUT /api/admin/objects/{id} (preserves visibility; 204/404),
DELETE /api/admin/objects/{id} (204/404). Every write records
AuditActor::User(<session-user-uuid>). Tests: lifecycle, public-rejection,
unauthenticated-rejection.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 21:59:14 +02:00
logaritmisk
1888e185f7
refactor(api): share Pagination across admin/public; cover get-by-id auth
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 21:53:21 +02:00
logaritmisk
0055616099
feat(api): admin object read surface (paginated list + get, ViewInternal)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 21:45:53 +02:00
logaritmisk
369eee4098
fix(server): --session-cookie-secure flag; scope+char-count password; invalid-email test
2026-06-02 15:16:46 +02:00
logaritmisk
dbff95c2a9
feat(server): create-user CLI + session-store migration on startup
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 15:07:58 +02:00
logaritmisk
642f709bbe
fix(api): drop redundant dev-deps; fix server AppState for cookie_secure; add logout + illegal-transition tests
2026-06-02 15:04:07 +02:00
logaritmisk
5135aeee6c
feat(api): admin auth surface (login/logout/me/users/publish) on tower-sessions
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 14:54:03 +02:00
logaritmisk
4e7288731a
harden(auth): distinguish session-store failure (500) from absent session (401); exhaustive marker + verify_dummy tests
2026-06-02 14:48:40 +02:00
logaritmisk
992526ef77
feat(auth): argon2id hashing + AuthUser/Authorized<Cap> session extractors
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 14:45:13 +02:00
logaritmisk
bea9b6b39a
harden(db): case-insensitive email unique index + dup-email test; list_users pagination TODO; from_db note
2026-06-02 14:42:04 +02:00
logaritmisk
f8ec2d7cf1
feat(db): users table + repository (create/by_id/by_email/list), audited
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 14:37:43 +02:00
logaritmisk
9597a42eeb
fix(domain): make Editor capability policy fail-closed (exhaustive match)
2026-06-02 14:32:13 +02:00
logaritmisk
74b2cf65ed
feat(domain): user identity (UserId, Email), Role/Capability policy
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 14:29:04 +02:00
logaritmisk
720c7ddbbf
chore(api): drop unused uuid dep + redundant domain dev-dep; test internal exclusion + note list/count race
2026-06-02 13:55:01 +02:00
logaritmisk
3c4ada202f
feat(api): public read API (PublicView projection, paginated list + get, OpenAPI)
2026-06-02 13:48:17 +02:00
logaritmisk
b948cae269
refactor(db): share update path so set_visibility avoids a redundant fetch; tie public-visibility const to the enum; test internal exclusion
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 13:35:36 +02:00
logaritmisk
14cdd2a04a
feat(db): audited stepwise set_visibility + public-only object readers
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 13:24:29 +02:00
logaritmisk
5e2ebbc8d9
test(domain): assert IllegalTransition Display message
2026-06-02 13:14:37 +02:00
logaritmisk
59400062ae
feat(domain): stepwise Visibility state machine (transition_to + IllegalTransition)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 13:11:01 +02:00
logaritmisk
fac4b703ff
docs(search): document eventual-consistency model; drop stale Task 2 note
2026-06-02 12:15:18 +02:00
logaritmisk
4bafac397a
docs(search): note why reindex test references db crate migrations
2026-06-02 12:12:12 +02:00
logaritmisk
7b91989411
feat(search): build documents resolving term/authority labels; reindex_all
...
Implements build_document in the search crate: resolves Term and Authority
flexible-field values to their human-readable labels so reindex_all produces
documents that Meilisearch can match on label text, not raw UUIDs.
Adds integration test covering the full reindex→search round-trip.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 12:08:07 +02:00
logaritmisk
b8d198f150
fix(search): surface failed Meilisearch tasks; make ensure_index idempotent
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 11:50:58 +02:00
logaritmisk
dc903989f7
feat(search): add Meilisearch-backed SearchClient (index, search, remove)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 11:43:53 +02:00
logaritmisk
5ee9fd88f1
polish(db): clearer maker label; assert group_key and vocabularies in seed tests
2026-06-02 11:25:10 +02:00
logaritmisk
adc7c61ee2
feat(db): seed a representative Spectrum cataloguing field set (idempotent)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 11:20:35 +02:00
logaritmisk
f30ce9d9dc
docs(db): note deferred date-format validation ( #11 ) at the Date field arm
2026-06-02 11:12:00 +02:00
logaritmisk
45c1d1b123
test(db): cover authority-kind, cross-vocabulary, localized text, replace/remove, no-op, missing object
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 11:07:43 +02:00
logaritmisk
c94fd1638c
docs(db): document set_object_fields replace semantics and required-field deferral
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 11:04:45 +02:00
logaritmisk
2b0056c038
feat(db): set_object_fields with registry validation and audited diffs
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 10:59:23 +02:00
logaritmisk
2aaf98794f
feat(db): add object.fields jsonb column, read it into CatalogueObject
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-02 10:54:49 +02:00
logaritmisk
f4152b2102
test(db): cover any-kind authority, scalar, zero-label, and list ordering for field definitions
2026-06-02 10:27:06 +02:00
logaritmisk
66ad67ca77
feat(db): add field-definition registry repository
...
Implements create_field_definition, field_definition_by_key, and
list_field_definitions in db::fields, with TDD integration tests
covering text, term, and authority field type round-trips.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 10:21:39 +02:00
logaritmisk
cbed662c18
feat(db): add field_definition tables
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 10:16:30 +02:00
logaritmisk
6e27288f43
fix(domain): make FieldType::from_parts a strict inverse; reject stray bindings
2026-06-02 10:15:07 +02:00
logaritmisk
2242ff5ef1
feat(domain): add field definition types (FieldType, FieldDefinition)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 10:11:28 +02:00
logaritmisk
2938649d62
fix(db): skip UPDATE and audit on no-op object update (keep updated_at consistent)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 09:40:27 +02:00
logaritmisk
a690c60ec6
refactor(db): delete_object via rows_affected; test update/delete-missing and field clearing
2026-06-02 09:36:44 +02:00
logaritmisk
9e1c88b294
feat(db): add catalogue object update/delete with audited field diffs
...
update_object records only changed fields as audit diffs and skips the
audit entry for no-op updates; delete_object records a Deleted entry.
Both operations are atomic on the caller's connection.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 09:32:16 +02:00
logaritmisk
616a6f05c6
refactor(db): DRY object SELECT columns, consistent date json; test date + all-none round-trip
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 09:29:40 +02:00
logaritmisk
e0c0187f29
feat(db): add catalogue object create/read/list with audit on create
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 09:24:03 +02:00
logaritmisk
95357f01dd
feat(db): non-empty CHECK constraints on object text columns
2026-06-02 09:21:08 +02:00
logaritmisk
c1dda280e2
feat(db): add object table
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-02 09:18:03 +02:00