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 @Produces(MediaType.APPLICATION_JSON) 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); accountManager.changeAccountColor(accountId, accountColor, 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)+"\""; } }