diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 5121230..4fcb14a 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -6,6 +6,8 @@ jobs: basic: name: Run tests on ${{ matrix.os }} runs-on: ${{ matrix.os }} + env: + DOTNET_CLI_TELEMETRY_OPTOUT: "true" strategy: max-parallel: 1 matrix: diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 98a44ab..358f68c 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -9,6 +9,8 @@ jobs: Release: if: "${{ startsWith(github.event.head_commit.message, 'chore(release)') }}" runs-on: ubuntu-latest + env: + DOTNET_CLI_TELEMETRY_OPTOUT: "true" steps: - uses: actions/checkout@v2 with: diff --git a/src/stream-chat-net-test/ClientTests.cs b/src/stream-chat-net-test/ClientTests.cs index 021c221..fb7f966 100644 --- a/src/stream-chat-net-test/ClientTests.cs +++ b/src/stream-chat-net-test/ClientTests.cs @@ -172,6 +172,46 @@ public async Task TestUpdateMessage() Assert.AreEqual("stuff", updatedMessage.GetData("new")); } + [Test] + public async Task TestUpdateMessagePartial() + { + var user1 = new User() + { + ID = Guid.NewGuid().ToString(), + Role = Role.Admin, + }; + + await this._client.Users.Upsert(user1); + + var channel = this._client.Channel("messaging", Guid.NewGuid().ToString()); + await channel.Create(user1.ID, new string[] { user1.ID }); + + var initialMsg = new MessageInput + { + Text = Guid.NewGuid().ToString() + }; + initialMsg.SetData("foo", "barsky"); + initialMsg.SetData("bar", "baz"); + + var msg = await channel.SendMessage(initialMsg, user1.ID); + + var resp = await _client.UpdateMessagePartial(msg.ID, new MessagePartialUpdateRequest + { + UserId = user1.ID, + Set = new Dictionary + { + { "foo", "new" } + }, + Unset = new List { "bar"}, + }); + + Assert.AreEqual(msg.ID, resp.Message.ID); + Assert.AreEqual(msg.Text, resp.Message.Text); + Assert.NotNull(resp.Duration); + Assert.AreEqual(resp.Message.GetData("foo"), "new"); + Assert.IsNull(resp.Message.GetData("bar")); + } + [Test] public async Task TestGetMessage() { diff --git a/src/stream-chat-net/Client.cs b/src/stream-chat-net/Client.cs index 55bc0a7..45cf451 100644 --- a/src/stream-chat-net/Client.cs +++ b/src/stream-chat-net/Client.cs @@ -292,6 +292,32 @@ public async Task UpdateMessage(MessageInput msg) throw StreamChatException.FromResponse(response); } + public async Task UpdateMessagePartial(string messageId, MessagePartialUpdateRequest partialUpdateRequest) + { + if (string.IsNullOrWhiteSpace(messageId)) + { + throw new ArgumentException("The messageId must be set.", nameof(messageId)); + } + + var endpoint = string.Format("messages/{0}", messageId); + var request = this.BuildAppRequest(endpoint, HttpMethod.PUT); + request.SetJsonBody(JsonConvert.SerializeObject(partialUpdateRequest)); + + var response = await MakeRequest(request); + if (response.StatusCode == System.Net.HttpStatusCode.Created) + { + var respObj = JObject.Parse(response.Content); + var msgObj = respObj.Property("message").Value as JObject; + + return new MessagePartialUpdateResponse + { + Duration = respObj.Property("duration").Value.ToString(), + Message = Message.FromJObject(msgObj) + }; + } + throw StreamChatException.FromResponse(response); + } + public async Task DeleteMessage(string messageID, bool hardDelete = false) { var endpoint = string.Format("messages/{0}", messageID); diff --git a/src/stream-chat-net/IClient.cs b/src/stream-chat-net/IClient.cs index 58883d6..f3c948d 100644 --- a/src/stream-chat-net/IClient.cs +++ b/src/stream-chat-net/IClient.cs @@ -32,6 +32,7 @@ public interface IClient Task Search(SearchOptions opts); Task GetMessage(string messageID); Task UpdateMessage(MessageInput msg); + Task UpdateMessagePartial(string messageId, MessagePartialUpdateRequest partialUpdateRequest); Task DeleteMessage(string messageID, bool hardDelete = false); diff --git a/src/stream-chat-net/Message.cs b/src/stream-chat-net/Message.cs index 25c33c9..bb2c445 100644 --- a/src/stream-chat-net/Message.cs +++ b/src/stream-chat-net/Message.cs @@ -189,4 +189,28 @@ public class MessageSearchResult public MessageSearchResult() { } } + public class MessagePartialUpdateRequest + { + [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "user_id")] + public string UserId { get; set; } + + [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "user")] + public User User { get; set; } + + [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "set")] + public Dictionary Set { get; set; } + + [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "unset")] + public List Unset { get; set; } + + [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "skip_enrich_url")] + public bool? SkipEnrichUrl { get; set; } + } + + public class MessagePartialUpdateResponse + { + public Message Message { get; internal set; } + + public string Duration { get; internal set; } + } }