diff --git a/src/main/java/org/ntlab/tampoposerver/resources/UsersResource.java b/src/main/java/org/ntlab/tampoposerver/resources/UsersResource.java index 714615f..e70b13b 100644 --- a/src/main/java/org/ntlab/tampoposerver/resources/UsersResource.java +++ b/src/main/java/org/ntlab/tampoposerver/resources/UsersResource.java @@ -1,14 +1,314 @@ package org.ntlab.tampoposerver.resources; -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; +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 { - @GET - public String getHello(){ - return "Hello World!"; + + // 初期化 + 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 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 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 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()); + } + } + + + +