Skip to content

Fixes to passed membership params. Add function overloads to pass the whole ChatMembershipData. #30

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions include/pubnub_chat/channel.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ namespace Pubnub
class User;
class MessageDraft;
struct EventsHistoryWrapper;
struct ChatMembershipData;

struct ChatChannelData
{
Expand Down Expand Up @@ -81,6 +82,7 @@ namespace Pubnub
Pubnub::Channel update(const ChatChannelData& in_additional_channel_data) const;
Pubnub::CallbackHandle connect(std::function<void(Message)> message_callback) const;
Pubnub::CallbackHandle join(std::function<void(Message)> message_callback, const Pubnub::String& additional_params = "") const;
Pubnub::CallbackHandle join(std::function<void(Message)> message_callback, const Pubnub::ChatMembershipData& membership_data) const;
void disconnect() const;
void leave() const;
void delete_channel() const;
Expand Down
2 changes: 2 additions & 0 deletions include/pubnub_chat/chat.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,9 @@ namespace Pubnub {

PN_CHAT_EXPORT Pubnub::Channel create_public_conversation(const Pubnub::String& channel_id, const ChatChannelData& channel_data) const;
PN_CHAT_EXPORT CreatedChannelWrapper create_direct_conversation(const Pubnub::User& user, const Pubnub::String& channel_id, const ChatChannelData& channel_data, const Pubnub::String& membership_data = "") const;
PN_CHAT_EXPORT CreatedChannelWrapper create_direct_conversation(const Pubnub::User& user, const Pubnub::String& channel_id, const ChatChannelData& channel_data, const Pubnub::ChatMembershipData& membership_data) const;
PN_CHAT_EXPORT CreatedChannelWrapper create_group_conversation(Pubnub::Vector<Pubnub::User> users, const Pubnub::String& channel_id, const ChatChannelData& channel_data, const Pubnub::String& membership_data = "") const;
PN_CHAT_EXPORT CreatedChannelWrapper create_group_conversation(Pubnub::Vector<Pubnub::User> users, const Pubnub::String& channel_id, const ChatChannelData& channel_data, const Pubnub::ChatMembershipData& membership_data) const;
PN_CHAT_EXPORT Channel get_channel(const Pubnub::String& channel_id) const;
PN_CHAT_EXPORT ChannelsResponseWrapper get_channels(const Pubnub::String& filter = "", const Pubnub::String& sort = "", int limit = 0, const Pubnub::Page& page = Pubnub::Page()) const;
PN_CHAT_EXPORT Pubnub::Channel update_channel(const Pubnub::String& channel_id, const ChatChannelData& channel_data) const;
Expand Down
1 change: 0 additions & 1 deletion include/pubnub_chat/membership.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ namespace Pubnub
PN_CHAT_EXPORT Pubnub::String custom_data() const;
PN_CHAT_EXPORT Pubnub::ChatMembershipData membership_data() const;

//TODO:: Mark as deprecated??
PN_CHAT_EXPORT Pubnub::Membership update(const Pubnub::String& custom_object_json) const;
PN_CHAT_EXPORT Pubnub::Membership update(const Pubnub::ChatMembershipData& membership_data) const;
PN_CHAT_EXPORT Pubnub::String last_read_message_timetoken() const;
Expand Down
18 changes: 10 additions & 8 deletions src/application/channel_service.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "thread_channel.hpp"
#include "thread_message.hpp"
#include "application/dao/channel_dao.hpp"
#include "application/dao/membership_dao.hpp"
#include "chat_service.hpp"
#include "domain/channel_entity.hpp"
#include "domain/json.hpp"
Expand Down Expand Up @@ -47,7 +48,7 @@ Channel ChannelService::create_public_conversation(const String& channel_id, con
return create_channel(channel_id, std::move(new_entity));
}

std::tuple<Channel, Membership, std::vector<Membership>> ChannelService::create_direct_conversation(const User& user, const String& channel_id, const ChannelDAO& channel_data, const String& membership_data) const {
std::tuple<Channel, Membership, std::vector<Membership>> ChannelService::create_direct_conversation(const User& user, const String& channel_id, const ChannelDAO& channel_data, const Pubnub::ChatMembershipData& membership_data) const {
//TODO: channel id should be optional and if it's not provided, we should create hashed channel id
String final_channel_id = channel_id;

Expand All @@ -70,13 +71,14 @@ std::tuple<Channel, Membership, std::vector<Membership>> ChannelService::create_
//TODO: Maybe current user should just be created in chat constructor and stored there all the time?
User current_user = chat_service_shared->user_service->get_user(user_id);

Membership host_membership = chat_service_shared->membership_service->create_membership_object(current_user, created_channel);
MembershipEntity host_membership_entity = MembershipDAO(membership_data).to_entity();
Membership host_membership = chat_service_shared->membership_service->create_membership_object(current_user, created_channel, host_membership_entity);
Membership invitee_membership = chat_service_shared->membership_service->invite_to_channel(final_channel_id, *created_channel.data, user);

return std::make_tuple(created_channel, host_membership, std::vector<Membership>{invitee_membership});
}

std::tuple<Channel, Membership, std::vector<Membership>> ChannelService::create_group_conversation(const std::vector<User>& users, const String& channel_id, const ChannelDAO& channel_data, const String& membership_data) const {
std::tuple<Channel, Membership, std::vector<Membership>> ChannelService::create_group_conversation(const std::vector<User>& users, const String& channel_id, const ChannelDAO& channel_data, const Pubnub::ChatMembershipData& membership_data) const {
//TODO: channel id should be optional and if it's not provided, we should create hashed channel id
String final_channel_id = channel_id;

Expand All @@ -99,7 +101,8 @@ std::tuple<Channel, Membership, std::vector<Membership>> ChannelService::create_
//TODO: Maybe current user should just be created in chat constructor and stored there all the time?
User current_user = chat_service_shared->user_service->get_user(user_id);

Membership host_membership = chat_service_shared->membership_service->create_membership_object(current_user, created_channel);
MembershipEntity host_membership_entity = MembershipDAO(membership_data).to_entity();
Membership host_membership = chat_service_shared->membership_service->create_membership_object(current_user, created_channel, host_membership_entity);
std::vector<Membership> invitee_memberships = chat_service_shared->membership_service->invite_multiple_to_channel(final_channel_id, *created_channel.data, users);

return std::make_tuple(created_channel, host_membership, invitee_memberships);
Expand Down Expand Up @@ -267,8 +270,9 @@ void ChannelService::disconnect(const ChannelDAO& channel_data) const {
channel_data.stop_listening_for_chat_messages();
}

std::shared_ptr<Subscription> ChannelService::join(const Channel& channel, const ChannelDAO& channel_data, std::function<void(Message)> message_callback, const String& additional_params) const {
String set_object_string = create_set_memberships_object(channel.channel_id(), additional_params);
std::shared_ptr<Subscription> ChannelService::join(const Channel& channel, const ChannelDAO& channel_data, std::function<void(Message)> message_callback, const ChatMembershipData& membership_data) const {
MembershipEntity membership_entity = MembershipDAO(membership_data).to_entity();
String set_object_string = membership_entity.get_set_memberships_json_string(channel.channel_id());

auto memberships_response = [this, set_object_string] {
auto pubnub_handle = this->pubnub->lock();
Expand All @@ -278,8 +282,6 @@ std::shared_ptr<Subscription> ChannelService::join(const Channel& channel, const
auto chat_service_shared = chat_service.lock();

auto user = chat_service_shared->user_service->get_current_user();
MembershipEntity membership_entity;
membership_entity.custom_field = additional_params;

auto membership = chat_service_shared->membership_service->create_membership_object(user, channel, membership_entity);

Expand Down
7 changes: 4 additions & 3 deletions src/application/channel_service.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "application/subscription.hpp"
#include "callback_stop.hpp"
#include "channel.hpp"
#include "membership.hpp"
#include "domain/channel_entity.hpp"
#include "enums.hpp"
#include "event.hpp"
Expand Down Expand Up @@ -67,8 +68,8 @@ class ChannelService : public std::enable_shared_from_this<ChannelService>
ChannelService(ThreadSafePtr<PubNub> pubnub, std::weak_ptr<ChatService> chat_service, float exponential_factor);

Pubnub::Channel create_public_conversation(const Pubnub::String& channel_id, const ChannelDAO& channel_data) const;
std::tuple<Pubnub::Channel, Pubnub::Membership, std::vector<Pubnub::Membership>> create_direct_conversation(const Pubnub::User& user, const Pubnub::String& channel_id, const ChannelDAO& channel_data, const Pubnub::String& membership_data = "") const;
std::tuple<Pubnub::Channel, Pubnub::Membership, std::vector<Pubnub::Membership>> create_group_conversation(const std::vector<Pubnub::User>& users, const Pubnub::String& channel_id, const ChannelDAO& channel_data, const Pubnub::String& membership_data = "") const;
std::tuple<Pubnub::Channel, Pubnub::Membership, std::vector<Pubnub::Membership>> create_direct_conversation(const Pubnub::User& user, const Pubnub::String& channel_id, const ChannelDAO& channel_data, const Pubnub::ChatMembershipData& membership_data = Pubnub::ChatMembershipData()) const;
std::tuple<Pubnub::Channel, Pubnub::Membership, std::vector<Pubnub::Membership>> create_group_conversation(const std::vector<Pubnub::User>& users, const Pubnub::String& channel_id, const ChannelDAO& channel_data, const Pubnub::ChatMembershipData& membership_data = Pubnub::ChatMembershipData()) const;
Pubnub::Channel create_channel(const Pubnub::String& channel_id, const ChannelEntity&& channel_entity) const;
Pubnub::Channel get_channel(const Pubnub::String& channel_id) const;
std::tuple<std::vector<Pubnub::Channel>, Pubnub::Page, int> get_channels(const Pubnub::String& filter = "", const Pubnub::String& sort = "", int limit = 0, const Pubnub::Page& page = Pubnub::Page()) const;
Expand All @@ -78,7 +79,7 @@ class ChannelService : public std::enable_shared_from_this<ChannelService>
Pubnub::Channel pin_message_to_channel(const Pubnub::Message& message, const Pubnub::String& channel_id, const ChannelDAO& channel) const;
Pubnub::Channel unpin_message_from_channel(const Pubnub::String& channel_id, const ChannelDAO& channel) const;
std::shared_ptr<Subscription> connect(const Pubnub::String& channel_id, const ChannelDAO& channel_data, std::function<void(Pubnub::Message)> message_callback) const;
std::shared_ptr<Subscription> join(const Pubnub::Channel& channel, const ChannelDAO& channel_data, std::function<void(Pubnub::Message)> message_callback, const Pubnub::String& additional_params = "") const;
std::shared_ptr<Subscription> join(const Pubnub::Channel& channel, const ChannelDAO& channel_data, std::function<void(Pubnub::Message)> message_callback, const Pubnub::ChatMembershipData& membership_data = Pubnub::ChatMembershipData()) const;
void disconnect(const ChannelDAO& channel_data) const;
void leave(const Pubnub::String& channel_id, const ChannelDAO& channel_data) const;
void send_text(const Pubnub::String& channel_id, const ChannelDAO& dao, const Pubnub::String& message, const SendTextParamsInternal& text_params = SendTextParamsInternal()) const;
Expand Down
29 changes: 15 additions & 14 deletions src/application/membership_service.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ std::tuple<std::vector<Pubnub::Membership>, Pubnub::Page, int, Pubnub::String> M
throw std::invalid_argument("can't get members, limit has to be within 0 - " + std::to_string(PN_MAX_LIMIT) + " range");
}

String include_string = "custom,channel,totalCount,channel.custom,status,type";
String include_string = "totalCount,custom,status,type,uuid,uuid.custom,uuid.status,uuid.type";

auto get_channel_members_response = [this, channel_id, include_string, limit, filter, sort, page] {
auto pubnub_handle = this->pubnub->lock();
Expand Down Expand Up @@ -62,8 +62,8 @@ std::tuple<std::vector<Pubnub::Membership>, Pubnub::Page, int, Pubnub::String> M
//We don't need to add channel to entity repository, as this whole function is called from a channel object - it has to already exist
Channel channel = chat_service_shared->channel_service->create_channel_object({channel_id, channel_data.to_entity()});

// TODO: no custom data?
Membership membership = this->create_membership_object(user, channel);
MembershipEntity membership_entity = MembershipEntity::from_json(single_data_json.value());
Membership membership = this->create_membership_object(user, channel, membership_entity);
memberships.push_back(membership);
}

Expand Down Expand Up @@ -112,7 +112,8 @@ std::tuple<std::vector<Pubnub::Membership>, Pubnub::Page, int, Pubnub::String> M
//We don't need to add user to entity repository, as this whole function is called from a user object - it has to already exist
User user = chat_service_shared->user_service->create_user_object({user_id, user_data.to_entity()});

Membership membership = this->create_membership_object(user, channel);
MembershipEntity membership_entity = MembershipEntity::from_json(single_data_json.value());
Membership membership = this->create_membership_object(user, channel, membership_entity);
memberships.push_back(membership);
}

Expand All @@ -138,7 +139,7 @@ Membership MembershipService::invite_to_channel(const String& channel_id, const
return members[0];
}

String include_string = "custom,channel,totalCount,channel.custom,status,type";
String include_string = "custom,channel,channel.custom,type,channel.type,status,channel.status";
String set_memeberships_obj = create_set_memberships_object(channel_id, "");

auto user_id = user.user_id();
Expand All @@ -157,7 +158,9 @@ Membership MembershipService::invite_to_channel(const String& channel_id, const
//This channel is updated, so we need to update it in entity repository as well
ChannelEntity channel_entity = ChannelEntity::from_json(channel_data_string);

Membership membership_object = this->create_membership_object(user, channel);
//This is newly created membership, so membership data is empty
MembershipEntity membership_entity;
Membership membership_object = this->create_membership_object(user, channel, membership_entity);
membership_object.set_last_read_message_timetoken(get_now_timetoken());
return membership_object;
}
Expand All @@ -181,7 +184,7 @@ std::vector<Membership> MembershipService::invite_multiple_to_channel(const Stri
}
}

String include_string = "custom,channel,totalCount,channel.custom,status,type";
String include_string = "custom,type,status";
String set_memebers_obj = create_set_members_object(users_ids, "");

auto set_members_response = [this, channel_id, set_memebers_obj, include_string, filter] {
Expand All @@ -204,7 +207,8 @@ std::vector<Membership> MembershipService::invite_multiple_to_channel(const Stri
continue;
}

Membership membership = this->create_membership_object(*user, channel);
MembershipEntity membership_entity = MembershipEntity::from_json(single_data_json.value());
Membership membership = this->create_membership_object(*user, channel, membership_entity);
membership.set_last_read_message_timetoken(get_now_timetoken());
invitees_memberships.push_back(membership);

Expand Down Expand Up @@ -380,7 +384,7 @@ std::tuple<Pubnub::Page, int, int, std::vector<Pubnub::Membership>> MembershipSe

auto memberships_response = [this, current_user, set_memberships_string] {
auto pubnub_handle = pubnub->lock();
String include_string = "custom,channel,totalCount,custom.channel,status,type";
String include_string = "totalCount,custom,channel,channel.custom,type,channel.type,status,channel.status";
return pubnub_handle->set_memberships(current_user.user_id(), set_memberships_string, include_string);
}();

Expand Down Expand Up @@ -419,7 +423,8 @@ std::tuple<Pubnub::Page, int, int, std::vector<Pubnub::Membership>> MembershipSe

Channel channel = chat_service_shared->channel_service->create_channel_object({channel_id, channel_entity});

Membership membership = this->create_membership_object(current_user, channel);
MembershipEntity membership_entity = MembershipEntity::from_json(element);
Membership membership = this->create_membership_object(current_user, channel, membership_entity);
memberships.push_back(membership);

//Emit events for updated memberships
Expand Down Expand Up @@ -467,10 +472,6 @@ std::shared_ptr<SubscriptionSet> MembershipService::stream_updates_on(Pubnub::Me
return subscription;
}

Membership MembershipService::create_membership_object(const User& user, const Channel& channel) const {
return this->create_membership_object(user, channel, MembershipEntity{channel.channel_data().custom_data_json});
}

Membership MembershipService::create_membership_object(const User& user, const Channel& channel, const MembershipEntity& membership_entity) const {
if (auto chat = this->chat_service.lock()) {
return Membership(user, channel, chat, shared_from_this(), std::make_unique<MembershipDAO>(membership_entity));
Expand Down
1 change: 0 additions & 1 deletion src/application/membership_service.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ class MembershipService : public std::enable_shared_from_this<MembershipService>
std::shared_ptr<Subscription> stream_updates(Pubnub::Membership calling_membership, std::function<void(Pubnub::Membership)> membership_callback) const;
std::shared_ptr<SubscriptionSet> stream_updates_on(Pubnub::Membership calling_membership, const std::vector<Pubnub::Membership>& memberships, std::function<void(std::vector<Pubnub::Membership>)> membership_callback) const;

Pubnub::Membership create_membership_object(const Pubnub::User& user, const Pubnub::Channel& channel) const;
Pubnub::Membership create_membership_object(const Pubnub::User& user, const Pubnub::Channel& channel, const MembershipEntity& membership_entity) const;

Pubnub::Membership update_membership_with_base(const Pubnub::Membership& membership, const Pubnub::Membership& base_membership) const;
Expand Down
2 changes: 1 addition & 1 deletion src/domain/membership_entity.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ Pubnub::String MembershipEntity::get_set_memberships_json_string(Pubnub::String
}
else
{
set_memberships_json.insert_or_update("custom", "{}");
set_memberships_json.insert_or_update("custom", Json::object());
}
if(!status.empty()) {
set_memberships_json.insert_or_update("status", status);
Expand Down
6 changes: 5 additions & 1 deletion src/presentation/channel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,11 @@ CallbackHandle Channel::connect(std::function<void(Message)> message_callback) c
}

CallbackHandle Channel::join(std::function<void(Message)> message_callback, const String& additional_params) const {
return CallbackHandle(this->channel_service->join(*this, *this->data, message_callback, additional_params));
return CallbackHandle(this->channel_service->join(*this, *this->data, message_callback, ChatMembershipData{additional_params}));
}

CallbackHandle Channel::join(std::function<void(Message)> message_callback, const ChatMembershipData& membership_data) const {
return CallbackHandle(this->channel_service->join(*this, *this->data, message_callback, membership_data));
}

void Channel::disconnect() const {
Expand Down
Loading