diff --git a/src/main/java/org/ntlab/nemophila/resources/accounts/FriendsRest.java b/src/main/java/org/ntlab/nemophila/resources/accounts/FriendsRest.java index 8cb02d3..4fecb8d 100644 --- a/src/main/java/org/ntlab/nemophila/resources/accounts/FriendsRest.java +++ b/src/main/java/org/ntlab/nemophila/resources/accounts/FriendsRest.java @@ -1,27 +1,81 @@ package org.ntlab.nemophila.resources.accounts; +import org.ntlab.nemophila.models.accounts.Account; +import org.ntlab.nemophila.models.accounts.AccountManager; +import org.ntlab.nemophila.models.accounts.FriendManager; import org.springframework.stereotype.Component; import javax.ws.rs.*; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; @Component @Path("/accounts") public class FriendsRest { @GET @Path("/{uid}/friends") - public String getFriends(@PathParam("uid") String uid) { - return uid; + @Produces(MediaType.APPLICATION_JSON) + public Collection getFriends(@PathParam("uid") String uid) { + AccountManager accountManager = AccountManager.getInstance(); + Account account = accountManager.getAccount(uid); //uidに紐づいたAccountのインスタンスを取得 + FriendManager friendManager = account.getFriendManager(); //取得したAccountのインスタンスのFriendManagerを取得 + HashSet friends = friendManager.getFriends(); //Accountのインスタンスが入ったHashSetを取得 + ArrayList ids = new ArrayList<>(); //YAML上ではidが入ったArrayListで返すのでそれ用に作成 + for (Account ac : friends) { + ids.add(ac.getId()); + } + + return ids; } @PUT @Path("/{uid}/friends/{fid}") - public String putFriend(@PathParam("uid") String uid, @PathParam("fid") String fid) { - return null; + public void putFriend(@PathParam("uid") String uid, @PathParam("fid") String fid) { + AccountManager accountManager = AccountManager.getInstance(); + Account fromAc = accountManager.getAccount(uid); //uidに紐づいたAccountのインスタンスを取得 + Account toAc = accountManager.getAccount(fid); //fidに紐づいたAccountのインスタンスを取得 + FriendManager fromFriendManager = fromAc.getFriendManager(); //uidのAccountのインスタンスのFriendManagerを取得 + FriendManager toAcFriendManager = toAc.getFriendManager(); //fidのAccountのインスタンスのFriendManagerを取得 + + ArrayList requesting = toAcFriendManager.getRequesting(); //フレンド申請の送り主のフレンド申請中のArrayList + ArrayList requested = fromFriendManager.getRequested(); //自身のフレンド申請されているArrayList + + // 自身がフレンド申請を受け取っている、かつ相手がフレンド申請をしているとき実行 + if (requested.contains(fid) && requesting.contains(uid)) { + fromFriendManager.addFriend(toAc); + fromFriendManager.removeRequested(toAc); + + toAcFriendManager.addFriend(fromAc); + toAcFriendManager.removeRequesting(fromAc); + } else { + var response = Response.status(Response.Status.NO_CONTENT); + response.status(400).entity("リクエストが不正である"); + throw new WebApplicationException(response.build()); + } } @DELETE @Path("/{uid}/friends/{fid}") - public String deleteFriend(@PathParam("uid") String uid, @PathParam("fid") String fid) { - return null; + public void deleteFriend(@PathParam("uid") String uid, @PathParam("fid") String fid) { + AccountManager accountManager = AccountManager.getInstance(); + Account fromAc = accountManager.getAccount(uid); //uidに紐づいたAccountのインスタンスを取得 + Account toAc = accountManager.getAccount(fid); //fidに紐づいたAccountのインスタンスを取得 + FriendManager fromFriendManager = fromAc.getFriendManager(); //uidのAccountのインスタンスのFriendManagerを取得 + FriendManager toFriendManager = toAc.getFriendManager(); //fidのAccountのインスタンスのFriendManagerを取得 + + HashSet fromFriends = fromFriendManager.getFriends(); //uidのAccountのfriendsを取得 + HashSet toFriends = toFriendManager.getFriends(); //fidのAccountのfriendsを取得 + + if (fromFriends.contains(toAc) || toFriends.contains(fromAc)) { + fromFriends.remove(toAc); + toFriends.remove(fromAc); + } else { + var response = Response.status(Response.Status.NO_CONTENT); + response.status(400).entity("リクエストが不正である"); + throw new WebApplicationException(response.build()); + } } }