package org.ntlab.tampoposerver.resources;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.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 //アカウントの全アクティビティを取得
@Produces(MediaType.APPLICATION_JSON)
public Response getActivities(@PathParam("user-id") String userId,
@QueryParam("filter") String filter) {
//400(ユーザーIDがnull or 空)
if (userId == null || userId.isEmpty()) {
// var response = Response.status(Response.Status.BAD_REQUEST).entity("不正なリクエスト");
// throw new WebApplicationException(response.build());
return Response.status(Response.Status.BAD_REQUEST).build();
}
HashMap<String, Activity> activities = activityRepository.getActivitiesForUser(userId);
//404(取得したアクティビティがnull)
if (activities == null) {
var response = Response.status(Response.Status.NOT_FOUND).entity("アクティビティが存在しません");
throw new WebApplicationException(response.build());
}
/*
500(予期せぬエラー)
spring bootが500を返してくれるからコードなし
*/
//200(filterの値がLATESTのときに最新の単一アクティビティをGET)
if (filter != null && filter.equals("LATEST")) { //equals:filterの値とLATESTが一致しているときtrue
Activity latestActivity = activityRepository.getLatestActivity(userId);
HashMap<String, Activity> latestActivityMap = new HashMap<>();
latestActivityMap.put(latestActivity.getActivityId(), latestActivity);
return Response.status(Response.Status.OK).entity(latestActivityMap).build();
}
//200(アカウントの全アクティビティをGET)
return Response.status(Response.Status.OK).entity(activities).build();
}
@Path("/{user-id}/activities")
@POST //新規のアクティビティを投稿する
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)//bodyに入力する値がある時
@Produces(MediaType.TEXT_PLAIN)
public Response postActivities(@PathParam("user-id") String userId,
@FormParam("token") String token,
@FormParam("new-activity") String newActivity) {
//400(トークン or 新アクティビティがnull or 空)
if (token == null || token.isEmpty() || newActivity == null || newActivity.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) {
var response = Response.status(Response.Status.NOT_FOUND).entity("ユーザーが存在しません");
throw new WebApplicationException(response.build());
}
//200(アクティビティを作成)
LocalTime time = LocalTime.now(); //ローカルの時間を取得
Activity addedActivity = activityRepository.addActivity(userId, newActivity); //追加されたアクティビティの情報を、あとで使えるように addedActivity に入れている
return Response.status(Response.Status.OK).entity(addedActivity.getActivityId()).build();
}
@Path("/{user-id}/activities/{activity-id}")
@GET //アカウントの単一アクティビティを取得する(アクティビティID,テキスト,投稿時間)
@Produces(MediaType.APPLICATION_JSON)
public Response getActivity(@PathParam("user-id") String userId,
@PathParam("activity-id") String activityId) {
//400(アクティビティがnull or 空だったら)
if (activityId == null || activityId.isEmpty()) {
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());
}
//200(アカウントの単一アクティビティを取得)
Activity activity = activityRepository.getActivity(userId,activityId);
return Response.status(Response.Status.OK).entity(activity).build();
}
@Path("/{user-id}/activities/{activity-id}")
@DELETE //アカウントの単一アクティビティを削除する
@Produces(MediaType.TEXT_PLAIN)
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());
}
//200(アクティビティを削除)
boolean deleteActivity = activityRepository.deleteActivity(userId,activityId);
if (deleteActivity == true) {
return Response.status(Response.Status.OK).entity("アクティビティが削除されました").build();
}
else {
return Response.status(Response.Status.BAD_REQUEST).entity("アクティビティが削除されませんでした").build();
}
}
@Path("/{user-id}/activities/{activity-id}/text")
@GET //アカウントの単一アクティビティの文章の内容を取得する(テキストのみ)
@Produces(MediaType.TEXT_PLAIN)
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(ユーザーかアクティビティが存在しないとき)
if (userRepository.getUser(userId) == null || activityRepository.getActivity(userId, activityId) == null) {
var response = Response.status(Response.Status.NOT_FOUND).entity("ユーザーかアクティビティが存在しません");
throw new WebApplicationException(response.build());
}
//200(アカウントの単一アクティビティの文章の内容を取得)
String getActivityText = activityRepository.getActivityText(userId, activityId);
return Response.status(Response.Status.OK).entity(getActivityText).build();
}
@Path("/{user-id}/activities/{activity-id}/updated-time")
@GET //単一アクティビティの投稿時間を取得する
@Produces(MediaType.TEXT_PLAIN)
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(単一アクティビティの投稿時間を取得する)
String getActivityUpdateTime = activityRepository.getActivityUpdateTime(userId, activityId);
return Response.status(Response.Status.OK).entity(getActivityUpdateTime).build();
}
@Path("/{user-id}/activities/last-updated-time")
@GET //最新のアクティビティの投稿時間を取得する
@Produces(MediaType.TEXT_PLAIN)
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(最新のアクティビティの投稿時間を取得する)
String getLastUpdatedTime = activityRepository.getLastUpdatedTime(userId);
return Response.status(Response.Status.OK).entity(getLastUpdatedTime).build();
}
}