diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e48b6be --- /dev/null +++ b/.gitignore @@ -0,0 +1,37 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ \ No newline at end of file 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..fc4e029 --- /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..6a5f00e --- /dev/null +++ b/.gradle/8.14/executionHistory/executionHistory.lock 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..672a11d --- /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..cc0ec29 --- /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..588f452 --- /dev/null +++ b/.gradle/8.14/fileHashes/resourceHashesCache.bin Binary files differ diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000..0824022 --- /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..4fc9fe7 --- /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/.idea/.gitignore b/.idea/.gitignore index cc5c502..3c30c70 100644 --- a/.idea/.gitignore +++ b/.idea/.gitignore @@ -6,3 +6,5 @@ # Datasource local storage ignored files /dataSources/ /dataSources.local.xml + + diff --git a/.idea/gradle.xml b/.idea/gradle.xml index f9163b4..4bd1d19 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,14 +1,17 @@ + diff --git a/.idea/misc.xml b/.idea/misc.xml index 9080f9e..9879958 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -4,7 +4,7 @@ - + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build/tmp/compileJava/previous-compilation-data.bin b/build/tmp/compileJava/previous-compilation-data.bin new file mode 100644 index 0000000..468be77 --- /dev/null +++ b/build/tmp/compileJava/previous-compilation-data.bin Binary files differ diff --git a/src/main/java/org/ntlab/tampoposerver/models/Activity.java b/src/main/java/org/ntlab/tampoposerver/models/Activity.java index efe82b0..bd2781f 100644 --- a/src/main/java/org/ntlab/tampoposerver/models/Activity.java +++ b/src/main/java/org/ntlab/tampoposerver/models/Activity.java @@ -1,4 +1,51 @@ package org.ntlab.tampoposerver.models; +import com.fasterxml.jackson.annotation.JsonIdentityInfo; +import com.fasterxml.jackson.annotation.JsonIgnore; + public class Activity { + @JsonIgnore + private String userId; + private String activityId; + private String text; + private String updateTime; + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getActivityId() { + return activityId; + } + + public void setActivityId(String activityId) { + this.activityId = activityId; + } + + public Activity(String u, String a, String t, String ut){ + userId = u; + activityId = a; + text = t; + updateTime = ut; + } } 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/models/Notification.java b/src/main/java/org/ntlab/tampoposerver/models/Notification.java index 101b9c9..115664b 100644 --- a/src/main/java/org/ntlab/tampoposerver/models/Notification.java +++ b/src/main/java/org/ntlab/tampoposerver/models/Notification.java @@ -1,4 +1,61 @@ package org.ntlab.tampoposerver.models; +import com.fasterxml.jackson.annotation.JsonIgnore; + public class Notification { + @JsonIgnore + private String userId; + @JsonIgnore + private String notificationId; + private String from; + private String text; + private String time; + + public Notification(String u, String n, String f, String tx, String tm) { + this.userId = u; + this.notificationId = n; + this.from = f; + this.text = tx; + this.time = tm; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getNotificationId() { + return notificationId; + } + + public void setNotificationId(String notificationId) { + this.notificationId = notificationId; + } + + public String getFrom() { + return from; + } + + public void setFrom(String from) { + this.from = from; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } } diff --git a/src/main/java/org/ntlab/tampoposerver/models/User.java b/src/main/java/org/ntlab/tampoposerver/models/User.java index b2376f3..76713a6 100644 --- a/src/main/java/org/ntlab/tampoposerver/models/User.java +++ b/src/main/java/org/ntlab/tampoposerver/models/User.java @@ -1,4 +1,95 @@ package org.ntlab.tampoposerver.models; +import java.util.ArrayList; +import java.util.UUID; + public class User { + private String userId; + private String name; + private String password; + private String email; + private String icon; + private String token; + private ArrayList friendPairs = new ArrayList<>(); + + public User(String userId, String password){ + this.userId = userId; + this.password = password; + } + + public User(String userId, String name, String password, String email, String icon){ + this.userId = userId; + this.name = name; + this.password = password; + this.email = email; + this.icon = icon; + } + + public String login(){ + UUID str = UUID.randomUUID(); + token = str.toString(); + return token; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public ArrayList getFriendPairs() { + return friendPairs; + } + + public void setFriendPairs(ArrayList friendPairs) { + this.friendPairs = friendPairs; + } + + } + + + + diff --git a/src/main/java/org/ntlab/tampoposerver/repositories/ActivityRepository.java b/src/main/java/org/ntlab/tampoposerver/repositories/ActivityRepository.java index ec8bb8e..02816d9 100644 --- a/src/main/java/org/ntlab/tampoposerver/repositories/ActivityRepository.java +++ b/src/main/java/org/ntlab/tampoposerver/repositories/ActivityRepository.java @@ -1,8 +1,86 @@ package org.ntlab.tampoposerver.repositories; +import org.ntlab.tampoposerver.models.Activity; import org.springframework.stereotype.Repository; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + @Repository public class ActivityRepository { + //アクティビティ情報を保存するハッシュマップを作成 + private final HashMap> activityMap = new HashMap<>(); + + //アクティビティクラスにはユーザID、アクティビティID、テキスト、投稿した時間を入れる + public Activity addActivity(String userId, String activityId, String text,String updateTime) { + Activity a = new Activity(userId,activityId,text,updateTime); + + //ハッシュマップがなかった場合にアクティビティを入れるハッシュマップの作成 + if(activityMap.get(userId) == null) { + activityMap.put(userId, new HashMap<>()); + } + //アクティビティマップにそのユーザのアクティビティIDと4項目を保存 + activityMap.get(userId).put(activityId,a); + + //userActivityMapはアクティビティマップのバリューのこと(そのバリューは表になってる) +// HashMap userActivityMap = activityMap.getOrDefault(userId, new HashMap<>()); +// userActivityMap.put(activityId, a); +// activityMap.put(userId, userActivityMap); + + return a; + } + //アクティビティを取得 + public Activity getActivity(String userId,String activityId) { + if(activityMap.get(userId) == null) { + return null; + } + return activityMap.get(userId).get(activityId); + } + + //アクティビティを削除するメソッド + public boolean deleteActivity(String userId, String activityId) { + HashMap userActivities = activityMap.get(userId); + if (userActivities != null && userActivities.containsKey(activityId)) { + userActivities.remove(activityId); + return true; // 成功 + } + return false; // 存在しない場合は削除できない + } + + //単一アクティビティの投稿時間の取得 + public String getActivityUpdateTime(String userId, String activityId) { + HashMap userActivities = activityMap.get(userId); + if (userActivities != null) { + Activity activity = userActivities.get(activityId); + if (activity != null) { + return activity.getUpdateTime(); + } + } + return null; // アクティビティが存在しない場合 + } + + //ユーザーの最後のアクティビティの投稿時間を返す + public String getLastUpdatedTime(String userId) { + HashMap userActivities = activityMap.get(userId); + if (userActivities != null && !userActivities.isEmpty()) {//userActivitiesが存在かつ要素が入っていれば + // 最も新しい更新時間を取得 + return userActivities.values().stream()//取り出した値(Activityの集合)をストリームに変換し順に処理をつなげていく + .map(Activity::getUpdateTime)//更新日時を取得します + .max(String::compareTo)//更新日時の中から「最大の値」(最も新しい日時)を取得します + .orElse(null); // 最後の更新時間が見つからない場合はnullを返す + } + return null; // ユーザーにアクティビティがない場合 + } + + //そのユーザの全アクティビティ情報を保存するリストをの作成 + public List getActivitiesForUser(String userId){ + if(activityMap.get(userId) == null) { + return new ArrayList<>(); + } + + //keySet());ならアクティビティIDだけで詳細が取れない + return new ArrayList<>(activityMap.get(userId).keySet()); + } } diff --git a/src/main/java/org/ntlab/tampoposerver/repositories/FriendRepository.java b/src/main/java/org/ntlab/tampoposerver/repositories/FriendRepository.java new file mode 100644 index 0000000..457eabc --- /dev/null +++ b/src/main/java/org/ntlab/tampoposerver/repositories/FriendRepository.java @@ -0,0 +1,50 @@ +package org.ntlab.tampoposerver.repositories; + +import org.ntlab.tampoposerver.models.FriendPair; +import org.springframework.stereotype.Repository; + +import java.util.HashMap; +import java.util.Map; + +@Repository +public class FriendRepository { + /* フレンドペアのIDからフレンドペアへの写像 */ + private final Map friends = new HashMap<>(); + + /* 最後に追加されたフレンドペアのID */ + private int lastPairId = -1; + + /** + * 渡されたIDに紐づけられているフレンドペアを取得する + * + * @param pairId 取得する対象のフレンドペアのID + * @return IDに紐づけられているフレンドペアが存在すればそのペア、存在しなければnull + */ + public FriendPair find(int pairId) { + return friends.get(pairId); + } + + /** + * 渡されたフレンドのペアを追加する + * + * @param pair 追加するフレンドペア + * @return 追加したフレンドペア + */ + public FriendPair add(FriendPair pair) { + lastPairId++; + pair.setId(lastPairId); + friends.put(pair.getId(), pair); + return pair; + } + + /** + * 渡されたIDに紐づけられているフレンドペアを削除する + * + * @param pairId 削除する対象のフレンドペアのID + * @return 削除できたらtrue、削除できなければfalse + */ + public boolean delete(int pairId) { + FriendPair removedPair = friends.remove(pairId); + return removedPair != null; + } +} diff --git a/src/main/java/org/ntlab/tampoposerver/repositories/FriendRequestRepository.java b/src/main/java/org/ntlab/tampoposerver/repositories/FriendRequestRepository.java new file mode 100644 index 0000000..e132740 --- /dev/null +++ b/src/main/java/org/ntlab/tampoposerver/repositories/FriendRequestRepository.java @@ -0,0 +1,59 @@ +package org.ntlab.tampoposerver.repositories; + +import org.ntlab.tampoposerver.models.FriendRequest; +import org.springframework.stereotype.Repository; + +import java.util.Collection; +import java.util.HashMap; + +@Repository +public class FriendRequestRepository { + /* フレンドリクエストのIDからフレンドリクエストへの写像 */ + private final HashMap friendRequests = new HashMap<>(); + + /* 最後に追加されたフレンドリクエストのID */ + private int lastId = -1; + + /** + * すべてのフレンドリクエストを返す + * + * @return すべてのフレンドリクエスト + */ + public Collection findAll() { + return friendRequests.values(); + } + + /** + * 渡されたフレンドリクエストIDに一致するリクエストを返す + * + * @param id 削除する対象のフレンドリクエストのID + * @return 存在したらそのリクエストのインスタンス、存在しなければnull + */ + public FriendRequest find(int id) { + return friendRequests.get(id); + } + + /** + * フレンドリクエストを追加する + * + * @param friendRequest 追加するフレンドリクエスト + * @return 追加したフレンドリクエスト + */ + public FriendRequest create(FriendRequest friendRequest) { + lastId++; + friendRequest.setId(lastId); + friendRequests.put(friendRequest.getId(), friendRequest); + return friendRequest; + } + + /** + * 渡されたIDに紐づけられているフレンドリクエストを削除する + * + * @param id 削除する対象のフレンドリクエストのID + * @return 削除できたらtrue、削除できなければfalse + */ + public boolean delete(int id) { + FriendRequest removedRequest = friendRequests.remove(id); + return removedRequest != null; + } +} diff --git a/src/main/java/org/ntlab/tampoposerver/repositories/NotificationRepository.java b/src/main/java/org/ntlab/tampoposerver/repositories/NotificationRepository.java index 7509ae4..0bc32e6 100644 --- a/src/main/java/org/ntlab/tampoposerver/repositories/NotificationRepository.java +++ b/src/main/java/org/ntlab/tampoposerver/repositories/NotificationRepository.java @@ -1,7 +1,47 @@ package org.ntlab.tampoposerver.repositories; +import org.ntlab.tampoposerver.models.Notification; import org.springframework.stereotype.Repository; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + @Repository public class NotificationRepository { + private HashMap> notificationMap = new HashMap<>(); + + //通知の追加 + public Notification addNotification(String userId, String notificationId, String from, String text, String time) { + Notification n = new Notification(userId, notificationId, from, text, time); + + if(notificationMap.get(userId) == null) { + notificationMap.put(userId, new HashMap<>()); + } + notificationMap.get(userId).put(notificationId, n); + + return n; + } + + //通知の取得 + public Notification getNotification(String userId, String notificationId){ + if(notificationMap.get(userId) == null) { + return null; + } + return notificationMap.get(userId).get(notificationId); + } + + //ユーザーに対応した通知リストの取得(時刻降順) + public List getNotificationsForUser(String userId){ + Map userNotifications = notificationMap.get(userId); + if(userNotifications == null) { + return new ArrayList<>(); + } + + return userNotifications.values().stream() + .sorted((a, b) -> b.getTime().compareTo(a.getTime())) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/org/ntlab/tampoposerver/repositories/UserRepository.java b/src/main/java/org/ntlab/tampoposerver/repositories/UserRepository.java index da39cd1..c65beaa 100644 --- a/src/main/java/org/ntlab/tampoposerver/repositories/UserRepository.java +++ b/src/main/java/org/ntlab/tampoposerver/repositories/UserRepository.java @@ -1,7 +1,71 @@ package org.ntlab.tampoposerver.repositories; +import org.ntlab.tampoposerver.models.FriendPair; +import org.ntlab.tampoposerver.models.User; import org.springframework.stereotype.Repository; +import java.util.ArrayList; +import java.util.HashMap; + @Repository public class UserRepository { + private final HashMap userMap = new HashMap<>(); + + 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) {//アカウント追加 + User u = new User(userId, name, password, email, icon); + userMap.put(userId, u); + return u; + } + + public User getUser(String userId) {//ユーザー情報取得 + return userMap.get(userId); + } + + public ArrayList getAllUsers() {//全アカウントのuserIdを取得 + 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) {//ユーザー側のフレンドペア追加 + User user = getUser(userId); + user.getFriendPairs().add(pair); + return user; + } + + public ArrayList getFriendPairs(String userId) {//ユーザー側のフレンドペアの取得 + User user = getUser(userId); + return user.getFriendPairs(); + } + + public boolean deleteFriendPair(String userId, FriendPair pair) {//ユーザー側のフレンドペアの削除 + User user = getUser(userId); + if (user == null) return false; + if (pair == null) return false; + boolean result = user.getFriendPairs().remove(pair); + return result; + } + + public boolean checkToken(String userId, String token) {// 指定されたユーザーのトークンと渡されたトークンの確認 + User user = getUser(userId); + if (user == null) return false; + if (token == null) return false; + if (user.getToken().equals(token)) { + return true; + } else { + return false; + } + } } diff --git a/src/main/java/org/ntlab/tampoposerver/resources/FriendRequestsResource.java b/src/main/java/org/ntlab/tampoposerver/resources/FriendRequestsResource.java index 585a4ed..678c967 100644 --- a/src/main/java/org/ntlab/tampoposerver/resources/FriendRequestsResource.java +++ b/src/main/java/org/ntlab/tampoposerver/resources/FriendRequestsResource.java @@ -2,13 +2,14 @@ import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; +import jakarta.ws.rs.QueryParam; import org.springframework.stereotype.Component; @Path("/friend-requests") @Component public class FriendRequestsResource { @GET - public String getHello(){ + public String getfriendrequests(@QueryParam("token") String token){ return "Hello World!"; } } diff --git a/src/main/java/org/ntlab/tampoposerver/resources/FriendsResource.java b/src/main/java/org/ntlab/tampoposerver/resources/FriendsResource.java index 03d2c94..01502e8 100644 --- a/src/main/java/org/ntlab/tampoposerver/resources/FriendsResource.java +++ b/src/main/java/org/ntlab/tampoposerver/resources/FriendsResource.java @@ -1,15 +1,104 @@ package org.ntlab.tampoposerver.resources; -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +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.services.FriendService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.AliasFor; import org.springframework.stereotype.Component; +import java.util.UUID; + @Path("/friends") @Component public class FriendsResource { - @GET - public String getHello() { - return "Hello World!!"; + + private UserRepository userRepository = null; + private FriendService friendService = null; + + @Autowired + public FriendsResource(UserRepository userRepository, FriendService friendService) { + this.userRepository = userRepository; + this.friendService = friendService; } + + + + @Path("/{pair-id}") + @GET + public Response getFriend(@QueryParam("token") String token, @PathParam("pair-id") int pairId) { + //400 + + //200 + FriendPair pair = friendService.getFriendPair(token, pairId); + if (pair == null) { + return Response.status(Response.Status.NOT_FOUND).build(); + } + return Response.status(Response.Status.OK).build(); + } + @POST + @Consumes (MediaType.APPLICATION_FORM_URLENCODED) + public void postFriends(@FormParam("token")String token,@FormParam("user0-id")String user0Id,@FormParam("user1-id")String user1Id){ + //400 + if (token.isBlank()){ //トークンが空文字だった時 + var response = Response.status(Response.Status.NOT_FOUND).entity("不正なリクエストです!"); + throw new WebApplicationException(response.build()); + } + //401 + //if (!UserRepository.getUser()){ //トークンが通らなかった時 + // var response = Response.status(Response.Status.NOT_FOUND).entity("トークンが無効です。");//404 + // throw new WebApplicationException(response.build()); + //} + + //403 + + //404 + //if (!friendService.createFriendPair(user0Id,user1Id){ //ユーザIDが変化した時、 + // var response = Response.status(Response.Status.NOT_FOUND).entity("データが存在しません。");//404 + // throw new WebApplicationException(response.build()); + //} + + + //200 + + //500は勝手にサーバがエラーでたらでるから書かない + + + return; + } + @Path("/{pair-id}") + @DELETE + public Response deleteFriend(@QueryParam("token") String token, @PathParam("pair-id") Integer pairId) { + //400 + if (token.isBlank()){ //トークンが空文字だった時 + var response = Response.status(Response.Status.NOT_FOUND).entity("不正なリクエストです。"); + throw new WebApplicationException(response.build()); + } + + //401 + //if (!userRepository.getUser()){ //トークンが通らなかった時 + // var response = Response.status(Response.Status.NOT_FOUND).entity("トークンが無効です。");//404 + // throw new WebApplicationException(response.build()); + //} + //403ここで書く必要なし + + //404 + if (!friendService.removeFriendPair(token,pairId)){ //トークンに対応したユーザが選択したフレンドが存在しない時 + var response = Response.status(Response.Status.NOT_FOUND).entity("データが存在しないです。");//404 + throw new WebApplicationException(response.build()); + } + + //200 + return Response.status(Response.Status.OK).build(); + + //500は勝手にサーバがエラーでたらでるから書かない + } + + } + 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/NotificationsResource.java b/src/main/java/org/ntlab/tampoposerver/resources/NotificationsResource.java new file mode 100644 index 0000000..1f5b609 --- /dev/null +++ b/src/main/java/org/ntlab/tampoposerver/resources/NotificationsResource.java @@ -0,0 +1,179 @@ +package org.ntlab.tampoposerver.resources; + +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import org.ntlab.tampoposerver.models.Notification; +import org.ntlab.tampoposerver.models.User; +import org.ntlab.tampoposerver.repositories.NotificationRepository; +import org.ntlab.tampoposerver.repositories.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Path("/users/{user-id}/notifications") +@Component +public class NotificationsResource { + private final UserRepository userRepository; + private final NotificationRepository notificationRepository; //finalによりインスタンス作成後に再代入不可,不変オブジェクト + + @Autowired + public NotificationsResource(UserRepository userRepository, NotificationRepository notificationRepository) { + this.userRepository = userRepository; + this.notificationRepository = notificationRepository; + } + + + @GET + @Produces(MediaType.APPLICATION_JSON) + public Response getNotifications(@PathParam("user-id") String userID, @QueryParam("token") String token) { + User user = userRepository.getUser(userID); + if (userID == null || userID.isEmpty()) { //userIDがnullまたは空文字列("")であるかをチェック + var response = Response.status(Response.Status.BAD_REQUEST).entity("不正なリクエスト"); //400 + throw new WebApplicationException(response.build()); + } + if (user == null) { + var response = Response.status(Response.Status.NOT_FOUND).entity("IDが存在しません");//404 + throw new WebApplicationException(response.build()); + } + if (token == null || token.isEmpty()) { + var response = Response.status(Response.Status.UNAUTHORIZED).entity("認証トークンがありません"); //401 + throw new WebApplicationException(response.build()); + } + if (!token.equals(user.getToken())) { //リクエストに含まれるトークンが、ユーザーに登録されているトークンと一致していない場合 + var response = Response.status(Response.Status.FORBIDDEN).entity("トークンが不正です");//403 + throw new WebApplicationException(response.build()); + } + + List notifications = notificationRepository.getNotificationsForUser(userID); + return Response.ok(notifications).build(); + } + + @Path("/{notification-id}") + @GET + @Produces(MediaType.APPLICATION_JSON) + public Response getNotification(@PathParam("user-id") String userID, @PathParam("notification-id") String notificationID, @QueryParam("token") String token) { + User user = userRepository.getUser(userID); + if (userID == null || userID.isEmpty() || notificationID == null || notificationID.isEmpty()) { + var response = Response.status(Response.Status.BAD_REQUEST).entity("不正なリクエスト"); //400 + throw new WebApplicationException(response.build()); + } + if (user == null) { + var response = Response.status(Response.Status.NOT_FOUND).entity("IDが存在しません");//404 + throw new WebApplicationException(response.build()); + } + if (token == null || token.isEmpty()) { + var response = Response.status(Response.Status.UNAUTHORIZED).entity("認証トークンがありません"); //401 + throw new WebApplicationException(response.build()); + } + if (!token.equals(user.getToken())) { + var response = Response.status(Response.Status.FORBIDDEN).entity("トークンが不正です");//403 + throw new WebApplicationException(response.build()); + } + Notification notification = notificationRepository.getNotification(userID, notificationID); //通知詳細を取得 + if (notification == null) { + var response = Response.status(Response.Status.NOT_FOUND).entity("通知が存在しません");//404 + throw new WebApplicationException(response.build()); + } + return Response.ok(notification).build(); + } + + @Path("/{notification-id}/text") //通知本文だけを返す + @GET + @Produces(MediaType.APPLICATION_JSON) + public Response getNotificationText(@PathParam("user-id") String userID, @PathParam("notification-id") String notificationID, @QueryParam("token") String token) { + User user = userRepository.getUser(userID); + if (userID == null || userID.isEmpty() || notificationID == null || notificationID.isEmpty()) { + var response = Response.status(Response.Status.BAD_REQUEST).entity("不正なリクエスト"); //400 + throw new WebApplicationException(response.build()); + } + if (user == null) { + var response = Response.status(Response.Status.NOT_FOUND).entity("IDが存在しません");//404 + throw new WebApplicationException(response.build()); + } + if (token == null || token.isEmpty()) { + var response = Response.status(Response.Status.UNAUTHORIZED).entity("認証トークンがありません"); //401 + throw new WebApplicationException(response.build()); + } + if (!token.equals(user.getToken())) { + var response = Response.status(Response.Status.FORBIDDEN).entity("トークンが不正です");//403 + throw new WebApplicationException(response.build()); + } + Notification notification = notificationRepository.getNotification(userID, notificationID); + if (notification == null) { + var response = Response.status(Response.Status.NOT_FOUND).entity("通知が存在しません");//404 + throw new WebApplicationException(response.build()); + } + + Map response = new HashMap<>(); //HashMapクラスのインスタンスを生成 + response.put("text", notification.getText()); //Mapにキーと値のペアを追加 + return Response.ok(response).build(); + } + + @Path("/{notification-id}/time") //通知日時だけを返す + @GET + @Produces(MediaType.APPLICATION_JSON) + public Response getNotificationTime(@PathParam("user-id") String userID, @PathParam("notification-id") String notificationID, @QueryParam("token") String token) { + User user = userRepository.getUser(userID); + if (userID == null || userID.isEmpty() || notificationID == null || notificationID.isEmpty()) { + var response = Response.status(Response.Status.BAD_REQUEST).entity("不正なリクエスト"); //400 + throw new WebApplicationException(response.build()); + } + if (user == null) { + var response = Response.status(Response.Status.NOT_FOUND).entity("IDが存在しません");//404 + throw new WebApplicationException(response.build()); + } + if (token == null || token.isEmpty()) { + var response = Response.status(Response.Status.UNAUTHORIZED).entity("認証トークンがありません"); //401 + throw new WebApplicationException(response.build()); + } + if (!token.equals(user.getToken())) { + var response = Response.status(Response.Status.FORBIDDEN).entity("トークンが不正です");//403 + throw new WebApplicationException(response.build()); + } + Notification notification = notificationRepository.getNotification(userID, notificationID); + if (notification == null) { + var response = Response.status(Response.Status.NOT_FOUND).entity("通知が存在しません");//404 + throw new WebApplicationException(response.build()); + } + + Map response = new HashMap<>(); + response.put("time", notification.getText()); + return Response.ok(response).build(); + } + + @Path("/{notification-id}/from") //通知送信者だけを返す + @GET + @Produces(MediaType.APPLICATION_JSON) + public Response getNotificationFrom(@PathParam("user-id") String userID, @PathParam("notification-id") String notificationID, @QueryParam("token") String token) { + User user = userRepository.getUser(userID); + if (userID == null || userID.isEmpty() || notificationID == null || notificationID.isEmpty()) { + var response = Response.status(Response.Status.BAD_REQUEST).entity("不正なリクエスト"); //400 + throw new WebApplicationException(response.build()); + } + if (user == null) { + var response = Response.status(Response.Status.NOT_FOUND).entity("IDが存在しません");//404 + throw new WebApplicationException(response.build()); + } + if (token == null || token.isEmpty()) { + var response = Response.status(Response.Status.UNAUTHORIZED).entity("認証トークンがありません"); //401 + throw new WebApplicationException(response.build()); + } + if (!token.equals(user.getToken())) { + var response = Response.status(Response.Status.FORBIDDEN).entity("トークンが不正です");//403 + throw new WebApplicationException(response.build()); + } + Notification notification = notificationRepository.getNotification(userID, notificationID); + if (notification == null) { + var response = Response.status(Response.Status.NOT_FOUND).entity("通知が存在しません");//404 + throw new WebApplicationException(response.build()); + } + + Map response = new HashMap<>(); + response.put("from", notification.getText()); + return Response.ok(response).build(); + } +} \ No newline at end of file diff --git a/src/main/java/org/ntlab/tampoposerver/resources/UsersResource.java b/src/main/java/org/ntlab/tampoposerver/resources/UsersResource.java index 714615f..9e2a135 100644 --- a/src/main/java/org/ntlab/tampoposerver/resources/UsersResource.java +++ b/src/main/java/org/ntlab/tampoposerver/resources/UsersResource.java @@ -1,14 +1,427 @@ 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 (userRepository.getUser(userId) != null) { + return Response.status(Response.Status.CONFLICT) + .entity("すでにユーザーが存在しています") + .build(); + } + User newUser = userRepository.addUser(userId, password); + + //6/12ここはswaggerではなくコードを仕様にすると決定しました。 + //return Response.ok(user.login(), MediaType.APPLICATION_JSON).build(); + return Response.status(Response.Status.CREATED) + .entity(newUser) // 仮に 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/{pairId}") + @Produces(MediaType.APPLICATION_JSON) + public Response getPairId(@PathParam("userId") String userId, @QueryParam("token") String token, @PathParam("pairId") String pairId) { + 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 new file mode 100644 index 0000000..f2372ba --- /dev/null +++ b/src/main/java/org/ntlab/tampoposerver/services/FriendService.java @@ -0,0 +1,182 @@ +package org.ntlab.tampoposerver.services; + +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; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Collection; + +// MEMO: ユーザーのトークンを認証するところはUserRepositoryに任せる +// MEMO: フレンド系の操作で認証が必要な場合はここで対応する +@Service +public class FriendService { + private final UserRepository userRepository; + private final FriendRepository friendRepository; + private final FriendRequestRepository friendRequestRepository; + + @Autowired + public FriendService(UserRepository userRepository, FriendRepository friendRepository, FriendRequestRepository friendRequestRepository) { + this.userRepository = userRepository; + this.friendRepository = friendRepository; + this.friendRequestRepository = friendRequestRepository; + } + + /** + * 新しいフレンドリクエストを作成する + * + * @param token APIリクエストをしてきたユーザーの認証用トークン + * @param senderId フレンドリクエストを送ったユーザーのユーザーID + * @param receiverId フレンドリクエストを受け取ったユーザーのユーザーID + * @return 作成されたフレンドリクエストのインスタンス(tokenに対応したユーザーがsenderIdでもreceiverIdにも関係しない場合は{@code Optional.empty()}) + * @apiNote {@code token} が有効かどうか、{@code senderId}と{@code receiverId}に対応したユーザーがそれぞれ存在するかどうかは別に判定が必要 + */ + 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)); + } + + /** + * ユーザー自身に関連するフレンドリクエストをすべて返す + * + * @param token ユーザー認証用のトークン + * @return ユーザー自身に関連するすべてのフレンドリクエストのインスタンス(リクエストがなければ空のリスト) + * @apiNote {@code token} が有効かどうかは別に判定が必要 + */ + public ArrayList getFriendRequests(String token) { + 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; + } + + /** + * 指定したフレンドリクエストを削除する + * + * @param token APIリクエストをしてきたユーザーの認証用トークン + * @param friendRequestId 削除する対象のフレンドリクエストのID + * @return 削除に成功したらtrue, それ以外はfalse + * @apiNote {@code token} が有効かどうかは別に判定が必要 + */ + public boolean removeFriendRequest(String token, int friendRequestId) { + 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 user0Id 片方のユーザーのユーザーID + * @param user1Id もう一方のユーザーのユーザーID + * @return 追加されたフレンドペアのインスタンス(エラーがあった場合は{@code Optional.empty()}) + * @apiNote {@code token} が有効かどうかは別に判定が必要 + */ + 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; + } + + /** + * 指定したフレンドのペアを取得する + * + * @param token APIリクエストをしてきたユーザーの認証用トークン + * @param friendPairId 取得する対象のフレンドペアのID + * @return 渡したフレンドペアのIDに対応したフレンドペア + * @apiNote {@code token} が有効かどうかは別に判定が必要 + */ + 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; + } + + /** + * 指定したフレンドのペアを削除する + * + * @param token APIリクエストをしてきたユーザーの認証用トークン + * @param friendPairId 削除する対象のフレンドペアのID + * @return 削除に成功したらtrue, それ以外はfalse + */ + public boolean removeFriendPair(String token, int friendPairId) { + 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/models/ActivityTest.java b/src/test/java/org/ntlab/tampoposerver/models/ActivityTest.java new file mode 100644 index 0000000..0cf437e --- /dev/null +++ b/src/test/java/org/ntlab/tampoposerver/models/ActivityTest.java @@ -0,0 +1,33 @@ +package org.ntlab.tampoposerver.models; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@SpringBootTest +public class ActivityTest { + @Test + void contextLoads() { + Activity a1 = new Activity("xyz","0","今からご飯食べる!","2025-06-05 14:23:45"); + Activity a2 = new Activity("abc","1","外出中!","2025-06-05 14:30:50"); + + System.out.println(a1.getUserId()); + System.out.println(a1.getActivityId()); + System.out.println(a1.getText()); + System.out.println(a1.getUpdateTime()); + System.out.println(a2.getUserId()); + System.out.println(a2.getActivityId()); + System.out.println(a2.getText()); + System.out.println(a2.getUpdateTime()); + + assertEquals("xyz",a1.getUserId()); + assertEquals("0",a1.getActivityId()); + assertEquals("今からご飯食べる!",a1.getText()); + assertEquals("2025-06-05 14:23:45",a1.getUpdateTime()); + assertEquals("abc",a2.getUserId()); + assertEquals("1",a2.getActivityId()); + assertEquals("外出中!",a2.getText()); + assertEquals("2025-06-05 14:30:50",a2.getUpdateTime()); + } +} diff --git a/src/test/java/org/ntlab/tampoposerver/models/NotificationTest.java b/src/test/java/org/ntlab/tampoposerver/models/NotificationTest.java new file mode 100644 index 0000000..59c6998 --- /dev/null +++ b/src/test/java/org/ntlab/tampoposerver/models/NotificationTest.java @@ -0,0 +1,27 @@ +package org.ntlab.tampoposerver.models; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import static org.junit.jupiter.api.Assertions.assertEquals; + + +@SpringBootTest +public class NotificationTest { + + @Test + void contextLoads() { + Notification n1 = new Notification("u01","n01","u100","telephone","2025/6/5"); + Notification n2 = new Notification("u02","n02","u100","telephone","2025/6/5"); + assertEquals("u01", n1.getUserId()); + assertEquals("n01", n1.getNotificationId()); + assertEquals("u100", n1.getFrom()); + assertEquals("telephone", n1.getText()); + assertEquals("2025/6/5", n1.getTime()); + assertEquals("u02", n2.getUserId()); + assertEquals("n02", n2.getNotificationId()); + assertEquals("u100", n2.getFrom()); + assertEquals("telephone", n2.getText()); + assertEquals("2025/6/5", n2.getTime()); + } +} diff --git a/src/test/java/org/ntlab/tampoposerver/models/UserTest.java b/src/test/java/org/ntlab/tampoposerver/models/UserTest.java new file mode 100644 index 0000000..d77a8fc --- /dev/null +++ b/src/test/java/org/ntlab/tampoposerver/models/UserTest.java @@ -0,0 +1,21 @@ +package org.ntlab.tampoposerver.models; + +import jakarta.validation.constraints.AssertTrue; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@SpringBootTest +public class UserTest { + @Test + void contextLoads() { + User u1 = new User("u01", "asdf", "xyz","asdf@gmail.com","123a876bca878de3"); + User u2 = new User("u02", "zcv", "abc","dfgdf@gmail.com","123a876bca878d125"); + assertEquals("asdf", u1.getName()); + assertEquals("xyz", u1.getPassword()); + assertEquals("asdf@gmail.com", u1.getEmail()); + assertEquals("zcv", u2.getName()); + assertEquals("abc", u2.getPassword()); + } +} \ No newline at end of file diff --git a/src/test/java/org/ntlab/tampoposerver/repositories/ActivityRepositoryTest.java b/src/test/java/org/ntlab/tampoposerver/repositories/ActivityRepositoryTest.java new file mode 100644 index 0000000..ebbd4d9 --- /dev/null +++ b/src/test/java/org/ntlab/tampoposerver/repositories/ActivityRepositoryTest.java @@ -0,0 +1,72 @@ +package org.ntlab.tampoposerver.repositories; + +import org.junit.jupiter.api.Test; +import org.ntlab.tampoposerver.models.Activity; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +public class ActivityRepositoryTest { + @Test + void contextLoads() { + ActivityRepository activityRepository = new ActivityRepository(); + //アクティビティの追加 + Activity a1 = activityRepository.addActivity("xyz","activity-id1", "今暇やねん","2025/05/14 15:20"); + Activity a2 = activityRepository.addActivity("abc","activity-id2", "お風呂入ってたわ","2025/07/14 23:50"); + Activity a100 = activityRepository.addActivity("abc","activity-id100", "プログラミングなう","2025/06/17 14:17"); + Activity a = activityRepository.getActivity("xyz","activity-id1"); + System.out.println(a); + System.out.println(a1); + System.out.println(a2); + assertEquals(a1,a); + assertNotEquals(a2,a); + //アクティビティマップにそのユーザのアクティビティIDと4項目を保存(アクティビティの内容も取得済み) + Activity a3 = activityRepository.getActivity("xyz","activity-id1"); + Activity a4 = activityRepository.getActivity("kkk","activity-id1"); + Activity a5 = activityRepository.getActivity("xyz","activity-id10"); + assertEquals(a1.getUserId(),a3.getUserId()); + assertEquals(a1.getActivityId(),a3.getActivityId()); + assertEquals(a1.getText(),a3.getText()); + assertEquals(a1.getUpdateTime(),a3.getUpdateTime()); + assertNull(a4); + assertNull(a5); + System.out.println(a1); + System.out.println(a3); + //アクティビティを削除するメソッド + boolean result = activityRepository.deleteActivity("xyz","activity-id1"); + boolean result2 = activityRepository.deleteActivity("xyz","activity-id2"); + assertTrue(result); + assertFalse(result2); + Activity a6 = activityRepository.getActivity("xyz","activity-id1"); + assertNull(a6); + System.out.println(result); + System.out.println(result2); + System.out.println(a6); + //単一アクティビティの投稿時間の取得 + String time = activityRepository.getActivityUpdateTime("abc","activity-id2"); + String time2 = activityRepository.getActivityUpdateTime("abc","activity-id4"); + assertEquals(a2.getUpdateTime(),time); + assertNotEquals(a100.getUpdateTime(),time); + assertNull(time2); + System.out.println(a1); + System.out.println(a2); + System.out.println(time); + System.out.println(time2); + //ユーザーの最後のアクティビティの投稿時間を返す + String newtime = activityRepository.getLastUpdatedTime("abc"); + String newtime2 = activityRepository.getLastUpdatedTime("kkk"); + assertEquals(a2.getUpdateTime(),newtime); + assertNull(newtime2); + System.out.println(newtime); + System.out.println(newtime2); + //そのユーザの全アクティビティ情報を保存するリストをの作成 + List list = activityRepository.getActivitiesForUser("abc"); + List list2 = activityRepository.getActivitiesForUser("kkk"); + System.out.println(list2); + System.out.println(list); + + } +} diff --git a/src/test/java/org/ntlab/tampoposerver/repositories/NotificationRepositoryTest.java b/src/test/java/org/ntlab/tampoposerver/repositories/NotificationRepositoryTest.java new file mode 100644 index 0000000..4f00ba7 --- /dev/null +++ b/src/test/java/org/ntlab/tampoposerver/repositories/NotificationRepositoryTest.java @@ -0,0 +1,54 @@ +package org.ntlab.tampoposerver.repositories; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.junit.jupiter.api.Test; +import org.ntlab.tampoposerver.models.Notification; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +@SpringBootTest +public class NotificationRepositoryTest { + + @Test + void contextLoads() throws JsonProcessingException { + NotificationRepository notificationRepository = new NotificationRepository(); + + Notification n1_1 = notificationRepository.addNotification("u01","n01","u00","telephone1","2025-06-10 10:00:11"); + Notification n1_2 = notificationRepository.addNotification("u01","n02","u02","telephone2","2025-06-07 10:31:11"); + Notification n1_3 = notificationRepository.addNotification("u01","n03","u02","telephone2","2025-06-07 12:09:22"); + Notification n2 = notificationRepository.addNotification("u02","n01","u00","telephone3","2025-06-07 09:22:12"); + + Notification n = notificationRepository.getNotification("u01","n02"); + assertEquals(n1_2.getText(),n.getText()); + + n = notificationRepository.getNotification("u01","n04"); + assertNull(n); + + n = notificationRepository.getNotification("u03","n03"); + assertNull(n); + + System.out.println(notificationRepository.getNotificationsForUser("u01")); + + System.out.println(notificationRepository.getNotification("u01","n01")); + + //JSONに変換して表示するテスト + ObjectMapper mapper = new ObjectMapper(); + mapper.registerModule(new JavaTimeModule()); // LocalDateTime対応 + mapper.findAndRegisterModules(); // 任意(自動登録) + + List notifications = notificationRepository.getNotificationsForUser("u01"); + String notificationsJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(notifications); + System.out.println(notificationsJson); + + String singleNotificationJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString( + notificationRepository.getNotification("u01", "n01") + ); + System.out.println(singleNotificationJson); + } +} diff --git a/src/test/java/org/ntlab/tampoposerver/repositories/UserRepositoryTest.java b/src/test/java/org/ntlab/tampoposerver/repositories/UserRepositoryTest.java new file mode 100644 index 0000000..6ac9843 --- /dev/null +++ b/src/test/java/org/ntlab/tampoposerver/repositories/UserRepositoryTest.java @@ -0,0 +1,67 @@ +package org.ntlab.tampoposerver.repositories; + +import org.junit.jupiter.api.Test; +import org.ntlab.tampoposerver.models.FriendPair; +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 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); + //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