Newer
Older
CitrusServer / src / main / java / org / ntlab / citrusserver / resources / AccountsRest.java
package org.ntlab.citrusserver.resources;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.ntlab.citrusserver.entities.Account;
import org.ntlab.citrusserver.repositories.*;
import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;

@Path("/accounts")
@Component //accountRestのインスタンスを一個作る

public class AccountsRest {
    private final AccountManager accountManager;
    private  final BookManager bookManager;
    private final ScheduleManager scheduleManager;
    private final TodoManager todoManager;//finalは書き換えられない

    @Autowired//springbootの決まり
    public AccountsRest(AccountManager am, BookManager bm, ScheduleManager sm, TodoManager tm) {
        bookManager = bm;
        scheduleManager = sm;
        accountManager = am;
        todoManager = tm;
    }

    // アカウントの一覧をリストとして返す(GET)
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Set<String> getAccount(){
        return accountManager.getAccountsID();
    }



    // account_idとpasswordを設定し新しいアカウントを作成する(POST)
    @POST
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)//bodyに入力する値がある時
    @Produces(MediaType.APPLICATION_JSON)
    public String signup(@FormParam("account_id") String accountId, @FormParam("password") String password) {
        String token;
        if (password == null) {
            var response = Response.status(Response.Status.BAD_REQUEST).entity("passwordを入力してください");
            throw new WebApplicationException(response.build());
        }
        token = accountManager.createAccount(accountId, password);
        if (token == null){
            var response = Response.status(Response.Status.CONFLICT).entity("id '" + accountId +  "' は既に存在します");//404
            throw new WebApplicationException(response.build());
        }
        return "\"" + token +"\"";
    }

    // 指定されたアカウントの情報を返す(GET)
    @Path("/{account_id}")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Account getAccountInfo(@PathParam("account_id") String accountId) {
        //404
        if (!accountManager.getAccountsID().contains(accountId)){ //account_idが存在しない時
            var response = Response.status(Response.Status.NOT_FOUND).entity("IDが存在しません");//404
            throw new WebApplicationException(response.build());
        }
        return accountManager.getAccount(accountId);
    }

    // アカウント情報を全削除する(DELETE)
    @Path("/{account_id}")
    @DELETE
    public void deleteAccount(@PathParam("account_id") String accountId,
                               @QueryParam("token") String token,
                               @QueryParam("password")String password) {
        if(accountManager.checkToken(accountId, token)) {
            accountManager.deleteAccount(accountId, token, password);
            return;
        }
        //404
        if (!accountManager.getAccountsID().contains(accountId)){ //account_idが存在しない時
            var response = Response.status(Response.Status.NOT_FOUND).entity("IDが存在しません");//404
            throw new WebApplicationException(response.build());
        }
        //403
        var response = Response.status(Response.Status.FORBIDDEN).entity("アカウント削除失敗");//forbiddenは403
        throw new WebApplicationException(response.build());

    }

    //accountのidを変更する(PUT)
    @Path("/{account_id}")
    @PUT
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)//bodyに入力する値がある時
    public void changeAccountId(@PathParam("account_id") String accountId,
                                @FormParam("new_account_id")String newAccountId,
                                @FormParam("old_password")String oldPassword,
                                @FormParam("token") String token){
        //404
        if (!accountManager.getAccountsID().contains(accountId)){ //account_idが存在しない時
            var response = Response.status(Response.Status.NOT_FOUND).entity("IDが存在しません");//404
            throw new WebApplicationException(response.build());
        }

        if(!accountManager.getAccount(accountId).getPassword().equals(oldPassword)) {
            var response = Response.status(Response.Status.BAD_REQUEST).entity("パスワードが違います");//404
            throw new WebApplicationException(response.build());
        }

        //成功
        if(accountManager.checkToken(accountId, token)) {
            accountManager.changeAccountId(accountId, newAccountId,oldPassword, token);
            bookManager.changeAccountId(accountId, newAccountId);
            scheduleManager.changeAccountId(accountId, newAccountId);
            todoManager.changeAccountId(accountId, newAccountId);
            return;
        }

        //403
        var response = Response.status(Response.Status.FORBIDDEN).entity("認証失敗");//forbiddenは403
        throw new WebApplicationException(response.build());
    }

    //指定されたIDのパスワードを変更する (PUT)
    @Path("/{account_id}/password")
    @PUT
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)//bodyに入力する値がある時
    public void changePassword(@PathParam("account_id") String accountId,
                                  @FormParam("new_password")String newPassword,
                                  @FormParam("old_password")String oldPassword,
                                  @FormParam("token") String token){
        if(!accountManager.getAccount(accountId).equals(oldPassword)) {
            var response = Response.status(Response.Status.BAD_REQUEST).entity("パスワードが違います");//404
            throw new WebApplicationException(response.build());
        }
        if(accountManager.checkToken(accountId, token)) {
            accountManager.changePassword(accountId, newPassword, oldPassword, token);
            return;
        }

        //404
        if (!accountManager.getAccountsID().contains(accountId)){ //account_idが存在しない時
            var response = Response.status(Response.Status.NOT_FOUND).entity("IDが存在しません");//404
            throw new WebApplicationException(response.build());
        }
        //403
        var response = Response.status(Response.Status.FORBIDDEN).entity("認証失敗");//forbiddenは403
        throw new WebApplicationException(response.build());
    }

    // 指定されたIDの自己紹介を返す(GET)
    @Path("/{account_id}/introduction")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public String getIntroduction(@PathParam("account_id") String accountId){
        String ac = accountManager.AccountIntro(accountId);
        return ac;
    }

    // 指定されたIDの自己紹介を変更する (PUT)
    @Path("/{account_id}/introduction")
    @PUT
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)//bodyに入力する値がある時
    public void changeIntroduction(@PathParam("account_id") String accountId,
                                    @FormParam("introduction")String introduction,
                                    @FormParam("token") String token){
        if(accountManager.checkToken(accountId, token)) {
            accountManager.changeIntroduction(accountId, introduction, token);
            return;
        }
        //404
        if (!accountManager.getAccountsID().contains(accountId)){ //account_idが存在しない時
            var response = Response.status(Response.Status.NOT_FOUND).entity("IDが存在しません");//404
            throw new WebApplicationException(response.build());
        }
        //403
        var response = Response.status(Response.Status.FORBIDDEN).entity("認証失敗");//forbiddenは403
        throw new WebApplicationException(response.build());
    }


    ///////////(9/26)
    // accountの色を返す(GET)
    @Path("/{account_id}/accountColor")
    @GET
    public String getAccountColor(@PathParam("account_id") String accountId){
        String accountColor = accountManager.getAccountColor(accountId);
        return accountColor;
    }

    //accountの色を変更する(PUT)
    @Path("/{account_id}/accountColor")
    @PUT
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)//bodyに入力する値がある時
    public void changeAccountColor(@PathParam("account_id") String accountId,
                                   @FormParam("accountColor")String accountColor,
                                   @FormParam("token") String token){
        //404
        if (!accountManager.getAccountsID().contains(accountId)){ //account_idが存在しない時
            var response = Response.status(Response.Status.NOT_FOUND).entity("IDが存在しません");//404
            throw new WebApplicationException(response.build());
        }
        //成功
        if(accountManager.checkToken(accountId, token)) {
            accountManager.changeAccountColor(accountId, "D5D5D5", token);
            return;
        }

        //403
        var response = Response.status(Response.Status.FORBIDDEN).entity("認証失敗");//forbiddenは403
        throw new WebApplicationException(response.build());
    }
    ///////////////////

    // アカウントidとパスワードでログインし、tokenを返す (POST)
    @Path("/{account_id}/login")
    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)//bodyに入力する値がある時
    public String login(@PathParam("account_id") String accountId,@FormParam("password") String password) {
        //404
        if (!accountManager.getAccountsID().contains(accountId)){ //account_idが存在しない時
            var response = Response.status(Response.Status.NOT_FOUND).entity("IDが存在しません");//404
            throw new WebApplicationException(response.build());
        }
        return "\""+ accountManager.login(accountId, password)+"\"";
    }

}