diff --git a/.idea/misc.xml b/.idea/misc.xml
index 280f3c23..95e40f9b 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,3 +1,4 @@
+
@@ -21,7 +22,7 @@
-
+
\ No newline at end of file
diff --git a/server/src/main/java/edu/sjsu/moth/server/controller/InboxController.java b/server/src/main/java/edu/sjsu/moth/server/controller/InboxController.java
index a4d6ac40..459627c6 100644
--- a/server/src/main/java/edu/sjsu/moth/server/controller/InboxController.java
+++ b/server/src/main/java/edu/sjsu/moth/server/controller/InboxController.java
@@ -12,6 +12,7 @@
import edu.sjsu.moth.server.db.FollowersRepository;
import edu.sjsu.moth.server.db.Following;
import edu.sjsu.moth.server.db.FollowingRepository;
+import edu.sjsu.moth.server.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@@ -36,14 +37,9 @@
@RestController
public class InboxController {
- @Autowired
- FollowersRepository followersRepository;
-
- @Autowired
- FollowingRepository followingRepository;
@Autowired
- AccountRepository accountRepository;
+ AccountService accountService;
//required to map payload from JSON to a Java Object for data access
ObjectMapper mappedLoad;
@@ -57,34 +53,7 @@ public Mono usersInbox(@PathVariable String id, @RequestBody JsonNode in
String requestType = inboxNode.get("type").asText();
// follow or unfollow requests
if (requestType.equals("Follow") || requestType.equals("Undo"))
- return followerHandler(id, inboxNode, requestType);
- return Mono.empty();
- }
-
- public Mono followerHandler(String id, JsonNode inboxNode, String requestType) {
- String follower = inboxNode.get("actor").asText();
- if (requestType.equals("Follow")) {
- // check id
- if (accountRepository.findItemByAcct(id)==null) {
- return Mono.error(new RuntimeException("Error: Account to follow doesn't exist."));
- }
- // find id, grab arraylist, append
- else {
- return followersRepository.findItemById(id)
- .switchIfEmpty(Mono.just(new Followers(id, new ArrayList<>())))
- .flatMap(followedUser -> {
- followedUser.getFollowers().add(follower);
- return followersRepository.save(followedUser).thenReturn("done");
- });
- }
- }
- if (requestType.equals("Undo")) {
- // find id, grab arraylist, remove
- return followersRepository.findItemById(id).flatMap(followedUser -> {
- followedUser.getFollowers().remove(follower);
- return followersRepository.save(followedUser).thenReturn("done");
- });
- }
+ return accountService.followerHandler(id, inboxNode, requestType);
return Mono.empty();
}
@@ -92,53 +61,14 @@ public Mono followerHandler(String id, JsonNode inboxNode, String reques
public Mono usersFollowing(@PathVariable String id,
@RequestParam(required = false) Integer page,
@RequestParam(required = false) Integer limit) {
- return usersFollow(id, page, limit, "following");
+ return accountService.usersFollow(id, page, limit, "following");
}
@GetMapping("/users/{id}/followers")
public Mono usersFollowers(@PathVariable String id,
@RequestParam(required = false) Integer page,
@RequestParam(required = false) Integer limit) {
- return usersFollow(id, page, limit, "followers");
- }
-
- public Mono usersFollow(String id, @RequestParam(required = false) Integer page,
- @RequestParam(required = false) Integer limit, String followType) {
- var items = followType.equals("following") ? followingRepository.findItemById(id)
- .map(Following::getFollowing) : followersRepository.findItemById(id).map(Followers::getFollowers);
- String returnID = MothController.BASE_URL + "/users/" + id + followType;
- int pageSize = limit != null ? limit : DEFAULT_PAGE_SIZE;
- if (page == null) {
- String first = returnID + "?page=1";
- return items.map(
- v -> new UsersFollowResponse(returnID, "OrderedCollection", v.size(), first, null, null, null));
- } else { // page number is given
- int pageNum = page < 1 ? 1 : page;
- return items.map(v -> {
- String newReturnID = limit != null ? returnID + "?page=" + page + "&limit=" + limit : returnID +
- "?page=" + page;
- if (pageNum * pageSize >= v.size()) { // no next page
- return new UsersFollowResponse(newReturnID, "OrderedCollectionPage", v.size(), null, null, returnID,
- paginateFollowers(v, pageNum, pageSize));
- } else {
- String next = returnID + "?page=" + (pageNum + 1);
- if (limit != null) {
- next += "&limit=" + limit;
- }
- return new UsersFollowResponse(newReturnID, "OrderedCollectionPage", v.size(), null, next, returnID,
- paginateFollowers(v, pageNum, pageSize));
- }
- });
- }
- }
-
- public List paginateFollowers(ArrayList followers, int pageNo, int pageSize) {
- int startIndex = (pageNo - 1) * pageSize;
- int endIndex = Math.min(startIndex + pageSize, followers.size());
- if (startIndex >= followers.size()) {
- return Collections.emptyList();
- }
- return followers.subList(startIndex, endIndex);
+ return accountService.usersFollow(id, page, limit, "followers");
}
@JsonInclude(JsonInclude.Include.NON_NULL)
diff --git a/server/src/main/java/edu/sjsu/moth/server/service/AccountService.java b/server/src/main/java/edu/sjsu/moth/server/service/AccountService.java
index a19ef0fe..677852e8 100644
--- a/server/src/main/java/edu/sjsu/moth/server/service/AccountService.java
+++ b/server/src/main/java/edu/sjsu/moth/server/service/AccountService.java
@@ -1,8 +1,14 @@
package edu.sjsu.moth.server.service;
+import com.fasterxml.jackson.databind.JsonNode;
+import edu.sjsu.moth.server.controller.InboxController;
import edu.sjsu.moth.server.controller.MothController;
import edu.sjsu.moth.server.db.Account;
import edu.sjsu.moth.server.db.AccountRepository;
+import edu.sjsu.moth.server.db.Followers;
+import edu.sjsu.moth.server.db.FollowersRepository;
+import edu.sjsu.moth.server.db.Following;
+import edu.sjsu.moth.server.db.FollowingRepository;
import edu.sjsu.moth.server.db.PubKeyPair;
import edu.sjsu.moth.server.db.PubKeyPairRepository;
import edu.sjsu.moth.server.db.WebfingerAlias;
@@ -11,8 +17,15 @@
import lombok.extern.apachecommons.CommonsLog;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
+import org.springframework.web.bind.annotation.RequestParam;
import reactor.core.publisher.Mono;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import static org.springframework.beans.support.PagedListHolder.DEFAULT_PAGE_SIZE;
+
/**
* this class manages the logic and DB access around account management.
* controllers shouldn't be doing account management directly and this class
@@ -26,6 +39,12 @@ public class AccountService {
@Autowired
AccountRepository accountRepository;
+ @Autowired
+ FollowersRepository followersRepository;
+
+ @Autowired
+ FollowingRepository followingRepository;
+
@Autowired
PubKeyPairRepository pubKeyPairRepository;
@@ -68,6 +87,68 @@ public Mono getPublicKey(String id, boolean addIfMissing) {
return mono;
}
+ public Mono followerHandler(String id, JsonNode inboxNode, String requestType) {
+ String follower = inboxNode.get("actor").asText();
+ if (requestType.equals("Follow")) {
+ // find id, grab arraylist, append
+ return accountRepository.findItemByAcct(id)
+ .switchIfEmpty(Mono.error(new RuntimeException("Error: Account to follow does not exist")))
+ .then(followersRepository.findItemById(id)
+ .switchIfEmpty(Mono.just(new Followers(id, new ArrayList<>())))
+ .flatMap(followedUser -> {
+ followedUser.getFollowers().add(follower);
+ return followersRepository.save(followedUser).thenReturn("done");
+ }));
+ }
+ if (requestType.equals("Undo")) {
+ // find id, grab arraylist, remove
+ return followersRepository.findItemById(id).flatMap(followedUser -> {
+ followedUser.getFollowers().remove(follower);
+ return followersRepository.save(followedUser).thenReturn("done");
+ });
+ }
+ return Mono.empty();
+ }
+
+ public Mono usersFollow(String id, @RequestParam(required = false) Integer page,
+ @RequestParam(required = false) Integer limit, String followType) {
+ var items = followType.equals("following") ? followingRepository.findItemById(id)
+ .map(Following::getFollowing) : followersRepository.findItemById(id).map(Followers::getFollowers);
+ String returnID = MothController.BASE_URL + "/users/" + id + followType;
+ int pageSize = limit != null ? limit : DEFAULT_PAGE_SIZE;
+ if (page == null) {
+ String first = returnID + "?page=1";
+ return items.map(
+ v -> new InboxController.UsersFollowResponse(returnID, "OrderedCollection", v.size(), first, null, null, null));
+ } else { // page number is given
+ int pageNum = page < 1 ? 1 : page;
+ return items.map(v -> {
+ String newReturnID = limit != null ? returnID + "?page=" + page + "&limit=" + limit : returnID +
+ "?page=" + page;
+ if (pageNum * pageSize >= v.size()) { // no next page
+ return new InboxController.UsersFollowResponse(newReturnID, "OrderedCollectionPage", v.size(), null, null, returnID,
+ paginateFollowers(v, pageNum, pageSize));
+ } else {
+ String next = returnID + "?page=" + (pageNum + 1);
+ if (limit != null) {
+ next += "&limit=" + limit;
+ }
+ return new InboxController.UsersFollowResponse(newReturnID, "OrderedCollectionPage", v.size(), null, next, returnID,
+ paginateFollowers(v, pageNum, pageSize));
+ }
+ });
+ }
+ }
+
+ public List paginateFollowers(ArrayList followers, int pageNo, int pageSize) {
+ int startIndex = (pageNo - 1) * pageSize;
+ int endIndex = Math.min(startIndex + pageSize, followers.size());
+ if (startIndex >= followers.size()) {
+ return Collections.emptyList();
+ }
+ return followers.subList(startIndex, endIndex);
+ }
+
public Mono updateAccount(Account a) {
return accountRepository.save(a);
}