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.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 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<String, Activity> 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 //アカウントの単一アクティビティを取得する @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 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 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/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(); } }