diff --git a/.gradle/8.14/checksums/checksums.lock b/.gradle/8.14/checksums/checksums.lock new file mode 100644 index 0000000..e4bdc95 --- /dev/null +++ b/.gradle/8.14/checksums/checksums.lock Binary files differ diff --git a/.gradle/8.14/executionHistory/executionHistory.bin b/.gradle/8.14/executionHistory/executionHistory.bin new file mode 100644 index 0000000..e0e5e75 --- /dev/null +++ b/.gradle/8.14/executionHistory/executionHistory.bin Binary files differ diff --git a/.gradle/8.14/executionHistory/executionHistory.lock b/.gradle/8.14/executionHistory/executionHistory.lock new file mode 100644 index 0000000..2b4f556 --- /dev/null +++ b/.gradle/8.14/executionHistory/executionHistory.lock Binary files differ diff --git a/.gradle/8.14/fileChanges/last-build.bin b/.gradle/8.14/fileChanges/last-build.bin new file mode 100644 index 0000000..f76dd23 --- /dev/null +++ b/.gradle/8.14/fileChanges/last-build.bin Binary files differ diff --git a/.gradle/8.14/fileHashes/fileHashes.bin b/.gradle/8.14/fileHashes/fileHashes.bin new file mode 100644 index 0000000..7ed6732 --- /dev/null +++ b/.gradle/8.14/fileHashes/fileHashes.bin Binary files differ diff --git a/.gradle/8.14/fileHashes/fileHashes.lock b/.gradle/8.14/fileHashes/fileHashes.lock new file mode 100644 index 0000000..e2767ee --- /dev/null +++ b/.gradle/8.14/fileHashes/fileHashes.lock Binary files differ diff --git a/.gradle/8.14/fileHashes/resourceHashesCache.bin b/.gradle/8.14/fileHashes/resourceHashesCache.bin new file mode 100644 index 0000000..d65fe97 --- /dev/null +++ b/.gradle/8.14/fileHashes/resourceHashesCache.bin Binary files differ diff --git a/.gradle/8.14/gc.properties b/.gradle/8.14/gc.properties new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/.gradle/8.14/gc.properties diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000..ff0754a --- /dev/null +++ b/.gradle/buildOutputCleanup/buildOutputCleanup.lock Binary files differ diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..fe46dfa --- /dev/null +++ b/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Tue Jun 03 13:42:38 JST 2025 +gradle.version=8.14 diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin new file mode 100644 index 0000000..a708109 --- /dev/null +++ b/.gradle/buildOutputCleanup/outputFiles.bin Binary files differ diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe new file mode 100644 index 0000000..c7124f8 --- /dev/null +++ b/.gradle/file-system.probe Binary files differ diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/.gradle/vcs-1/gc.properties diff --git a/build/classes/java/main/org/ntlab/tampoposerver/JerseyConfig.class b/build/classes/java/main/org/ntlab/tampoposerver/JerseyConfig.class new file mode 100644 index 0000000..aca4086 --- /dev/null +++ b/build/classes/java/main/org/ntlab/tampoposerver/JerseyConfig.class Binary files differ diff --git a/build/classes/java/main/org/ntlab/tampoposerver/ServletInitializer.class b/build/classes/java/main/org/ntlab/tampoposerver/ServletInitializer.class new file mode 100644 index 0000000..0db777a --- /dev/null +++ b/build/classes/java/main/org/ntlab/tampoposerver/ServletInitializer.class Binary files differ diff --git a/build/classes/java/main/org/ntlab/tampoposerver/TampopoServerApplication.class b/build/classes/java/main/org/ntlab/tampoposerver/TampopoServerApplication.class new file mode 100644 index 0000000..91eb52f --- /dev/null +++ b/build/classes/java/main/org/ntlab/tampoposerver/TampopoServerApplication.class Binary files differ diff --git a/build/classes/java/main/org/ntlab/tampoposerver/resources/HelloWorldResource.class b/build/classes/java/main/org/ntlab/tampoposerver/resources/HelloWorldResource.class new file mode 100644 index 0000000..ca373ed --- /dev/null +++ b/build/classes/java/main/org/ntlab/tampoposerver/resources/HelloWorldResource.class Binary files differ diff --git a/build/resources/main/application.properties b/build/resources/main/application.properties new file mode 100644 index 0000000..5370fb9 --- /dev/null +++ b/build/resources/main/application.properties @@ -0,0 +1 @@ +spring.application.name=tampopo-server diff --git a/build/tmp/bootWar/MANIFEST.MF b/build/tmp/bootWar/MANIFEST.MF new file mode 100644 index 0000000..59499bc --- /dev/null +++ b/build/tmp/bootWar/MANIFEST.MF @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 + diff --git a/build/tmp/compileJava/compileTransaction/stash-dir/HelloWorldResource.class.uniqueId0 b/build/tmp/compileJava/compileTransaction/stash-dir/HelloWorldResource.class.uniqueId0 new file mode 100644 index 0000000..034d5fa --- /dev/null +++ b/build/tmp/compileJava/compileTransaction/stash-dir/HelloWorldResource.class.uniqueId0 Binary files differ diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin new file mode 100644 index 0000000..6871cde --- /dev/null +++ b/build/tmp/compileJava/previous-compilation-data.bin Binary files differ diff --git a/build/tmp/war/MANIFEST.MF b/build/tmp/war/MANIFEST.MF new file mode 100644 index 0000000..59499bc --- /dev/null +++ b/build/tmp/war/MANIFEST.MF @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 + diff --git a/src/main/java/org/ntlab/tampoposerver/models/FriendPair.java b/src/main/java/org/ntlab/tampoposerver/models/FriendPair.java index ef6d46b..76b242a 100644 --- a/src/main/java/org/ntlab/tampoposerver/models/FriendPair.java +++ b/src/main/java/org/ntlab/tampoposerver/models/FriendPair.java @@ -5,8 +5,7 @@ private String user0Id; private String user1Id; - public FriendPair(Integer id, String user0Id, String user1Id) { - this.id = id; + public FriendPair(String user0Id, String user1Id) { this.user0Id = user0Id; this.user1Id = user1Id; } diff --git a/src/main/java/org/ntlab/tampoposerver/models/FriendRequest.java b/src/main/java/org/ntlab/tampoposerver/models/FriendRequest.java index d20cab1..b78cf6d 100644 --- a/src/main/java/org/ntlab/tampoposerver/models/FriendRequest.java +++ b/src/main/java/org/ntlab/tampoposerver/models/FriendRequest.java @@ -5,8 +5,7 @@ private String senderId; private String receiverId; - public FriendRequest(Integer id, String senderId, String receiverId) { - this.id = id; + public FriendRequest(String senderId, String receiverId) { this.senderId = senderId; this.receiverId = receiverId; } diff --git a/src/main/java/org/ntlab/tampoposerver/repositories/FriendRepository.java b/src/main/java/org/ntlab/tampoposerver/repositories/FriendRepository.java index 4ab2a8f..457eabc 100644 --- a/src/main/java/org/ntlab/tampoposerver/repositories/FriendRepository.java +++ b/src/main/java/org/ntlab/tampoposerver/repositories/FriendRepository.java @@ -30,7 +30,7 @@ * @param pair 追加するフレンドペア * @return 追加したフレンドペア */ - public FriendPair create(FriendPair pair) { + public FriendPair add(FriendPair pair) { lastPairId++; pair.setId(lastPairId); friends.put(pair.getId(), pair); diff --git a/src/main/java/org/ntlab/tampoposerver/repositories/UserRepository.java b/src/main/java/org/ntlab/tampoposerver/repositories/UserRepository.java index a571337..1450b1e 100644 --- a/src/main/java/org/ntlab/tampoposerver/repositories/UserRepository.java +++ b/src/main/java/org/ntlab/tampoposerver/repositories/UserRepository.java @@ -11,39 +11,50 @@ public class UserRepository { private final HashMap userMap = new HashMap<>(); - public User addUser(String userId, String password) { + public User addUser(String userId, String password) {//アカウント新規作成時追加 User u = new User(userId, password); userMap.put(userId, u); return u; } - public User addUser(String userId, String name, String password, String email, String icon) { + public User addUser(String userId, String name, String password, String email, String icon) {//アカウント追加 User u = new User(userId, name, password, email, icon); userMap.put(userId, u); return u; } - public User getUser(String userId) { + public User getUser(String userId) {//ユーザー情報取得 return userMap.get(userId); } - public User deleteUser(String userId) { + public ArrayList getAllUsers() { + ArrayList u = new ArrayList<>(); + for (String key : userMap.keySet()) { + u.add(userMap.get(key)); + } + return u; + } + + public User deleteUser(String userId) {//ユーザー情報の削除 return userMap.remove(userId); } - public User addFriendPair(String userId, FriendPair pair) { + public User addFriendPair(String userId, FriendPair pair) {//ユーザー側のフレンドペア追加 User user = getUser(userId); user.getFriendPairs().add(pair); return user; } - public ArrayList getFriendPairs(String userId) { + public ArrayList getFriendPairs(String userId) {//ユーザー側のフレンドペアの取得 User user = getUser(userId); return user.getFriendPairs(); } - public void deleteFriendPair(String userId, FriendPair pair) { + public boolean deleteFriendPair(String userId, FriendPair pair) {//ユーザー側のフレンドペアの削除 User user = getUser(userId); - user.getFriendPairs().remove(pair); + if (user == null) return false; + if (pair == null) return false; + boolean result = user.getFriendPairs().remove(pair); + return result; } -} +} \ No newline at end of file diff --git a/src/main/java/org/ntlab/tampoposerver/resources/HelloWorldResource.java b/src/main/java/org/ntlab/tampoposerver/resources/HelloWorldResource.java deleted file mode 100644 index 3f3e884..0000000 --- a/src/main/java/org/ntlab/tampoposerver/resources/HelloWorldResource.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.ntlab.tampoposerver.resources; - -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; -import org.springframework.stereotype.Component; - -@Path("/hello-world") -@Component -public class HelloWorldResource { - @GET - public String getHello() { - return "Hello World!!"; - } -} diff --git a/src/main/java/org/ntlab/tampoposerver/resources/UsersResource.java b/src/main/java/org/ntlab/tampoposerver/resources/UsersResource.java index 714615f..94e2190 100644 --- a/src/main/java/org/ntlab/tampoposerver/resources/UsersResource.java +++ b/src/main/java/org/ntlab/tampoposerver/resources/UsersResource.java @@ -1,14 +1,426 @@ package org.ntlab.tampoposerver.resources; -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import org.ntlab.tampoposerver.models.FriendPair; +import org.ntlab.tampoposerver.repositories.UserRepository; +import org.ntlab.tampoposerver.models.User; +import org.ntlab.tampoposerver.services.FriendService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.ArrayList; +import java.util.List; +/* +//6/10報告:全部できた(friendまで)、UserRepositoryとの連携ができていない(updateあります?)、responseがない +//6/17報告:すべてのユーザーの情報を持ってくるところ、フレンドペアの自分じゃない方のuidを返すところ、フレンドペアの削除はもらったものを連携できていない + +マスタからこのブランチへと取り込む +ブランチ checkout +masterからブランチへ引き込む +Git → Merge → git merge origin/master + +別のクラスへのアクセス方法 +コンストラクタを作る +import class +コンストラクタの上に@Autowired これを入れるとspring bootが管理しているuserRepositoryのインスタンスを渡してくれる +Repositoru側の説明 Repositoryをつけるとspring bootがインスタンスを1個だけ勝手に作ってくれる シングルトン +変数名は先頭小文字 + +未コミットの編集→スタッシュで書き換えてしまったコードを退避させることができる + +ポストマンでテスト +1. +*/ + @Path("/users") @Component + public class UsersResource { + + + private final UserRepository userRepository; + private final FriendService friendService; + + @Autowired + public UsersResource(UserRepository userRepository, + FriendService friendService) { //インスタンスを作るときに呼び出されるメソッドであるコンストラクタを書く + this.userRepository = userRepository; + this.friendService = friendService; + } + + //@Path("/{uid}/..")などパスを指定する + //アカウントの基本情報 @GET - public String getHello(){ - return "Hello World!"; + @Produces(MediaType.APPLICATION_JSON) + /*関数の名前を適切なものに変更する + 関数の引数に@PathParam("uid") String uidのような形でパラメーターを定義しておく + Queryの場合は@QueryParam("filter") String filter + repositoryのメソッド名:add, get, delete + 本来の流れはインターフェースだけ決めておく メソッド名と引数名*/ + public Response getUsers() { + List users = userRepository.getAllUsers(); + if (users.isEmpty()) { + return Response.noContent().build(); + } + return Response.ok(users).build(); + } + + + //新規アカウントを作る + @POST + @Consumes(MediaType.APPLICATION_FORM_URLENCODED) + public Response createUser(@FormParam("user_id") String userId, @FormParam("password") String password) { + + //ユーザーがいるか調べる + User user = userRepository.getUser(userId); + if (user == null) { + throw new WebApplicationException( + Response.status(Response.Status.NOT_FOUND) + .entity("ユーザーが存在しません") + .build() + ); + } + + //6/12ここはswaggerではなくコードを仕様にすると決定しました。 + return Response.ok(user.login(), MediaType.APPLICATION_JSON).build(); + + } + + //単一アカウントの情報を返す + @GET + @Path("/{userId}") + @Produces(MediaType.APPLICATION_JSON) + public Response getUser(@PathParam("userId") String userId) { + //取得 + User user = userRepository.getUser(userId); + //存在の確認 + if (user == null) { + throw new WebApplicationException(Response.Status.NOT_FOUND); + } + return Response.ok(user, MediaType.APPLICATION_JSON).build(); + } + + //ユーザの削除 ok + @DELETE + //deleteはquery parameter + @Path("/{userId}") + public Response deleteUser(@PathParam("userId") String userId, @QueryParam("token") String token) { + //取得 + User user = userRepository.getUser(userId); + //存在チェック + if (user == null) { + throw new WebApplicationException( + Response.status(Response.Status.NOT_FOUND) + .entity("404 IDが存在しません") + .build() + ); + } + + if (!token.equals(user.getToken())) { + throw new WebApplicationException( + Response.status(Response.Status.FORBIDDEN) + .entity("401 認証失敗") + .build() + ); + } + + //削除処理 + userRepository.deleteUser(userId); + return Response.noContent().build(); + } + + + //ログイン + @POST + @Path("/{userId}/login") + @Consumes(MediaType.APPLICATION_FORM_URLENCODED) + public Response login(@PathParam("userId") String userId, @FormParam("password") String password) { + + //存在チェック + User user = userRepository.getUser(userId); + if (user == null) { + throw new WebApplicationException( + Response.status(Response.Status.NOT_FOUND) + .entity("IDが存在しません") + .build() + ); + } + + //パスワードチェック 適切なステータスはなんですか? + if (!password.equals(user.getPassword())) { + throw new WebApplicationException( + Response.status(Response.Status.UNAUTHORIZED) + .entity("パスワードが間違っています") + .build() + ); + } + + //トークン発行 + String token = user.login(); + + return Response.ok(token).build(); + + } + + //アカウントのニックネームの取得 ok + @GET + @Path("/{userId}/name") + @Produces(MediaType.APPLICATION_JSON) + public Response getName(@PathParam("userId") String userId) { + //取得 + User user = userRepository.getUser(userId); + //存在チェック + if (user == null) { + throw new WebApplicationException( + Response.Status.NOT_FOUND + ); + } + + return Response.ok(user.getName(), MediaType.APPLICATION_JSON).build(); + } + + //ニックネームの変更 + @PUT + @Path("/{userId}") + @Consumes(MediaType.APPLICATION_FORM_URLENCODED) + public Response updateName(@PathParam("userId") String userId, @FormParam("new_name") String newName, @FormParam("token") String token) { + + User user = userRepository.getUser(userId); + if (user == null) { + throw new WebApplicationException( + Response.status(Response.Status.NOT_FOUND) + .entity("ユーザーが存在しません") + .build() + ); + } + + if (token == null || !token.equals(user.getToken())) { + throw new WebApplicationException( + Response.status(Response.Status.FORBIDDEN) + .entity("認証失敗") + .build() + ); + } + + //ニックネームアップデート + user.setName(newName); + return Response.ok(user.getName(), MediaType.APPLICATION_JSON).build(); + + } + + //単一アカウントのパスワードの取得 ok + @GET + @Path("/{userId}/password") + @Produces(MediaType.APPLICATION_JSON) + public Response getPassword(@PathParam("userId") String userId, @QueryParam("token") String token) { + User user = userRepository.getUser(userId); + if (user == null) { + throw new WebApplicationException(Response.Status.NOT_FOUND); + } + return Response.ok(user.getPassword(), MediaType.APPLICATION_JSON).build(); + } + + //指定されたIDのパスワードを変更する + @PUT + @Path("/{userId}/password") + @Consumes(MediaType.APPLICATION_FORM_URLENCODED) + public Response updatePassword(@PathParam("userId") String userId, @FormParam("new_password") String newPassword) { + + User user = userRepository.getUser(userId); + if (user == null) { + throw new WebApplicationException( + Response.status(Response.Status.NOT_FOUND) + .entity("ユーザーが存在しません") + .build() + ); + } + + + //パスワードのアップデート + user.setPassword(newPassword); + return Response.ok().build(); + + } + + + //単一アカウントのemailの取得 + @GET + @Path("/{userId}/email") + @Produces(MediaType.APPLICATION_JSON) + public Response getEmail(@PathParam("userId") String userId) { + User user = userRepository.getUser(userId); + if (user == null) { + throw new WebApplicationException(Response.Status.NOT_FOUND); + } + return Response.ok(user.getEmail(), MediaType.APPLICATION_JSON).build(); + } + + //指定されたIDのemailを変更する + @PUT + @Path("/{userId}/email") + @Consumes(MediaType.APPLICATION_FORM_URLENCODED) + public Response updateEmail(@PathParam("userId") String userId, @FormParam("new_email") String newEmail, @FormParam("token") String token) { + + User user = userRepository.getUser(userId); + if (user == null) { + throw new WebApplicationException( + Response.status(Response.Status.NOT_FOUND) + .entity("ユーザーが存在しません") + .build() + ); + } + + if (token == null || !token.equals(user.getToken())) { + throw new WebApplicationException( + Response.status(Response.Status.FORBIDDEN) + .entity("認証失敗") + .build() + ); + } + + //emailアップデート + user.setEmail(newEmail); + return Response.ok(user.getEmail(), MediaType.APPLICATION_JSON).build(); + + } + + //指定されたIDのアイコンを返す + @GET + @Path("/{userId}/icon") + @Produces(MediaType.APPLICATION_JSON) + public Response getIcon(@PathParam("userId") String userId) { + User user = userRepository.getUser(userId); + if (user == null) { + throw new WebApplicationException(Response.Status.NOT_FOUND); + } + return Response.ok(user.getIcon(), MediaType.APPLICATION_JSON).build(); + } + + //アイコンを変更する + @PUT + @Path("/{userId}/icon") + @Consumes(MediaType.APPLICATION_FORM_URLENCODED) + public String updateIcon(@PathParam("userId") String userId, @FormParam("new_icon") String newIcon, @FormParam("token") String token) { + + User user = userRepository.getUser(userId); + if (user == null) { + throw new WebApplicationException( + Response.status(Response.Status.NOT_FOUND) + .entity("ユーザーが存在しません") + .build() + ); + } + + if (token == null || !token.equals(user.getToken())) { + throw new WebApplicationException( + Response.status(Response.Status.FORBIDDEN) + .entity("認証失敗") + .build() + ); + } + + //アイコンを変更する + user.setIcon(newIcon); + return Response.ok(user.getIcon(), MediaType.APPLICATION_JSON).build().toString(); + + } + + //フレンド相手の情報の取得 + @GET + @Path("/{userId}/friends/") + @Produces(MediaType.APPLICATION_JSON) + public Response getFriends(@PathParam("userId") String userId, @QueryParam("token") String token) { + User user = userRepository.getUser(userId); + if (user == null) { + throw new WebApplicationException( + Response.status(Response.Status.NOT_FOUND) + .entity("ユーザーが存在しません") + .build() + ); + } + if (token == null || !token.equals(user.getToken())) { + throw new WebApplicationException( + Response.status(Response.Status.FORBIDDEN) + .entity("認証失敗") + .build() + ); + } + //pairIdを取ってきて自分じゃない方のuserIdを渡す + List friendIds = friendService.getFriendIds(token, userId); + if (friendIds == null) { // 認証失敗 or ユーザ無し + throw new WebApplicationException( + Response.status(Response.Status.FORBIDDEN) + .entity("認証失敗またはユーザ不一致") + .build()); + } + + return Response + .ok() + .build(); + } + + + //自分のペアのpid一覧(JSON)の取得 + @GET + @Path("/{userId}/friends") + @Produces(MediaType.APPLICATION_JSON) + public Response getPairId(@PathParam("userId") String userId, @QueryParam("token") String token) { + User user = userRepository.getUser(userId); + if (user == null) { + throw new WebApplicationException( + Response.status(Response.Status.NOT_FOUND) + .entity("ユーザーが存在しません") + .build() + ); + } + + if (token == null || !token.equals(user.getToken())) { + throw new WebApplicationException( + Response.status(Response.Status.FORBIDDEN) + .entity("認証失敗") + .build() + ); + } + + ArrayList pairIds = user.getFriendPairs(); + + // JSON で返す + return Response.ok(pairIds).build(); + } + + + //ペアの削除  + @DELETE + @Path("/{userId}/friends/{pairId}") + public Response deleteFriends(@PathParam("userId") String userId, @PathParam("pairId") int pairId, @QueryParam("token") String token) { + User user = userRepository.getUser(userId); + if (user == null) { + throw new NotFoundException("IDが存在しません"); + } + + //トークン認証 + if (token == null || !token.equals(user.getToken())) { + throw new WebApplicationException( + Response.status(Response.Status.FORBIDDEN) + .entity("認証失敗") + .build() + ); + } + + + boolean removed = friendService.removeFriendPair(token, pairId); + if(!removed) { + throw new WebApplicationException(Response.Status.NOT_FOUND); + } + + return Response.noContent().build(); } } + + + + + + diff --git a/src/main/java/org/ntlab/tampoposerver/services/FriendService.java b/src/main/java/org/ntlab/tampoposerver/services/FriendService.java index 2cd7576..f2372ba 100644 --- a/src/main/java/org/ntlab/tampoposerver/services/FriendService.java +++ b/src/main/java/org/ntlab/tampoposerver/services/FriendService.java @@ -2,6 +2,7 @@ import org.ntlab.tampoposerver.models.FriendPair; import org.ntlab.tampoposerver.models.FriendRequest; +import org.ntlab.tampoposerver.models.User; import org.ntlab.tampoposerver.repositories.FriendRepository; import org.ntlab.tampoposerver.repositories.FriendRequestRepository; import org.ntlab.tampoposerver.repositories.UserRepository; @@ -9,7 +10,7 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; -import java.util.Optional; +import java.util.Collection; // MEMO: ユーザーのトークンを認証するところはUserRepositoryに任せる // MEMO: フレンド系の操作で認証が必要な場合はここで対応する @@ -32,10 +33,16 @@ * @param token APIリクエストをしてきたユーザーの認証用トークン * @param senderId フレンドリクエストを送ったユーザーのユーザーID * @param receiverId フレンドリクエストを受け取ったユーザーのユーザーID - * @return 作成されたフレンドリクエストのインスタンス + * @return 作成されたフレンドリクエストのインスタンス(tokenに対応したユーザーがsenderIdでもreceiverIdにも関係しない場合は{@code Optional.empty()}) + * @apiNote {@code token} が有効かどうか、{@code senderId}と{@code receiverId}に対応したユーザーがそれぞれ存在するかどうかは別に判定が必要 */ - public Optional createFriendRequest(String token, String senderId, String receiverId) { - return Optional.empty(); + public FriendRequest createFriendRequest(String token, String senderId, String receiverId) { + User sender = userRepository.getUser(senderId); + User receiver = userRepository.getUser(receiverId); + if (!sender.getToken().equals(token) && !receiver.getToken().equals(token)) { + return null; + } + return friendRequestRepository.create(new FriendRequest(senderId, receiverId)); } /** @@ -43,9 +50,19 @@ * * @param token ユーザー認証用のトークン * @return ユーザー自身に関連するすべてのフレンドリクエストのインスタンス(リクエストがなければ空のリスト) + * @apiNote {@code token} が有効かどうかは別に判定が必要 */ public ArrayList getFriendRequests(String token) { - return new ArrayList<>(); + ArrayList results = new ArrayList<>(); + Collection allRequests = friendRequestRepository.findAll(); + for (FriendRequest request : allRequests) { + User sender = userRepository.getUser(request.getSenderId()); + User receiver = userRepository.getUser(request.getReceiverId()); + if (sender.getToken().equals(token) || receiver.getToken().equals(token)) { + results.add(request); + } + } + return results; } /** @@ -54,21 +71,45 @@ * @param token APIリクエストをしてきたユーザーの認証用トークン * @param friendRequestId 削除する対象のフレンドリクエストのID * @return 削除に成功したらtrue, それ以外はfalse + * @apiNote {@code token} が有効かどうかは別に判定が必要 */ public boolean removeFriendRequest(String token, int friendRequestId) { - return false; + FriendRequest targetRequest = friendRequestRepository.find(friendRequestId); + if (targetRequest == null) { + return false; + } + + User sender = userRepository.getUser(targetRequest.getSenderId()); + User receiver = userRepository.getUser(targetRequest.getReceiverId()); + if (!sender.getToken().equals(token) && !receiver.getToken().equals(token)) { + return false; + } + return friendRequestRepository.delete(friendRequestId); } /** * 新しくフレンドペアを作成する * - * @param token APIリクエストをしてきたユーザーの認証用トークン * @param user0Id 片方のユーザーのユーザーID * @param user1Id もう一方のユーザーのユーザーID - * @return 追加されたフレンドペアのインスタンス + * @return 追加されたフレンドペアのインスタンス(エラーがあった場合は{@code Optional.empty()}) + * @apiNote {@code token} が有効かどうかは別に判定が必要 */ - public Optional createFriendPair(String token, String user0Id, String user1Id) { - return Optional.empty(); + public FriendPair createFriendPair(String user0Id, String user1Id) { + // フレンドリクエストを検索して削除する + FriendRequest acceptedRequest = friendRequestRepository.findAll().stream().filter((req) -> { + return (req.getSenderId().equals(user0Id) && req.getReceiverId().equals(user1Id)) || (req.getSenderId().equals(user1Id) && req.getReceiverId().equals(user0Id)); + }).findFirst().orElse(null); + if (acceptedRequest == null) { + return null; + } + friendRequestRepository.delete(acceptedRequest.getId()); + + // フレンドを追加する + FriendPair createdPair = friendRepository.add(new FriendPair(user0Id, user1Id)); + userRepository.addFriendPair(user0Id, createdPair); + userRepository.addFriendPair(user1Id, createdPair); + return createdPair; } /** @@ -77,9 +118,19 @@ * @param token APIリクエストをしてきたユーザーの認証用トークン * @param friendPairId 取得する対象のフレンドペアのID * @return 渡したフレンドペアのIDに対応したフレンドペア + * @apiNote {@code token} が有効かどうかは別に判定が必要 */ - public Optional getFriendPair(String token, int friendPairId) { - return Optional.empty(); + public FriendPair getFriendPair(String token, int friendPairId) { + FriendPair foundPair = friendRepository.find(friendPairId); + if (foundPair == null) { + return null; + } + User user0 = userRepository.getUser(foundPair.getUser0Id()); + User user1 = userRepository.getUser(foundPair.getUser1Id()); + if (!user0.getToken().equals(token) && !user1.getToken().equals(token)) { + return null; + } + return foundPair; } /** @@ -90,6 +141,42 @@ * @return 削除に成功したらtrue, それ以外はfalse */ public boolean removeFriendPair(String token, int friendPairId) { - return false; + FriendPair foundPair = friendRepository.find(friendPairId); + if (foundPair == null) { + return false; + } + User user0 = userRepository.getUser(foundPair.getUser0Id()); + User user1 = userRepository.getUser(foundPair.getUser1Id()); + if (!user0.getToken().equals(token) && !user1.getToken().equals(token)) { + return false; + } + + // フレンドペアを削除する + return friendRepository.delete(friendPairId) && userRepository.deleteFriendPair(user0.getUserId(), foundPair) && userRepository.deleteFriendPair(user1.getUserId(), foundPair); + } + + /** + * ユーザーIDが{@code userId}のユーザーとフレンドになっているユーザーのIDをすべて返す + * + * @param token APIリクエストをしてきたユーザーの認証用トークン + * @param userId APIリクエストをしてきたユーザーのID + * @return ユーザーIDが {@code userId} のユーザーとフレンドになっているユーザーすべてのID + * @apiNote ペアがない場合は空の配列、トークンとユーザーIDで認証できなければnullを返す + */ + public ArrayList getFriendIds(String token, String userId) { + User user = userRepository.getUser(userId); + if (user == null || !user.getToken().equals(token)) { + return null; + } + + ArrayList friendIds = new ArrayList<>(); + for (FriendPair friendPair : user.getFriendPairs()) { + if (friendPair.getUser0Id().equals(user.getUserId())) { + friendIds.add(friendPair.getUser1Id()); + } else { + friendIds.add(friendPair.getUser0Id()); + } + } + return friendIds; } } diff --git a/src/test/java/org/ntlab/tampoposerver/repositories/UserRepositoryTest.java b/src/test/java/org/ntlab/tampoposerver/repositories/UserRepositoryTest.java index 08c3f3b..6ac9843 100644 --- a/src/test/java/org/ntlab/tampoposerver/repositories/UserRepositoryTest.java +++ b/src/test/java/org/ntlab/tampoposerver/repositories/UserRepositoryTest.java @@ -5,26 +5,63 @@ import org.ntlab.tampoposerver.models.User; import org.springframework.boot.test.context.SpringBootTest; +import java.util.ArrayList; + +import static org.junit.jupiter.api.Assertions.assertEquals; + @SpringBootTest public class UserRepositoryTest { @Test void contextLoads() { UserRepository userRepository = new UserRepository(); -// User u1 = userRepository.addUser("u01", "asdf", "xyz","asdf@gmail.com","123a876bca878de3"); -// User u2 = userRepository.addUser("u02", "zcv", "abc","dfgdf@gmail.com","123a876bca878d125"); + User u1 = userRepository.addUser("u01", "asdf", "xyz","asdf@gmail.com","123a876bca878de3"); + User u2 = userRepository.addUser("u02", "zcv", "abc","dfgdf@gmail.com","123a876bca878d125"); + User u3 = userRepository.addUser("u03", "ghj", "yyi","yijdh@gmail.com","143a876bca878d125"); // User u = userRepository.getUser("u02"); + //getAllUsersテスト + ArrayList users = userRepository.getAllUsers(); + for (User u : users) { + System.out.println(u.getUserId()); + } +// System.out.println(users); // assertEquals(u2, u); // assertNotEquals(u1, u); // userRepository.deleteUser("u02"); // u = userRepository.getUser("u02"); // assertNull(u); // User user = userRepository.addPairId("u01", 2); - User u1 = userRepository.addUser("u01", "asdf", "xyz","asdf@gmail.com","123a876bca878de3"); - User u2 = userRepository.addUser("u02", "zcv", "abc","dfgdf@gmail.com","123a876bca878d125"); - FriendPair pair = new FriendPair(1, "u01", "u02"); - userRepository.addFriendPair("u01", pair); - userRepository.addFriendPair("u02", pair); - System.out.println(userRepository.getFriendPairs("u01").get(0).getUser1Id()); - System.out.println(userRepository.getFriendPairs("u02").get(0).getUser0Id()); + //usersのfriend(add.get.delete)テスト +// User u1 = userRepository.addUser("u01", "asdf", "xyz","asdf@gmail.com","123a876bca878de3"); +// User u2 = userRepository.addUser("u02", "zcv", "abc","dfgdf@gmail.com","123a876bca878d125"); +// User u3 = userRepository.addUser("u03", "jkl", "jkl","dfgdrgsf@gmail.com","123a876897878d125"); +// FriendPair pair = new FriendPair("u01", "u02"); +// FriendPair pair2 = new FriendPair("u01", "u03"); +// userRepository.addFriendPair("u01", pair); +// userRepository.addFriendPair("u02", pair); +// userRepository.addFriendPair("u01", pair2); +// userRepository.addFriendPair("u03", pair2); +// ArrayList u01FriendPairs = userRepository.getFriendPairs("u01"); +// for (FriendPair fp : u01FriendPairs) { +// System.out.println(fp.getUser1Id()); +// } +// assertEquals(2, u01FriendPairs.size());//数が正しいか判定 +// ArrayList u02FriendPairs = userRepository.getFriendPairs("u02"); +// for (FriendPair fp : u02FriendPairs) { +// System.out.println(fp.getUser1Id()); +// } +// assertEquals(1, u02FriendPairs.size()); +//// System.out.println(userRepository.getFriendPairs("u01").get(1).getUser1Id()); +//// System.out.println(userRepository.getFriendPairs("u02").get(0).getUser1Id()); +// userRepository.deleteFriendPair("u01", pair2); +// u01FriendPairs = userRepository.getFriendPairs("u01"); +// for (FriendPair fp : u01FriendPairs) { +// System.out.println(fp.getUser1Id()); +// } +// assertEquals(1, u01FriendPairs.size()); +// u02FriendPairs = userRepository.getFriendPairs("u02"); +// for (FriendPair fp : u02FriendPairs) { +// System.out.println(fp.getUser1Id()); +// } +// assertEquals(1, u02FriendPairs.size()); } } \ No newline at end of file