This website requires JavaScript.
684469273f
feat(web): app shell with sidebar nav, language switch, sign out
logaritmisk
2026-06-03 23:01:42 +02:00
057a00c413
feat(web): login page with inline error handling
logaritmisk
2026-06-03 22:56:17 +02:00
01f43e1f67
fix(web): disable retry on useObject (404 resolves to null)
logaritmisk
2026-06-03 22:53:32 +02:00
cf02eeb991
feat(web): TanStack Query hooks + session-guarded routes
logaritmisk
2026-06-03 22:49:55 +02:00
2e4187c850
test(web): reset i18n to English after the language-switch test
logaritmisk
2026-06-03 22:47:27 +02:00
478b4ce44e
feat(web): i18n with react-i18next (sv/en)
logaritmisk
2026-06-03 22:42:47 +02:00
66d0624279
test(web): MSW harness with typed handlers, fixtures, and client tests
logaritmisk
2026-06-03 22:35:55 +02:00
dcfddc88c7
feat(web): generated OpenAPI types + typed openapi-fetch client with 401 redirect
logaritmisk
2026-06-03 22:25:10 +02:00
5267f05089
fix(web): restore shadcn theme tokens in index.css; tidy deps + eslint rule
logaritmisk
2026-06-03 22:21:58 +02:00
b7ec4b1041
feat(web): Tailwind 4 + shadcn/ui + ESLint
logaritmisk
2026-06-03 22:14:12 +02:00
8466ed4d08
chore(web): drop dangling favicon link (runtime 404)
logaritmisk
2026-06-03 22:10:29 +02:00
f64688a16f
feat(web): scaffold Vite + React + TS SPA with Vitest
logaritmisk
2026-06-03 22:06:03 +02:00
a177b02145
docs(plan): frontend SPA milestone 1 — task-by-task implementation plan
logaritmisk
2026-06-03 21:56:54 +02:00
31e2a3f30a
docs(spec): frontend SPA milestone 1 (foundation slice) design
logaritmisk
2026-06-03 21:50:30 +02:00
8cfcf07387
fix(db): publish gate fires only on transition into public, not re-set
logaritmisk
2026-06-02 23:40:10 +02:00
e96f74f47a
feat(db): enforce required-field completeness on publish (#16 )
logaritmisk
2026-06-02 23:36:24 +02:00
4921c73fa7
style(api): import reindex into scope rather than crate::-qualify
logaritmisk
2026-06-02 23:29:50 +02:00
d15afda9b2
feat(api): on-write search reindex after catalogue writes (#17 )
logaritmisk
2026-06-02 23:25:43 +02:00
c4e0c4c834
style(api): merge use decl; assert status + breathing room in authority test
logaritmisk
2026-06-02 22:39:36 +02:00
01abd5cbbc
feat(api): admin authority management (create + list by kind)
logaritmisk
2026-06-02 22:33:44 +02:00
d81b069b8f
style(api): merge use decl; breathing-room blank in vocab test
logaritmisk
2026-06-02 22:29:51 +02:00
7a18e0e9bf
feat(api): admin vocabulary + term management
logaritmisk
2026-06-02 22:20:47 +02:00
8b929c7180
refactor(api): descriptive closure params; exhaustive FieldError match; field-endpoint auth tests
logaritmisk
2026-06-02 22:16:50 +02:00
b6a30c3995
feat(api): admin set flexible fields + field-definition listing
logaritmisk
2026-06-02 22:09:43 +02:00
34e5754815
refactor(api): read object visibility inside update tx; breathing-room nits
logaritmisk
2026-06-02 22:05:54 +02:00
3f4da46b78
feat(api): admin object create/update/delete (EditCatalogue, audited as user)
logaritmisk
2026-06-02 21:59:14 +02:00
1888e185f7
refactor(api): share Pagination across admin/public; cover get-by-id auth
logaritmisk
2026-06-02 21:53:21 +02:00
0055616099
feat(api): admin object read surface (paginated list + get, ViewInternal)
logaritmisk
2026-06-02 21:45:53 +02:00
3dc621b6dd
docs(plans): admin CRUD — object lifecycle + vocab/authority management
logaritmisk
2026-06-02 19:02:47 +02:00
807ac1a9f8
chore: sync Cargo.lock with auth dependencies
logaritmisk
2026-06-02 15:21:03 +02:00
5cfee93037
merge: authentication (email/password) — sessions, extractors, admin surface, CLI bootstrap
logaritmisk
2026-06-02 15:20:36 +02:00
369eee4098
fix(server): --session-cookie-secure flag; scope+char-count password; invalid-email test
logaritmisk
2026-06-02 15:16:46 +02:00
dbff95c2a9
feat(server): create-user CLI + session-store migration on startup
logaritmisk
2026-06-02 15:07:58 +02:00
642f709bbe
fix(api): drop redundant dev-deps; fix server AppState for cookie_secure; add logout + illegal-transition tests
logaritmisk
2026-06-02 15:04:07 +02:00
5135aeee6c
feat(api): admin auth surface (login/logout/me/users/publish) on tower-sessions
logaritmisk
2026-06-02 14:54:03 +02:00
4e7288731a
harden(auth): distinguish session-store failure (500) from absent session (401); exhaustive marker + verify_dummy tests
logaritmisk
2026-06-02 14:48:40 +02:00
992526ef77
feat(auth): argon2id hashing + AuthUser/Authorized<Cap> session extractors
logaritmisk
2026-06-02 14:45:13 +02:00
bea9b6b39a
harden(db): case-insensitive email unique index + dup-email test; list_users pagination TODO; from_db note
logaritmisk
2026-06-02 14:42:04 +02:00
f8ec2d7cf1
feat(db): users table + repository (create/by_id/by_email/list), audited
logaritmisk
2026-06-02 14:37:43 +02:00
9597a42eeb
fix(domain): make Editor capability policy fail-closed (exhaustive match)
logaritmisk
2026-06-02 14:32:13 +02:00
74b2cf65ed
feat(domain): user identity (UserId, Email), Role/Capability policy
logaritmisk
2026-06-02 14:29:04 +02:00
1ed9798a1f
docs(plans): authentication (email/password) — sessions, extractors, CLI bootstrap
logaritmisk
2026-06-02 14:26:19 +02:00
6cd01f9b97
merge: publishing — visibility transitions, PublicView & public read API
logaritmisk
2026-06-02 14:04:32 +02:00
1b48f082ee
chore: sync Cargo.lock after dropping api's uuid dep
logaritmisk
2026-06-02 14:04:32 +02:00
720c7ddbbf
chore(api): drop unused uuid dep + redundant domain dev-dep; test internal exclusion + note list/count race
logaritmisk
2026-06-02 13:55:01 +02:00
3c4ada202f
feat(api): public read API (PublicView projection, paginated list + get, OpenAPI)
logaritmisk
2026-06-02 13:48:17 +02:00
b948cae269
refactor(db): share update path so set_visibility avoids a redundant fetch; tie public-visibility const to the enum; test internal exclusion
logaritmisk
2026-06-02 13:35:36 +02:00
14cdd2a04a
feat(db): audited stepwise set_visibility + public-only object readers
logaritmisk
2026-06-02 13:24:29 +02:00
5e2ebbc8d9
test(domain): assert IllegalTransition Display message
logaritmisk
2026-06-02 13:14:37 +02:00
59400062ae
feat(domain): stepwise Visibility state machine (transition_to + IllegalTransition)
logaritmisk
2026-06-02 13:11:01 +02:00
5ea1febb91
docs(plans): publishing — visibility transitions, PublicView, public read API
logaritmisk
2026-06-02 12:50:31 +02:00
f0e00fba40
merge: search (Meilisearch full-text over catalogue objects)
logaritmisk
2026-06-02 12:35:37 +02:00
fac4b703ff
docs(search): document eventual-consistency model; drop stale Task 2 note
logaritmisk
2026-06-02 12:15:18 +02:00
4bafac397a
docs(search): note why reindex test references db crate migrations
logaritmisk
2026-06-02 12:12:12 +02:00
7b91989411
feat(search): build documents resolving term/authority labels; reindex_all
logaritmisk
2026-06-02 12:08:07 +02:00
b8d198f150
fix(search): surface failed Meilisearch tasks; make ensure_index idempotent
logaritmisk
2026-06-02 11:50:58 +02:00
dc903989f7
feat(search): add Meilisearch-backed SearchClient (index, search, remove)
logaritmisk
2026-06-02 11:43:53 +02:00
851181d91d
docs: add Plan 6 (Meilisearch search) implementation plan
logaritmisk
2026-06-02 11:39:55 +02:00
5ee9fd88f1
polish(db): clearer maker label; assert group_key and vocabularies in seed tests
logaritmisk
2026-06-02 11:25:10 +02:00
adc7c61ee2
feat(db): seed a representative Spectrum cataloguing field set (idempotent)
logaritmisk
2026-06-02 11:20:35 +02:00
91a9eb2964
docs: add Spectrum cataloguing seed plan
logaritmisk
2026-06-02 11:17:56 +02:00
f30ce9d9dc
docs(db): note deferred date-format validation (#11 ) at the Date field arm
logaritmisk
2026-06-02 11:12:00 +02:00
45c1d1b123
test(db): cover authority-kind, cross-vocabulary, localized text, replace/remove, no-op, missing object
logaritmisk
2026-06-02 11:07:43 +02:00
c94fd1638c
docs(db): document set_object_fields replace semantics and required-field deferral
logaritmisk
2026-06-02 11:04:45 +02:00
2b0056c038
feat(db): set_object_fields with registry validation and audited diffs
logaritmisk
2026-06-02 10:59:23 +02:00
2aaf98794f
feat(db): add object.fields jsonb column, read it into CatalogueObject
logaritmisk
2026-06-02 10:54:49 +02:00
7b0f804461
docs: add Plan 5 (Object flexible-field values) implementation plan
logaritmisk
2026-06-02 10:52:38 +02:00
f4152b2102
test(db): cover any-kind authority, scalar, zero-label, and list ordering for field definitions
logaritmisk
2026-06-02 10:27:06 +02:00
66ad67ca77
feat(db): add field-definition registry repository
logaritmisk
2026-06-02 10:21:39 +02:00
cbed662c18
feat(db): add field_definition tables
logaritmisk
2026-06-02 10:16:30 +02:00
6e27288f43
fix(domain): make FieldType::from_parts a strict inverse; reject stray bindings
logaritmisk
2026-06-02 10:15:07 +02:00
2242ff5ef1
feat(domain): add field definition types (FieldType, FieldDefinition)
logaritmisk
2026-06-02 10:11:28 +02:00
da2db11a30
docs: add Plan 4 (Field-definition registry) implementation plan
logaritmisk
2026-06-02 10:09:46 +02:00
2938649d62
fix(db): skip UPDATE and audit on no-op object update (keep updated_at consistent)
logaritmisk
2026-06-02 09:40:27 +02:00
a690c60ec6
refactor(db): delete_object via rows_affected; test update/delete-missing and field clearing
logaritmisk
2026-06-02 09:36:44 +02:00
9e1c88b294
feat(db): add catalogue object update/delete with audited field diffs
logaritmisk
2026-06-02 09:32:16 +02:00
616a6f05c6
refactor(db): DRY object SELECT columns, consistent date json; test date + all-none round-trip
logaritmisk
2026-06-02 09:29:40 +02:00
e0c0187f29
feat(db): add catalogue object create/read/list with audit on create
logaritmisk
2026-06-02 09:24:03 +02:00
95357f01dd
feat(db): non-empty CHECK constraints on object text columns
logaritmisk
2026-06-02 09:21:08 +02:00
c1dda280e2
feat(db): add object table
logaritmisk
2026-06-02 09:18:03 +02:00
bf332ac0ae
test(domain): pin Visibility serde output to as_str
logaritmisk
2026-06-02 09:16:53 +02:00
266f914b88
feat(domain): add catalogue object types (Visibility, ObjectInput, CatalogueObject)
logaritmisk
2026-06-02 09:13:54 +02:00
ed608c6e37
docs: add Plan 3 (Catalogue core) implementation plan
logaritmisk
2026-06-02 09:12:41 +02:00
7782bd764a
test(db): zero-label authority round-trip; doc the labels-json constant
logaritmisk
2026-06-02 09:01:06 +02:00
6e45baa8d4
feat(db): add authority repository with multilingual labels
logaritmisk
2026-06-02 08:55:50 +02:00
345073b130
test(db): cover zero-label term and duplicate vocabulary key; use try_get in vocabulary_by_key
logaritmisk
2026-06-02 08:52:58 +02:00
5dc07ddf4c
feat(db): add vocabulary/term repository with multilingual labels
logaritmisk
2026-06-02 08:48:51 +02:00
cc1fbf5b7d
feat(db): RESTRICT vocabulary deletes; non-empty label/lang constraints
logaritmisk
2026-06-02 08:46:34 +02:00
93d54d7783
feat(db): add vocabulary, term, and authority tables
logaritmisk
2026-06-02 08:43:23 +02:00
d5ed2a261f
feat(domain): restore must_use message; test TermRef accessors
logaritmisk
2026-06-02 08:42:14 +02:00
8cf737d8a9
feat(domain): id macro + vocabulary/authority/label value types
logaritmisk
2026-06-02 08:38:39 +02:00
42e0a5f5f1
docs: add Plan 2 (Vocabularies & authorities) implementation plan
logaritmisk
2026-06-02 08:36:03 +02:00
cc26c96a82
chore: update Cargo.lock for audit-spine dependencies
logaritmisk
2026-06-02 08:02:09 +02:00
86a3a8a47c
test(db): assert audit_log mutations fail via the immutability trigger
logaritmisk
2026-06-02 08:01:28 +02:00
45aea6b702
test(db): enforce audit_log immutability and transactional atomicity
logaritmisk
2026-06-02 07:58:10 +02:00
c67b588188
test(db): cover delete/empty-changes/empty-history; clarify map_row naming
logaritmisk
2026-06-02 07:56:05 +02:00
87b016a56c
feat(db): add append-only audit repository (record, history_for)
logaritmisk
2026-06-02 07:52:16 +02:00
01c42837d1
feat(db): also reject TRUNCATE on audit_log (statement-level trigger)
logaritmisk
2026-06-02 07:49:47 +02:00
152fc30116
feat(db): schema bootstrap with append-only audit_log table
logaritmisk
2026-06-02 07:46:39 +02:00
4c6f77b999
test(domain): pin audit serde contracts; loosen time version; note null caveat
logaritmisk
2026-06-02 07:44:21 +02:00