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; //finalは書き換えられない
@Autowired//springbootの決まり
public AccountsRest(AccountManager am) {
accountManager = am;
}
// アカウントの一覧をリストとして返す(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());
}
//指定された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.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());
}
/////////
// @Path("/{account_id}/photo")
// //画像を返す
// @GET
// public String getAccount(@PathParam("account_id") String accountId){
// Account ac = accountManager.getAccount(accountId);
// return ac.getPhoto();
// }
// @Path("/{account_id}/photo")
// @PUT
//////////
// お気に入りの本のbook_idを削除する (DELETE)
// @Path("/{account_id}/favorites/{other_account_id}/{book_id}")
// @DELETE
// いいねした本のアカウントIDとbook_idを追加する(いいねした側に追加) (PUT)
//@Path("/{account_id}/favorites/{other_account_id}/{book_id}")
// @PUT
// アカウント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);
}
}