80dbdec107
purge: skip broadcasts of deleted authors, purge outbox log, guards, 410 inbox test
2026-10-26 02:39:06 +01:00
51a70b5260
feat: account purge handler, tombstone cleanup, AP tombstone signing + 410
2026-10-26 02:30:09 +01:00
7f9c252d35
fix: NewRemoteReview param struct, atomic review+orphan movie delete
2026-10-26 01:19:09 +01:00
9a4d0c1714
feat: atomic social local writes, remote review enrichment
...
SocialCommand methods take events. Local follow ops = one FollowCommand::apply
tx (rows + events). k_ap path (remote, block/unblock): best-effort publish in
CompositeSocialAdapter after k_ap write; not atomic, k_ap owns tx.
save_remote_review takes events, enqueued in same tx via
sqlite::persistence::enqueue_events. Deps drop event_publisher: social
command, ReviewObjectHandler.
Remaining .publish( sites:
announce-only: users/delete_account UserDeleted, person/get + get_credits
PersonEnrichmentRequested, jobs/enrichment_staleness, http-axum search,
ImageStored (sync_poster, poster_sync_handler, image-converter backfill,
update_profile; object storage), federation_event_bridge (handler reaction),
nats relay (transport).
non-atomic by necessity: CompositeSocialAdapter::announce (k_ap-owned write).
Everything else rides its write.
2026-10-26 01:12:58 +01:00
04f9c13625
refactor: adapters configured from config crate
2026-10-25 21:07:19 +01:00
e303ae7f08
insights-correlations ( #22 )
...
CI / Check / Test (push) Has been cancelled
Reviewed-on: #22
2026-10-12 18:56:55 +00:00
c9715baab8
structural refactor and codebase improvements
2026-08-09 14:58:14 +02:00
063bab910b
ADR-0003: local follows bypass AP, unified FollowCommand/FollowQuery ports, FederationRepos struct, base_url normalization
CI / Check / Test (push) Has been cancelled
2026-07-27 12:56:30 +02:00
839cababe4
bump k-ap 0.5.0, decompose repo traits, LocalObject, ActivityStreamsType enum, split follow modules
CI / Check / Test (push) Has been cancelled
2026-07-27 11:46:24 +02:00
e30e785936
bump k-ap to 0.4.6, add nodeinfo metadata
2026-07-16 09:56:54 +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
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
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
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
081a20ae31
fix: clippy too-many-args on update_remote_review, use RemoteReviewUpdate struct
2026-07-10 00:41:51 +02:00
5ae38c834a
making it AP complaint
CI / Check / Test (push) Has been cancelled
2026-06-30 02:25:42 +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
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
6bd728fd50
feat: replace instance actor decorator with real DB row
...
CI / Check / Test (push) Failing after 52s
Migrations (postgres + sqlite) insert a service actor with a well-known
UUID. Removes the InstanceActorUserRepo wrapper.
2026-05-30 03:16:03 +02:00
1b9a6617f3
feat: add instance actor for signed fetch (Secure Mode support)
CI / Check / Test (push) Has been cancelled
2026-05-30 03:11: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
624cfe5799
feat: migrate k-ap 0.1.10→0.3.1, fix AP gaps
...
- split FederationRepository into FollowRepository, ActorRepository, BlocklistRepository, ActivityRepository
- RemoteActor: 5 new fields (bio, banner_url, followers_url, following_url, also_known_as)
- ApObjectHandler split: get_local_objects_page/count_local_posts → ApContentReader trait
- builder API: positional args → named setters
- broadcast_create_note/update_note: add ApVisibility + mentioned_inboxes params
- backfill_outbox → import_remote_outbox
- ApUser: also_known_as Option<String> → Vec<String>, new fields
AP gaps fixed:
- add GET /users/{id}/followers + /following with content negotiation
- wire EventPublisher into builder via FederationEventBridge adapter
- add display_name field full stack (domain→DB→API→AP)
- DB-side outbox pagination (get_local_reviews_page)
- set featured_url on ApUser
2026-05-29 10:42:53 +02:00
51bd580a04
watchlist backfill
CI / Check / Test (push) Failing after 57s
CI / Release build (push) Has been skipped
2026-05-28 03:52:38 +02:00
ca8fdb33ba
fix: resolve movies-diary compile errors after k-ap migration
CI / Check / Test (push) Failing after 44s
CI / Release build (push) Has been skipped
2026-05-17 23:12:03 +02:00
6efc47a891
chore: replace local activitypub-base with k-ap git dep
2026-05-17 23:06:20 +02:00
19171806b9
fmt
CI / Check / Test / Build (push) Has been cancelled
2026-05-13 23:38:57 +02:00
fdd61ae701
feat: refactor user profile handling and integrate ApProfileField structure
2026-05-13 22:59:38 +02:00
815178e6a4
feat(ap): ActivityPub spec compliance and profile completeness
...
Phase 1 — spec compliance:
- Add AS_PUBLIC constant; add to/cc fields to CreateActivity, DeleteActivity,
UpdateActivity, AddActivity; populate on all broadcast call sites
- Add @context to outbox CreateActivity items
- Set manuallyApprovesFollowers: true to match actual Pending follow flow
- Gate PermissiveVerifier behind FEDERATION_DEBUG env var
- Add updated timestamp to Person actor JSON
- Improve actor update delivery logging
Phase 2a Batch 1 — AP layer:
- Add /inbox shared inbox route; add endpoints.sharedInbox to Person
- Paginate followers and following collections (20/page, OrderedCollectionPage)
Phase 2a Batch 2 — profile completeness:
- DB migrations: banner_path, also_known_as columns; user_profile_fields table
- ProfileField value object; UserProfileFieldsRepository port
- Banner image upload (stored via image-converter, surfaced as image in Person)
- alsoKnownAs field in Person (account migration support)
- Custom profile fields (up to 4 PropertyValue attachments in Person)
- Profile settings UI: banner preview/upload, alsoKnownAs input, fields form
- PUT /api/v1/profile/fields API endpoint
2026-05-13 22:21:41 +02:00
ca9a504632
feat: wire event_publisher through activitypub::wire()
2026-05-13 01:30:30 +02:00
2567103587
feat: publish FollowAccepted event when remote accepts follow
2026-05-13 01:28:03 +02:00
31fbb79451
refactor: remove watchlist repository references and add get_remote_watchlist use case
2026-05-13 00:34:23 +02:00
53df90ab1f
feat: MovieDto enrichment, movie detail page, PWA, watchlist, watchlist federation
2026-05-13 00:23:45 +02:00
00218366da
Revert "feat: rename product to Screened, add PRODUCT_NAME constant to domain"
...
This reverts commit f2e3a876dc .
2026-05-12 16:26:42 +02:00
f2e3a876dc
feat: rename product to Screened, add PRODUCT_NAME constant to domain
2026-05-12 15:42:24 +02:00
f0620f5aa1
feat: discoverability (NodeInfo, hashtags) and moderation (domain/actor blocking)
...
- NodeInfo at /.well-known/nodeinfo + /nodeinfo/2.0
- Hashtags #MoviesDiary + #MovieTitle on review posts; /tags/{tag} redirect
- Domain blocking: blocked_domains table, admin API + HTML, inbox enforcement
- Per-actor blocking: blocked_actors table, user API + HTML, BlockActivity send/receive
- Delivery filter excludes blocked actors and blocked-domain inboxes
2026-05-12 01:05:46 +02:00
e461c689d9
feat: add axum dependency and implement wiring functions for federation repositories
2026-05-10 18:58:41 +02:00
dcfc17f542
export feature
2026-05-09 20:51:29 +02:00
2120044f1a
Refactor ActivityPub integration and add SQLite federation support
...
- Removed event-publisher dependency from Cargo.lock and Cargo.toml.
- Introduced sqlite-federation crate with necessary dependencies and implementation.
- Updated activitypub crate to use new ActivityPubPort trait for better abstraction.
- Refactored event handling to utilize domain ports instead of direct dependencies.
- Adjusted presentation layer to accommodate new ActivityPub service structure.
- Removed unused test setup for ActivityPub service in favor of NoopActivityPubService.
- Cleaned up SQLite adapter to remove unnecessary dependencies and streamline functionality.
2026-05-09 18:21:16 +02:00
8819266cf9
separation of activitypub
2026-05-09 17:23:06 +02:00
470b29c9e1
federation refinement
2026-05-09 13:53:45 +02:00
df71748897
activity-pub implementation
2026-05-08 21:26:50 +02:00