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();
}
//ユーザーID1つで入っているチャットルームを検索
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getChatroomId(
@QueryParam("user0-id") String user0Id,
@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;
chatRoom = chatRoomsRepository.findChatRoomBySingleUser(user0Id);
if (chatRoom == null) {
return Response.status(Response.Status.NOT_FOUND)
.entity(Map.of("error", "ユーザーが含まれるチャットルームが見つかりません")).build();
}else{
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();
}
}