d867a14b28
add 400+ unit tests for domain and application layers
...
CI / Check / Test (push) Has been cancelled
Extract ReviewLogger trait to decouple import/integrations
from diary::log_review (cross-module coupling smell).
Add in-memory fakes for all repository ports, enabling
isolated testing of every use case module without a database.
Coverage: domain+application 22% → 80%, 427 tests.
2026-06-09 02:07:26 +02:00
30a6200b5b
remove wrapup video rendering (ffmpeg)
...
CI / Check / Test (push) Successful in 15m34s
SPA handles wrapup visuals client-side; server-side
renderer was dead code pulling in ffmpeg + image crates.
2026-06-09 00:36:44 +02:00
a7a11dde08
refactor: split monolithic handlers + testing into domain-grouped modules
...
CI / Check / Test (push) Has been cancelled
handlers/api.rs (1706 LOC) + html.rs (1735 LOC) → 12 domain files:
auth, diary, movies, users, search, watchlist, goals, social,
integrations, helpers + existing import/webhook/wrapup/images/rss.
domain/testing.rs (1309 LOC) → testing/ module:
in_memory, fakes, noops, panics, wrapup.
Update README + architecture.mmd with goals feature.
2026-06-08 23:59:23 +02:00
fff5f4af2f
feat: goals — "watch N movies in YEAR" with progress bar
...
Domain: Goal entity, UserSettings (federation toggle), RemoteGoalEntry.
Ports: GoalRepository, UserSettingsRepository, RemoteGoalRepository.
Adapters: sqlite + postgres repos, migrations, AP content query extensions.
Application: CRUD use cases (create/update/delete/get/list), settings use cases.
API: 7 endpoints (/goals CRUD, /users/{id}/goals, /settings) with utoipa docs.
Federation: GoalObject (Note + goal discriminator), outbound broadcast with
per-user toggle, inbound GoalObjectHandler in CompositeObjectHandler.
SPA: API client + hooks, GoalCard (shadcn Card+Progress+DropdownMenu),
GoalSheet (Drawer), profile integration (editable own, read-only others),
federation toggle in settings (Switch).
Classic HTML: glassmorphic goal card on profile, Frutiger Aero styling.
Progress computed from existing reviews — backwards compatible.
2026-06-08 22:37:52 +02:00
c647f4c13b
fix: clippy 1.96 lints — map_or, duplicate_mod, needless_borrows, slice_refs
CI / Check / Test (push) Failing after 44s
2026-06-04 17:58:01 +02:00
bd7dc648c4
feat: search reindex, worker improvements, person IDs, user display names
...
- add admin POST /api/v1/admin/reindex-search endpoint + event-driven handler
- backfill persons from movie_cast/movie_crew into persons table
- paginate person list_page/backfill_from_credits_batch to cap memory
- concurrent worker event dispatch with semaphore (max 8)
- graceful worker shutdown (drain in-flight tasks on SIGINT)
- always ack events, log handler errors as warnings (no infinite retry)
- NATS ack_wait 600s, AtomicBool guard against concurrent reindex
- add username/display_name to UserSummaryDto and users list
- add person_id to CastMemberDto/CrewMemberDto via get_movie_profile use case
- add movie_id to wrapup MovieRef, person_id to wrapup PersonStat
- thread tmdb_person_id through wrapup cast pipeline
- add is_federated to FeedEntryDto
- cap orphaned persons query with LIMIT 500
- add SPA link to classic site footer
2026-06-04 14:43:28 +02:00
6668ba511c
fmt
CI / Check / Test (push) Failing after 6m32s
2026-06-03 01:38:25 +02:00
f262417971
refactor: rename ImageStorage → ObjectStorage
CI / Check / Test (push) Failing after 46s
2026-06-03 01:33:08 +02:00
d94ccbe057
refactor: store typed WrapUpReport in domain, serialize in adapters
CI / Check / Test (push) Failing after 45s
2026-06-03 01:25:16 +02:00
e8e83d3f16
assets + fmt
CI / Check / Test (push) Has been cancelled
2026-06-03 01:13:06 +02:00
241063c914
feat: wrapup date validation, delete endpoint, failed record cleanup
CI / Check / Test (push) Failing after 41s
2026-06-03 00:54:08 +02:00
d52120d6a9
feat: frutiger aero visual overhaul — backgrounds, glass panels, cast photos, full mosaic
CI / Check / Test (push) Failing after 42s
2026-06-03 00:34:13 +02:00
bf0350c87a
fmt
CI / Check / Test (push) Failing after 6m39s
2026-06-02 23:50:20 +02:00
1e063b6580
feat: streaming video download via ImageStorage::get_stream
CI / Check / Test (push) Failing after 41s
2026-06-02 23:45:31 +02:00
490bd97a40
feat: wire video renderer pipeline + download endpoint
CI / Check / Test (push) Failing after 41s
2026-06-02 22:34:55 +02:00
5e740ba2a1
fix: add async_trait + exhaustive match for wrapup events in tests
2026-06-02 22:14:50 +02:00
b171d2d1e2
feat(application): wrapup generate/get/list use cases
2026-06-02 22:09:08 +02:00
28170c95d4
chore: fmt + remove dead federation module
CI / Check / Test (push) Failing after 5m58s
2026-06-02 20:44:08 +02:00
b9210b6c4e
fix: batch N+1 queries in import duplicate check and watch event dismiss
...
CI / Check / Test (push) Failing after 5m54s
apply_mapping: 2 batch queries instead of up to 2N per-row lookups
dismiss: single fetch + single update instead of 2N per-event queries
2026-06-02 20:05:15 +02:00
ac7edd6953
WIP: federation + integrations
CI / Check / Test (push) Failing after 5m56s
2026-06-02 19:50:19 +02:00
aadad3cfb0
feat: Jellyfin/Plex auto-import via watch queue
...
CI / Check / Test (push) Failing after 6m5s
Webhook ingestion from media servers — movies land in a pending
watch queue, user rates and confirms to create diary entries.
- domain: WatchEvent, WebhookToken models, MediaServerParser port
- adapters: jellyfin + plex parser crates, SQLite + Postgres repos
- application: ingest/confirm/dismiss/cleanup use cases, token mgmt
- presentation: webhook endpoints (bearer + query param auth),
watch queue + integrations settings HTML pages, OpenAPI docs
- worker: WatchEventCleanupJob (daily, 30d retention)
Movie resolution deferred to confirm — single canonical path
through log_review for enrichment, poster fetch, federation.
2026-06-02 17:34:16 +02:00
c3b89f6dc6
refactor: extract business logic from handlers to application layer
...
CI / Check / Test (push) Has been cancelled
CI / Release build (push) Has been cancelled
Move domain logic out of 7 handlers into use cases:
- activity feed: FollowingFilter construction
- user profile: social counts + pending followers
- users list: parallel local+remote actor loading
- watchlist page: local-vs-remote branching
- sync_poster: movie lookup + validation
- get_profile: avatar URL construction
- post_register: register+login orchestration
Add SocialQueryPort.{count_following,count_accepted_followers,
get_pending_followers} to AppContext behind federation feature gate.
2026-05-29 11:41:16 +02:00
2355f89bed
refactor: fix all clippy warnings properly
...
- UserProfile struct groups display_name/bio/avatar/banner/also_known_as/profile_fields
- User::from_persistence takes UserProfile (6 args, was 11)
- PersistedReview struct for Review::from_persistence (1 arg, was 8)
- WatchlistApInput struct for watchlist_to_ap_object (1 arg, was 8)
- ActivityPubDeps struct for activitypub::wire (1 arg, was 11)
- FederationRepos type alias for wire() return types
- FeedSortBy: impl std::str::FromStr instead of inherent from_str
- postgres users.rs: row_to_user takes &PgRow like sqlite
- collapse nested ifs in multipart handlers
- type alias for complex return types (image-converter, worker)
- tui: allow large_enum_variant at crate level (pre-existing, unrelated)
2026-05-29 11:19:02 +02:00
19171806b9
fmt
CI / Check / Test / Build (push) Has been cancelled
2026-05-13 23:38:57 +02:00
c420826474
fix: update tests for expanded User profile signature
2026-05-13 23:27:36 +02:00
53df90ab1f
feat: MovieDto enrichment, movie detail page, PWA, watchlist, watchlist federation
2026-05-13 00:23:45 +02:00
2fd8734d23
fix: close search index consistency gaps (orphan cleanup, discovery indexing, poster sync)
2026-05-12 19:05:22 +02:00
c6770659c5
feat: extensible search engine with person entities (FTS5/tsvector)
2026-05-12 18:47:06 +02:00
763d622601
refactor: move inline tests to separate files via #[path]
2026-05-12 16:39:58 +02:00