0e76ca1895
clean up
lint / lint (push) Failing after 5m1s
test / unit (push) Successful in 16m56s
test / integration (push) Failing after 19m2s
lint / lint (pull_request) Failing after 5m4s
test / unit (pull_request) Successful in 16m27s
test / integration (pull_request) Failing after 17m29s
2026-05-16 11:41:24 +02:00
2754e3e820
chore(application): fix unused import and clippy warnings in thoughts use cases
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m7s
test / unit (pull_request) Successful in 16m39s
test / integration (pull_request) Failing after 17m43s
2026-05-16 11:31:07 +02:00
4b1e7565ac
feat(bootstrap): wire ApiKeyServiceImpl + PgEngagementRepository
2026-05-16 11:21:19 +02:00
5618da7d37
refactor(presentation): replace impl FromAppState boilerplate with deps_struct! macro in remaining handlers
2026-05-16 11:19:04 +02:00
e9f7851400
refactor(presentation/feed): call ports directly — remove shallow use case wrappers
2026-05-16 11:16:57 +02:00
d701a40e61
feat(presentation/thoughts): use enrichment use cases — real engagement stats, no hardcoded zeros
2026-05-16 11:16:54 +02:00
eea1d3fe24
feat(presentation): add deps_struct! macro; add api_key_auth + engagement to AppState; use ApiKeyService in extractor
2026-05-16 11:10:45 +02:00
90866aea58
refactor(application): delete shallow feed use cases — keep only get_home_feed
2026-05-16 11:09:26 +02:00
2d2b5dde6a
feat(application): add get_thought_view + get_thread_views use cases with real engagement stats
2026-05-16 11:08:31 +02:00
bf5fd618cb
feat(postgres): add PgEngagementRepository with batch stats query
2026-05-16 11:04:54 +02:00
ae8a3dc6ed
feat(postgres): add list_paginated + find_by_ids to PgUserRepository
2026-05-16 11:04:33 +02:00
0222a168db
feat(auth): add ApiKeyServiceImpl — moves sha256 hashing out of presentation
2026-05-16 11:03:07 +02:00
d3223923e4
feat(domain/testing): add ApiKeyService, EngagementRepository, list_paginated, find_by_ids to TestStore
2026-05-16 11:01:54 +02:00
f4db518167
feat(domain): add ApiKeyService, EngagementRepository ports; extend UserReader with list_paginated + find_by_ids
2026-05-16 10:59:32 +02:00
8628acfb77
refactor(application): use UniqueViolation in register — remove postgres constraint strings
2026-05-16 10:58:14 +02:00
1ab3766ce8
fix(postgres): map unique constraint violations to DomainError::UniqueViolation
2026-05-16 10:57:04 +02:00
ca35e8e774
feat(domain): add DomainError::UniqueViolation {field}
2026-05-16 10:55:58 +02:00
65ec64a4d9
feat(activitypub): index hashtags from incoming federated notes
...
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m2s
test / unit (pull_request) Successful in 16m11s
test / integration (pull_request) Failing after 18m6s
- accept_note now returns ThoughtId (INSERT then SELECT by ap_id)
- ThoughtsObjectHandler extracts Hashtag entries from AP tag array, strips #, lowercases
- Calls TagRepository.find_or_create + attach_to_thought for each tag; failures silenced
- TagRepository injected into handler via bootstrap and worker factories
2026-05-16 02:56:07 +02:00
efa9bbc6e5
feat(bootstrap): inject TagRepository into ThoughtsObjectHandler
2026-05-16 02:52:58 +02:00
3907ee1538
feat(activitypub): index hashtags from incoming federated notes
2026-05-16 02:51:09 +02:00
98e96b306a
fix(postgres): accept_note returns ThoughtId via SELECT after INSERT
2026-05-16 02:48:52 +02:00
0d43d0adb9
refactor(ap-ports): accept_note returns ThoughtId instead of ()
2026-05-16 02:46:20 +02:00
1d35cedf3f
docs: federated hashtag indexing implementation plan
2026-05-16 02:43:39 +02:00
f895503175
docs: federated hashtag indexing design spec
2026-05-16 02:39:33 +02:00
78ee7b9388
feat: suspense boundaries, streaming sidebar, N+1 fix for top-friends
...
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m3s
test / unit (pull_request) Successful in 16m12s
test / integration (pull_request) Failing after 17m8s
- Backend: top-friends endpoint returns Vec<UserResponse> (JOIN already existed, handler was discarding data)
- Frontend: TopFriends self-contained — fetches own data via cookies, no more N+1 getUserProfile calls
- Frontend: sidebar (TopFriends, PopularTags, UsersCount) wrapped in Suspense — feed renders immediately
- Frontend: TagsSkeleton + CountSkeleton added to loading-skeleton.tsx
- Frontend: loading.tsx skeleton files added for feed, tags, search, and thread pages
2026-05-16 02:18:51 +02:00
f135e4d583
feat(frontend): loading.tsx skeletons for feed, tags, search, and thread pages
2026-05-16 02:16:45 +02:00
42baf3fe3c
perf(frontend): stream sidebar via Suspense — feed renders immediately; sidebar loads async
2026-05-16 02:14:36 +02:00
e86f07ef34
refactor(frontend): TopFriends self-contained — fetches own data, no N+1
2026-05-16 02:11:05 +02:00
98d3fdb832
feat(frontend): TagsSkeleton and CountSkeleton for sidebar Suspense fallbacks
2026-05-16 02:10:55 +02:00
2c3e7934b8
fix(frontend): getTopFriends schema returns UserSchema[] not string[]
2026-05-16 02:10:37 +02:00
29e4af26d8
fix(api): top-friends endpoint returns full UserResponse — eliminates frontend N+1
2026-05-16 02:08:22 +02:00
57b1bfc447
feat(api-types): TopFriendsResponse with Vec<UserResponse>
2026-05-16 02:06:06 +02:00
28521cc9ed
docs: suspense + streaming implementation plan
2026-05-16 02:03:52 +02:00
7f10349c76
docs: suspense + streaming design spec
2026-05-16 01:59:16 +02:00
e2210ba0f0
feat(frontend): performance + DRY + composition overhaul
...
- Tagged fetch cache: all GET fetches have next.tags for targeted invalidation
- Server Actions (thoughts, social, profile) replace scattered router.refresh()
- Eliminated author profile waterfall — use thought.author directly
- useOptimistic on FollowButton for instant feedback
- ThoughtForm unifies PostThoughtForm and ReplyForm
- EmptyState and LoadingSkeleton shared primitives
- RemoteUserProfile split into ProfileCard + Connections
2026-05-15 23:21:51 +02:00
448cd506eb
fix(frontend): remove dead activeTab state; guard URL hostname parse
2026-05-15 20:21:05 +02:00
c1c9539978
refactor(frontend): split RemoteUserProfile into ProfileCard + Connections
2026-05-15 20:16:39 +02:00
688e7b0018
refactor(frontend): FollowButton useOptimistic + Server Action; edit-profile-form Server Action
2026-05-15 20:08:49 +02:00
71233f069e
fix(frontend): ThoughtForm — safe onSuccess?.() on cancel, dedupe reply textarea classes
2026-05-15 20:07:27 +02:00
d450a1d8d8
refactor(frontend): EmptyState + LoadingSkeleton primitives; unified ThoughtForm replaces PostThoughtForm and ReplyForm
2026-05-15 20:01:00 +02:00
dadfe04934
perf(frontend): eliminate author profile waterfall — use thought.author directly
2026-05-15 19:47:06 +02:00
9ecbde019d
feat(frontend): Server Actions for thought, social, and profile mutations
2026-05-15 19:43:10 +02:00
ed789c6170
fix(frontend): tag remaining GET fetches for cache invalidation
2026-05-15 19:41:50 +02:00
091c3a4706
feat(frontend): add next.tags cache support to apiFetch; tag all GET fetches
2026-05-15 19:38:24 +02:00
fe610c8b6f
fix(frontend): tag getTopFriends fetch
2026-05-15 19:30:17 +02:00
4f92c16c0f
docs: frontend overhaul implementation plan
2026-05-15 19:24:28 +02:00
896d2d86c9
docs: frontend overhaul design spec
2026-05-15 19:17:31 +02:00
94ea7a287f
clean up
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m2s
test / unit (pull_request) Successful in 16m56s
test / integration (pull_request) Failing after 17m15s
2026-05-15 18:58:45 +02:00
511a09db25
chore: remove arch-refactors subproject
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m0s
test / unit (pull_request) Successful in 16m19s
test / integration (pull_request) Failing after 17m4s
2026-05-15 18:58:24 +02:00
0592861edd
refactor: 5 architectural improvements (Tasks 2-5 + Task 6 fix)
...
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m2s
test / unit (pull_request) Successful in 16m19s
test / integration (pull_request) Failing after 17m15s
- feat(domain): Hashtag value object with canonical extract() — unifies two
divergent private implementations; fields pre-compute raw/normalized/url_slug/ap_name
- feat(presentation): Deps<S: FromAppState> extractor — each handler now
declares its exact dependency surface; AppState unchanged; handlers
become unit-testable without mocking all 20 deps
- refactor(feed): replace 5 flat FeedRepository methods with FeedQuery/FeedScope
— single query() method; SQL shared logic lives once; adding feed types
no longer requires 5 edits
- refactor(activitypub): ActivityPubRepository + OutboundFederationPort moved
out of domain::ports into activitypub-base::ap_ports — domain crate no
longer knows about AP IDs, inboxes, or actor URLs
- fix(outbox): OutboxRelay now opens a per-row transaction so FOR UPDATE
SKIP LOCKED actually holds the lock during publish + mark_delivered
2026-05-15 18:54:20 +02:00
6024a65060
feat(infra): transactional outbox — OutboxWriter port, PgOutboxWriter, OutboxRelay, TestOutbox; update create_thought + delete_thought
2026-05-15 18:31:57 +02:00
15b1d0fdb7
fix(db): map 23505 unique_violation to DomainError::Conflict (→ HTTP 409); close TOCTOU on register save
2026-05-15 17:03:48 +02:00
a02ae3e662
fix(db): in_reply_to_id FK ON DELETE SET NULL — deleting a thought no longer blocks if it has replies
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m40s
test / unit (pull_request) Successful in 16m10s
test / integration (pull_request) Failing after 17m4s
2026-05-15 16:29:57 +02:00
e43d784c39
feat(worker): DLQ processor — exhausted events moved to failed_events with exponential retry
2026-05-15 16:26:44 +02:00
c092b9e658
feat(postgres): failed_events table and PgFailedEventStore for dead-letter queue
2026-05-15 16:23:21 +02:00
340886fcfe
fix(nats): explicit consumer config, ack timeouts, unknown-event acking, delivery_count
2026-05-15 16:20:31 +02:00
75e8d349e3
fix(auth): validate JWT secret length, equalize login timing, reduce TTL to 24h
2026-05-15 16:16:58 +02:00
50a08d8ed6
docs: NATS hardening + DLQ + auth security implementation plan
2026-05-15 16:15:10 +02:00
e278e4e2cc
docs: NATS hardening, DLQ, and auth security design spec
2026-05-15 16:10:11 +02:00
fd9e526b81
fix(search): use to_thought_response in search handler — was returning snake_case partial data
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m24s
test / unit (pull_request) Successful in 16m42s
test / integration (pull_request) Failing after 17m1s
2026-05-15 15:44:59 +02:00
6dd4e3366c
fix(search): viewer-aware SQL in search_thoughts — ViewerContext now real instead of hardcoded false
2026-05-15 15:24:55 +02:00
48b57abf92
refactor(adapters): update FeedEntry construction to use EngagementStats + ViewerContext
2026-05-15 15:21:48 +02:00
686dc1c91a
refactor(domain): FeedEntry — EngagementStats + Option<ViewerContext> sub-structs
2026-05-15 15:20:07 +02:00
693f53b4b6
docs: FeedEntry decoupling implementation plan
2026-05-15 15:18:32 +02:00
a245b7b8b9
docs: FeedEntry decoupling design spec
2026-05-15 15:15:33 +02:00
988f5c75aa
fix(tests): use distinct usernames in notification tests
2026-05-15 14:11:58 +02:00
3f6b91c943
refactor(ports): ActivityPubRepository takes &str instead of url::Url — infra type stays in adapter
2026-05-15 14:06:33 +02:00
c76894e527
refactor(domain): remove AP delivery fields (inbox_url, public_key) from domain RemoteActor
2026-05-15 14:02:53 +02:00
1a77e15d70
refactor(application): remove pass-through search use cases — call SearchPort directly
2026-05-15 13:59:30 +02:00
f697267828
fix(domain): from_db_str returns Result — unknown DB values are errors not silent defaults
2026-05-15 13:57:38 +02:00
5a64dd361c
refactor(domain): algebraic NotificationKind — invalid states now unrepresentable
2026-05-15 13:53:53 +02:00
189901b778
refactor(ports): CQRS split — FederationActionPort into four focused sub-ports
2026-05-15 13:49:58 +02:00
8ed7f3d5bc
refactor(ports): CQRS split — UserRepository = UserReader + UserWriter supertrait
2026-05-15 13:43:43 +02:00
a902154777
refactor(domain): remove FetchRemoteActorPosts/FetchActorConnections from DomainEvent; add FederationSchedulerPort
2026-05-15 13:28:19 +02:00
e935c8973e
refactor(domain): remove ap_id/inbox_url from User and Thought; use ActivityPubRepository lookups
2026-05-15 13:21:21 +02:00
bf3e336d0f
feat(ports): add get_thought_ap_id and get_actor_ap_urls to ActivityPubRepository
2026-05-15 13:09:37 +02:00
711b3ec63b
fix(ap): protocol compliance — actor verification, on_unlike, Move, bto/bcc
...
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m31s
test / unit (pull_request) Successful in 16m12s
test / integration (pull_request) Failing after 16m53s
- Add verify() to Accept/Reject (actor must match Follow target)
- Add verify() to Create/Update (actor must match attributedTo)
- Add verify() to Delete (actor domain must match object domain)
- Fix UpdateActivity passing wrapper id instead of object id to on_update
- Implement on_unlike (was no-op stub) — publishes LikeRemoved event
- BlockActivity now removes remote actor as follower, not just following
- Add MoveActivity (account migration) to InboxActivities enum
- Add bto/bcc fields to CreateActivity for blind DM support
- http_signature_compat(true) restricted to debug mode only
- Announce of non-local object logs debug instead of silent drop
- postgres-federation: get_followers/get_following_page/count_following
now consistently filter by status='accepted'
2026-05-15 12:52:37 +02:00
314dad5451
Refactor database error handling across repositories to use IntoDbResult for improved error management
...
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m30s
test / unit (pull_request) Successful in 16m10s
test / integration (pull_request) Failing after 16m44s
- Updated PgNotificationRepository to utilize IntoDbResult for error handling in various methods.
- Refactored PgRemoteActorRepository to replace manual error mapping with IntoDbResult.
- Modified PgRemoteActorConnectionRepository to implement IntoDbResult for error handling.
- Adjusted PgTagRepository to use IntoDbResult for consistent error management.
- Introduced test_helpers module for seeding users and thoughts in tests.
- Enhanced PgThoughtRepository to leverage IntoDbResult for error handling.
- Updated PgTopFriendRepository to utilize IntoDbResult for error management.
- Refactored PgUserRepository to implement IntoDbResult for error handling.
- Added constants for pagination defaults in requests.
- Introduced MAX_TOP_FRIENDS constant for top friends validation.
- Refactored JWT expiration time to use a constant.
- Improved rate limiter configuration with constants for better readability.
- Added utility methods for FollowState and Visibility enums for string conversions.
- Introduced maximum length constants for Username, Email, and Content value objects.
- Cleaned up test modules by removing redundant code and utilizing a shared testing state.
2026-05-15 12:31:25 +02:00
a040a38036
fix(service): remove unused followers and following route handlers
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m20s
test / unit (pull_request) Successful in 16m27s
test / integration (pull_request) Failing after 16m54s
2026-05-15 12:08:45 +02:00
6273635aeb
feat: implement unread notification count and enhance user listing with pagination
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m33s
test / unit (pull_request) Successful in 16m24s
test / integration (pull_request) Failing after 16m52s
2026-05-15 12:04:00 +02:00
5f61a71336
test(activitypub): add missing argument to test case for clarity
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m22s
test / unit (pull_request) Successful in 16m26s
test / integration (pull_request) Failing after 16m58s
2026-05-15 11:52:49 +02:00
7b1e26fa9e
fix(ap): propagate sharedInbox through DbActor — was hardcoded None everywhere
2026-05-15 11:51:57 +02:00
bd1dd89f78
refactor(bootstrap): use ap_service.router() as single source of truth for AP routes
2026-05-15 11:47:37 +02:00
a8caca8df8
fix(bootstrap): register /inbox shared inbox route — was missing, Mastodon delivers deletes there
2026-05-15 11:45:46 +02:00
296dfdaeee
fix(frontend): key RemoteUserProfile and Tabs by actor/user id to reset state on navigation
2026-05-15 11:26:17 +02:00
db1625dc0d
fix(ap): use Note id (not Create activity id) in CreateActivity::receive — fixes Delete sync
2026-05-15 10:58:13 +02:00
4b20bfd369
fix(frontend): initialize follow state from server-side following list on remote actor profile
2026-05-15 10:54:01 +02:00
cf78b3e28f
fix(frontend): use thought.author.avatarUrl as base in ThoughtThread — fixes remote author avatars on feed and detail pages
2026-05-15 10:46:38 +02:00
159a8ca43b
fix(ap): store avatar_url from fetched actor in remote_actors when following
2026-05-15 10:27:26 +02:00
cf6eec55da
fix(feed): append @domain to handle when remote_actors stored username-only handle (old data)
2026-05-15 10:17:13 +02:00
44e152783f
fix(feed): join remote_actors to get proper handle and avatar for remote authors
2026-05-15 10:09:14 +02:00
2a51241bb5
fix(ap): resolve parent ap_id for replies so inReplyTo is set on outbound Notes
2026-05-15 09:59:50 +02:00
009b2d43c9
feat(frontend): show external parent link on remote reply posts
2026-05-15 05:51:03 +02:00
f946239757
feat(api): expose replyToUrl in ThoughtResponse for remote reply context
2026-05-15 05:50:59 +02:00
90dbf76753
feat(feed): include remote following posts in home feed
2026-05-15 05:47:26 +02:00
6c83c193ed
feat(ap): @mention notification from inbound remote Notes
2026-05-15 05:44:10 +02:00
ca1ebc4b68
feat(ap): broadcast Update(Actor) when user updates their profile
2026-05-15 05:32:25 +02:00
d360e506db
feat(ap): handle Undo(Like) inbound activity
2026-05-15 05:28:52 +02:00
f008564c32
feat(ap): add hashtag tag array to outbound Notes
2026-05-15 05:26:56 +02:00
82f2a3aaa0
fix(ap): wrap outbound Note content in HTML paragraph tags
2026-05-15 05:25:20 +02:00
3455512bbb
docs: federation gaps round 2 implementation plan
2026-05-15 05:23:37 +02:00
09bebf7dc9
fix: store in_reply_to on remote notes + use full handle in federation component links/actions
2026-05-15 05:09:44 +02:00
e04b08c202
feat(application): federate local likes + locality guard prevents remote boost re-broadcast
2026-05-15 04:58:38 +02:00
a7527c50be
feat(activitypub): implement on_like and on_announce_received in ThoughtsObjectHandler
2026-05-15 04:55:50 +02:00
e691b20a05
feat(activitypub-base): broadcast_like/undo_like + LikeActivity inbox handler
2026-05-15 04:52:03 +02:00
0cf34184d9
feat(activitypub-base): LikeActivity struct + on_like/on_announce_received trait methods
2026-05-15 04:49:20 +02:00
6d365dd3cf
feat(domain): add broadcast_like/broadcast_undo_like to OutboundFederationPort
2026-05-15 04:47:19 +02:00
9af1d33e71
docs: AP likes and boost notifications implementation plan
2026-05-15 04:45:39 +02:00
2e3b81de17
fix: full fediverse handle display + follower count includes remote
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
test / integration (pull_request) Has been cancelled
2026-05-15 04:35:04 +02:00
4342a06319
clean up
2026-05-15 04:29:18 +02:00
d88eb5d127
feat(frontend): show @handle and link to profile in federation actor lists
2026-05-15 04:28:36 +02:00
d98c338e52
fix(frontend): unify local+remote followers/following — profile tab becomes Requests only
2026-05-15 04:25:33 +02:00
895b892cf2
feat(frontend): proper pagination with page numbers and ellipsis
2026-05-15 04:21:11 +02:00
40d8234225
fix(frontend): hide pagination when only one page
2026-05-15 04:19:45 +02:00
9df1a55c48
feat(frontend): federation tab on own profile
2026-05-15 04:14:56 +02:00
cb413ee6e9
feat(frontend): federation settings page
2026-05-15 04:14:29 +02:00
b86c486530
feat(frontend): FederationPanel tabbed wrapper
2026-05-15 04:14:07 +02:00
86a21a5bb7
feat(frontend): RemoteFollowing component
2026-05-15 04:13:51 +02:00
c4dd0797a1
feat(frontend): RemoteFollowers component
2026-05-15 04:13:34 +02:00
497edf3437
feat(frontend): PendingRequests component
2026-05-15 04:13:17 +02:00
e4d1a1f4d1
feat(frontend): federation management API client functions
2026-05-15 04:12:52 +02:00
a8fbfcf49e
feat(presentation): federation management endpoints
2026-05-15 04:10:36 +02:00
8c6e259133
feat(application): federation management use cases
2026-05-15 04:08:40 +02:00
75c1870891
feat(activitypub-base): implement federation management port methods
2026-05-15 04:05:31 +02:00
1b0bb911a0
feat(domain): add federation management methods to FederationActionPort
2026-05-15 03:35:58 +02:00
3903421d54
docs: federation management implementation plan
2026-05-15 03:33:39 +02:00
4533e35092
docs: federation management design spec
2026-05-15 03:28:01 +02:00
f7ac6f6476
feat(dependencies): add bcrypt, blowfish, cipher, and inout packages to Cargo.lock
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
test / integration (pull_request) Has been cancelled
lint / lint (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
2026-05-15 03:20:37 +02:00
9976c1481a
feat(frontend): show precise date on hover over relative timestamps
2026-05-15 03:19:24 +02:00
e6b351b472
feat(frontend): show fediverse handle @user@domain on local user profiles
2026-05-15 03:16:17 +02:00
706d7389ed
refactor: replace inline find_by_id calls with get_user use case in presentation handlers
2026-05-15 03:14:09 +02:00
6e9b1596d8
refactor: move UUID/username routing to application use case — fix handler boundary leak
2026-05-15 03:12:52 +02:00
bbf6c97379
fix: UUID fallback in GET /users/{id} so AP actor URLs resolve for signature verification
2026-05-15 03:11:33 +02:00
b5427cab7d
fix: force HTTPS for WebFinger in follow/unfollow — library uses HTTP in debug mode
2026-05-15 03:03:51 +02:00
f7350847c5
fix: allow dots in usernames; BCrypt fallback in password verifier for v1 migrations
2026-05-15 02:56:18 +02:00
555bcea307
fix: correct API_URL default value in deploy script
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
test / integration (pull_request) Has been cancelled
lint / lint (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
2026-05-15 02:48:36 +02:00
031a22514d
feat: implement remote unfollow — wire FederationActionPort through delete_follow handler
2026-05-15 02:46:24 +02:00
eebdbeaaf2
chore: use shared-services network for NATS, hardcode URL to match homeserver
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
test / integration (pull_request) Has been cancelled
2026-05-15 02:15:07 +02:00
f387be43fb
chore: replace nginx proxy with direct Traefik routing on two domains
2026-05-15 02:13:32 +02:00
1a1ba3da63
refactor(domain): remove public_key/private_key from User model — managed by federation adapter
2026-05-15 02:06:06 +02:00
9757ebdabf
refactor(application): move local/remote follow routing out of presentation handler
2026-05-15 01:58:40 +02:00
344bcf34af
refactor(domain): move DB string conversions out of domain enums
2026-05-15 01:54:32 +02:00
a123c0b8cc
feat(frontend): rich OG metadata + dynamic page titles across all routes
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
test / integration (pull_request) Has been cancelled
2026-05-15 01:38:59 +02:00
71a0f55c93
chore: deploy workflow is manual-only (workflow_dispatch)
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
test / integration (pull_request) Has been cancelled
2026-05-15 01:33:41 +02:00
e1bb7dde1f
chore: update compose.prod.yml (worker+nats external), CI builds frontend, deprecate thoughts-backend
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
test / integration (pull_request) Has been cancelled
2026-05-15 01:32:09 +02:00
61c82d77ba
chore: deploy.sh builds and pushes both backend and frontend images
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
test / integration (pull_request) Has been cancelled
2026-05-15 01:27:06 +02:00
b2d6be90c2
chore: update README, Dockerfile, compose.yml — add frontend/worker services, SSR env var, feature list
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
test / integration (pull_request) Has been cancelled
2026-05-15 01:26:23 +02:00
4cd94b3c7f
clean up
2026-05-15 01:25:16 +02:00
0734ef20c6
chore: stop tracking .env (already in .gitignore)
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
test / integration (pull_request) Has been cancelled
2026-05-15 01:24:32 +02:00
32161e777b
docs: movies-diary first-class integration design notes
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
test / integration (pull_request) Has been cancelled
2026-05-15 01:23:18 +02:00
27e94d64b0
fix: fetch_actor_urls_from_collection follows 'first' page link like outbox does
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
test / integration (pull_request) Has been cancelled
2026-05-15 01:18:28 +02:00
e3251b6928
fix: migrate thoughts.content VARCHAR(128) → TEXT to allow remote posts of any length
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m33s
test / unit (pull_request) Successful in 16m18s
test / integration (pull_request) Failing after 16m51s
2026-05-15 01:15:09 +02:00
83af9b2256
feat: show media attachment notice for unsupported post types (photos/videos)
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m20s
test / unit (pull_request) Successful in 16m15s
test / integration (pull_request) Failing after 17m1s
2026-05-15 01:12:44 +02:00
e83b08fcc8
fix: remote actor display names in thought cards — use last URL segment as username, resolve display_name after intern
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m13s
test / unit (pull_request) Successful in 15m56s
test / integration (pull_request) Failing after 17m29s
2026-05-15 01:04:42 +02:00
3c6344f954
feat(frontend): followers/following tabs on remote actor profile with lazy loading + pagination
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m16s
test / unit (pull_request) Successful in 16m12s
test / integration (pull_request) Failing after 16m54s
2026-05-15 00:51:37 +02:00
c536cc2cd4
feat(presentation): followers/following list endpoints for remote actors
2026-05-15 00:48:42 +02:00
38a13ad641
feat(worker): handle FetchActorConnections — resolve and cache remote actor connections
2026-05-15 00:40:34 +02:00
58126f195c
feat(activitypub-base): impl fetch_actor_urls_from_collection + resolve_actor_profiles (concurrent, 5s timeout)
2026-05-15 00:33:14 +02:00
d62dde67bb
feat(postgres): remote_actor_connections table + PgRemoteActorConnectionRepository
2026-05-15 00:29:33 +02:00
99dd89b60d
feat(domain): ActorConnectionSummary, ConnectionType, RemoteActorConnectionRepository, FetchActorConnections event
2026-05-15 00:25:54 +02:00
23501f5203
docs: remote actor connections implementation plan
2026-05-15 00:22:03 +02:00
75f59a1f40
docs: remote actor connections (followers/following) design spec
2026-05-15 00:17:21 +02:00
8b3dfffd3b
feat: followers/following links on remote profile; render remote post content as HTML
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m39s
test / unit (pull_request) Failing after 10m48s
test / integration (pull_request) Failing after 16m54s
2026-05-15 00:04:54 +02:00
0b4c8c6c40
fix(frontend): render bio HTML properly instead of as escaped text
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m24s
test / unit (pull_request) Failing after 12m17s
test / integration (pull_request) Failing after 17m10s
2026-05-15 00:01:13 +02:00
fcfc1750fc
fix: truncate remote actor username to VARCHAR(32); fix outbox URL by following 'first' link
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m33s
test / unit (pull_request) Failing after 10m46s
test / integration (pull_request) Failing after 16m54s
2026-05-14 23:53:33 +02:00
4d2d56c8ae
fix(nats): revert to consumer.messages() — fetch() defaults no_wait:true which skips empty queues
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m21s
test / unit (pull_request) Failing after 10m57s
test / integration (pull_request) Failing after 16m44s
2026-05-14 23:34:51 +02:00
a4377fe209
fix(nats): remove filter_subject from consumer config
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (push) Has been cancelled
lint / lint (pull_request) Failing after 9m20s
test / unit (pull_request) Failing after 10m40s
test / integration (pull_request) Failing after 17m47s
2026-05-14 23:29:45 +02:00
16892007a3
fix(nats): use fetch().expires(30s) instead of messages() — without expires NATS returns empty immediately
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
test / integration (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
lint / lint (pull_request) Has been cancelled
2026-05-14 23:25:01 +02:00
40ed9b1ad8
fix(nats): delete+recreate stream when retention policy is incompatible
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
test / integration (pull_request) Has been cancelled
2026-05-14 23:19:41 +02:00
0caca58c1c
fix(nats): align with movies-diary — Limits retention, single wildcard subject, filter_subject on consumer, prefixed publish
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Has been cancelled
test / unit (pull_request) Has been cancelled
test / integration (pull_request) Has been cancelled
2026-05-14 23:17:57 +02:00
55c55424b5
chore: bump async-nats 0.38 → 0.48 to match movies-diary
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m15s
test / unit (pull_request) Failing after 11m16s
test / integration (pull_request) Failing after 17m40s
2026-05-14 23:12:53 +02:00
9bda23f187
fix(nats): delete old push consumer before creating pull consumer
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m10s
test / unit (pull_request) Failing after 10m54s
test / integration (pull_request) Failing after 17m11s
2026-05-14 23:07:05 +02:00
17d2a186e1
fix(nats): switch from push to pull consumer — pull is reliable, push had deliver_subject issues
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m35s
test / unit (pull_request) Failing after 11m38s
test / integration (pull_request) Failing after 17m2s
2026-05-14 23:04:03 +02:00
7bbc702e85
debug: add INFO logging to ensure_stream and remote_actor_posts_handler
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m42s
test / unit (pull_request) Failing after 10m52s
test / integration (pull_request) Failing after 17m20s
2026-05-14 22:59:12 +02:00
612b7f069b
fix(frontend): profile fields — grid layout caps name col at 5rem, value gets remaining space
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m22s
test / unit (pull_request) Failing after 11m23s
test / integration (pull_request) Failing after 17m2s
2026-05-14 22:51:07 +02:00
199fe91801
fix(frontend): profile fields table — overflow-x-auto, break-all values, styled links
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m12s
test / unit (pull_request) Failing after 11m0s
test / integration (pull_request) Failing after 17m17s
2026-05-14 22:47:42 +02:00
f3df2061e1
fix(frontend): truncate long handles in remote user profile and card
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m8s
test / unit (pull_request) Failing after 10m43s
test / integration (pull_request) Failing after 16m52s
2026-05-14 22:45:06 +02:00
df7fcf5096
fix: add federation.> to NATS stream subjects; update stream on startup; truncate long profile URLs
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m48s
test / unit (pull_request) Failing after 10m52s
test / integration (pull_request) Failing after 16m50s
2026-05-14 22:43:43 +02:00
072d06cb46
fix(frontend): middleware rewrites remote actor URLs to avoid Next.js file-extension routing issue
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 31s
test / unit (pull_request) Failing after 11m18s
test / integration (pull_request) Failing after 18m1s
2026-05-14 22:40:21 +02:00
4ce239fc87
fix(frontend): encode handle in URL to avoid Next.js routing issues with @ chars
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m21s
test / unit (pull_request) Failing after 10m59s
test / integration (pull_request) Failing after 12s
2026-05-14 22:36:24 +02:00
72813d7c9b
fix(frontend): remote user card link needs leading @ in handle URL
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m22s
test / unit (pull_request) Failing after 10m46s
test / integration (pull_request) Failing after 17m9s
2026-05-14 22:30:59 +02:00
a472ae08fb
feat(frontend): link remote user card avatar/name to profile page
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m42s
test / unit (pull_request) Failing after 11m13s
test / integration (pull_request) Failing after 17m23s
2026-05-14 22:29:35 +02:00
8ef7c93970
feat(frontend): remote actor profile page with bio, fields, and posts
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 10m5s
test / unit (pull_request) Failing after 10m51s
test / integration (pull_request) Failing after 17m1s
2026-05-14 22:25:53 +02:00
dc3afeca26
feat(worker): handle FetchRemoteActorPosts — fetch and store remote outbox notes
2026-05-14 22:23:20 +02:00
f3c3637ade
feat(presentation): remote actor posts endpoint + extended RemoteActorResponse
2026-05-14 22:19:23 +02:00
00b369c6ad
feat(bootstrap): add ap_repo to AppState
2026-05-14 22:16:20 +02:00
8c931c9b98
feat(event-payload): add FetchRemoteActorPosts to uniqueness test
2026-05-14 22:15:33 +02:00
1ddb6a3954
feat(activitypub-base): impl fetch_outbox_page; populate all RemoteActor fields in lookup_actor
2026-05-14 22:13:39 +02:00
70fc4fbcd0
feat(domain): RemoteActor fields, RemoteNote, FetchRemoteActorPosts event, fetch_outbox_page port
2026-05-14 22:08:26 +02:00
cbfaeb95ac
docs: remote actor profile implementation plan
2026-05-14 22:04:11 +02:00
2e64e196b5
docs: remote actor profile design spec
2026-05-14 21:58:09 +02:00
ed6996e350
fix(activitypub-base): populate also_known_as, profile_url, attachment from fetched actor
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 10m0s
test / unit (pull_request) Failing after 11m10s
test / integration (pull_request) Failing after 17m19s
2026-05-14 21:47:34 +02:00
0c4df36b95
fix(activitypub-base): populate avatar_url, bio, banner from fetched actor JSON
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m46s
test / unit (pull_request) Failing after 11m36s
test / integration (pull_request) Failing after 17m47s
2026-05-14 21:45:55 +02:00
908789e639
fix: content negotiation for followers/following — resolve AP router conflict
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m28s
test / unit (pull_request) Failing after 11m39s
test / integration (pull_request) Failing after 17m5s
2026-05-14 21:42:38 +02:00
fc3b4146a5
refactor(frontend): update API client to match cleaned REST routes
2026-05-14 21:34:26 +02:00
e64404cf40
refactor(routes): clean RESTful route table; content negotiation at /users/{username}
2026-05-14 21:31:02 +02:00
fbc02bc2f8
refactor(social): unified follow handler; remove federation handler module
2026-05-14 21:28:33 +02:00
d1f72c8308
refactor(users): content negotiation at GET /users/{username}; move lookup_handler; rename get_me_following
2026-05-14 21:25:49 +02:00
abc5f2b936
refactor(api): notification state changes use PATCH with JSON body
2026-05-14 21:05:30 +02:00
d5a116e483
feat(activitypub-base): impl actor_json port; return full user@domain handle from lookup
2026-05-14 20:47:41 +02:00
57110f3b75
feat(domain): add actor_json to FederationActionPort
2026-05-14 20:46:10 +02:00
812cf7b140
docs: REST API cleanup implementation plan
2026-05-14 20:44:31 +02:00
93967e53a2
docs: REST API cleanup design spec
2026-05-14 20:38:05 +02:00
dbd891d60d
fix(activitypub-base): lookup_actor fetches WebFinger via HTTPS directly
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m40s
test / unit (pull_request) Successful in 16m33s
test / integration (pull_request) Failing after 17m33s
2026-05-14 20:25:14 +02:00
baf8b57b6d
fix(activitypub-base): strip leading @ from handle before WebFinger lookup
2026-05-14 20:16:00 +02:00
a7a331858d
feat(frontend): remote actor lookup and follow from search page
2026-05-14 20:09:49 +02:00
31487882e0
feat(presentation): /federation/lookup and /federation/follow endpoints
2026-05-14 20:06:55 +02:00
a08bb3d698
feat(bootstrap): wire ActivityPubService as FederationActionPort in AppState
2026-05-14 20:03:49 +02:00
1d50b54227
fix(activitypub-base): use username as display_name in lookup_actor
2026-05-14 20:02:01 +02:00
fce819be7f
feat(activitypub-base): impl FederationActionPort for ActivityPubService
2026-05-14 19:59:19 +02:00
0e45707d7e
fix(postgres): persist and read avatar_url in remote_actor adapter
2026-05-14 19:57:13 +02:00
82f8772104
feat(domain): FederationActionPort trait + avatar_url on RemoteActor
2026-05-14 19:55:10 +02:00
8eb59bfac6
docs: remote actor search & follow implementation plan
2026-05-14 19:52:29 +02:00
62970d519a
docs: remote actor search & follow spec
2026-05-14 19:48:34 +02:00
8602614e7c
fix(ap): visibility-aware addressing — correct to/cc outbound, parse inbound to/cc
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m25s
test / unit (pull_request) Successful in 16m39s
test / integration (pull_request) Failing after 17m35s
2026-05-14 19:34:43 +02:00
a5ea97bbaa
fix: visibility-aware feeds — owner sees all, followers see followers-only, home feed includes non-public posts
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m44s
test / unit (pull_request) Successful in 16m12s
test / integration (pull_request) Failing after 16m59s
2026-05-14 18:18:42 +02:00
fcbd132a78
fix: registration — parse AuthResponse correctly, auto-login after successful registration
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m38s
test / unit (pull_request) Successful in 16m14s
test / integration (pull_request) Failing after 17m16s
2026-05-14 18:13:57 +02:00
e61e5b4cec
fix: profile friends section shows profile owner's following list, not viewer's
lint / lint (push) Has been cancelled
test / integration (push) Has been cancelled
test / unit (push) Has been cancelled
lint / lint (pull_request) Failing after 9m46s
test / unit (pull_request) Successful in 16m32s
test / integration (pull_request) Failing after 17m49s
2026-05-14 18:08:50 +02:00
171cfe4373
fix: follow/block handlers accept username string — was parsing as UUID
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m38s
test / unit (pull_request) Successful in 16m13s
test / integration (pull_request) Failing after 17m31s
2026-05-14 18:03:16 +02:00
24bfda8458
feat: extract and save hashtags on thought creation
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m18s
test / unit (pull_request) Successful in 16m4s
test / integration (pull_request) Failing after 17m16s
2026-05-14 18:01:07 +02:00
5c9acdecc1
fix(postgres): get_thread uses recursive CTE — fetches all nested replies not just direct ones
lint / lint (push) Has been cancelled
test / integration (push) Has been cancelled
test / unit (push) Has been cancelled
lint / lint (pull_request) Failing after 9m18s
test / unit (pull_request) Successful in 16m9s
test / integration (pull_request) Failing after 17m5s
2026-05-14 17:56:03 +02:00
255ff549a4
fix: getThoughtThread parses flat array and builds nested tree — backend returns Vec not nested object
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m51s
test / unit (pull_request) Successful in 16m52s
test / integration (pull_request) Failing after 17m6s
2026-05-14 17:52:52 +02:00
c67371231e
fix(thoughts): thought_to_json uses camelCase — POST/GET responses now match ThoughtSchema
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m33s
test / unit (pull_request) Successful in 16m22s
test / integration (pull_request) Failing after 17m18s
2026-05-14 17:49:22 +02:00
68261c4b2b
fix: include own thoughts in home feed
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m27s
test / unit (pull_request) Successful in 16m33s
test / integration (pull_request) Failing after 17m15s
2026-05-14 17:47:13 +02:00
057ed3ccbf
fix: joinedAt nullable in UserSchema, guard null in profile page
2026-05-14 17:45:01 +02:00
8ef3a300bc
fix(users): return camelCase from GET /users list — UserSummary was snake_case
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m34s
test / unit (pull_request) Successful in 16m5s
test / integration (pull_request) Failing after 18m6s
2026-05-14 17:44:59 +02:00
c8c430fe7f
fix: getUserProfile calls /users/{username}/profile to avoid AP route conflict
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m13s
test / unit (pull_request) Successful in 15m54s
test / integration (pull_request) Failing after 18m39s
2026-05-14 17:39:20 +02:00
ec0e24db8d
fix: add GET /users/{username}/profile REST endpoint — AP actor owns /users/{username}
2026-05-14 17:39:19 +02:00
7cb6b94b08
fix: per_page not perPage in Zod schemas — raw serde_json keys are snake_case
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m36s
test / unit (pull_request) Successful in 17m6s
test / integration (pull_request) Failing after 17m0s
2026-05-14 17:32:39 +02:00
b95cebc799
fix: await searchParams and params for Next.js 15 async API, compute totalPages in all-users page
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m41s
test / unit (pull_request) Successful in 16m33s
test / integration (pull_request) Failing after 17m3s
2026-05-14 17:28:35 +02:00
12adddaa16
fix(nats): use explicit subject prefixes — WorkQueue retention disallows > wildcard
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m9s
test / unit (pull_request) Successful in 16m19s
test / integration (pull_request) Failing after 17m5s
2026-05-14 17:20:21 +02:00
44385adb6b
feat: update frontend to work with v2 backend — camelCase, new endpoints, nested author
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m38s
test / unit (pull_request) Successful in 16m2s
test / integration (pull_request) Failing after 17m2s
2026-05-14 17:14:27 +02:00
7110f30e16
fix: top-friends returns usernames not UUIDs
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m40s
test / unit (pull_request) Successful in 16m13s
test / integration (pull_request) Failing after 17m12s
2026-05-14 17:08:12 +02:00
aadd876994
feat: camelCase JSON responses, isFollowedByViewer, customCss, GET /users/me/following-list
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m15s
test / unit (pull_request) Successful in 16m3s
test / integration (pull_request) Failing after 17m19s
2026-05-14 17:04:42 +02:00
d3b7ecad15
fix(ap): add url field to Note, handle Delete(actor) and Tombstone objects
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m12s
test / unit (pull_request) Successful in 15m52s
test / integration (pull_request) Failing after 17m10s
2026-05-14 16:47:17 +02:00
458feebcdd
feat(nats): migrate to JetStream — at-least-once delivery with durable consumer
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m25s
test / unit (pull_request) Successful in 15m53s
test / integration (pull_request) Failing after 16m42s
2026-05-14 16:41:17 +02:00
550865bad4
fix: resolve all clippy warnings — redundant closures, dead code, collapsible_if, needless borrow
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 9m25s
test / unit (pull_request) Successful in 16m57s
test / integration (pull_request) Failing after 17m29s
2026-05-14 16:33:34 +02:00
10c4a66de5
Refactor handlers and OpenAPI documentation for improved readability and consistency
...
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 6m49s
test / unit (pull_request) Successful in 16m24s
test / integration (pull_request) Failing after 17m7s
- Reorganized imports in health, notifications, social, thoughts, and users handlers for clarity.
- Updated function signatures in handlers to improve readability by aligning parameters.
- Enhanced JSON response formatting in notifications and thoughts handlers.
- Improved error handling in user-related functions.
- Refactored OpenAPI documentation to maintain consistent formatting and structure.
- Cleaned up unnecessary code and comments across various files.
- Ensured consistent use of `Arc` for shared state in AppState and WorkerHandlers.
2026-05-14 16:28:57 +02:00
004bfb427b
feat: implement merge readiness plan to close gaps between v2 and v1
...
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m8s
test / unit (pull_request) Successful in 16m18s
test / integration (pull_request) Failing after 16m59s
- Task 1: Fix feed response hydration by adding `to_thought_response` helper and updating feed handlers to return full `ThoughtResponse`.
- Task 2: Wire follower/following REST routes for user feeds.
- Task 3: Add user listing and count endpoints, including `GET /users` and `GET /users/count`.
- Task 4: Implement popular tags feature with `GET /tags/popular`.
- Task 5: Enhance configuration with HOST, CORS_ORIGINS, and optional rate limiting using tower-governor.
2026-05-14 16:28:18 +02:00
e6f4a6256f
refactor(application): fix 4 code smells — validate username input, extract ownership guard and dedup helpers
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m12s
test / unit (pull_request) Successful in 16m23s
test / integration (pull_request) Failing after 17m26s
2026-05-14 16:27:03 +02:00
dd7beb7ab4
chore: add compose.yml for local dev (postgres + nats)
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m9s
test / unit (pull_request) Successful in 16m14s
test / integration (pull_request) Failing after 17m3s
2026-05-14 16:22:16 +02:00
ddd9b17ed7
test(application): fill unit test gaps — api_keys, profile, auth, thoughts, social
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m7s
test / unit (pull_request) Successful in 16m2s
test / integration (pull_request) Failing after 16m57s
2026-05-14 16:19:35 +02:00
d50c13a2db
refactor: wrap direct port calls behind use cases — notifications, search, popular_tags
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m7s
test / unit (pull_request) Successful in 15m51s
test / integration (pull_request) Failing after 17m3s
2026-05-14 16:13:34 +02:00
004f3cd4d2
fix(arch): move AP router assembly to bootstrap — presentation no longer depends on activitypub-base
2026-05-14 16:09:21 +02:00
970f5a1644
fix: move user_feed to FeedRepository — proper counts and viewer flags for user timelines
2026-05-14 16:06:38 +02:00
ecba9267cf
fix: compute liked_by_viewer/boosted_by_viewer from DB — viewer_id was ignored in all feed queries
2026-05-14 16:03:55 +02:00
4890501512
chore: add deploy.sh — build amd64 image and push to registry
lint / lint (push) Has been cancelled
test / integration (push) Has been cancelled
test / unit (push) Has been cancelled
lint / lint (pull_request) Failing after 5m4s
test / unit (pull_request) Successful in 16m39s
test / integration (pull_request) Failing after 16m56s
2026-05-14 15:46:53 +02:00
cc9658975f
fix: tag feed returns full FeedEntry with author and counts
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m2s
test / unit (pull_request) Successful in 16m3s
test / integration (pull_request) Failing after 16m59s
2026-05-14 15:43:02 +02:00
38b4774a63
feat(bootstrap): configurable HOST, CORS_ORIGINS, and optional rate limiting
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m3s
test / unit (pull_request) Successful in 16m6s
test / integration (pull_request) Failing after 17m45s
2026-05-14 15:37:38 +02:00
9b47779e63
feat: GET /tags/popular — top tags by usage count
2026-05-14 15:34:40 +02:00
eb7dbb0aee
feat: GET /users (search/list) and GET /users/count
2026-05-14 15:34:37 +02:00
a2cc4fba21
feat(presentation): wire GET /users/{username}/follower-list and /following-list
2026-05-14 15:34:33 +02:00
6eba91e699
fix(presentation): hydrate feed responses with full ThoughtResponse — remove UUID-only stubs
2026-05-14 15:31:44 +02:00
cf94b0ba6c
ci(test): split into unit (no DB) and integration (postgres) jobs
lint / lint (push) Has been cancelled
test / unit (push) Has been cancelled
test / integration (push) Has been cancelled
lint / lint (pull_request) Failing after 5m9s
test / unit (pull_request) Successful in 15m59s
test / integration (pull_request) Failing after 16m59s
2026-05-14 15:17:59 +02:00
057f10cb69
chore: Dockerfile, README, LICENSE, .env.example, CI workflows (lint/test/deploy)
lint / lint (push) Has been cancelled
test / test (push) Has been cancelled
lint / lint (pull_request) Failing after 5m3s
test / test (pull_request) Failing after 18m48s
2026-05-14 15:15:18 +02:00
ed744046f4
refactor(activitypub-base): eliminate double get_local_actor — extract thought_note_json, remove dead broadcast_to_followers methods
2026-05-14 14:36:54 +02:00
931894d77a
refactor(activitypub-base): extract accepted_follower_inboxes helper — eliminate 7x duplicated filtering
2026-05-14 14:23:38 +02:00
2485869af6
fix(activitypub-base): deterministic announce IDs so Undo(Announce) can reference original activity
2026-05-14 14:16:48 +02:00
b0b3c6a59b
feat: BoostRemoved → Undo(Announce) fan-out via OutboundFederationPort
2026-05-14 14:10:11 +02:00
eaf079069f
fix(application): gate federation broadcast on Public/Unlisted visibility only
2026-05-14 14:03:31 +02:00
a37c877172
chore(worker): remove stale dependencies after business logic migration
2026-05-14 13:59:45 +02:00
904916d4c1
refactor(worker): thin handlers + factory — move all business logic to application services
2026-05-14 13:57:14 +02:00
057fc29abc
fix(activitypub-base): validate update Note id URL, add updated field to Update Notes
2026-05-14 13:50:05 +02:00
1fa8389a69
feat(activitypub-base): Announce broadcast + impl OutboundFederationPort for ActivityPubService
2026-05-14 13:46:31 +02:00
83e87e644b
test(application): document user-not-found silent-skip and locality guard in FederationEventService
2026-05-14 13:44:13 +02:00
13282fc88e
feat(application): FederationEventService — content fan-out business logic
2026-05-14 13:40:10 +02:00
10605bbf2f
test(application): add self_boost_creates_no_notification test
2026-05-14 13:37:29 +02:00
2d742bdbe3
feat(application): NotificationEventService — move notification business logic out of worker
2026-05-14 13:35:20 +02:00
925856f6b8
feat(domain): OutboundFederationPort — thin AP broadcast abstraction
2026-05-14 13:32:23 +02:00
114d9f9558
fix(activitypub): re-export NoteType from activitypub-base, drop direct activitypub_federation dep
2026-05-14 12:51:47 +02:00
69b55058ce
feat(worker): use EventConsumerAdapter<NatsMessageSource> — transport-agnostic consuming
2026-05-14 12:37:16 +02:00
e995b29be1
refactor(nats): replace NatsEventConsumer with NatsMessageSource implementing MessageSource
2026-05-14 12:36:45 +02:00
c202eded05
feat(event-transport): MessageSource trait + EventConsumerAdapter for transport-agnostic consuming
2026-05-14 12:34:45 +02:00
f9ca5836fb
refactor: rename event-publisher → event-transport
2026-05-14 12:30:58 +02:00
7963278189
docs: event-transport rename + consumer abstraction plan
2026-05-14 12:29:28 +02:00
ff82764eb0
feat(bootstrap): wire EventPublisherAdapter<NatsTransport> — transport-agnostic event publishing
2026-05-14 12:24:15 +02:00
cfc8c19175
refactor(nats): strip NatsEventPublisher, add NatsTransport implementing Transport
2026-05-14 12:22:11 +02:00
a684c922e0
feat(event-publisher): Transport trait + EventPublisherAdapter for transport-agnostic event routing
2026-05-14 12:20:29 +02:00
42d3dbd251
docs: event-publisher transport abstraction plan
2026-05-14 12:18:41 +02:00
c072ee95cd
refactor(presentation): pure HTTP library — remove concrete adapter deps and binary
2026-05-14 12:07:18 +02:00
0c7a6fe9be
feat(bootstrap): composition root with Config + factory.rs
2026-05-14 12:05:00 +02:00
53185efe5e
docs: bootstrap factory implementation plan
2026-05-14 12:00:20 +02:00
1866eef770
feat(presentation): OpenAPI docs at /docs (Swagger) and /scalar
2026-05-14 11:41:12 +02:00
137d1a0c6a
feat(presentation): add utoipa::path annotations to all handlers
2026-05-14 11:34:02 +02:00
4f990afe5e
feat(api-types): add utoipa ToSchema and IntoParams derives
2026-05-14 11:30:11 +02:00
fb8c75af72
docs: OpenAPI documentation implementation plan
2026-05-14 11:27:43 +02:00
2524440fe4
feat(presentation): GET /health endpoint
2026-05-14 11:21:58 +02:00
6082766935
feat(presentation): GET /users/me, GET /users/{username}/thoughts, GET /tags/{name}
2026-05-14 11:20:48 +02:00
e408a53136
docs: v1 parity gaps implementation plan
2026-05-14 11:19:29 +02:00
68fe8624cd
feat(worker): Reply notification when ThoughtCreated has in_reply_to_id
2026-05-14 11:08:30 +02:00
1127a5946f
feat: UserUnblocked + UserRegistered events, fix unblock_user and register signatures
2026-05-14 11:06:36 +02:00
f0b87311e3
docs: audit gap fixes implementation plan
2026-05-14 11:03:36 +02:00
ea14035062
fix: wire PgActivityPubRepository into ThoughtsObjectHandler — closes activitypub→postgres violation
2026-05-14 10:59:43 +02:00
4ae3af8086
refactor(activitypub): ThoughtsObjectHandler uses ActivityPubRepository port, drops postgres dep
2026-05-14 10:58:25 +02:00
e0b0a71f1d
feat(postgres): PgActivityPubRepository implementing ActivityPubRepository port
2026-05-14 10:55:58 +02:00
5f8e96b9be
feat(domain): ActivityPubRepository port with federation vocabulary
2026-05-14 10:52:35 +02:00
54bd1c193b
docs: ActivityPubRepository port implementation plan
2026-05-14 10:50:06 +02:00
e0a27c99a4
feat(presentation): ActivityPub routes — WebFinger, NodeInfo, inbox, outbox
2026-05-14 10:28:22 +02:00
2080fec347
feat(activitypub): ThoughtNote AP object and ThoughtsObjectHandler
2026-05-14 10:23:35 +02:00
21b6a04f97
feat(postgres-federation): FederationRepository and ApUserRepository
2026-05-14 10:19:57 +02:00
ebc612a311
feat(activitypub-base): copy from movies-diary with username-based actor URLs
2026-05-14 10:15:34 +02:00
c9b389a00c
docs: v2 Plan 4 federation implementation plan
2026-05-14 10:10:36 +02:00
3318635da6
feat(presentation): NatsEventPublisher with no-op fallback when NATS_URL unset
2026-05-14 10:00:39 +02:00
2e702c64cc
feat(worker): consumer loop binary connecting NATS to handlers
2026-05-14 09:58:33 +02:00
2cee884fe1
feat(worker): NotificationHandler and FederationHandler stub
2026-05-14 09:58:31 +02:00
a0893b1c69
feat(nats): NatsEventPublisher and NatsEventConsumer with payload conversion
2026-05-14 09:54:50 +02:00
57232705fe
feat(event-payload): serializable NATS event payload types
2026-05-14 09:48:58 +02:00
02de6b6f83
docs: v2 Plan 3 events+worker implementation plan
2026-05-14 09:45:57 +02:00
b599047d98
feat(presentation): wire SearchPort, /search returns thoughts + users
2026-05-14 09:38:02 +02:00
4eeaea2a14
feat(postgres): upgrade FeedRepository search from ILIKE to pg_trgm
2026-05-14 09:28:02 +02:00
ebf0aaab58
feat(postgres-search): PgSearchRepository using pg_trgm
2026-05-14 09:26:36 +02:00
a3534317de
feat(domain): SearchPort trait with thought and user search
2026-05-14 09:23:22 +02:00
6e5d0de636
feat(postgres): pg_trgm extension and GIN search indexes
2026-05-14 09:21:59 +02:00
bfe6db2215
docs: v2 Plan 2 search implementation plan
2026-05-14 09:19:52 +02:00
f75e796faf
fix: align follow event with accepted state; redact internal error details
2026-05-14 04:10:27 +02:00
c5d262c68f
feat(presentation): routes and main — Plan 1 complete
2026-05-14 04:06:17 +02:00
38106ecdb6
feat(presentation): all handlers
2026-05-14 04:00:04 +02:00
fb39ea2469
feat(presentation): state, errors, extractors, auth and user handlers
2026-05-14 03:56:42 +02:00
adc2102927
feat(application): all use cases
2026-05-14 03:52:36 +02:00
134ecdcfb4
feat(api-types): request and response DTOs
2026-05-14 03:48:16 +02:00
2b428b2b0a
feat(auth): JWT AuthService and Argon2 PasswordHasher
2026-05-14 03:47:08 +02:00
69608cfc75
feat(postgres): Tag, ApiKey, TopFriend, Notification, RemoteActor, Feed repos
2026-05-14 03:45:11 +02:00
02ce3a49b4
feat(postgres): LikeRepository, BoostRepository
2026-05-14 03:40:15 +02:00
1dab9ffbfb
feat(postgres): FollowRepository, BlockRepository
2026-05-14 03:38:20 +02:00
9dd04541ac
feat(postgres): ThoughtRepository
2026-05-14 03:35:39 +02:00
fe9655ee96
feat(postgres): UserRepository
2026-05-14 03:32:56 +02:00
62ee73e302
feat(postgres): initial migrations
2026-05-14 03:26:42 +02:00
80b656341d
feat(domain): ports, events, test helpers
2026-05-14 03:23:42 +02:00
4b8d1027c1
feat(domain): models
2026-05-14 03:18:49 +02:00
94a3f414e4
feat(domain): errors and value objects
2026-05-14 03:16:22 +02:00
63a7001165
chore: scaffold v2 workspace
2026-05-14 03:07:45 +02:00
321571aae9
docs: v2 Plan 1 implementation plan (core)
2026-05-14 03:03:02 +02:00
9d6e3298f1
docs: clarify presentation layer is REST-only
2026-05-14 01:09:07 +02:00
6fd9a76e68
docs: v2 architecture rewrite design spec
2026-05-14 01:08:13 +02:00