Newer
Older
tampopo-server / src / main / java / org / ntlab / tampoposerver / resources / ChatRoomsResource.java
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}")
    public Response deleteChatRoom(@PathParam("chatroom-id") int chatRoomId, @FormParam("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("IDが存在しません");
        }

        if (token == null || !token.equals(user.getToken())) {
            throw new WebApplicationException(
                    Response.status(Response.Status.FORBIDDEN)
                            .entity("認証失敗")
                            .build()
            );
        }


        ChatRooms chatRoom = chatRoomsRepository.deleteChatRoom(chatRoomId);
        return Response.noContent().build();
        //return Response.status(Response.Status.noContent).entity(chatRoom).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();
    }



}