c224cc6bd2
refactor: extract adapter-common crate — shared sqlx error mapping,
...
row-to-domain conversions, date/uuid utils
Eliminates 39 map_err copies, consolidates parse_uuid/parse_datetime/
datetime_to_str/format_year_month, extracts 7 shared row-to-domain
conversion functions (movie, review, watchlist, stats, user_summary).
Row structs stay per-adapter (FromRow is db-specific), only conversion
logic is shared. Net -281 lines.
2026-07-10 05:44:42 +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
2e32847129
docs+fix: update arch diagram/README/Insomnia, ApiError returns JSON
...
- architecture.mmd: CQRS trait names, ImageFetcher/RssFeedRenderer
ports, infra-wiring crate, api-types description
- README: add infra-wiring, note CQRS ports
- Insomnia: add PATCH /api/v1/reviews/:id
- ApiError returns {"error":"..."} JSON not plain text
2026-07-10 03:52:49 +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
26152660bb
fix: show remote user's reviews on their profile (include_remote when user_id set)
CI / Check / Test (push) Failing after 21m16s
2026-07-10 00:51:33 +02:00
c8f93bdd35
fix: human-readable watch medium labels in classic HTML (Media Server, Physical Media)
2026-07-10 00:44:23 +02:00
081a20ae31
fix: clippy too-many-args on update_remote_review, use RemoteReviewUpdate struct
2026-07-10 00:41:51 +02:00
cde2f5aaae
feat: federate watch_medium in AP review objects
...
- add watch_medium field to ReviewObject (outbound + inbound)
- update_remote_review passes watch_medium to DB
- unknown values silently ignored on ingest
2026-07-10 00:38:29 +02:00
f584bcd724
fix: diary page filters by authenticated user, excludes federated reviews
2026-07-10 00:35:51 +02:00
925f74bb3d
feat: auto-grow comment textarea, review detail sheet for full text
...
- textarea grows as you type instead of fixed 3 rows
- tap truncated comment to open detail sheet with full selectable text
- review detail sheet shows poster, rating, medium, date, full comment
2026-07-10 00:33:49 +02:00
306f4489fd
fix: hoist TooltipProvider to app root, remove per-component instances
2026-07-10 00:25:04 +02:00
5d4622e046
feat: tooltip with concrete date on relative timestamps in SPA
2026-07-10 00:22:14 +02:00
2e2adef5e0
fix: profile shows only own reviews, federation display name in community
...
- diary API accepts user_id filter, profile page passes it
- movie social feed joins ap_remote_actors for handle resolution
- COALESCE prefers actor handle for remote reviews, email for local
2026-07-10 00:19:23 +02:00
206ad44e82
fix: auto-set WatchMedium::MediaServer on webhook watch confirms
2026-07-10 00:07:52 +02:00
8eecd06fb8
docs: update README + architecture for WatchMedium and review editing
2026-07-10 00:05:36 +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
d7fbf8d9e2
feat: enhance review handling by adding actor URL support across multiple components
CI / Check / Test (push) Successful in 1h3m53s
2026-06-30 03:34:52 +02:00
9f6ba55afc
fix: update SQL queries to filter reviews with null remote_actor_url
2026-06-30 02:57:58 +02:00
10c811d9a7
docs: update README and architecture diagrams to reflect new ActivityPub features and user account management
CI / Check / Test (push) Has been cancelled
2026-06-30 02:31:40 +02:00
5ae38c834a
making it AP complaint
CI / Check / Test (push) Has been cancelled
2026-06-30 02:25:42 +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
9c06fbd33e
refactor
2026-06-29 23:54:59 +02:00
bb17beb80d
restructure
2026-06-29 23:38:53 +02:00
7faf14fb2f
docs: update project description to reflect current scope
CI / Check / Test (push) Successful in 43m3s
2026-06-12 12:53:15 +02:00
ddb5966c9b
docs: mention Insomnia collection in API section
CI / Check / Test (push) Has been cancelled
2026-06-12 12:51:24 +02:00
4ec231017e
docs: badges, TOC, quick start, env var table, screenshots
CI / Check / Test (push) Has been cancelled
2026-06-12 12:46:31 +02:00
fab236688b
screenshots
CI / Check / Test (push) Has been cancelled
2026-06-12 12:31:13 +02:00
4683a408d7
fix(spa): use import type for UpdateUserSettingsRequest
CI / Check / Test (push) Successful in 38m33s
2026-06-12 02:29:50 +02:00
6d4c70553a
fix: remove unused UserFederationSettingsQuery import in worker/db.rs
2026-06-12 02:28:02 +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
33aa5bdab3
fmt
CI / Check / Test (push) Successful in 38m21s
2026-06-12 01:46:16 +02:00
b844339795
fix(domain): ImportSession::new() generates own ID, add from_persistence()
2026-06-12 01:41:03 +02:00
cedb13d7a8
fix(domain): typed VOs in MovieEnrichmentRequested and PersonEnrichmentRequested
2026-06-12 01:34:47 +02:00
aec5f6b058
feat(dependencies): add async-stream and bytes to Cargo.toml and Cargo.lock
...
CI / Check / Test (push) Has been cancelled
refactor(adapters): update diary.rs to use BoxStream from futures
2026-06-12 01:20:45 +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
d4c42f8567
feat(application): export_diary::execute returns BoxStream<Bytes>
2026-06-12 01:11:36 +02:00
9c44330f14
feat(adapters): stream_user_history in SQLite and Postgres diary adapters
2026-06-12 01:10:21 +02:00
2fa118570f
feat(export): stream_entries — CSV/JSON streaming via BoxStream<Bytes>
2026-06-12 01:08:11 +02:00
ded7517a8a
feat(domain): DiaryRepository::stream_user_history, DiaryExporter::stream_entries
2026-06-12 01:05:32 +02:00
bf272bf8d9
perf(import): parallelize row processing with JoinSet + Semaphore (limit 10)
CI / Check / Test (push) Has been cancelled
2026-06-12 00:40:27 +02:00
6f34b7b5ec
fix(worker): nack on transient handler failures, ack on permanent
CI / Check / Test (push) Has been cancelled
2026-06-12 00:30:06 +02:00
17d4de461b
feat(domain): DomainError::is_transient() for retry classification
2026-06-12 00:27:16 +02:00
40cb15e7cb
refactor(postgres): split fat PostgresRepository into per-port structs
CI / Check / Test (push) Has been cancelled
2026-06-12 00:00:15 +02:00
c80287bb9e
refactor(presentation): use split sqlite repos in api_test
2026-06-11 23:52:14 +02:00
06ab5c8df1
refactor(sqlite): split fat SqliteMovieRepository into per-port structs
2026-06-11 23:49:55 +02:00