From c9b982890abbbd4c8ed38954f0ff4bcb7b00332e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Z=C3=B6ller?= Date: Sat, 3 Jan 2026 20:25:17 +0100 Subject: [PATCH] Fix federated follow counts --- .../controller/ActivityPubController.java | 26 ++++++++++++++++--- .../fitpub/repository/FollowRepository.java | 9 +++++++ 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/operaton/fitpub/controller/ActivityPubController.java b/src/main/java/org/operaton/fitpub/controller/ActivityPubController.java index 1802eb7..2c47136 100644 --- a/src/main/java/org/operaton/fitpub/controller/ActivityPubController.java +++ b/src/main/java/org/operaton/fitpub/controller/ActivityPubController.java @@ -34,6 +34,7 @@ public class ActivityPubController { private final ActivityRepository activityRepository; private final ActivityImageService activityImageService; private final org.operaton.fitpub.service.InboxProcessor inboxProcessor; + private final org.operaton.fitpub.repository.FollowRepository followRepository; @Value("${fitpub.base-url}") private String baseUrl; @@ -145,10 +146,19 @@ public class ActivityPubController { return ResponseEntity.notFound().build(); } + User user = userOpt.get(); String followersUrl = baseUrl + "/users/" + username + "/followers"; + String actorUri = user.getActorUri(baseUrl); - // TODO: Fetch actual followers from database - OrderedCollection collection = OrderedCollection.empty(followersUrl); + // Get actual follower count from database + long followerCount = followRepository.countAcceptedFollowersByActorUri(actorUri); + + OrderedCollection collection = OrderedCollection.builder() + .context("https://www.w3.org/ns/activitystreams") + .type("OrderedCollection") + .id(followersUrl) + .totalItems((int) followerCount) + .build(); return ResponseEntity.ok(collection); } @@ -172,10 +182,18 @@ public class ActivityPubController { return ResponseEntity.notFound().build(); } + User user = userOpt.get(); String followingUrl = baseUrl + "/users/" + username + "/following"; - // TODO: Fetch actual following from database - OrderedCollection collection = OrderedCollection.empty(followingUrl); + // Get actual following count from database + long followingCount = followRepository.countAcceptedFollowingByUserId(user.getId()); + + OrderedCollection collection = OrderedCollection.builder() + .context("https://www.w3.org/ns/activitystreams") + .type("OrderedCollection") + .id(followingUrl) + .totalItems((int) followingCount) + .build(); return ResponseEntity.ok(collection); } diff --git a/src/main/java/org/operaton/fitpub/repository/FollowRepository.java b/src/main/java/org/operaton/fitpub/repository/FollowRepository.java index 31c00d3..4fa9bcc 100644 --- a/src/main/java/org/operaton/fitpub/repository/FollowRepository.java +++ b/src/main/java/org/operaton/fitpub/repository/FollowRepository.java @@ -60,6 +60,15 @@ public interface FollowRepository extends JpaRepository { @Query("SELECT f FROM Follow f WHERE f.followerId = :followerId AND f.status = 'ACCEPTED'") List findAcceptedFollowingByUserId(@Param("followerId") UUID followerId); + /** + * Count accepted following relationships for a user. + * + * @param followerId the follower's user ID + * @return count of accepted following relationships + */ + @Query("SELECT COUNT(f) FROM Follow f WHERE f.followerId = :followerId AND f.status = 'ACCEPTED'") + long countAcceptedFollowingByUserId(@Param("followerId") UUID followerId); + /** * Find a follow by its Activity ID. *