diff --git a/src/main/java/org/ntlab/tampoposerver/resources/UsersResource.java b/src/main/java/org/ntlab/tampoposerver/resources/UsersResource.java index e70b13b..257cda4 100644 --- a/src/main/java/org/ntlab/tampoposerver/resources/UsersResource.java +++ b/src/main/java/org/ntlab/tampoposerver/resources/UsersResource.java @@ -4,24 +4,31 @@ import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; import org.ntlab.tampoposerver.repositories.UserRepository; +import org.ntlab.tampoposerver.models.User; 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個だけ勝手に作ってくれる シングルトン -// -// +//6/10報告:全部できた(friendまで)、UserRepositoryとの連携ができていない(updateあります?)、responseがない + +/* +ログインした時にtokenが返ってくるようにする + +マスタからこのブランチへと取り込む +ブランチ checkout +masterからブランチへ引き込む +Git → Merge → git merge origin/master + +別のクラスへのアクセス方法 +コンストラクタを作る +import class +コンストラクタの上に@Autowired これを入れるとspring bootが管理しているuserRepositoryのインスタンスを渡してくれる +Repositoru側の説明 Repositoryをつけるとspring bootがインスタンスを1個だけ勝手に作ってくれる シングルトン +変数名は先頭小文字 + +未コミットの編集→スタッシュで書き換えてしまったコードを退避させることができる +*/ @Path("/users") @Component @@ -29,285 +36,381 @@ public class UsersResource { // 初期化 - private UserRepository userRepository = null; + private UserRepository userRepository = null; //spring bootがインスタンスを1個作って管理している インスタンスが一個しかないクラスをシングルトンという - @Autowired - public UserResource(UserRepository userRepo){ - userRepository = userRepo; - - } - private final UserRepository userRepository; - + @Autowired//インスタンスを作るときに呼び出されるメソッドであるコンストラクタを書く 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" - ); + /*関数の名前を適切なものに変更する + 関数の引数に@PathParam("uid") String uidのような形でパラメーターを定義しておく + Queryの場合は@QueryParam("filter") String filter + repositoryのメソッド名:add, get, delete + 本来の流れはインターフェースだけ決めておく メソッド名と引数名*/ + public Response getUsers() { + //TODO:getAllUserという名前でユーザーのリストを返してくれるメソッドを作ってもらう + List users = userRepository.getAllUser(); + if (users.isEmpty()) { + return Response.noContent().build(); // 204 + } + return Response.ok(users).build(); } - //新規アカウントを作る @POST @Consumes(MediaType.APPLICATION_FORM_URLENCODED) - public String createUser(@FormParam("user_id") String userId, @FormParam("password") String password) { + public Response 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"; + //ユーザーがいるか調べる + User user = userRepository.getUser(userId); + if (user == null) { + throw new WebApplicationException( + Response.status(Response.Status.NOT_FOUND) + .entity("ユーザーが存在しません") + .build() + ); } + + user.login(); + return Response.ok(user.login(), MediaType.APPLICATION_JSON).build(); + } - //単一アカウントの情報を返す + //単一アカウントの情報を返す ok @GET @Path("/{userId}") @Produces(MediaType.APPLICATION_JSON) - public String getUser(@PathParam("user_id") String userId) { - return "WRITE LATER"; + public Response getUser(@PathParam("userId") String userId) { + //取得 + User user = userRepository.getUser(userId); + //存在の確認 + if (user == null) { + throw new WebApplicationException(Response.Status.NOT_FOUND); + } + return Response.ok(user, MediaType.APPLICATION_JSON).build(); } - //ユーザの削除 + //ユーザの削除 ok @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; + public Response deleteUser(@PathParam("userId") String userId, @QueryParam("token") String token) { + //取得 + User user = userRepository.getUser(userId); + //存在チェック + if (user == null) { + throw new WebApplicationException( + Response.status(Response.Status.NOT_FOUND) + .entity("404 IDが存在しません") + .build() + ); } - //404 - if (!userRepository.getUserId().contains(userId)) { - var response = Response.status(Response.Status.NOT_FOUND).entity("IDが存在しません"); - throw new WebApplicationException(response.build()); + if (!token.equals(user.getToken())) { + throw new WebApplicationException( + Response.status(Response.Status.FORBIDDEN) + .entity("401 認証失敗") + .build() + ); } - //403 - var response = Response.status(Response.Status.FORBIDDEN).entity("認証失敗"); - throw new WebApplicationException(response.build()); + //削除処理 + userRepository.deleteUser(userId); + return Response.ok().build(); } - //ログイン + + //ログイン ok @POST @Path("/login") @Consumes(MediaType.APPLICATION_FORM_URLENCODED) - public String login(@FormParam("password") String password) { + public Response login(@PathParm("userId") String userId, @FormParam("password") String password) { - //TODO:パスワードが間違っていた場合のログインできない処理を書く - - - //200 OK 成功 - if (userRepository.checkToken(password)) { - userRepository.login(password); - return "WRITE LATER"; + //存在チェック + User user = userRepository.getUser(userId); + if (user == null) { + throw new WebApplicationException( + Response.status(Response.Status.NOT_FOUND) + .entity("IDが存在しません") + .build() + ); } + + //パスワードチェック 適切なステータスはなんですか? + if (!password.equals(user.getPassword())) { + throw new WebApplicationException( + Response.status(Response.Status.UNAUTHORIZED) + .entity("パスワードが間違っています") + .build() + ); + } + + //トークン発行 + String token = user.login(); + + + return Response + .ok(token) + .build(); + } - //アカウントのニックネームの取得 + //アカウントのニックネームの取得 ok @GET @Path("/{userId}/name") @Produces(MediaType.APPLICATION_JSON) - public String getName(@PathParam("user_id") String userId) { - return "WRITE LATER"; + public Response getName(@PathParam("userId") String userId) { + //取得 + User user = userRepository.getUser(userId); + //存在チェック + if (user == null) { + throw new WebApplicationException( + Response.Status.NOT_FOUND + ); + } + + return Response.ok(user.getName(), MediaType.APPLICATION_JSON).build(); } //ニックネームの変更 @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) { + public Response updateName(@PathParam("userId") 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()); + User user = userRepository.getUser(userId); + if (user == null) { + throw new WebApplicationException( + Response.status(Response.Status.NOT_FOUND) + .entity("ユーザーが存在しません") + .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"; - + if (token == null || !token.equals(user.getToken())) { + throw new WebApplicationException( + Response.status(Response.Status.FORBIDDEN) + .entity("認証失敗") + .build() + ); } + + //ここから先ニックネームアップデート + user.setName(newName); + return Response.ok(user.getName(), MediaType.APPLICATION_JSON).build(); + } - //単一アカウントのパスワードの取得 + + //単一アカウントのパスワードの取得 ok @GET @Path("/{userId}/password") @Produces(MediaType.APPLICATION_JSON) - public String getPassword(@PathParam("user_id") String userId,@QueryParam("token") String token) { - return "WRITE LATER"; + public Response getPassword(@PathParam("userId") String userId, @QueryParam("token") String token) { + User user = userRepository.getUser(userId); + if (user == null) { + throw new WebApplicationException(Response.Status.NOT_FOUND); + } + return Response.ok(user.getPassword(), MediaType.APPLICATION_JSON).build(); } //指定されたIDのパスワードを変更する @PUT @Path("/{userId}/password") @Consumes(MediaType.APPLICATION_FORM_URLENCODED) - public String updatePassword(@PathParam("user_id") String userId, @FormParam("new_password") String newPassword) { + public Response updatePassword(@PathParam("userId") 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()); + User user = userRepository.getUser(userId); + if (user == null) { + throw new WebApplicationException( + Response.status(Response.Status.NOT_FOUND) + .entity("ユーザーが存在しません") + .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"; + //ここから先パスワードのアップデート + user.setPassword(newPassword); + return Response.ok(user.getPassword(), MediaType.APPLICATION_JSON).build(); - } } - //単一アカウントのemailの取得 + //単一アカウントのemailの取得 ok @GET @Path("/{userId}/email") - @Consumes(MediaType.APPLICATION_FORM_URLENCODED) - public String getEmail(@PathParam("user_id") String userId) { - return "WRITE LATER"; + @Produces(MediaType.APPLICATION_JSON) + public Response getEmail(@PathParam("userId") String userId) { + User user = userRepository.getUser(userId); + if (user == null) { + throw new WebApplicationException(Response.Status.NOT_FOUND); + } + return Response.ok(user.getEmail(), MediaType.APPLICATION_JSON).build(); } //指定された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) { + public Response updateEmail(@PathParam("userId") 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()); + User user = userRepository.getUser(userId); + if (user == null) { + throw new WebApplicationException( + Response.status(Response.Status.NOT_FOUND) + .entity("ユーザーが存在しません") + .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"; - + if (token == null || !token.equals(user.getToken())) { + throw new WebApplicationException( + Response.status(Response.Status.FORBIDDEN) + .entity("認証失敗") + .build() + ); } + + //ここから先emailアップデート + user.setEmail(newEmail); + return Response.ok(user.getEmail(), MediaType.APPLICATION_JSON).build(); + } - //指定されたIDのアイコンを返す + //指定されたIDのアイコンを返す ok @GET @Path("/{userId}/icon") @Produces(MediaType.APPLICATION_JSON) - public String getIcon(@PathParam("user_id") String userId) { - return "ICON URL"; + public Response getIcon(@PathParam("userId") String userId) { + User user = userRepository.getUser(userId); + if (user == null) { + throw new WebApplicationException(Response.Status.NOT_FOUND); + } + return Response.ok(user.getIcon(), MediaType.APPLICATION_JSON).build(); } //アイコンを変更する @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) { + public String updateIcon(@PathParam("userId") 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()); + User user = userRepository.getUser(userId); + if (user == null) { + throw new WebApplicationException( + Response.status(Response.Status.NOT_FOUND) + .entity("ユーザーが存在しません") + .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"; - + if (token == null || !token.equals(user.getToken())) { + throw new WebApplicationException( + Response.status(Response.Status.FORBIDDEN) + .entity("認証失敗") + .build() + ); } + + //アイコンを変更する + user.setIcon(newIcon); + return Response.ok(user.getIcon(), MediaType.APPLICATION_JSON).build().toString(); + } + //自分のペアの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" - ); + public Response getPairId(@PathParam("userId") String userId, @QueryParam("token") String token) { + User user = userRepository.getUser(userId); + if (user == null) { + throw new WebApplicationException( + Response.status(Response.Status.NOT_FOUND) + .entity("ユーザーが存在しません") + .build() + ); } - //フレンド相手の情報の取得 + if (token == null || !token.equals(user.getToken())) { + throw new WebApplicationException( + Response.status(Response.Status.FORBIDDEN) + .entity("認証失敗") + .build() + ); + } + + //TODO:岩谷さんに自分のペアのpid一覧を取ってくるメソッドを作ってもらう + List pairIds = user.getFriendIds(); + + // JSON で返す + return Response + .ok(pairIds) + .build(); + } + + //フレンド相手の情報の取得 TODOこれが存在する理由がわかっていないので解決する(上と同じような気がする) @GET - @Path("/{userId}/friends/{pairId}") + @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" - ); + public Response getFriends(@PathParam("userId") String userId, @QueryParam("token") String token) { + User user = userRepository.getUser(userId); + if (user == null) { + throw new WebApplicationException( + Response.status(Response.Status.NOT_FOUND) + .entity("ユーザーが存在しません") + .build() + ); + } + if (token == null || !token.equals(user.getToken())) { + throw new WebApplicationException( + Response.status(Response.Status.FORBIDDEN) + .entity("認証失敗") + .build() + ); + } + //TODO:岩谷さんにフレンドIDを取ってくるメソッドを作ってもらう + List friendIds = user.getFriendIds(); + return Response + .ok(friendIds) + .build(); } //ペアの削除 @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()); + public Response deleteFriends(@PathParam("userId") String userId, @PathParam("pairId") String pairId, @QueryParam("token") String token) { + User user = userRepository.getUser(userId); + if (user == null) { + throw new NotFoundException("IDが存在しません"); } + + //トークン認証 + if (token == null || !token.equals(user.getToken())) { + throw new WebApplicationException( + Response.status(Response.Status.FORBIDDEN) + .entity("認証失敗") + .build() + ); + } + + + //TODO:岩谷さんにペア削除を作ってもらう + return Response.ok().build(); } +} + +