diff --git a/src/main/java/org/ntlab/nemophila/resources/accounts/RequestedRest.java b/src/main/java/org/ntlab/nemophila/resources/accounts/RequestedRest.java index 3b0043d..a4e5e80 100644 --- a/src/main/java/org/ntlab/nemophila/resources/accounts/RequestedRest.java +++ b/src/main/java/org/ntlab/nemophila/resources/accounts/RequestedRest.java @@ -44,11 +44,13 @@ FriendManager fm = ac.getFriendManager(); //uidのAccountのFriendManagerを取得 FriendManager fmFrom = acFrom.getFriendManager(); //申請元のAccountのFriendManagerを取得 - //入力されたtokenがuidのものと一致した時、uidのrequestedにある申請元のAccountを、申請元のrequestingにあるuidのAccountを削除する + //入力されたtokenがuidのものと一致した時、uidとrequested_idのrequestingとrequestedそれぞれからお互いを削除 String acToken = ac.getToken(); if(token.equals(acToken)) { + fm.removeRequesting(acFrom); fm.removeRequested(acFrom); fmFrom.removeRequesting(ac); + fmFrom.removeRequested(ac); }else{ var response = Response.status(Response.Status.NO_CONTENT); response.status(401).entity("認証に失敗しました"); diff --git a/src/main/java/org/ntlab/nemophila/resources/accounts/RequestingRest.java b/src/main/java/org/ntlab/nemophila/resources/accounts/RequestingRest.java index cdbd74a..ea3df8d 100644 --- a/src/main/java/org/ntlab/nemophila/resources/accounts/RequestingRest.java +++ b/src/main/java/org/ntlab/nemophila/resources/accounts/RequestingRest.java @@ -10,6 +10,7 @@ import javax.ws.rs.core.Response; import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; @Component @Path("/accounts") @@ -41,14 +42,40 @@ AccountManager am = AccountManager.getInstance(); //AccountManagerを取得 Account ac = am.getAccount(uid); //uidからAccountインスタンスを取得 Account acTo = am.getAccount(requesting_id); //requesting_idから申請先のAccountインスタンスを取得 - FriendManager fm = ac.getFriendManager(); //uidのAccountのFriendManagerを取得 - FriendManager fmTo = acTo.getFriendManager(); //申請先のAccountのFriendManagerを取得 + FriendManager fm = ac.getFriendManager(); //uidのFriendManagerを取得 + FriendManager fmTo = acTo.getFriendManager(); //申請先のFriendManagerを取得 + HashSet acFriends = fm.getFriends(); //uidのフレンド一覧を取得 + ArrayList acRequesting = fm.getRequesting(); //uidが申請中のAccountの一覧を取得 + ArrayList acRequested = fm.getRequested(); //uidが申請を受けているAccountの一覧を取得 + ArrayList acToRequesting = fmTo.getRequesting(); //申請先のAccountが申請中のAccountの一覧を取得 + ArrayList acToRequested = fmTo.getRequested(); //申請先のAccountが申請を受けているAccountの一覧を取得 //入力されたtokenがuidのものと一致した時、uidのrequestingに申請先のAccountを、申請先のrequestedにuidのAccountを追加する + //相手が既にフレンドの時か、相手から申請を受けている時は実行できない + //同じ相手にもう一度申請を送る時は前のものを消して再送(重複しないように、かつArrayListの時系列順を更新できるように) String acToken = ac.getToken(); if(token.equals(acToken)) { - fm.addRequesting(acTo); - fmTo.addRequested(ac); + if(!(acFriends.contains(acTo))) { + if (!(acToRequesting.contains(ac) || acRequested.contains(acTo))) { + if (acRequesting.contains(acTo)) { + fm.removeRequesting(acTo); + } + fm.addRequesting(acTo); + + if (acToRequested.contains(ac)) { + fmTo.removeRequested(ac); + } + fmTo.addRequested(ac); + } else { + var response = Response.status(Response.Status.NO_CONTENT); + response.status(400).entity("リクエストが不正です"); + throw new WebApplicationException(response.build()); + } + }else{ + var response = Response.status(Response.Status.NO_CONTENT); + response.status(400).entity("リクエストが不正です"); + throw new WebApplicationException(response.build()); + } }else{ var response = Response.status(Response.Status.NO_CONTENT); response.status(401).entity("認証に失敗しました");