587dcc04de
feat: richer profile stats, wrapup min-count filter, watch medium distribution
...
CI / Check / Test (push) Has been cancelled
- filter wrapup top directors/actors with count < 2
- add watch_medium to wrapup report + adapters
- profile trends: genre breakdown, rating histogram, watch medium dist
- fix unused StarDisplay import in movie detail
2026-07-10 21:38:08 +02:00
46b8488b09
refactor: Feed uses SocialIdentity matching, deps From impl, remove get_accepted_following_urls
...
Feed builds FollowingFilter by matching SocialIdentity::Local/Remote
instead of URL-prefix heuristic. Removed get_accepted_following_urls
from SocialQuery (no longer needed). Added From<&AppState> for deps
structs — 20 construction sites collapsed to one-liners.
2026-07-10 16:31:05 +02:00
7e02f15a85
refactor: consolidate 11 social use cases → SocialCmd/SocialQry enum dispatch
...
-280 net lines. 11 one-file use cases replaced by execute_command/
execute_query with enum dispatch. Added FollowRejected event (reject
was silently dropping). Command→event mapping now explicit in one match.
2026-07-10 16:26:57 +02:00
d60c47199c
fix: FollowTarget enum — actor_url no longer lies about holding a handle
...
FollowCommand.target is now FollowTarget (Identity|Handle) instead of
SocialIdentity. actor_url field always holds a URL; handles go through
FollowTarget::Handle. Adapter resolves handles explicitly. Type system
prevents misuse in future commands.
2026-07-10 16:18:57 +02:00
2484f1e603
fmt
2026-07-10 16:03:36 +02:00
44d7df33a2
refactor: remove SocialQueryPort — replaced by SocialQuery + FederationAdminQuery
...
-319 lines. Legacy SocialQueryPort trait, NoopSocialQueryPort,
PanicSocialQueryPort all deleted. Federation repos now implement
FederationAdminQuery (single method). get_users uses FederationAdminQuery.
All other consumers use unified SocialQuery.
2026-07-10 16:02:27 +02:00
7cfa234902
refactor: SocialActor rich queries, migrate remaining handlers, slim SocialQueryPort
...
SocialQuery returns SocialActor (identity+handle+display_name+avatar_url)
instead of bare SocialIdentity. Migrated get_following_page,
get_followers_page, get_blocked_actors_page to use cases. Moved
get_activity_feed + get_profile from SocialQueryPort to SocialQuery.
Legacy SocialQueryPort remains only for get_users listing.
2026-07-10 15:52:37 +02:00
3ee75305a9
refactor: move ap_service from AppState to AppContext.Services
2026-07-10 15:34:23 +02:00
322e9ee81a
feat: unified social identity layer — SocialIdentity, ports, use cases, adapter
...
SocialIdentity value object (Local|Remote), SocialCommand/SocialQuery
domain ports, 11 CQRS use cases w/ 14 tests, CompositeSocialAdapter
wrapping k_ap, 6 new domain events, handlers migrated from ap_service
to use cases. Closes #12 foundation — AP handlers + legacy cleanup TBD.
2026-07-10 15:29:46 +02:00
0eb56c2be6
fmt
CI / Check / Test (push) Has been cancelled
2026-07-10 05:45:44 +02:00
6a9b4e5c00
refactor: LOW+MEDIUM cleanups — CQRS DiaryQuery/GoalCommand+GoalQuery,
...
test-helpers out of production, decompose get_user_profile_html,
dedup secure_flag, remove vestigial social_query, drop
PersistedImportSession, LoginCommand rename, DeleteAccountDeps,
PersonId macro, ReviewSortBy rename, TUI Command for fs::read,
generic PaginatedResponse<T>, noop ports for production fallbacks
2026-07-10 05:29:02 +02:00
5e0dde656c
refactor: LOW cleanups — dedup secure_flag, remove vestigial social_query,
...
drop PersistedImportSession, rename LoginQuery→LoginCommand, own
DeleteAccountDeps, PersonId via uuid_id! macro, rename SortDirection→
ReviewSortBy, TUI fs::read→Command, generic PaginatedResponse<T>
2026-07-10 05:04:35 +02:00
5266646b0b
fix: remove unused watch_event_query binding, prefix dead field for clippy -D warnings
2026-07-10 04:32:54 +02:00
dee013c7eb
refactor: remaining MEDIUM — CQRS splits, DI Deps, profile dedup, event Value, response enum
...
M1: MovieRepository→MovieCommand/MovieQuery, WatchEventRepository→
WatchEventCommand/WatchEventQuery
M2: goals/ and import/ use Deps structs
M7: extract upload_image helper in update_profile
M8: FederationDeliveryRequested activity_json String→serde_json::Value
M11: UserProfileResponse uses ProfileViewData enum
2026-07-10 03:50:43 +02:00
12da356a40
refactor: fix HIGH+MEDIUM architectural violations from code review
...
HIGH: fix watch_medium data-loss bug, standardize error handling on
ApiError, fix dep direction (rss/template-askama no longer dep on
application), extract ImageFetcher port (remove reqwest from app layer),
move event construction from save_review to use case, extract
infra-wiring crate (DbPool/EventBusBackend dedup), deduplicate
presentation helpers (encode_error, export streaming, multipart parsing)
MEDIUM: split LocalApContentQuery god-trait 10→3 methods, dedup movie
resolution orchestration, add RemoteActorDto/PersonDto mappers, move
AppConfig to infra-wiring, fix SocialQueryPort Uuid→UserId, replace
stringly-typed api-types with domain enums, move count_reviews_in_year
to StatsRepository, dedup event publisher cfg blocks, extract
should_enrich, move group_by_month to application, dedup
count_local_posts, add FederationFlags Default, TUI input helper +
ShowError rename + typed auth errors, api-types cleanup
(UserSettingsDto/UserProfileBase/PreviewRowData)
102 files changed, -681 lines net
2026-07-10 02:08:39 +02:00
29cc68b07c
feat: add WatchMedium field, general review editing, configurable deploy
...
CI / Check / Test (push) Failing after 27m0s
- WatchMedium enum (cinema/streaming/tv/physical_media/download/media_server/other)
- PATCH /api/v1/reviews/:id partial update (rating, comment, watched_at, watch_medium)
- edit_review use case w/ ownership + remote review guard, best-effort AP Update broadcast
- SPA: icon picker, edit sheet (long-press mobile / pencil desktop), watch medium badge
- shared ReviewFormFields, EditableContextMenu, parse_watched_at/format_watched_at
- deploy.sh parameterized (--features, --tag), CORS allows PATCH
- CONTEXT.md glossary, ADR-0001 general review editing
2026-07-10 00:01:14 +02:00
9794babe06
feat: implement federated profile handling with support for remote actor URLs across multiple components
CI / Check / Test (push) Successful in 1h7m53s
2026-07-01 00:13:28 +02:00
943a0abe54
refactor: reorganize HtmlPageContext and update imports across modules
CI / Check / Test (push) Failing after 46m33s
2026-06-30 00:07:20 +02:00
bb17beb80d
restructure
2026-06-29 23:38:53 +02:00
ca7ca51949
feat: per-entity federation privacy toggles for reviews and watchlist
...
- add federate_reviews + federate_watchlist to UserSettings (default true)
- new UserFederationSettingsQuery port with FederationFlags struct
- remove get_user_federate_goals from LocalApContentQuery
- gate ReviewLogged, ReviewUpdated, WatchlistEntryAdded, on_poster_synced on flags
- goals gating migrated to UserFederationSettingsQuery
- ReviewDeleted and WatchlistEntryRemoved ungated (tombstones always fire)
- sqlite + postgres migrations and adapter impls
- settings API and SPA toggles
2026-06-12 02:26:01 +02:00
d9234ecd11
fix(presentation): log errors in diary export stream
2026-06-12 01:18:54 +02:00
010ee404c8
feat(presentation): pipe diary export stream to Body::from_stream
2026-06-12 01:15:23 +02:00
57520c00f3
refactor: move AppContext to presentation crate, structurally enforce boundary
CI / Check / Test (push) Successful in 39m33s
2026-06-11 23:18:28 +02:00
9ca5ada924
refactor(auth): LoginDeps, RegisterDeps, RefreshDeps, RegisterAndLoginDeps, RefreshSessionCleanupJob
2026-06-11 22:58:42 +02:00
61980b0cfb
refactor(users): GetProfileDeps, UpdateProfileDeps, scoped Arc deps
2026-06-11 22:47:17 +02:00
7bf5c47f5b
refactor(diary): DeleteReviewDeps, GetMovieSocialPageDeps, GetActivityFeedDeps
2026-06-11 22:37:35 +02:00
ddf100cfc2
refactor(wrapup): scoped deps — HandleWrapUpRequestedDeps, flat-Arc jobs
2026-06-11 22:29:30 +02:00
cdff0de53d
refactor(movies): collapse single-field deps structs to Arc params
2026-06-11 22:17:09 +02:00
1e62f12903
refactor(movies): EnrichMovieDeps, ReindexSearchDeps, SyncPosterDeps, SearchReindexHandler, EnrichmentStalenessJob
2026-06-11 22:13:25 +02:00
66bd138927
refactor(person): EnrichPersonDeps + GetPersonDeps, PersonEnrichmentHandler
2026-06-11 22:05:38 +02:00
b29f3020e6
refactor(integrations): IngestWatchEventDeps, scoped Arc deps, WatchEventCleanupJob
2026-06-11 22:01:15 +02:00
b5ff43d9dc
refactor(import): scoped Arc deps, ImportSessionCleanupJob
2026-06-11 21:49:15 +02:00
b552c1d156
refactor(watchlist): WatchlistAddDeps, scoped Arc deps
2026-06-11 21:40:48 +02:00
f006ba00a8
refactor(goals): scoped Arc deps instead of AppContext
2026-06-11 21:36:11 +02:00
2b295e10ba
refactor(search): scoped Arc dep instead of AppContext
2026-06-11 21:32:19 +02:00
8ac87a3735
refactor: split jobs.rs into per-context modules
2026-06-11 14:44:23 +02:00
822f3f9d9c
api: refresh + logout endpoints, update login response
2026-06-11 14:37:09 +02:00
c05087a6c7
fmt
2026-06-11 13:51:33 +02:00
9b932cde8e
feat: wire person enrichment handler, update API DTOs
2026-06-11 13:40:16 +02:00
5dc90724d3
feat: JSON import + mapping presets in SPA
...
- Accept .json files in import upload, send format to backend
- Backend endpoint PUT /import/sessions/{id}/profile/{profile_id}
- Load saved presets on mapping step, auto-apply and skip to preview
- Save current mapping as preset on confirm step
- Delete presets from mapping step
2026-06-11 12:58:08 +02:00
f10b114e83
feat: expose search param on user profile API endpoint
2026-06-11 12:37:20 +02:00
05d062f4e0
fmt
CI / Check / Test (push) Successful in 15m57s
2026-06-09 02:31:02 +02:00
70b3ca0f5c
refactor: split domain models, move presentation logic out of app layer
...
CI / Check / Test (push) Failing after 47s
Split domain/models/mod.rs (630 lines) into focused files:
movie.rs, review.rs, user.rs, stats.rs, enrichment.rs, feed.rs.
Move URL/date formatting from application use cases to
presentation mappers — use cases now return raw domain data.
Delete watchlist/get_page.rs (was pure presentation logic),
replace with presentation/mappers/watchlist.rs.
Document signature conventions in CONTRIBUTING.md.
2026-06-09 02:29:11 +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
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
15dc0e526b
feat: expose display_name, also_known_as, profile fields in GET /profile
2026-06-04 02:58:12 +02:00
cf2f4a1b4f
feat: watchlist add accepts title/year/imdb for movies not in DB
2026-06-04 02:47:55 +02:00
e7cdbf9ca7
fix: user profile URLs, typed returns for following/followers
...
- avatar_url/banner_url now use full base_url + /images/ prefix
- get_user_following/followers return Result<Json<_>, ApiError>
- add ap_to_domain helper for anyhow→DomainError conversion
2026-06-04 02:40:04 +02:00