package org.ntlab.tampoposerver.resources; import javax.ws.rs.*; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.ntlab.tampoposerver.models.ChatRequest; import org.ntlab.tampoposerver.models.ChatRooms; import org.ntlab.tampoposerver.models.FriendRequest; import org.ntlab.tampoposerver.models.User; import org.ntlab.tampoposerver.repositories.ChatRequestRepository; import org.ntlab.tampoposerver.repositories.ChatRoomsRepository; import org.ntlab.tampoposerver.repositories.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import static javax.ws.rs.core.Response.status; @Path("/chat-rooms") @Component public class ChatRoomsResource { private final ChatRoomsRepository chatRoomsRepository; private final UserRepository userRepository; @Autowired public ChatRoomsResource(UserRepository userRepository, ChatRoomsRepository chatRoomsRepository) { this.userRepository = userRepository; this.chatRoomsRepository = chatRoomsRepository; } //チャットルームの作成 @POST @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Produces(MediaType.APPLICATION_JSON) public Response createChatRoom(@QueryParam("user0-id") String user0Id, @QueryParam("user1-id") String user1Id, @QueryParam("token") String token) { User user = userRepository.getUser(user0Id); if (token == null || !token.equals(user.getToken())) { throw new WebApplicationException( Response.status(Response.Status.FORBIDDEN) .entity("認証失敗") .build() ); } ChatRooms chatRoom = chatRoomsRepository.addChatRoom(user0Id, user1Id); return Response.status(Response.Status.CREATED).entity(chatRoom).build(); } @GET @Produces(MediaType.APPLICATION_JSON) public Response getChatroomId( @QueryParam("user0-id") String user0Id, @QueryParam("user1-id") String user1Id, @QueryParam("token") String token) { // ユーザー存在チェック User user = userRepository.getUser(user0Id); if (user == null) { return Response.status(Response.Status.NOT_FOUND) .entity(Map.of("error", "ユーザーが存在しません")).build(); } // トークンチェック if (token == null || !token.equals(user.getToken())) { return Response.status(Response.Status.FORBIDDEN) .entity(Map.of("error", "認証失敗")).build(); } ChatRooms chatRoom; // user1-id が指定された場合(2人に一致するチャットルーム) if (user1Id != null && !user1Id.isEmpty()) { chatRoom = chatRoomsRepository.findChatRoomByUsers(user0Id, user1Id); if (chatRoom == null) { return Response.status(Response.Status.NOT_FOUND) .entity(Map.of("error", "指定された2ユーザーのチャットルームが見つかりません")).build(); } } // user0-id のみ指定された場合 else { chatRoom = chatRoomsRepository.findChatRoomBySingleUser(user0Id); if (chatRoom == null) { return Response.status(Response.Status.NOT_FOUND) .entity(Map.of("error", "ユーザーが含まれるチャットルームが見つかりません")).build(); } } return Response.ok(Map.of("chatRoomId", chatRoom.getChatRoomId())).build(); } // //チャットルームIDを取得する // @GET // @Consumes(MediaType.APPLICATION_FORM_URLENCODED) // @Produces(MediaType.APPLICATION_JSON) // public Response getChatroomId(@QueryParam("user0-id") String user0Id, @QueryParam("user1-id") String user1Id, @QueryParam("token") String token) { // User user = userRepository.getUser(user0Id); // if (token == null || !token.equals(user.getToken())) { // throw new WebApplicationException( // Response.status(Response.Status.FORBIDDEN) // .entity("認証失敗") // .build() // ); // } // ChatRooms chatRoom = chatRoomsRepository.findChatRoomByUsers(user0Id, user1Id); // return Response.ok(Map.of("chatRoomId", chatRoom.getChatRoomId())).build(); // } // //1つのユーザーIDによってチャットルームIDを取得する // @GET // @Consumes(MediaType.APPLICATION_FORM_URLENCODED) // @Produces(MediaType.APPLICATION_JSON) // public Response getChatroomId(@QueryParam("user0-id") String user0Id, @QueryParam("token") String token) { // User user = userRepository.getUser(user0Id); // if (token == null || !token.equals(user.getToken())) { // throw new WebApplicationException( // Response.status(Response.Status.FORBIDDEN) // .entity("認証失敗") // .build() // ); // } // ChatRooms chatRoom = chatRoomsRepository.findChatRoomBySingleUsers(user0Id); // return Response.ok(Map.of("chatRoomId", chatRoom.getChatRoomId())).build(); // } //メッセージを閲覧する @GET @Path("/{chat-room-id}/{user-id}") @Produces(MediaType.APPLICATION_JSON) public Response getChatRoomMessages(@PathParam("chat-room-id") int chatRoomId, @PathParam("user-id") String userId, @QueryParam("token") String token) { User user = userRepository.getUser(userId); if (user == null) throw new NotFoundException("ユーザーが見つかりません"); List<ChatRooms.Message> messages = chatRoomsRepository.getMessagesFromUser(chatRoomId, userId); // if (messages == null) throw new NotFoundException("チャットルームが存在しません"); if (token == null || !token.equals(user.getToken())) { throw new WebApplicationException( Response.status(Response.Status.FORBIDDEN) .entity("認証失敗") .build() ); } return Response.status(Response.Status.OK).entity(messages).build(); } //チャットルームの削除 @DELETE @Path("/{chatroom-id}/{user-id}") @Produces(MediaType.APPLICATION_JSON) public Response leaveChatRoom(@PathParam("chatroom-id") int chatRoomId, @PathParam("user-id") String userId, @QueryParam("token") String token) { ChatRooms room = chatRoomsRepository.getChatRoom(chatRoomId); if (room == null) throw new NotFoundException("チャットルームが存在しません"); User user = userRepository.getUser(userId); if (user == null) throw new NotFoundException("ユーザーが存在しません"); if (token == null || !token.equals(user.getToken())) { throw new WebApplicationException( Response.status(Response.Status.FORBIDDEN) .entity("認証失敗") .build() ); } boolean removed = room.removeUser(userId); if (!removed) { return Response.status(Response.Status.BAD_REQUEST) .entity(Map.of("message", "ユーザーはこのルームに存在しません")) .build(); } if (room.isEmpty()) { chatRoomsRepository.deleteChatRoom(chatRoomId); return Response.ok(Map.of("message", "両者が退出したためルームを削除しました")).build(); } return Response.noContent().build(); // 片方退出 } //チャットルームにユーザーを追加する @PUT @Path("/{chatroom-id}/{user-id}") @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Produces(MediaType.APPLICATION_JSON) public Response addChatRoomUser(@PathParam("chatroom-id") int chatRoomId, @PathParam("user-id") String userId, @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() ); } ChatRooms chatRoom = chatRoomsRepository.addUserRoom(chatRoomId, userId); return Response.status(Response.Status.OK).entity(chatRoom).build(); } //チャットルームにメッセージを追加する @PUT @Path("/{chatroom-id}/{user-id}/message") @Consumes(MediaType.APPLICATION_FORM_URLENCODED) @Produces(MediaType.APPLICATION_JSON) public Response updateMessage(@PathParam("chatroom-id") int roomId, @PathParam("user-id") String userId, @FormParam("message") String message, @QueryParam("token") String token) { User user = userRepository.getUser(userId); if (token == null || !token.equals(user.getToken())) { throw new WebApplicationException( Response.status(Response.Status.FORBIDDEN) .entity("認証失敗") .build() ); } ChatRooms room = chatRoomsRepository.getChatRoom(roomId); if (room == null) throw new NotFoundException("チャットルームが存在しません"); ChatRooms chatRoom = chatRoomsRepository.addMessage(roomId, userId, message); return Response.status(Response.Status.OK).entity(chatRoom).build(); } }