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()); } }