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); }