@@ -118,14 +118,15 @@ Membership MembershipService::invite_to_channel(const String& channel_id, const
118
118
119
119
Channel channel = chat_service_shared->channel_service ->create_channel_object ({channel_id, channel_data.to_entity ()});
120
120
121
- if (channel.channel_data ().type == String (" public" ))
121
+ // Check if user is not a member of the channel that he is invited to
122
+ Pubnub::String filter = Pubnub::String (" uuid.id == \" " ) + user.user_id () + Pubnub::String (" \" " );
123
+ auto members = std::get<0 >(this ->get_channel_members (channel_id, channel_data, filter));
124
+ if (!members.empty ())
122
125
{
123
- throw std::runtime_error (" Channel invites are not supported in Public chats" );
126
+ // Already a member, just return current membership
127
+ return members[0 ];
124
128
}
125
129
126
- // TODO:: check here if user already is on that channel. Requires C-Core filtering
127
-
128
-
129
130
String include_string = " custom,channel,totalCount,customChannel" ;
130
131
String set_memeberships_obj = create_set_memberships_object (channel_id, " " );
131
132
@@ -145,7 +146,6 @@ Membership MembershipService::invite_to_channel(const String& channel_id, const
145
146
// This channel is updated, so we need to update it in entity repository as well
146
147
ChannelEntity channel_entity = ChannelEntity::from_json (channel_data_string);
147
148
148
- // TODO: no custom data?
149
149
Membership membership_object = this ->create_membership_object (user, channel);
150
150
membership_object.set_last_read_message_timetoken (get_now_timetoken ());
151
151
return membership_object;
@@ -157,39 +157,34 @@ std::vector<Membership> MembershipService::invite_multiple_to_channel(const Stri
157
157
158
158
Channel channel = chat_service_shared->channel_service ->create_channel_object ({channel_id, channel_data.to_entity ()});
159
159
160
- if (channel.channel_data ().type == String (" public" ))
161
- {
162
- throw std::runtime_error (" Channel invites are not supported in Public chats" );
163
- }
164
-
165
- // TODO:: check here if users already are on that channel. Requires C-Core filtering
166
-
160
+ std::vector<String> users_ids;
161
+ String filter;
167
162
168
- std::vector<String> filtered_users_ids;
169
-
170
- for (auto &user : users)
163
+ for (int i = 0 ; i < users.size (); i++)
171
164
{
172
- filtered_users_ids.push_back (user.user_id ());
165
+ users_ids.push_back (users[i].user_id ());
166
+ filter += Pubnub::String (" uuid.id == \" " ) + users[i].user_id () + Pubnub::String (" \" " );
167
+ if (i < users.size () - 1 )
168
+ {
169
+ filter += Pubnub::String (" || " );
170
+ }
173
171
}
174
172
175
173
String include_string = " custom,channel,totalCount,customChannel" ;
176
- String set_memebers_obj = create_set_members_object (filtered_users_ids , " " );
174
+ String set_memebers_obj = create_set_members_object (users_ids , " " );
177
175
178
- auto set_members_response = [this , channel_id, set_memebers_obj, include_string] {
176
+ auto set_members_response = [this , channel_id, set_memebers_obj, include_string, filter ] {
179
177
auto pubnub_handle = this ->pubnub ->lock ();
180
- return pubnub_handle->set_members (channel_id, set_memebers_obj, include_string);
178
+ return pubnub_handle->set_members (channel_id, set_memebers_obj, include_string, filter );
181
179
}();
182
180
183
181
std::vector<Membership> invitees_memberships;
184
182
185
183
json memberships_response_json = json::parse (set_members_response);
186
184
json memberships_data_array = memberships_response_json[" data" ];
187
-
188
- String test = memberships_data_array.dump ();
189
185
190
186
for (json::iterator single_data_json = memberships_data_array.begin (); single_data_json != memberships_data_array.end (); ++single_data_json)
191
187
{
192
- // TODO: @kamil - check if this assumption is correct
193
188
auto user = std::find_if (users.begin (), users.end (), [single_data_json](const User& user) {
194
189
return user.user_id () == String (single_data_json.value ()[" uuid" ][" id" ]);
195
190
});
@@ -198,7 +193,6 @@ std::vector<Membership> MembershipService::invite_multiple_to_channel(const Stri
198
193
continue ;
199
194
}
200
195
201
- // TODO: no custom data?
202
196
Membership membership = this ->create_membership_object (*user, channel);
203
197
membership.set_last_read_message_timetoken (get_now_timetoken ());
204
198
invitees_memberships.push_back (membership);
0 commit comments