diff --git a/src/main/java/org/ntlab/tampoposerver/models/ChatRequest.java b/src/main/java/org/ntlab/tampoposerver/models/ChatRequest.java new file mode 100644 index 0000000..15aa63a --- /dev/null +++ b/src/main/java/org/ntlab/tampoposerver/models/ChatRequest.java @@ -0,0 +1,37 @@ +package org.ntlab.tampoposerver.models; + +public class ChatRequest { + private Integer chatRequestId; + private String senderId; + private String receiverId; + + public ChatRequest(Integer chatRequestId, String senderId, String receiverId) { + this.chatRequestId = chatRequestId; + this.senderId = senderId; + this.receiverId = receiverId; + } + + public Integer getChatRequestId() { + return chatRequestId; + } + + public void setChatRequestId(Integer chatRequestId) { + this.chatRequestId = chatRequestId; + } + + public String getSenderId() { + return senderId; + } + + public void setSenderId(String senderId) { + this.senderId = senderId; + } + + public String getReceiverId() { + return receiverId; + } + + public void setReceiverId(String receiverId) { + this.receiverId = receiverId; + } +} diff --git a/src/main/java/org/ntlab/tampoposerver/repositories/ActivityRepository.java b/src/main/java/org/ntlab/tampoposerver/repositories/ActivityRepository.java index 9f20f74..13d3e19 100644 --- a/src/main/java/org/ntlab/tampoposerver/repositories/ActivityRepository.java +++ b/src/main/java/org/ntlab/tampoposerver/repositories/ActivityRepository.java @@ -38,13 +38,30 @@ return a; } - //アクティビティを取得 + //単一のアクティビティを取得 public Activity getActivity(String userId,String activityId) { if(activityMap.get(userId) == null) { return null; } - return activityMap.get(userId).get(activityId); + + HashMap activities = activityMap.get(userId); + + if(activities.get(activityId) == null) { + return null; + } + Activity activity = activities.get(activityId); + return activity; } +// +// public HashMap getActivitiesForUser(String userId){ +// if(activityMap.get(userId) == null) { +// return null; +// } +// +// //keySet());ならアクティビティIDだけで詳細が取れない +// HashMap value = activityMap.get(userId); +// return value; +// } //アクティビティのテキストが存在しないとき public boolean isValidActivity(String userId, String activityId) { @@ -105,12 +122,13 @@ } //そのユーザの全アクティビティ情報を保存するリストをの作成 - public List getActivitiesForUser(String userId){ + public HashMap getActivitiesForUser(String userId){ if(activityMap.get(userId) == null) { - return new ArrayList<>(); + return null; } //keySet());ならアクティビティIDだけで詳細が取れない - return new ArrayList<>(activityMap.get(userId).keySet()); + HashMap value = activityMap.get(userId); + return value; } } diff --git a/src/main/java/org/ntlab/tampoposerver/repositories/ChatRequestRepository.java b/src/main/java/org/ntlab/tampoposerver/repositories/ChatRequestRepository.java new file mode 100644 index 0000000..d45cbb8 --- /dev/null +++ b/src/main/java/org/ntlab/tampoposerver/repositories/ChatRequestRepository.java @@ -0,0 +1,31 @@ +package org.ntlab.tampoposerver.repositories; + +import org.ntlab.tampoposerver.models.ChatRequest; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +@Repository +public class ChatRequestRepository { + private final HashMap chatRequests = new HashMap<>(); + private int id = 0; + + public ChatRequest addChatRequest(String senderId, String receiverId) { + return null; + } + + public ChatRequest getChatRequest(int chatRequestId) { + return chatRequests.get(chatRequestId); + } + + public ArrayList getChatRequestsForUser(String userId) { + return null; + } + + public ChatRequest deleteChatRequest(int chatRequestId) { + return null; + } + +} diff --git a/src/main/java/org/ntlab/tampoposerver/resources/ActivitiesResource.java b/src/main/java/org/ntlab/tampoposerver/resources/ActivitiesResource.java index 8edefdb..1c9c48a 100644 --- a/src/main/java/org/ntlab/tampoposerver/resources/ActivitiesResource.java +++ b/src/main/java/org/ntlab/tampoposerver/resources/ActivitiesResource.java @@ -1,40 +1,223 @@ package org.ntlab.tampoposerver.resources; -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.PathParam; -import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; +import org.ntlab.tampoposerver.models.Activity; +import org.ntlab.tampoposerver.repositories.ActivityRepository; +import org.ntlab.tampoposerver.repositories.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.time.LocalTime; +import java.util.HashMap; + @Path("/users") @Component public class ActivitiesResource { + + private UserRepository userRepository = null; + private ActivityRepository activityRepository = null; + + @Autowired + public ActivitiesResource(UserRepository userRepository, ActivityRepository activityRepository) { + this.userRepository = userRepository; + this.activityRepository = activityRepository; + } + @Path("/{user-id}/activities") - @GET - public String getActivities(@PathParam("user-id") String userId, @QueryParam("filter") String filter) { - return "Hello World!!"; + @GET //アカウントの全アクティビティを取得 + public Response getActivities(@PathParam("user-id") String userId, + @QueryParam("filter") String filter) { + //失敗 + //400(ユーザーnull or 空だったら) + if (userId == null || userId.isEmpty()) { + var response = Response.status(Response.Status.BAD_REQUEST).entity("不正なリクエスト"); + throw new WebApplicationException(response.build()); + } + + HashMap activities = activityRepository.getActivitiesForUser(userId); + + //404(アクティビティが存在しないとき) + if (activities == null) { //取得した最新のアクティビティがnullのとき + var response = Response.status(Response.Status.NOT_FOUND).entity("アクティビティが存在しません"); + throw new WebApplicationException(response.build()); + } + + //200(アカウントの全アクティビティを取得) + return Response.status(Response.Status.OK).entity(activities).build(); + } + + @Path("/{user-id}/activities") + @POST //新規のアクティビティを投稿する + @Consumes(MediaType.APPLICATION_FORM_URLENCODED)//bodyに入力する値がある時 + public Response postActivities(@PathParam("user-id") String userId, + @FormParam("token") String token, + @FormParam("new-activity") String newActivity) { + //失敗 + //400(不正なリクエスト) + if (token == null || token.isEmpty() || newActivity == null || newActivity.isEmpty()) { //トークン or 新アクティビティがnull or 空だったら + var response = Response.status(Response.Status.BAD_REQUEST).entity("不正なリクエスト"); + throw new WebApplicationException(response.build()); + } + + //403(未認証&トークンの不一致) + if (!userRepository.checkToken(userId, token)) { // ユーザーまたはトークンが存在しない はるかと相談済み + var response = Response.status(Response.Status.FORBIDDEN).entity("認証エラー"); + throw new WebApplicationException(response.build()); + } + + + //404(ユーザーが存在しないとき) + if (userRepository.getUser(userId) == null) { + var response = Response.status(Response.Status.NOT_FOUND).entity("ユーザーが存在しません"); + throw new WebApplicationException(response.build()); + } + + /* + 500(予期せぬエラー) + spring bootが500を返してくれるからコードなし + */ + + //成功 + //200(アクティビティを作成) + LocalTime time = LocalTime.now(); //ローカルの時間を取得 + Activity addedActivity = activityRepository.addActivity(userId, newActivity, time.toString()); //追加されたアクティビティの情報を、あとで使えるように addedActivity に入れている + return Response.status(Response.Status.OK).entity(addedActivity.getActivityId()).build(); } @Path("/{user-id}/activities/{activity-id}") - @GET - public String getActivity(@PathParam("user-id") String userId, @PathParam("activity-id") String activityId) { - return "Hello World!!"; + @GET //アカウントの単一アクティビティを取得する + @Produces(MediaType.APPLICATION_JSON) + public Response getActivity(@PathParam("user-id") String userId, + @PathParam("activity-id") String activityId) { + //失敗 + //400(不正なリクエスト) + if (activityId == null || activityId.isEmpty()) { //アクティビティがnull or 空だったら + var response = Response.status(Response.Status.BAD_REQUEST).entity("不正なリクエスト"); + throw new WebApplicationException(response.build()); + } + + //404(ユーザーかアクティビティが存在しないとき) + if (userRepository.getUser(userId) == null || activityRepository.getActivity(userId, activityId) == null) { + var response = Response.status(Response.Status.NOT_FOUND).entity("ユーザーかアクティビティが存在しません"); + throw new WebApplicationException(response.build()); + } + + Activity activity = activityRepository.getActivity(userId,activityId); + + //200(アカウントの単一アクティビティを取得) + return Response.status(Response.Status.OK).entity(activity).build(); } + @Path("/{user-id}/activities/{activity-id}") + @DELETE //アカウントの単一アクティビティを削除する + public Response deleteActivity(@PathParam("user-id") String userId, + @PathParam("activity-id") String activityId, + @QueryParam("token") String token) { + + + //失敗 + //400(トークン or 新アクティビティがnull or 空だったら) + if (token == null || token.isEmpty() || activityId == null || activityId.isEmpty()) { + var response = Response.status(Response.Status.BAD_REQUEST).entity("不正なリクエスト"); + throw new WebApplicationException(response.build()); + } + + //403(ユーザーまたはトークンが存在しないとき) + if (!userRepository.checkToken(userId, token)) { + var response = Response.status(Response.Status.FORBIDDEN).entity("認証エラー"); + throw new WebApplicationException(response.build()); + } + + + //404(ユーザーかアクティビティが存在しないとき) + if (userRepository.getUser(userId) == null || activityRepository.getActivity(userId, activityId) == null) { + var response = Response.status(Response.Status.NOT_FOUND).entity("ユーザーかアクティビティが存在しません"); + throw new WebApplicationException(response.build()); + } + + /* + 500(予期せぬエラー) + spring bootが500を返してくれるからコードなし + */ + + boolean deleteActivity = activityRepository.deleteActivity(userId,activityId); + + //成功 + //200(アクティビティを削除) + return Response.status(Response.Status.OK).entity(deleteActivity).build(); + } + + @Path("/{user-id}/activities/{activity-id}/text") - @GET - public String getActivityText(@PathParam("user-id") String userId, @PathParam("activity-id") String activityId) { - return "Hello World!!"; + @GET //アカウントの単一アクティビティの文章の内容を取得する + public Response getActivityText(@PathParam("user-id") String userId, + @PathParam("activity-id") String activityId) { + //失敗 + //400(不正なリクエスト) + if (activityId == null || activityId.isEmpty()) { //アクティビティがnull or 空だったら + var response = Response.status(Response.Status.BAD_REQUEST).entity("不正なリクエスト"); + throw new WebApplicationException(response.build()); + } + + //404(取得したアクティビティがnullのとき) + if (activityRepository.getActivity(userId, activityId) == null) { + var response = Response.status(Response.Status.NOT_FOUND).entity("アクティビティが存在しません"); + throw new WebApplicationException(response.build()); + } + + //成功 + //200(アカウントの単一アクティビティの文章の内容を取得) + activityRepository.getActivity(userId, activityId); + return Response.status(Response.Status.OK).build(); } + @Path("/{user-id}/activities/{activity-id}/updated-time") - @GET - public String getActivityUpdatedTime(@PathParam("user-id") String userId, @PathParam("activity-id") String activityId) { - return "Hello World!!"; + @GET //単一アクティビティの投稿時間を取得する + public Response getActivityUpdatedTime(@PathParam("user-id") String userId, + @PathParam("activity-id") String activityId) { + //失敗 + //400(不正なリクエスト) + if (activityId == null || activityId.isEmpty()) { //アクティビティがnull or 空だったら + var response = Response.status(Response.Status.BAD_REQUEST).entity("不正なリクエスト"); + throw new WebApplicationException(response.build()); + } + + //404(アクティビティが存在しないとき) + if (activityRepository.getActivity(userId, activityId) == null) { //取得したアクティビティがnullのとき(不正な内容のとき) + var response = Response.status(Response.Status.NOT_FOUND).entity("アクティビティが存在しません"); + throw new WebApplicationException(response.build()); + } + + //成功 + //200(単一アクティビティの投稿時間を取得する) + activityRepository.getActivityUpdateTime(userId, activityId); + return Response.status(Response.Status.OK).build(); } - @Path("/{user-id}/activities/{activity-id}/last-updated-time") - @GET - public String getActivityLastUpdatedTime(@PathParam("user-id") String userId) { - return "Hello World!!"; + + @Path("/{user-id}/activities/last-updated-time") + @GET //最新のアクティビティの投稿時間を取得する + public Response getActivityLastUpdatedTime(@PathParam("user-id") String userId) { + //失敗 + //400(不正なリクエスト) + if (userId == null || userId.isEmpty()) { //ユーザーがnull or 空だったら + var response = Response.status(Response.Status.BAD_REQUEST).entity("不正なリクエスト"); + throw new WebApplicationException(response.build()); + } + + + //404(アクティビティが存在しないとき) + if (activityRepository.getActivitiesForUser(userId).isEmpty() || userRepository.getUser(userId) == null) { //ユーザの全アクティビティ情報を保存するリストが空のとき + var response = Response.status(Response.Status.NOT_FOUND).entity("ユーザーかアクティビティが存在しません"); + throw new WebApplicationException(response.build()); + } + + + //成功 + //200(最新のアクティビティの投稿時間を取得する) + activityRepository.getLastUpdatedTime(userId); + return Response.status(Response.Status.OK).build(); } } \ No newline at end of file diff --git a/src/main/java/org/ntlab/tampoposerver/resources/ChatRequestsResource.java b/src/main/java/org/ntlab/tampoposerver/resources/ChatRequestsResource.java new file mode 100644 index 0000000..cf0cc06 --- /dev/null +++ b/src/main/java/org/ntlab/tampoposerver/resources/ChatRequestsResource.java @@ -0,0 +1,122 @@ +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.ChatRequest; +import org.ntlab.tampoposerver.models.FriendRequest; +import org.ntlab.tampoposerver.repositories.ChatRequestRepository; +import org.ntlab.tampoposerver.repositories.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; + +import static jakarta.ws.rs.core.Response.status; + + + +@Path("/chat-requests/") +@Component + +public class ChatRequestsResource { + + private ChatRequestRepository chatRequestRepository ; + private UserRepository userRepository = null; + + @Autowired + public ChatRequestsResource(UserRepository userRepository,ChatRequestRepository chatRequestRepository) { + this.userRepository = userRepository; + this.chatRequestRepository = chatRequestRepository; + } + + @GET + @Consumes(MediaType.APPLICATION_FORM_URLENCODED) + public Response getChatRequests( + @QueryParam("token") String token, + @QueryParam("user-id") String userId) { + + //400(認証が必要です) tokenがなかったら400 + if (token == null || token.isEmpty() || userId == null || userId.isEmpty()) { + return status(Response.Status.BAD_REQUEST) + .entity("認証が必要です").build(); + } + + + + //200(成功レスポンス) + ArrayList requests = chatRequestRepository.getChatRequestsForUser(userId);//前の人がListだったらArrayListになるから作ってて頼む時はListで頼め + //tokenのチェックはこっちでする、ほかのひとがしていた + // 岩谷さんのUserRepositoryでtokenの確認を行う + if (!userRepository.checkToken(userId, token) ) { + return Response.status(Response.Status.UNAUTHORIZED).build(); + } + + if (requests == null) { + return status(Response.Status.BAD_REQUEST) + .entity("認証が必要です").build(); + } + + return Response.status(Response.Status.OK).entity(requests).build(); + + } + + //チャットリクエストの作成 + //トークンを使って他人の情報を返さないように実装する。 + @POST + @Consumes(MediaType.APPLICATION_FORM_URLENCODED) + public Response postChatRequest( + @FormParam("token") String token, + @FormParam("sender-id") String senderId, + @FormParam("receiver-id") String receiverId) { + + + //204チャットがリクエストされました + ChatRequest created = chatRequestRepository.addChatRequest(senderId, receiverId); + //トークンのチェックよろしくじぶんで + if (!userRepository.checkToken(senderId, token) || !userRepository.checkToken(receiverId, token)) { + return Response.status(Response.Status.UNAUTHORIZED).build(); + } + + + if (created == null) { + return status(Response.Status.BAD_REQUEST) + .entity("チャットリクエストの作成に失敗しました").build(); + } + + return Response. + status(Response.Status.OK).entity(created.getChatRequestId()).build(); + } + + @Path("/chat-requests/{chat-request-id}") + @DELETE + public Response deleteChatRequest( + @QueryParam("receiver-token") String receiverToken, + @PathParam("chat-request-id") Integer chatRequestId) { + + //401承認が必要です + if (receiverToken == null || receiverToken.isEmpty()) { + return status(Response.Status.UNAUTHORIZED) + .entity("認証が必要です") // 401 + .build(); + } + + //403(未認証&トークンの不一致) + //ChatRequestRepository.getChatRequest(chatRequestId); + if (!userRepository.checkToken(null, null) && !userRepository.checkToken(null, null)) { + return Response.status(Response.Status.UNAUTHORIZED).build(); + } + + + //404チャットリクエストが見つかりません。 + ChatRequest deleted = chatRequestRepository.deleteChatRequest(chatRequestId); + if (deleted==null) { + return status(Response.Status.NOT_FOUND) + .entity("チャットリクエストが見つかりません") // 404 + .build(); + } + //204チャットリクエストが削除されました + return status(Response.Status.NO_CONTENT).build(); + } + +} \ No newline at end of file diff --git a/src/main/java/org/ntlab/tampoposerver/resources/FriendRequestsResource.java b/src/main/java/org/ntlab/tampoposerver/resources/FriendRequestsResource.java index 1937276..0742a23 100644 --- a/src/main/java/org/ntlab/tampoposerver/resources/FriendRequestsResource.java +++ b/src/main/java/org/ntlab/tampoposerver/resources/FriendRequestsResource.java @@ -10,6 +10,7 @@ import org.springframework.stereotype.Component; import java.util.ArrayList; +import java.util.UUID; @Path("/friend-requests") @Component @@ -32,6 +33,12 @@ if (token.isBlank()) { return Response.status(Response.Status.BAD_REQUEST).build(); } + // tokenがUUIDの規格に沿っていないとき + try { + UUID.fromString(token); + } catch (IllegalArgumentException e) { + return Response.status(Response.Status.BAD_REQUEST).build(); + } // 200 ArrayList requests = friendService.getFriendRequests(token); @@ -42,14 +49,18 @@ @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Produces(MediaType.APPLICATION_JSON) public Response postFriendRequest(@FormParam("sender-id") String senderId, @FormParam("receiver-id") String receiverId, @FormParam("token") String token) { - //201(フレンドリクエスト作成) + + //403(未認証&トークンの不一致) + if (!userRepository.checkToken(senderId, token) && !userRepository.checkToken(receiverId, token)) { + return Response.status(Response.Status.UNAUTHORIZED).build(); + } + FriendRequest created = friendService.createFriendRequest(token, senderId, receiverId); if (created == null) { return Response.status(Response.Status.BAD_REQUEST).build(); } + // 201(フレンドリクエスト作成) return Response.status(Response.Status.OK).entity(created.getId()).build(); - - } @Path("/{friend-request-id}") diff --git a/src/main/java/org/ntlab/tampoposerver/resources/FriendsResource.java b/src/main/java/org/ntlab/tampoposerver/resources/FriendsResource.java index 4f4f448..68f77a7 100644 --- a/src/main/java/org/ntlab/tampoposerver/resources/FriendsResource.java +++ b/src/main/java/org/ntlab/tampoposerver/resources/FriendsResource.java @@ -27,7 +27,7 @@ } - @Path("/{pair-id}") + @POST @Consumes (MediaType.APPLICATION_FORM_URLENCODED) public Response postFriends(@FormParam("token")String token,@FormParam("user0-id")String user0Id,@FormParam("user1-id")String user1Id){ @@ -38,7 +38,7 @@ } //403(未認証&トークンの不一致) - if (!userRepository.checkToken(user0Id, token) || !userRepository.checkToken(user1Id, token)) { // ユーザーまたはトークンが存在しない はるかと相談済み + if (!userRepository.checkToken(user0Id, token) && !userRepository.checkToken(user1Id, token)) { // ユーザーまたはトークンが存在しない はるかと相談済み var response = Response.status(Response.Status.FORBIDDEN).entity("認証エラーです。"); return Response.status(Response.Status.BAD_REQUEST).build(); } @@ -48,7 +48,7 @@ if (pair == null) { return Response.status(Response.Status.NOT_FOUND).build(); } - return Response.status(Response.Status.OK).build(); + return Response.status(Response.Status.OK).entity(pair).build(); //500は勝手にサーバがエラーでたらでるから書かない } @@ -66,7 +66,7 @@ if (pair == null) { return Response.status(Response.Status.NOT_FOUND).build(); } - return Response.status(Response.Status.OK).build(); + return Response.status(Response.Status.OK).entity(pair).build(); } @Path("/{pair-id}") diff --git a/src/main/java/org/ntlab/tampoposerver/resources/NotificationsResource.java b/src/main/java/org/ntlab/tampoposerver/resources/NotificationsResource.java index 537a354..e0d2311 100644 --- a/src/main/java/org/ntlab/tampoposerver/resources/NotificationsResource.java +++ b/src/main/java/org/ntlab/tampoposerver/resources/NotificationsResource.java @@ -53,6 +53,18 @@ return Response.ok(notifications).build(); } + @POST + @Consumes(MediaType.APPLICATION_FORM_URLENCODED) + public Response addNotification(@PathParam("user-id") String userID, @FormParam("from") String from, @FormParam("text") String text, @FormParam("time") String time) { + if (userID == null || userID.isEmpty()) { + var response = Response.status(Response.Status.BAD_REQUEST).entity("404"); + throw new WebApplicationException(response.build()); + } + Notification notification = notificationRepository.addNotification(userID, from, text, time); + return Response.ok(notification).build(); + } + + //通知詳細を取得 @Path("/{notification-id}") @GET @@ -83,6 +95,7 @@ return Response.ok(notification).build(); } + //通知本文だけを返す @Path("/{notification-id}/text") @GET @@ -145,7 +158,7 @@ } Map response = new HashMap<>(); - response.put("time", notification.getText()); + response.put("time", notification.getTime()); return Response.ok(response).build(); } @@ -178,7 +191,7 @@ } Map response = new HashMap<>(); - response.put("from", notification.getText()); + response.put("from", notification.getFrom()); return Response.ok(response).build(); } } \ 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 index 59910eb..c29d918 100644 --- a/src/test/java/org/ntlab/tampoposerver/repositories/ActivityRepositoryTest.java +++ b/src/test/java/org/ntlab/tampoposerver/repositories/ActivityRepositoryTest.java @@ -77,10 +77,14 @@ System.out.println(newtime2); //そのユーザの全アクティビティ情報を保存するリストをの作成 - List list = activityRepository.getActivitiesForUser("abc"); - List list2 = activityRepository.getActivitiesForUser("kkk"); - System.out.println(list2); - System.out.println(list); +// List list = activityRepository.getActivitiesForUser("abc"); +// List list2 = activityRepository.getActivitiesForUser("kkk"); +// System.out.println(list2); +// System.out.println(list); + + activityRepository.addActivity("rana","aaa","2025/07/17 14:17"); + Activity activity = activityRepository.getActivity("rana","4"); + System.out.println(activity); } }