Show follower count on the profile page
This commit is contained in:
parent
864b1f138b
commit
3808df9dbf
2 changed files with 43 additions and 4 deletions
|
|
@ -6,7 +6,9 @@ import lombok.extern.slf4j.Slf4j;
|
||||||
import org.operaton.fitpub.model.dto.UserDTO;
|
import org.operaton.fitpub.model.dto.UserDTO;
|
||||||
import org.operaton.fitpub.model.dto.UserUpdateRequest;
|
import org.operaton.fitpub.model.dto.UserUpdateRequest;
|
||||||
import org.operaton.fitpub.model.entity.User;
|
import org.operaton.fitpub.model.entity.User;
|
||||||
|
import org.operaton.fitpub.repository.FollowRepository;
|
||||||
import org.operaton.fitpub.repository.UserRepository;
|
import org.operaton.fitpub.repository.UserRepository;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.security.core.annotation.AuthenticationPrincipal;
|
import org.springframework.security.core.annotation.AuthenticationPrincipal;
|
||||||
import org.springframework.security.core.userdetails.UserDetails;
|
import org.springframework.security.core.userdetails.UserDetails;
|
||||||
|
|
@ -25,6 +27,26 @@ import java.util.UUID;
|
||||||
public class UserController {
|
public class UserController {
|
||||||
|
|
||||||
private final UserRepository userRepository;
|
private final UserRepository userRepository;
|
||||||
|
private final FollowRepository followRepository;
|
||||||
|
|
||||||
|
@Value("${fitpub.base-url}")
|
||||||
|
private String baseUrl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper method to populate follower/following counts in UserDTO.
|
||||||
|
*/
|
||||||
|
private void populateSocialCounts(UserDTO dto, User user) {
|
||||||
|
String actorUri = user.getActorUri(baseUrl);
|
||||||
|
|
||||||
|
// Count followers (people following this user)
|
||||||
|
long followersCount = followRepository.countAcceptedFollowersByActorUri(actorUri);
|
||||||
|
|
||||||
|
// Count following (people this user follows)
|
||||||
|
long followingCount = followRepository.findAcceptedFollowingByUserId(user.getId()).size();
|
||||||
|
|
||||||
|
dto.setFollowersCount(followersCount);
|
||||||
|
dto.setFollowingCount((long) followingCount);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get current user's profile.
|
* Get current user's profile.
|
||||||
|
|
@ -39,7 +61,10 @@ public class UserController {
|
||||||
User user = userRepository.findByUsername(userDetails.getUsername())
|
User user = userRepository.findByUsername(userDetails.getUsername())
|
||||||
.orElseThrow(() -> new UsernameNotFoundException("User not found"));
|
.orElseThrow(() -> new UsernameNotFoundException("User not found"));
|
||||||
|
|
||||||
return ResponseEntity.ok(UserDTO.fromEntity(user));
|
UserDTO dto = UserDTO.fromEntity(user);
|
||||||
|
populateSocialCounts(dto, user);
|
||||||
|
|
||||||
|
return ResponseEntity.ok(dto);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -72,7 +97,10 @@ public class UserController {
|
||||||
|
|
||||||
User updated = userRepository.save(user);
|
User updated = userRepository.save(user);
|
||||||
|
|
||||||
return ResponseEntity.ok(UserDTO.fromEntity(updated));
|
UserDTO dto = UserDTO.fromEntity(updated);
|
||||||
|
populateSocialCounts(dto, updated);
|
||||||
|
|
||||||
|
return ResponseEntity.ok(dto);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -88,7 +116,10 @@ public class UserController {
|
||||||
User user = userRepository.findByUsername(username)
|
User user = userRepository.findByUsername(username)
|
||||||
.orElseThrow(() -> new UsernameNotFoundException("User not found: " + username));
|
.orElseThrow(() -> new UsernameNotFoundException("User not found: " + username));
|
||||||
|
|
||||||
return ResponseEntity.ok(UserDTO.fromEntity(user));
|
UserDTO dto = UserDTO.fromEntity(user);
|
||||||
|
populateSocialCounts(dto, user);
|
||||||
|
|
||||||
|
return ResponseEntity.ok(dto);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -104,6 +135,9 @@ public class UserController {
|
||||||
User user = userRepository.findById(id)
|
User user = userRepository.findById(id)
|
||||||
.orElseThrow(() -> new UsernameNotFoundException("User not found"));
|
.orElseThrow(() -> new UsernameNotFoundException("User not found"));
|
||||||
|
|
||||||
return ResponseEntity.ok(UserDTO.fromEntity(user));
|
UserDTO dto = UserDTO.fromEntity(user);
|
||||||
|
populateSocialCounts(dto, user);
|
||||||
|
|
||||||
|
return ResponseEntity.ok(dto);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,9 +28,14 @@ public class UserDTO {
|
||||||
private LocalDateTime createdAt;
|
private LocalDateTime createdAt;
|
||||||
private LocalDateTime updatedAt;
|
private LocalDateTime updatedAt;
|
||||||
|
|
||||||
|
// Social counts (populated separately)
|
||||||
|
private Long followersCount;
|
||||||
|
private Long followingCount;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a DTO from a User entity.
|
* Creates a DTO from a User entity.
|
||||||
* Note: email should only be included when user is viewing their own profile.
|
* Note: email should only be included when user is viewing their own profile.
|
||||||
|
* Note: follower/following counts are not populated by this method - set them separately.
|
||||||
*/
|
*/
|
||||||
public static UserDTO fromEntity(User user) {
|
public static UserDTO fromEntity(User user) {
|
||||||
return UserDTO.builder()
|
return UserDTO.builder()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue