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.models.FriendPair; 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.ArrayList; import java.util.List; /* //6/10報告:全部できた(friendまで)、UserRepositoryとの連携ができていない(updateあります?)、responseがない //6/17報告:すべてのユーザーの情報を持ってくるところ、フレンドペアの自分じゃない方のuidを返すところ、フレンドペアの削除はもらったものを連携できていない マスタからこのブランチへと取り込む ブランチ 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; //spring bootがインスタンスを1個作って管理している インスタンスが一個しかないクラスをシングルトンという @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 Response getUsers() { //TODO:getAllUsersという名前でユーザーのリストを返してくれるメソッドを作ってもらう List<User> users = userRepository.getAllUsers(); if (users.isEmpty()) { return Response.noContent().build(); // 204 } return Response.ok(users).build(); } //新規アカウントを作る @POST @Consumes(MediaType.APPLICATION_FORM_URLENCODED) public Response createUser(@FormParam("user_id") String userId, @FormParam("password") String password) { //ユーザーがいるか調べる User user = userRepository.getUser(userId); if (user == null) { throw new WebApplicationException( Response.status(Response.Status.NOT_FOUND) .entity("ユーザーが存在しません") .build() ); } //6/12ここはswaggerではなくコードを仕様にすると決定しました。 return Response.ok(user.login(), MediaType.APPLICATION_JSON).build(); } //単一アカウントの情報を返す ok @GET @Path("/{userId}") @Produces(MediaType.APPLICATION_JSON) 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("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() ); } if (!token.equals(user.getToken())) { throw new WebApplicationException( Response.status(Response.Status.FORBIDDEN) .entity("401 認証失敗") .build() ); } //削除処理 userRepository.deleteUser(userId); return Response.noContent().build(); } //ログイン @POST @Path("/{userId}/login") @Consumes(MediaType.APPLICATION_FORM_URLENCODED) public Response login(@PathParam("userId") String userId, @FormParam("password") String password) { //存在チェック 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 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 Response updateName(@PathParam("userId") String userId, @FormParam("new_name") String newName, @FormParam("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() ); } //ここから先ニックネームアップデート user.setName(newName); return Response.ok(user.getName(), MediaType.APPLICATION_JSON).build(); } //単一アカウントのパスワードの取得 ok @GET @Path("/{userId}/password") @Produces(MediaType.APPLICATION_JSON) 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 Response updatePassword(@PathParam("userId") String userId, @FormParam("new_password") String newPassword) { User user = userRepository.getUser(userId); if (user == null) { throw new WebApplicationException( Response.status(Response.Status.NOT_FOUND) .entity("ユーザーが存在しません") .build() ); } //ここから先パスワードのアップデート user.setPassword(newPassword); return Response.ok().build(); } //単一アカウントのemailの取得 ok @GET @Path("/{userId}/email") @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 Response updateEmail(@PathParam("userId") String userId, @FormParam("new_email") String newEmail, @FormParam("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() ); } //ここから先emailアップデート user.setEmail(newEmail); return Response.ok(user.getEmail(), MediaType.APPLICATION_JSON).build(); } //指定されたIDのアイコンを返す ok @GET @Path("/{userId}/icon") @Produces(MediaType.APPLICATION_JSON) 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("userId") String userId, @FormParam("new_icon") String newIcon, @FormParam("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() ); } //アイコンを変更する user.setIcon(newIcon); return Response.ok(user.getIcon(), MediaType.APPLICATION_JSON).build().toString(); } //フレンド相手の情報の取得 @GET @Path("/{userId}/friends/") @Produces(MediaType.APPLICATION_JSON) 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:山際くんにpairIdを取ってきて自分じゃない方のuserIdを渡すメソッドを作ってもらう ArrayList<FriendPair> friendIds = user.getFriendPairs(); //pairIdからuserIdを2つ引っ張ってくる friendIds.get(0).getUser0Id(); //山際くんが書く //userIdで自分じゃない方をピックアップ //リストにして返却 return Response .ok(friendIds) .build(); } //自分のペアのpid一覧(JSON)の取得 @GET @Path("/{userId}/friends") @Produces(MediaType.APPLICATION_JSON) 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() ); } ArrayList<FriendPair> pairIds = user.getFriendPairs(); // JSON で返す return Response.ok(pairIds).build(); } //ペアの削除 TODO:山際くんのものを使うために実装を変更 @DELETE @Path("/{userId}/friends/{pairId}") 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() ); } FriendPair pair = user.getFriendPairs() .stream() .filter(p -> p.getId().equals(pairId)) .findFirst() .orElse(null); //TODO:岩谷さんにペア削除を作ってもらう userRepository.deleteFriendPair(userId, pair); return Response.noContent().build(); } }