Newer
Older
CitrusServer / src / main / java / org / ntlab / citrusserver / resources / TodoRest.java
package org.ntlab.citrusserver.resources;

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.apache.coyote.http11.upgrade.UpgradeServletOutputStream;
import org.ntlab.citrusserver.entities.Todo;
import org.ntlab.citrusserver.repositories.AccountManager;
import org.ntlab.citrusserver.repositories.TodoManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.HashMap;

@Path("/accounts")
@Component
public class TodoRest {

    private final TodoManager todoManager;
    private final AccountManager accountManager;

    @Autowired
    public TodoRest(TodoManager todoManager, AccountManager accountManager) {
        this.todoManager = todoManager;
        this.accountManager = accountManager;
    }

    //test用
    @Path("/TodoTest")
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String testHello() {
        return "hello";
    }

    //指定された本のtodoをすべて返す
    //変更↓
    @Path("/{account_id}/books/{book_id}/todos")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public HashMap<Integer, HashMap<Integer, HashMap<Integer, HashMap<Integer, Todo>>>> getAllTodos(@PathParam("account_id") String account_id, @PathParam("book_id") Integer book_id, @QueryParam("token") String token) {
        if (accountManager.checkToken(account_id, token)) {
            return todoManager.getAllTodos(account_id, book_id);
        }
        return null;
    }

    //指定された本の指定された年と月のtodoをすべて返す
    @Path("/{account_id}/books/{book_id}/todos/{year}/{month}")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public HashMap<Integer, HashMap<Integer, Todo>> getTodosByMonth(@PathParam("account_id") String account_id, @PathParam("book_id") Integer book_id, @PathParam("year") Integer year, @PathParam("month") Integer month, @QueryParam("token") String token) {
        if (accountManager.checkToken(account_id, token)) {
            return todoManager.getTodosByMonth(account_id, book_id, year, month);
        }
        return null;
    }

    //指定された本の指定された年と月と日のtodoをすべて返す
    @Path("/{account_id}/books/{book_id}/todos/{year}/{month}/{day}")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public HashMap<Integer, Todo> getTodosByDay(@PathParam("account_id") String account_id, @PathParam("book_id") Integer book_id, @PathParam("year") Integer year, @PathParam("month") Integer month, @PathParam("day") Integer day, @QueryParam("token") String token) {
        if (accountManager.checkToken(account_id, token)) {
            return todoManager.getTodosByDay(account_id, book_id, year, month, day);
        }
        return null;
    }

    //本のtodoを年月日とtodo_idを指定してtodoを一つ返す
    @Path("/{account_id}/books/{book_id}/todos/{year}/{month}/{day}/{todo_id}")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Todo getTodoById(@PathParam("account_id") String account_id, @PathParam("book_id") Integer book_id, @PathParam("year") Integer year, @PathParam("month") Integer month, @PathParam("day") Integer day, @PathParam("todo_id") Integer todo_id, @QueryParam("token") String token) {
        if (accountManager.checkToken(account_id, token)) {
            Todo todo = todoManager.getTodoById(account_id, book_id, year, month, day, todo_id);
            return todo;
        }
        return null;
    }


    //指定した本と年月日にtodoを新しく追加する
    @POST
    @Path("/{account_id}/books/{book_id}/todos/{year}/{month}/{day}")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    @Produces(MediaType.APPLICATION_JSON)
    public Todo createTodo(@PathParam("account_id") String account_id, @PathParam("book_id") Integer book_id, @PathParam("year") Integer year, @PathParam("month") Integer month, @PathParam("day") Integer day, @FormParam("title") String title, @FormParam("token") String token) {
        if (accountManager.checkToken(account_id, token)) {
            return todoManager.createTodo(account_id, book_id, year, month, day, title);
        }
        return null;
    }

    //todoを選んで達成状態を変更する
    //フォームパラメータでチェック状況
    //-1エラー 1達成
    @PUT
    @Path("/{account_id}/books/{book_id}/todos/{year}/{month}/{day}/{todo_id}/check")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public void setCheck(@PathParam("account_id") String account_id, @PathParam("book_id") Integer book_id, @PathParam("year") Integer year, @PathParam("month") Integer month, @PathParam("day") Integer day, @PathParam("todo_id") Integer todo_id, @FormParam("check") boolean check, @FormParam("token") String token) {
        if (accountManager.checkToken(account_id, token)) {
            if (todoManager.setCheck(account_id, book_id, year, month, day, todo_id, check) == -1) {
                var response = Response.status(Response.Status.BAD_REQUEST).entity("変更失敗");
                throw new WebApplicationException(response.build());
            }
        }else{
            var response = Response.status(Response.Status.FORBIDDEN).entity("認証失敗");
            throw new WebApplicationException(response.build());
        }
    }


   /* //本のtodoを年月日とtodo_idを指定してそのtodoを削除する
    @DELETE
    @Path("/{account_id}/books/{book_id}/todos/{year}/{month}/{day}/{todo_id}")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public void deleteTodoById(@PathParam("account_id") String account_id, @PathParam("book_id") Integer book_id, @PathParam("year") Integer year, @PathParam("month") Integer month, @PathParam("day") Integer day, @PathParam("todo_id") Integer todo_id, @QueryParam("token") String token){
        if(accountManager.checkToken(account_id,token)==true) {
            todoManager.deleteTodoById(account_id, book_id, year, month, day, todo_id);
        }
    }*/

    //本のtodoを年月日とtodo_idを指定してそのtodoを削除する
    //-1えらー 1達成
    @DELETE
    @Path("/{account_id}/books/{book_id}/todos/{year}/{month}/{day}/{todo_id}")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public void deleteTodoById(@PathParam("account_id") String account_id, @PathParam("book_id") Integer book_id, @PathParam("year") Integer year, @PathParam("month") Integer month, @PathParam("day") Integer day, @PathParam("todo_id") Integer todo_id, @QueryParam("token") String token) {
        if (accountManager.checkToken(account_id, token)) {
            if (todoManager.deleteTodoById(account_id, book_id, year, month, day, todo_id) == -1) {
                var response = Response.status(Response.Status.BAD_REQUEST).entity("消去失敗");
                throw new WebApplicationException(response.build());
            }
        }else {
            var response = Response.status(Response.Status.FORBIDDEN).entity("認証失敗");
            throw new WebApplicationException(response.build());
            }
        }
    }