Newer
Older
tampopo-server / src / main / java / org / ntlab / tampoposerver / resources / ActivitiesResource.java
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();
    }
}