Skip to content

Commit 5b05902

Browse files
jakub-grzesiowskipubnub-release-botMohit Tejani
authored
Callback results refactor (#260)
* Implement PNMembershipMetadataResult inside PNObjectEventResult * refactor UserMetadata deserialization --------- Co-authored-by: PubNub Release Bot <[email protected]> Co-authored-by: Mohit Tejani <[email protected]>
1 parent 24e2da4 commit 5b05902

19 files changed

+1138
-525
lines changed

.pubnub.yml

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
11
name: c-sharp
2-
version: "7.4.0"
2+
version: "7.4.1"
33
schema: 1
44
scm: github.com/pubnub/c-sharp
55
changelog:
6+
- date: 2025-07-30
7+
version: v7.4.1
8+
changes:
9+
- type: bug
10+
text: "Added MembershipMetadata container inside PNObjectEventResult to correctly parse and forward data when object event type is `membership`."
11+
- type: bug
12+
text: "Fixed issue where some result objects like PNMessageResult had UserMetadata declared as an object instead of the standard Dictionary<string, object> format for metadata."
613
- date: 2025-07-23
714
version: v7.4.0
815
changes:
@@ -929,7 +936,7 @@ features:
929936
- QUERY-PARAM
930937
supported-platforms:
931938
-
932-
version: Pubnub 'C#' 7.4.0
939+
version: Pubnub 'C#' 7.4.1
933940
platforms:
934941
- Windows 10 and up
935942
- Windows Server 2008 and up
@@ -940,7 +947,7 @@ supported-platforms:
940947
- .Net Framework 4.6.1+
941948
- .Net Framework 6.0
942949
-
943-
version: PubnubPCL 'C#' 7.4.0
950+
version: PubnubPCL 'C#' 7.4.1
944951
platforms:
945952
- Xamarin.Android
946953
- Xamarin.iOS
@@ -960,7 +967,7 @@ supported-platforms:
960967
- .Net Core
961968
- .Net 6.0
962969
-
963-
version: PubnubUWP 'C#' 7.4.0
970+
version: PubnubUWP 'C#' 7.4.1
964971
platforms:
965972
- Windows Phone 10
966973
- Universal Windows Apps
@@ -984,7 +991,7 @@ sdks:
984991
distribution-type: source
985992
distribution-repository: GitHub
986993
package-name: Pubnub
987-
location: https://github.com/pubnub/c-sharp/releases/tag/v7.4.0.0
994+
location: https://github.com/pubnub/c-sharp/releases/tag/v7.4.1.0
988995
requires:
989996
-
990997
name: ".Net"
@@ -1267,7 +1274,7 @@ sdks:
12671274
distribution-type: source
12681275
distribution-repository: GitHub
12691276
package-name: PubNubPCL
1270-
location: https://github.com/pubnub/c-sharp/releases/tag/v7.4.0.0
1277+
location: https://github.com/pubnub/c-sharp/releases/tag/v7.4.1.0
12711278
requires:
12721279
-
12731280
name: ".Net Core"
@@ -1626,7 +1633,7 @@ sdks:
16261633
distribution-type: source
16271634
distribution-repository: GitHub
16281635
package-name: PubnubUWP
1629-
location: https://github.com/pubnub/c-sharp/releases/tag/v7.4.0.0
1636+
location: https://github.com/pubnub/c-sharp/releases/tag/v7.4.1.0
16301637
requires:
16311638
-
16321639
name: "Universal Windows Platform Development"

CHANGELOG

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
v7.4.1 - July 30 2025
2+
-----------------------------
3+
- Fixed: added MembershipMetadata container inside PNObjectEventResult to correctly parse and forward data when object event type is "membership".
4+
- Fixed: fixed issue where some result objects like PNMessageResult had UserMetadata declared as an object instead of the standard Dictionary<string, object> format for metadata.
5+
16
v7.4.0 - July 23 2025
27
-----------------------------
38
- Added: added support for `status` and `type` fields for uuid, channel and members app context apis.

src/Api/PubnubApi/JsonDataParse/DeserializeToInternalObjectUtility.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ public static T DeserializeToInternalObject<T>(IJsonPluggableLibrary jsonPlug, L
193193

194194
if (listObject[1] != null)
195195
{
196-
ack.UserMetadata = listObject[1];
196+
ack.UserMetadata = jsonPlug.ConvertToDictionaryObject(listObject[1]);
197197
}
198198

199199
if (ack.Event != null && ack.Event.ToLowerInvariant() == "interval")

src/Api/PubnubApi/JsonDataParse/EventDeserializer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ private PNPresenceEventResult DeserializePresenceEvent(IDictionary<string, objec
9595

9696
if (jsonFields.TryGetValue("userMetadata", out object userMetadataValue))
9797
{
98-
presenceEvent.UserMetadata = userMetadataValue;
98+
presenceEvent.UserMetadata = jsonLibrary.ConvertToDictionaryObject(userMetadataValue);
9999
}
100100

101101
if (presenceEvent.Event != null && presenceEvent.Event.ToLowerInvariant() == "interval")

src/Api/PubnubApi/JsonDataParse/PNObjectEventJsonDataParse.cs

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,14 @@ internal static PNObjectEventResult GetObject(IJsonPluggableLibrary jsonPlug,
3737
var dataFields = objectEventDicObj["data"] as Dictionary<string, object>;
3838
if (dataFields != null)
3939
{
40+
//Common fields
41+
var custom = dataFields.ContainsKey("custom") && dataFields["custom"] != null
42+
? jsonPlug.ConvertToDictionaryObject(dataFields["custom"])
43+
: null;
44+
var status = GetStringValue(dataFields, "status");
45+
var type = GetStringValue(dataFields, "type");
46+
var updated = GetStringValue(dataFields, "updated");
47+
4048
if (result.Type?.ToLowerInvariant() == "uuid" && dataFields.ContainsKey("id"))
4149
{
4250
result.UuidMetadata = new PNUuidMetadataResult
@@ -46,12 +54,10 @@ internal static PNObjectEventResult GetObject(IJsonPluggableLibrary jsonPlug,
4654
ExternalId = GetStringValue(dataFields, "externalId"),
4755
ProfileUrl = GetStringValue(dataFields, "profileUrl"),
4856
Email = GetStringValue(dataFields, "email"),
49-
Status = GetStringValue(dataFields, "status"),
50-
Type = GetStringValue(dataFields, "type"),
51-
Custom = dataFields.ContainsKey("custom") && dataFields["custom"] != null
52-
? jsonPlug.ConvertToDictionaryObject(dataFields["custom"])
53-
: null,
54-
Updated = GetStringValue(dataFields, "updated")
57+
Status = status,
58+
Type = type,
59+
Custom = custom,
60+
Updated = updated
5561
};
5662
}
5763
else if (result.Type.ToLowerInvariant() == "channel" && dataFields.ContainsKey("id"))
@@ -61,33 +67,31 @@ internal static PNObjectEventResult GetObject(IJsonPluggableLibrary jsonPlug,
6167
Channel = dataFields["id"]?.ToString(),
6268
Name = GetStringValue(dataFields, "name"),
6369
Description = GetStringValue(dataFields, "description"),
64-
Status = GetStringValue(dataFields, "status"),
65-
Type = GetStringValue(dataFields, "type"),
66-
Custom = dataFields.ContainsKey("custom") && dataFields["custom"] != null
67-
? jsonPlug.ConvertToDictionaryObject(dataFields["custom"])
68-
: null,
69-
Updated = GetStringValue(dataFields, "updated")
70+
Status = status,
71+
Type = type,
72+
Custom = custom,
73+
Updated = updated
7074
};
7175
}
7276
else if (result.Type.ToLowerInvariant() == "membership" && dataFields.ContainsKey("uuid") &&
7377
dataFields.ContainsKey("channel"))
7478
{
79+
result.MembershipMetadata = new PNMembershipMetadataResult()
80+
{
81+
Custom = custom,
82+
Status = status,
83+
Type = type,
84+
Updated = updated
85+
};
7586
var userMetadataFields = dataFields["uuid"] as Dictionary<string, object>;
7687
if (userMetadataFields != null && userMetadataFields.ContainsKey("id"))
7788
{
78-
result.UuidMetadata = new PNUuidMetadataResult
79-
{
80-
Uuid = userMetadataFields["id"]?.ToString()
81-
};
89+
result.MembershipMetadata.Uuid = userMetadataFields["id"]?.ToString();
8290
}
83-
8491
var channelMetadataFields = dataFields["channel"] as Dictionary<string, object>;
8592
if (channelMetadataFields != null && channelMetadataFields.ContainsKey("id"))
8693
{
87-
result.ChannelMetadata = new PNChannelMetadataResult
88-
{
89-
Channel = channelMetadataFields["id"]?.ToString()
90-
};
94+
result.MembershipMetadata.Channel = channelMetadataFields["id"]?.ToString();
9195
}
9296
}
9397
}

src/Api/PubnubApi/Model/Consumer/Objects/PNChannelMetadataResult.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Linq;
4-
using System.Text;
1+
using System.Collections.Generic;
52

63
namespace PubnubApi
74
{
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using System.Collections.Generic;
2+
3+
namespace PubnubApi;
4+
5+
public class PNMembershipMetadataResult
6+
{
7+
public string Channel { get; internal set; }
8+
public string Uuid { get; internal set; }
9+
public Dictionary<string, object> Custom { get; internal set; }
10+
public string Status { get; internal set; }
11+
public string Type { get; internal set; }
12+
public string Updated { get; internal set; }
13+
}

src/Api/PubnubApi/Model/Consumer/Pubsub/PNMessageResult.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System.Collections.Generic;
22

33
namespace PubnubApi
44
{
@@ -10,7 +10,7 @@ public class PNMessageResult<T>
1010
public long Timetoken { get; internal set; }
1111

1212
public string CustomMessageType { get; internal set; }
13-
public object UserMetadata { get; internal set; }
13+
public Dictionary<string, object> UserMetadata { get; internal set; }
1414
public string Publisher { get; internal set; }
1515
}
1616
}
Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,14 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Linq;
4-
using System.Text;
5-
6-
namespace PubnubApi
1+
namespace PubnubApi
72
{
83
public class PNObjectEventResult
94
{
10-
public PNObjectEventResult()
11-
{
12-
this.Event = ""; //values = set/delete for uuid/channel/UuidAssociation/ChannelAssociation
13-
this.Type = ""; //values = uuid/channel/membership
14-
this.Channel = "";
15-
}
16-
public string Event { get; internal set; }
17-
public string Type { get; internal set; }
5+
public string Event { get; internal set; } = ""; //values = set/delete for uuid/channel/UuidAssociation/ChannelAssociation
6+
public string Type { get; internal set; } = ""; //values = uuid/channel/membership
187
public PNUuidMetadataResult UuidMetadata { get; internal set; } //Populate when Type = uuid
198
public PNChannelMetadataResult ChannelMetadata { get; internal set; } //Populate when Type = channel
9+
public PNMembershipMetadataResult MembershipMetadata { get; internal set; } //Populate when Type = membership
2010
public long Timestamp { get; internal set; }
21-
public string Channel { get; internal set; } //Subscribed channel
11+
public string Channel { get; internal set; } = ""; //Subscribed channel
2212
public string Subscription { get; internal set; }
2313
}
2414
}

src/Api/PubnubApi/Model/Consumer/Pubsub/PNPresenceEventResult.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public PNPresenceEventResult()
2323
public string Subscription { get; internal set; }
2424

2525
public long Timetoken { get; internal set; }
26-
public object UserMetadata { get; internal set; }
26+
public Dictionary<string, object> UserMetadata { get; internal set; }
2727
public string[] Join { get; internal set; }
2828
public string[] Timeout { get; internal set; }
2929
public string[] Leave { get; internal set; }

0 commit comments

Comments
 (0)