Skip to content

Commit 673a470

Browse files
authored
Feature/expose channel freezing to state client (#132)
* Fix state update after `channel.truncated` event with a past date * Add waiting for new message.received event when truncating in a unit test + add max waiting of 60s for a condition * Add IStreamChannel.FreezeAsync & IStreamChannel.UnfreezeAsync + add unit tests
1 parent 62b898a commit 673a470

5 files changed

Lines changed: 100 additions & 7 deletions

File tree

Assets/Plugins/StreamChat/Core/InternalDTO/Requests/UpdateChannelPartialRequestInternalDTO.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ namespace StreamChat.Core.InternalDTO.Requests
1717
internal partial class UpdateChannelPartialRequestInternalDTO
1818
{
1919
[Newtonsoft.Json.JsonProperty("set", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
20-
public System.Collections.Generic.Dictionary<string, object> Set { get; set; } = new System.Collections.Generic.Dictionary<string, object>();
20+
public System.Collections.Generic.Dictionary<string, object> Set { get; set; }
2121

2222
[Newtonsoft.Json.JsonProperty("unset", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
23-
public System.Collections.Generic.List<string> Unset { get; set; } = new System.Collections.Generic.List<string>();
23+
public System.Collections.Generic.List<string> Unset { get; set; }
2424

2525
[Newtonsoft.Json.JsonProperty("user", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
2626
public UserObjectRequestInternalDTO User { get; set; }

Assets/Plugins/StreamChat/Core/StatefulModels/IStreamChannel.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,18 @@ Task TruncateAsync(DateTimeOffset? truncatedAt = default, string systemMessage =
500500
/// </summary>
501501
Task StopWatchingAsync();
502502

503+
/// <summary>
504+
/// Freezing a channel will disallow sending new messages and sending / deleting reactions
505+
/// </summary>
506+
/// <remarks>https://getstream.io/chat/docs/unity/disabling_channels/?language=unity#freeze-a-channel</remarks>
507+
Task FreezeAsync();
508+
509+
/// <summary>
510+
/// Unfreeze this channel
511+
/// </summary>
512+
/// <remarks>https://getstream.io/chat/docs/unity/disabling_channels/?language=unity#unfreeze-a-channel</remarks>
513+
Task UnfreezeAsync();
514+
503515
/// <summary>
504516
/// Delete this channel. By default channel is soft deleted. You can hard delete it only by using a server-side SDK due to security
505517
/// </summary>

Assets/Plugins/StreamChat/Core/StatefulModels/StreamChannel.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -568,6 +568,32 @@ public Task StopWatchingAsync()
568568
=> LowLevelClient.InternalChannelApi.StopWatchingChannelAsync(Type, Id,
569569
new ChannelStopWatchingRequestInternalDTO());
570570

571+
public async Task FreezeAsync()
572+
{
573+
var response = await LowLevelClient.InternalChannelApi.UpdateChannelPartialAsync(Type, Id,
574+
new UpdateChannelPartialRequestInternalDTO()
575+
{
576+
Set = new Dictionary<string, object>
577+
{
578+
{ "frozen", true }
579+
}
580+
});
581+
Cache.TryCreateOrUpdate(response.Channel);
582+
}
583+
584+
public async Task UnfreezeAsync()
585+
{
586+
var response = await LowLevelClient.InternalChannelApi.UpdateChannelPartialAsync(Type, Id,
587+
new UpdateChannelPartialRequestInternalDTO()
588+
{
589+
Set = new Dictionary<string, object>
590+
{
591+
{ "frozen", false }
592+
}
593+
});
594+
Cache.TryCreateOrUpdate(response.Channel);
595+
}
596+
571597
public Task DeleteAsync()
572598
=> LowLevelClient.InternalChannelApi.DeleteChannelAsync(Type, Id, isHardDelete: false);
573599

Assets/Plugins/StreamChat/Samples/ChannelsCodeSamples.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -713,7 +713,7 @@ public async Task HideAndShowChannel()
713713
/// </summary>
714714
public async Task DisableChannel()
715715
{
716-
//StreamTodo: IMPLEMENT disable channel
716+
// Feature only available via a server-side SDK
717717
await Task.CompletedTask;
718718
}
719719

@@ -722,17 +722,17 @@ public async Task DisableChannel()
722722
/// </summary>
723723
public async Task FreezeChannel()
724724
{
725-
//StreamTodo: IMPLEMENT freeze channel
726-
await Task.CompletedTask;
725+
var channel = await Client.GetOrCreateChannelWithIdAsync(ChannelType.Messaging, channelId: "my-channel-id");
726+
await channel.FreezeAsync();
727727
}
728728

729729
/// <summary>
730730
/// https://getstream.io/chat/docs/unity/disabling_channels/?language=unity#unfreeze-a-channel
731731
/// </summary>
732732
public async Task UnfreezeChannel()
733733
{
734-
//StreamTodo: IMPLEMENT unfreeze channel
735-
await Task.CompletedTask;
734+
var channel = await Client.GetOrCreateChannelWithIdAsync(ChannelType.Messaging, channelId: "my-channel-id");
735+
await channel.UnfreezeAsync();
736736
}
737737

738738
/// <summary>

Assets/Plugins/StreamChat/Tests/StatefulClient/ChannelsTests.cs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using NUnit.Framework;
88
using StreamChat.Core.LowLevelClient.Requests;
99
using StreamChat.Core;
10+
using StreamChat.Core.Models;
1011
using StreamChat.Core.QueryBuilders.Filters;
1112
using StreamChat.Core.QueryBuilders.Filters.Channels;
1213
using StreamChat.Core.QueryBuilders.Filters.Users;
@@ -551,6 +552,60 @@ await WaitWithTimeoutAsync(taskCompletionSource.Task, maxSeconds: 3,
551552
// await WaitWithTimeout(taskCompletionSource.Task, maxSeconds: 3,
552553
// $"Event {nameof(otherClient.ChannelInviteReceived)} was not received");
553554
// }
555+
556+
[UnityTest]
557+
public IEnumerator When_freezing_a_channel_expect_channel_frozen()
558+
=> ConnectAndExecute(When_freezing_a_channel_expect_channel_frozen_Async);
559+
560+
private async Task When_freezing_a_channel_expect_channel_frozen_Async()
561+
{
562+
var channel = await CreateUniqueTempChannelAsync();
563+
await channel.FreezeAsync();
564+
Assert.IsTrue(channel.Frozen);
565+
}
566+
567+
[UnityTest]
568+
public IEnumerator When_sending_message_to_frozen_channel_expect_error_message_returned()
569+
=> ConnectAndExecute(When_sending_message_to_frozen_channel_expect_error_message_returned_Async);
570+
571+
private async Task When_sending_message_to_frozen_channel_expect_error_message_returned_Async()
572+
{
573+
var channel = await CreateUniqueTempChannelAsync();
574+
575+
await channel.SendNewMessageAsync("Test1");
576+
var lastNormalMessage = channel.Messages.LastOrDefault();
577+
Assert.IsNotNull(lastNormalMessage);
578+
Assert.AreNotEqual(StreamMessageType.Error, lastNormalMessage.Type);
579+
580+
await channel.FreezeAsync();
581+
Assert.IsTrue(channel.Frozen);
582+
583+
await channel.SendNewMessageAsync("MessageAfterFrozenChannel");
584+
585+
var lastMessage = channel.Messages.LastOrDefault();
586+
587+
Assert.IsNotNull(lastMessage);
588+
Assert.AreEqual(StreamMessageType.Error, lastMessage.Type);
589+
}
590+
591+
[UnityTest]
592+
public IEnumerator When_unfreezing_a_frozen_channel_expect_channel_unfrozen()
593+
=> ConnectAndExecute(When_unfreezing_a_frozen_channel_expect_channel_unfrozen_Async);
594+
595+
private async Task When_unfreezing_a_frozen_channel_expect_channel_unfrozen_Async()
596+
{
597+
var channel = await CreateUniqueTempChannelAsync();
598+
await channel.FreezeAsync();
599+
Assert.IsTrue(channel.Frozen);
600+
await channel.UnfreezeAsync();
601+
Assert.IsFalse(channel.Frozen);
602+
603+
await channel.SendNewMessageAsync("MessageAfterUnfrozenChannel");
604+
var lastMessage = channel.Messages.LastOrDefault();
605+
Assert.IsNotNull(lastMessage);
606+
Assert.AreEqual("MessageAfterUnfrozenChannel", lastMessage.Text);
607+
Assert.AreNotEqual(StreamMessageType.Error, lastMessage.Type);
608+
}
554609
}
555610
}
556611

0 commit comments

Comments
 (0)