Newer
Older
tampopo-server / src / main / java / org / ntlab / tampoposerver / resources / UsersResource.java
package org.ntlab.tampoposerver.resources;

import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import org.ntlab.tampoposerver.repositories.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
//マスタからこのブランチへと取り込む
//ブランチ checkout
//masterからブランチへ引き込む
//Git → Merge → git merge origin/master

//別のクラスへのアクセス方法
//コンストラクタを作る
//import class
//コンストラクタの上に@Autowired これを入れるとspring bootが管理しているuserRepositoryのインスタンスを渡してくれる
//Repositoru側の説明 Repositoryをつけるとspring bootがインスタンスを1個だけ勝手に作ってくれる シングルトン
//
//

@Path("/users")
@Component

public class UsersResource {

    // 初期化
    private UserRepository userRepository = null;

    @Autowired
    public UserResource(UserRepository userRepo){
        userRepository = userRepo;

    }
    private final UserRepository userRepository;

    public UsersResource(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    //@Path("/{uid}/..")などパスを指定する
    //アカウントの基本情報
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    //関数の名前を適切なものに変更する
    //関数の引数に@PathParam("uid") String uidのような形でパラメーターを定義しておく
    //Queryの場合は@QueryParam("filter") String filter
    //repositoryのメソッド名:add, get, delete
    //本来の流れはインターフェースだけ決めておく メソッド名と引数名
    public List<String> getUsers() {
        //TODO:400番系のエラーを記述
        //TODO:userIdのリストを返す
        return List.of(
                "WRITE LATER",
                "WRITE LATER",
                "WRITE LATER"
        );
    }



    //新規アカウントを作る
    @POST
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public String createUser(@FormParam("user_id") String userId, @FormParam("password") String password) {

        //???:パスワードの桁数制御などはクライアント側?

        //200 OK 成功
        //FIXME:成功の定義がわからないのでとりあえず200をコピーして貼り付けました
        if (userRepository.checkToken(userId)) {
            userRepository.addUserId(userId, password);

            return "WRITE LATER";
        }

    }

    //単一アカウントの情報を返す
    @GET
    @Path("/{userId}")
    @Produces(MediaType.APPLICATION_JSON)
    public String getUser(@PathParam("user_id") String userId) {
        return "WRITE LATER";
    }

    //ユーザの削除
    @DELETE
    //deleteはquery parameter
    @Path("/{userId}")
    public Response deleteUser(@PathParam("user_id") String userId) {
        //???:tokenが定義されていないが、これはいるのか?

        if (userRepository.checkToken(userId, token)) {
            userRepository.deleteUser(userId, token);
            return;
        }

        //404
        if (!userRepository.getUserId().contains(userId)) {
            var response = Response.status(Response.Status.NOT_FOUND).entity("IDが存在しません");
            throw new WebApplicationException(response.build());
        }

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

    //ログイン
    @POST
    @Path("/login")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public String login(@FormParam("password") String password) {

        //TODO:パスワードが間違っていた場合のログインできない処理を書く


        //200 OK 成功
        if (userRepository.checkToken(password)) {
            userRepository.login(password);
            return "WRITE LATER";
        }
    }

    //アカウントのニックネームの取得
    @GET
    @Path("/{userId}/name")
    @Produces(MediaType.APPLICATION_JSON)
    public String getName(@PathParam("user_id") String userId) {
        return "WRITE LATER";
    }

    //ニックネームの変更
    @PUT
    @Path("/{userId}")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public String updateName(@PathParam("user_id") String userId, @FormParam("new_name") String newName, @FormParam("token") String token) {

        //404 データが存在しません user_idが存在しないとき
        if (!userRepository.getUserId().contains(userId)) {
            var response = Response.status(Response.Status.BAD_REQUEST).entity("データが存在しません");
            throw new WebApplicationException(response.build());
        }

        //403 トークンの不一致
        var response = Response.status(Response.Status.FORBIDDEN).entity("未認証");
        throw new WebApplicationException(response.build());

        //200 OK 成功
        if (userRepository.checkToken(userId, token)) {
            userRepository.updateUserId(userId, newName, token);
            //他のRepositoryも書く必要がありそう
            return "WRITE LATER";

        }
    }
    //単一アカウントのパスワードの取得
    @GET
    @Path("/{userId}/password")
    @Produces(MediaType.APPLICATION_JSON)
    public String getPassword(@PathParam("user_id") String userId,@QueryParam("token") String token) {
        return "WRITE LATER";
    }

    //指定されたIDのパスワードを変更する
    @PUT
    @Path("/{userId}/password")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public String updatePassword(@PathParam("user_id") String userId, @FormParam("new_password") String newPassword) {

        //404 データが存在しません user_idが存在しないとき
        if (!userRepository.getUserId().contains(userId)) {
            var response = Response.status(Response.Status.BAD_REQUEST).entity("データが存在しません");
            throw new WebApplicationException(response.build());
        }

        //401 変更前のパスワード間違い citrusは404
        if (!userRepository.getUser(userId).getPassword().equals(oldPassword)) {
            var response = Response.status(Response.Status.BAD_REQUEST).entity("変更前のパスワードを間違えています");
            throw new WebApplicationException(response.build());
        }

        //200 OK 成功
        if (userRepository.checkToken(userId, token)) {
            userRepository.updateUserId(userId, newPassword, token);
            //他のRepositoryも書く必要がありそう
            return "WRITE LATER";

        }
    }


    //単一アカウントのemailの取得
    @GET
    @Path("/{userId}/email")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public String getEmail(@PathParam("user_id") String userId) {
        return "WRITE LATER";
    }

    //指定されたIDのemailを変更する
    @PUT
    @Path("/{userId}/email")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public String updateEmail(@PathParam("user_id") String userId, @FormParam("new_email") String newEmail, @FormParm("token") String token) {

        //404 見つかりませんでした user_idが存在しないとき
        if (!userRepository.getUserId().contains(userId)) {
            var response = Response.status(Response.Status.BAD_REQUEST).entity("見つかりませんでした");
            throw new WebApplicationException(response.build());
        }

        //403 トークンの不一致
        var response = Response.status(Response.Status.FORBIDDEN).entity("未認証");
        throw new WebApplicationException(response.build());

        //200 OK 成功
        if (userRepository.checkToken(userId, token)) {
            userRepository.updateUserId(userId, newEmail, token);
            //他のRepositoryも書く必要がありそう
            return "WRITE LATER";

        }
    }

    //指定されたIDのアイコンを返す
    @GET
    @Path("/{userId}/icon")
    @Produces(MediaType.APPLICATION_JSON)
    public String getIcon(@PathParam("user_id") String userId) {
        return "ICON URL";
    }

    //アイコンを変更する
    @PUT
    @Path("/{userId}/icon")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public String updateIcon(@PathParam("user_id") String userId, @FormParam("new_icon") String newIcon, @FormParam("token") String token) {

        //404 見つかりませんでした user_idが存在しないとき
        if (!userRepository.getUserId().contains(userId)) {
            var response = Response.status(Response.Status.BAD_REQUEST).entity("見つかりませんでした");
            throw new WebApplicationException(response.build());
        }

        //403 トークンの不一致
        var response = Response.status(Response.Status.FORBIDDEN).entity("未認証");
        throw new WebApplicationException(response.build());

        //200 OK 成功
        //TODO:userRepositoryで定義されているメソッド名に書き換える
        if (userRepository.checkToken(userId, token)) {
            userRepository.updateIcon(userId, newIcon, token);
            //???:他のRepositoryも書く必要がある?
            return "WRITE LATER";

        }
    }

    //自分のペアのpid一覧(JSON)の取得
    @GET
    @Path("/{userId}/friends")
    @Produces(MediaType.APPLICATION_JSON)
    public List<String> getFriends(@PathParam("user_id") String userId, @FormParam("token") String token) {
        return List.of(
                "WRITE LATER",
                "WRITE LATER",
                "WRITE LATER"
        );
        }

    //フレンド相手の情報の取得
    @GET
    @Path("/{userId}/friends/{pairId}")
    @Produces(MediaType.APPLICATION_JSON)
    public List<String> getFriends(@PathParam("user_id") String userId, @FormParam("token") String token) {
        return List.of(
                "WRITE LATER",
                "WRITE LATER",
                "WRITE LATER"
        );
    }


    //ペアの削除
    @DELETE
    @Path("/{userId}/friends/{pairId}")
    public Response deleteFriends(@PathParam("user_id") String userId, @PathParam("pair_id") String pairId, @QueryParam("token") String token)
        {
            if (userRepository.checkToken(userId, token)) {
                userRepository.deleteUser(userId, token, pairId);
                return;
            }

            //404
            if (!userRepository.getUserId().contains(userId)) {
                var response = Response.status(Response.Status.NOT_FOUND).entity("IDが存在しません");
                throw new WebApplicationException(response.build());
            }

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