Skip to content
This repository has been archived by the owner on Jun 29, 2024. It is now read-only.

Commit

Permalink
add SendMessageToGroupMessageHandler
Browse files Browse the repository at this point in the history
  • Loading branch information
wsekta committed Jan 17, 2024
1 parent 2fa9d42 commit a203863
Show file tree
Hide file tree
Showing 7 changed files with 203 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,7 @@ void PrivateMessagesController::sendPrivateMessage(const QString& messageText)

nlohmann::json data{
{"groupId", currentFriendGroupId},
{"message", messageText.toStdString()},
{"text", messageText.toStdString()},
};

session->sendMessage(common::messages::MessageId::SendPrivateMessage, data);
Expand Down
2 changes: 2 additions & 0 deletions apps/server/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ set(SOURCES
domain/entities/blacklistToken/BlacklistToken.cpp
infrastructure/repositories/blacklistTokenRepository/blacklistTokenMapper/BlacklistTokenMapperImpl.cpp
infrastructure/repositories/blacklistTokenRepository/BlacklistTokenRepositoryImpl.cpp
api/messageHandlers/messages/sendMessageToGroupMessageHandler/SendMessageToGroupMessageHandler.cpp
)

set(TEST_COMMON_SOURCES
Expand Down Expand Up @@ -188,6 +189,7 @@ set(UT_SOURCES
api/messageHandlers/messages/sendMessageToChannelMessageHandler/SendMessageToChannelMessageHandlerTest.cpp
api/messageHandlers/messages/getMessagesFromChannelMessageHandler/GetMessagesFromChannelMessageHandlerTest.cpp
api/messageHandlers/messages/getMessagesFromGroupMessageHandler/GetMessagesFromGroupMessageHandlerTest.cpp
api/messageHandlers/messages/sendMessageToGroupMessageHandler/SendMessageToGroupMessageHandlerTest.cpp
)

set(IT_SOURCES
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#include "SendMessageToGroupMessageHandler.h"

#include <loguru.hpp>
#include <nlohmann/json.hpp>
#include <regex>

namespace server::api
{
SendMessageToGroupMessageHandler::SendMessageToGroupMessageHandler(
std::shared_ptr<application::TokenService> tokenServiceInit,
std::unique_ptr<application::CreateGroupMessageCommandHandler> createGroupMessageCommandHandlerInit)
: tokenService{std::move(tokenServiceInit)},
createGroupMessageCommandHandler{std::move(createGroupMessageCommandHandlerInit)}
{
}

common::messages::Message
SendMessageToGroupMessageHandler::handleMessage(const common::messages::Message& message) const
{
try
{
auto payloadJson = nlohmann::json::parse(static_cast<std::string>(message.payload));

auto token = payloadJson["token"].get<std::string>();
auto groupId = payloadJson["data"]["groupId"].get<std::string>();
auto text = payloadJson["data"]["text"].get<std::string>();

auto [senderId] = tokenService->verifyToken(token);

auto [newMessage] = createGroupMessageCommandHandler->execute({text, senderId, groupId});

nlohmann::json responsePayload;

responsePayload["data"]["message"] = {
{"id", newMessage.getId()},
{"text", newMessage.getContent()},
{"senderName", newMessage.getSender()->getNickname()},
{"sentAt", newMessage.getCreatedAt()},
};

return {common::messages::MessageId::SendPrivateMessageResponse, common::bytes::Bytes{responsePayload.dump()}};
}
catch (const std::exception& e)
{
nlohmann::json responsePayload{{"error", e.what()}};

return {common::messages::MessageId::SendPrivateMessageResponse, common::bytes::Bytes{responsePayload.dump()}};
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#pragma once

#include <memory>

#include "../../MessageHandler.h"
#include "server/application/commandHandlers/message/createGroupMessageCommandHandler/CreateGroupMessageCommandHandler.h"
#include "server/application/services/tokenService/TokenService.h"

namespace server::api
{
class SendMessageToGroupMessageHandler : public MessageHandler
{
public:
SendMessageToGroupMessageHandler(
std::shared_ptr<application::TokenService> tokenService,
std::unique_ptr<application::CreateGroupMessageCommandHandler> createGroupMessageCommandHandler);

common::messages::Message handleMessage(const common::messages::Message& message) const override;

private:
std::shared_ptr<application::TokenService> tokenService;
std::unique_ptr<application::CreateGroupMessageCommandHandler> createGroupMessageCommandHandler;
};
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
#include "SendMessageToGroupMessageHandler.h"

#include <gtest/gtest.h>

#include "server/application/commandHandlers/message/createGroupMessageCommandHandler/CreateGroupMessageCommandHandlerMock.h"
#include "server/application/services/tokenService/TokenServiceMock.h"

#include "faker-cxx/String.h"
#include "nlohmann/json.hpp"
#include "server/tests/factories/groupTestFactory/GroupTestFactory.h"
#include "server/tests/factories/messageTestFactory/MessageTestFactory.h"
#include "server/tests/factories/userTestFactory/UserTestFactory.h"

using namespace server::api;
using namespace ::testing;

namespace
{
const auto invalidTokenError = std::runtime_error{"invalidToken"};
const auto invalidTokenMessageResponse = common::messages::Message{
common::messages::MessageId::SendPrivateMessageResponse, common::bytes::Bytes{R"({"error":"invalidToken"})"}};

const auto createChannelMessageCommandHandlerError = std::runtime_error{"createGroupMessageCommandHandlerError"};
const auto createChannelMessageCommandHandlerErrorMessageResponse =
common::messages::Message{common::messages::MessageId::SendPrivateMessageResponse,
common::bytes::Bytes{R"({"error":"createGroupMessageCommandHandlerError"})"}};
}

class SendMessageToGroupMessageHandlerTest : public Test
{
public:
server::tests::UserTestFactory userTestFactory;
server::tests::GroupTestFactory groupTestFactory;
server::tests::MessageTestFactory messageTestFactory;

std::string token = faker::String::alphanumeric(40);
const std::shared_ptr<server::domain::User> messageSender = userTestFactory.createDomainUser();
server::application::VerifyTokenResult verifyTokenResult{messageSender->getId()};

const std::shared_ptr<server::domain::Group> messageGroup = groupTestFactory.createDomainGroup();
const std::shared_ptr<server::domain::Message> message =
messageTestFactory.createDomainMessage(messageSender, nullptr, messageGroup);
nlohmann::json validPayloadJson{
{"data", nlohmann::json{{"groupId", messageGroup->getId()}, {"text", message->getContent()}}},
{"token", token}};
common::bytes::Bytes validPayload{validPayloadJson.dump()};
common::messages::Message validMessage{common::messages::MessageId::SendPrivateMessage, validPayload};

std::shared_ptr<server::application::TokenServiceMock> tokenServiceMock =
std::make_shared<StrictMock<server::application::TokenServiceMock>>();

std::unique_ptr<server::application::CreateGroupMessageCommandHandlerMock>
createGroupMessageCommandHandlerMockInit =
std::make_unique<StrictMock<server::application::CreateGroupMessageCommandHandlerMock>>();

server::application::CreateGroupMessageCommandHandlerMock* createGroupMessageCommandHandlerMock =
createGroupMessageCommandHandlerMockInit.get();

SendMessageToGroupMessageHandler sendMessageToGroupMessageHandler{
tokenServiceMock, std::move(createGroupMessageCommandHandlerMockInit)};
};

TEST_F(SendMessageToGroupMessageHandlerTest, handleValidSendChannelMessage)
{
const auto validCommandHandlerResponse = server::application::CreateGroupMessageCommandHandlerResult{*message};
const auto validCommandHandlerResponseJson = nlohmann::json{{"data",
{{"message",
{{"id", message->getId()},
{"text", message->getContent()},
{"senderName", messageSender->getNickname()},
{"sentAt", message->getCreatedAt()}}}}}};
auto commandPayload = server::application::CreateGroupMessageCommandHandlerPayload{
message->getContent(), messageSender->getId(), messageGroup->getId()};
nlohmann::json validPayloadJson{
{"data", nlohmann::json{{"groupId", messageGroup->getId()}, {"text", message->getContent()}}},
{"token", token}};
common::bytes::Bytes validPayload{validPayloadJson.dump()};
common::messages::Message validMessage{common::messages::MessageId::SendPrivateMessage, validPayload};

const auto validMessageResponse =
common::messages::Message{common::messages::MessageId::SendPrivateMessageResponse,
common::bytes::Bytes{validCommandHandlerResponseJson.dump()}};

EXPECT_CALL(*tokenServiceMock, verifyToken(token)).WillOnce(Return(verifyTokenResult));
EXPECT_CALL(*createGroupMessageCommandHandlerMock, execute(commandPayload))
.WillOnce(Return(validCommandHandlerResponse));

auto responseMessage = sendMessageToGroupMessageHandler.handleMessage(validMessage);

EXPECT_EQ(responseMessage, validMessageResponse);
}

TEST_F(SendMessageToGroupMessageHandlerTest, handleSendChannelMessageWithInvalidToken)
{
EXPECT_CALL(*tokenServiceMock, verifyToken(token)).WillOnce(Throw(invalidTokenError));

auto responseMessage = sendMessageToGroupMessageHandler.handleMessage(validMessage);

EXPECT_EQ(responseMessage, invalidTokenMessageResponse);
}

TEST_F(SendMessageToGroupMessageHandlerTest, handleSendChannelMessageWithCreateChannelMessageCommandHandlerError)
{
EXPECT_CALL(*tokenServiceMock, verifyToken(token)).WillOnce(Return(verifyTokenResult));
auto commandPayload = server::application::CreateGroupMessageCommandHandlerPayload{
message->getContent(), messageSender->getId(), messageGroup->getId()};
EXPECT_CALL(*createGroupMessageCommandHandlerMock, execute(commandPayload))
.WillOnce(Throw(createChannelMessageCommandHandlerError));

auto responseMessage = sendMessageToGroupMessageHandler.handleMessage(validMessage);

EXPECT_EQ(responseMessage, createChannelMessageCommandHandlerErrorMessageResponse);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@

#include <gmock/gmock.h>

#include "CreateGroupCommandHandler.h"
#include "CreateGroupMessageCommandHandler.h"

namespace server::application
{
class CreateGroupCommandHandlerMock : public CreateGroupCommandHandler
class CreateGroupMessageCommandHandlerMock : public CreateGroupMessageCommandHandler
{
public:
MOCK_METHOD(CreateGroupCommandHandlerResult, execute, (const CreateGroupCommandHandlerPayload&), (const override));
MOCK_METHOD(CreateGroupMessageCommandHandlerResult, execute, (const CreateGroupMessageCommandHandlerPayload&),
(const override));
};
}
9 changes: 9 additions & 0 deletions apps/server/core/session/MessageRouterFactory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include "server/api/messageHandlers/messages/getMessagesFromChannelMessageHandler/GetMessagesFromChannelMessageHandler.h"
#include "server/api/messageHandlers/messages/getMessagesFromGroupMessageHandler/GetMessagesFromGroupMessageHandler.h"
#include "server/api/messageHandlers/messages/sendMessageToChannelMessageHandler/SendMessageToChannelMessageHandler.h"
#include "server/api/messageHandlers/messages/sendMessageToGroupMessageHandler/SendMessageToGroupMessageHandler.h"
#include "server/api/messageHandlers/user/deleteUserMessageHandler/DeleteUserMessageHandler.h"
#include "server/api/messageHandlers/user/getUserDataMessageHandler/GetUserDataMessageHandler.h"
#include "server/api/messageHandlers/user/loginMessageHandler/LoginMessageHandler.h"
Expand All @@ -38,6 +39,7 @@
#include "server/application/commandHandlers/friend/deleteFriendshipCommandHandler/DeleteFriendshipCommandHandlerImpl.h"
#include "server/application/commandHandlers/friend/rejectFriendInvitationCommandHandler/RejectFriendInvitationCommandHandlerImpl.h"
#include "server/application/commandHandlers/message/createChannelMessageCommandHandler/CreateChannelMessageCommandHandlerImpl.h"
#include "server/application/commandHandlers/message/createGroupMessageCommandHandler/CreateGroupMessageCommandHandlerImpl.h"
#include "server/application/commandHandlers/user/deleteUserCommandHandler/DeleteUserCommandHandlerImpl.h"
#include "server/application/commandHandlers/user/loginUserCommandHandler/LoginUserCommandHandlerImpl.h"
#include "server/application/commandHandlers/user/logoutUserCommandHandler/LogoutUserCommandHandlerImpl.h"
Expand Down Expand Up @@ -302,6 +304,12 @@ std::unique_ptr<MessageRouter> MessageRouterFactory::createMessageRouter() const
auto getMessagesFromGroupMessageHandler = std::make_shared<server::api::GetMessagesFromGroupMessageHandler>(
tokenService, std::move(findGroupMessagesQueryHandler));

auto createGroupMessageCommandHandler = std::make_unique<server::application::CreateGroupMessageCommandHandlerImpl>(
groupRepository, userRepository, userGroupRepository, messageRepository);

auto sendMessageToGroupMessageHandler = std::make_shared<server::api::SendMessageToGroupMessageHandler>(
tokenService, std::move(createGroupMessageCommandHandler));

std::unordered_map<common::messages::MessageId, std::shared_ptr<api::MessageHandler>> messageHandlers{
{common::messages::MessageId::CreateChannel, createChannelMessageHandler},
{common::messages::MessageId::GetUserChannels, getUserChannelsMessageHandler},
Expand All @@ -328,6 +336,7 @@ std::unique_ptr<MessageRouter> MessageRouterFactory::createMessageRouter() const
{common::messages::MessageId::SendChannelMessage, sendMessageToChannelMessageHandler},
{common::messages::MessageId::GetChannelMessages, getMessageFromChannelMessageHandler},
{common::messages::MessageId::GetPrivateMessages, getMessagesFromGroupMessageHandler},
{common::messages::MessageId::SendPrivateMessage, sendMessageToGroupMessageHandler},
};

return std::make_unique<MessageRouterImpl>(std::move(messageHandlers));
Expand Down

0 comments on commit a203863

Please sign in to comment.