diff --git a/Vonage.Test/Conversations/CreateMember/RequestBuilderTest.cs b/Vonage.Test/Conversations/CreateMember/RequestBuilderTest.cs index 0b7c37cf..e5117175 100644 --- a/Vonage.Test/Conversations/CreateMember/RequestBuilderTest.cs +++ b/Vonage.Test/Conversations/CreateMember/RequestBuilderTest.cs @@ -143,9 +143,9 @@ public void Build_ShouldSetAppChannel() => .Create() .Map(request => request.Channel) .Should() - .BeSuccess(new MemberChannelV2(ChannelType.App, - new MemberChannelFromV2(ChannelType.App, ChannelType.Phone, ChannelType.Sms), - new MemberChannelToV2(ChannelType.App, ValidUserId, Maybe.None, Maybe.None))); + .BeSuccess(new MemberChannel(ChannelType.App, + MemberChannelFrom.FromChannels(ChannelType.App, ChannelType.Phone, ChannelType.Sms), + new MemberChannelToV(ChannelType.App, ValidUserId, Maybe.None, Maybe.None))); [Fact] public void Build_ShouldReturnFailure_GivenChannelTypesAreEmpty() => @@ -156,7 +156,7 @@ public void Build_ShouldReturnFailure_GivenChannelTypesAreEmpty() => .WithApp(ValidUserId) .Create() .Should() - .BeParsingFailure("Channels cannot be empty."); + .BeParsingFailure("Type cannot be null or whitespace."); private static IBuilderForOptional BuildDefaultBuilder() => CreateMemberRequest.Build() @@ -175,9 +175,9 @@ public void Build_ShouldSetPhoneChannel() => .Create() .Map(request => request.Channel) .Should() - .BeSuccess(new MemberChannelV2(ChannelType.Phone, - new MemberChannelFromV2(ChannelType.Phone, ChannelType.Messenger), - new MemberChannelToV2(ChannelType.Phone, Maybe.None, "NUM-123", Maybe.None))); + .BeSuccess(new MemberChannel(ChannelType.Phone, + MemberChannelFrom.FromChannels(ChannelType.Phone, ChannelType.Messenger), + new MemberChannelToV(ChannelType.Phone, Maybe.None, "NUM-123", Maybe.None))); [Fact] public void Build_ShouldSetSmsChannel() => @@ -189,9 +189,9 @@ public void Build_ShouldSetSmsChannel() => .Create() .Map(request => request.Channel) .Should() - .BeSuccess(new MemberChannelV2(ChannelType.Sms, - new MemberChannelFromV2(ChannelType.Sms, ChannelType.Viber), - new MemberChannelToV2(ChannelType.Sms, Maybe.None, "NUM-123", Maybe.None))); + .BeSuccess(new MemberChannel(ChannelType.Sms, + MemberChannelFrom.FromChannels(ChannelType.Sms, ChannelType.Viber), + new MemberChannelToV(ChannelType.Sms, Maybe.None, "NUM-123", Maybe.None))); [Fact] public void Build_ShouldSetMmsChannel() => @@ -203,9 +203,9 @@ public void Build_ShouldSetMmsChannel() => .Create() .Map(request => request.Channel) .Should() - .BeSuccess(new MemberChannelV2(ChannelType.Mms, - new MemberChannelFromV2(ChannelType.Mms, ChannelType.Viber), - new MemberChannelToV2(ChannelType.Mms, Maybe.None, "NUM-123", Maybe.None))); + .BeSuccess(new MemberChannel(ChannelType.Mms, + MemberChannelFrom.FromChannels(ChannelType.Mms, ChannelType.Viber), + new MemberChannelToV(ChannelType.Mms, Maybe.None, "NUM-123", Maybe.None))); [Fact] public void Build_ShouldSetWhatsAppChannel() => @@ -217,9 +217,9 @@ public void Build_ShouldSetWhatsAppChannel() => .Create() .Map(request => request.Channel) .Should() - .BeSuccess(new MemberChannelV2(ChannelType.Whatsapp, - new MemberChannelFromV2(ChannelType.Whatsapp, ChannelType.Viber), - new MemberChannelToV2(ChannelType.Whatsapp, Maybe.None, "NUM-123", Maybe.None))); + .BeSuccess(new MemberChannel(ChannelType.Whatsapp, + MemberChannelFrom.FromChannels(ChannelType.Whatsapp, ChannelType.Viber), + new MemberChannelToV(ChannelType.Whatsapp, Maybe.None, "NUM-123", Maybe.None))); [Fact] public void Build_ShouldSetViberChannel() => @@ -231,9 +231,9 @@ public void Build_ShouldSetViberChannel() => .Create() .Map(request => request.Channel) .Should() - .BeSuccess(new MemberChannelV2(ChannelType.Viber, - new MemberChannelFromV2(ChannelType.Viber), - new MemberChannelToV2(ChannelType.Viber, Maybe.None, Maybe.None, ValidUserId))); + .BeSuccess(new MemberChannel(ChannelType.Viber, + MemberChannelFrom.FromChannels(ChannelType.Viber), + new MemberChannelToV(ChannelType.Viber, Maybe.None, Maybe.None, ValidUserId))); [Fact] public void Build_ShouldSetMessengerChannel() => @@ -245,7 +245,7 @@ public void Build_ShouldSetMessengerChannel() => .Create() .Map(request => request.Channel) .Should() - .BeSuccess(new MemberChannelV2(ChannelType.Messenger, - new MemberChannelFromV2(ChannelType.Messenger, ChannelType.Phone), - new MemberChannelToV2(ChannelType.Messenger, Maybe.None, Maybe.None, ValidUserId))); + .BeSuccess(new MemberChannel(ChannelType.Messenger, + MemberChannelFrom.FromChannels(ChannelType.Messenger, ChannelType.Phone), + new MemberChannelToV(ChannelType.Messenger, Maybe.None, Maybe.None, ValidUserId))); } \ No newline at end of file diff --git a/Vonage.Test/Conversations/CreateMember/SerializationTest.cs b/Vonage.Test/Conversations/CreateMember/SerializationTest.cs index 8334bb92..f90dd4e1 100644 --- a/Vonage.Test/Conversations/CreateMember/SerializationTest.cs +++ b/Vonage.Test/Conversations/CreateMember/SerializationTest.cs @@ -69,9 +69,9 @@ internal static void VerifyResponse(Member response) null )); response.Channel.Should().Be(new MemberChannel( - "app", - new MemberChannelFrom("app"), - new MemberChannelTo("app", "string", null, null) + ChannelType.App, + MemberChannelFrom.FromChannels(ChannelType.App), + new MemberChannelToV(ChannelType.App, "string", null, null) )); } diff --git a/Vonage.Test/Conversations/GetMember/Data/ShouldDeserializeInitiatorAdmin-response.json b/Vonage.Test/Conversations/GetMember/Data/ShouldDeserializeInitiatorAdmin-response.json index d6321b82..aff8c8a0 100644 --- a/Vonage.Test/Conversations/GetMember/Data/ShouldDeserializeInitiatorAdmin-response.json +++ b/Vonage.Test/Conversations/GetMember/Data/ShouldDeserializeInitiatorAdmin-response.json @@ -27,7 +27,7 @@ "channel": { "type": "app", "from": { - "type": "string" + "type": "app" }, "to": { "type": "app", diff --git a/Vonage.Test/Conversations/GetMember/Data/ShouldDeserializeMMS-response.json b/Vonage.Test/Conversations/GetMember/Data/ShouldDeserializeMMS-response.json index 37189a30..ffdfa004 100644 --- a/Vonage.Test/Conversations/GetMember/Data/ShouldDeserializeMMS-response.json +++ b/Vonage.Test/Conversations/GetMember/Data/ShouldDeserializeMMS-response.json @@ -32,6 +32,7 @@ "type": "mms" }, "to": { + "type": "mms", "number": "string" } }, diff --git a/Vonage.Test/Conversations/GetMember/Data/ShouldDeserializeMessenger-response.json b/Vonage.Test/Conversations/GetMember/Data/ShouldDeserializeMessenger-response.json index 79b93ba1..3e7173ae 100644 --- a/Vonage.Test/Conversations/GetMember/Data/ShouldDeserializeMessenger-response.json +++ b/Vonage.Test/Conversations/GetMember/Data/ShouldDeserializeMessenger-response.json @@ -32,6 +32,7 @@ "type": "messenger" }, "to": { + "type": "messenger", "id": "app" } }, diff --git a/Vonage.Test/Conversations/GetMember/Data/ShouldDeserializeViber-response.json b/Vonage.Test/Conversations/GetMember/Data/ShouldDeserializeViber-response.json index 42763e70..0c8e3c14 100644 --- a/Vonage.Test/Conversations/GetMember/Data/ShouldDeserializeViber-response.json +++ b/Vonage.Test/Conversations/GetMember/Data/ShouldDeserializeViber-response.json @@ -32,6 +32,7 @@ "type": "viber" }, "to": { + "type": "viber", "id": "app" } }, diff --git a/Vonage.Test/Conversations/GetMember/Data/ShouldDeserializeWhatsApp-response.json b/Vonage.Test/Conversations/GetMember/Data/ShouldDeserializeWhatsApp-response.json index 2c1614bf..9f397d13 100644 --- a/Vonage.Test/Conversations/GetMember/Data/ShouldDeserializeWhatsApp-response.json +++ b/Vonage.Test/Conversations/GetMember/Data/ShouldDeserializeWhatsApp-response.json @@ -32,6 +32,7 @@ "type": "whatsapp" }, "to": { + "type": "whatsapp", "number": "string" } }, diff --git a/Vonage.Test/Conversations/GetMember/SerializationTest.cs b/Vonage.Test/Conversations/GetMember/SerializationTest.cs index b80f564e..70591a21 100644 --- a/Vonage.Test/Conversations/GetMember/SerializationTest.cs +++ b/Vonage.Test/Conversations/GetMember/SerializationTest.cs @@ -73,9 +73,9 @@ internal static void VerifyAppResponse(Member response) null )); response.Channel.Should().Be(new MemberChannel( - "app", - new MemberChannelFrom("app"), - new MemberChannelTo("app", "string", null, null) + ChannelType.App, + MemberChannelFrom.FromChannels(ChannelType.App), + new MemberChannelToV(ChannelType.App, "string", null, null) )); } @@ -88,9 +88,9 @@ internal static void VerifyMessengerResponse(Member response) null )); response.Channel.Should().Be(new MemberChannel( - "messenger", - new MemberChannelFrom("messenger"), - new MemberChannelTo(null, null, null, "app") + ChannelType.Messenger, + MemberChannelFrom.FromChannels(ChannelType.Messenger), + new MemberChannelToV(ChannelType.Messenger, null, null, "app") )); } @@ -103,9 +103,9 @@ internal static void VerifyViberResponse(Member response) null )); response.Channel.Should().Be(new MemberChannel( - "viber", - new MemberChannelFrom("viber"), - new MemberChannelTo(null, null, null, "app") + ChannelType.Viber, + MemberChannelFrom.FromChannels(ChannelType.Viber), + new MemberChannelToV(ChannelType.Viber, null, null, "app") )); } @@ -118,9 +118,9 @@ internal static void VerifyMMSResponse(Member response) null )); response.Channel.Should().Be(new MemberChannel( - "mms", - new MemberChannelFrom("mms"), - new MemberChannelTo(null, null, "string", null) + ChannelType.Mms, + MemberChannelFrom.FromChannels(ChannelType.Mms), + new MemberChannelToV(ChannelType.Mms, null, "string", null) )); } @@ -133,9 +133,9 @@ internal static void VerifyWhatsAppResponse(Member response) null )); response.Channel.Should().Be(new MemberChannel( - "whatsapp", - new MemberChannelFrom("whatsapp"), - new MemberChannelTo(null, null, "string", null) + ChannelType.Whatsapp, + MemberChannelFrom.FromChannels(ChannelType.Whatsapp), + new MemberChannelToV(ChannelType.Whatsapp, null, "string", null) )); } @@ -148,9 +148,9 @@ internal static void VerifyPhoneResponse(Member response) null )); response.Channel.Should().Be(new MemberChannel( - "phone", - new MemberChannelFrom("phone"), - new MemberChannelTo("phone", null, "string", null) + ChannelType.Phone, + MemberChannelFrom.FromChannels(ChannelType.Phone), + new MemberChannelToV(ChannelType.Phone, null, "string", null) )); } @@ -163,9 +163,9 @@ internal static void VerifySMSResponse(Member response) null )); response.Channel.Should().Be(new MemberChannel( - "sms", - new MemberChannelFrom("sms"), - new MemberChannelTo("sms", null, "string", null) + ChannelType.Sms, + MemberChannelFrom.FromChannels(ChannelType.Sms), + new MemberChannelToV(ChannelType.Sms, null, "string", null) )); } @@ -177,9 +177,9 @@ internal static void VerifyInitiatorAdminResponse(Member response) new MemberInitiatorInvited(true) )); response.Channel.Should().Be(new MemberChannel( - "app", - new MemberChannelFrom("string"), - new MemberChannelTo("app", "string", null, null) + ChannelType.App, + MemberChannelFrom.FromChannels(ChannelType.App), + new MemberChannelToV(ChannelType.App, "string", null, null) )); } diff --git a/Vonage/Conversations/CreateMember/CreateMemberRequest.cs b/Vonage/Conversations/CreateMember/CreateMemberRequest.cs index eb7f2b1e..0b717607 100644 --- a/Vonage/Conversations/CreateMember/CreateMemberRequest.cs +++ b/Vonage/Conversations/CreateMember/CreateMemberRequest.cs @@ -43,28 +43,52 @@ public HttpRequestMessage BuildRequestMessage() => VonageRequestBuilder /// The builder. public static IBuilderForConversationId Build() => new CreateMemberRequestBuilder(); + /// + /// Invite or join a member to a conversation + /// [JsonConverter(typeof(EnumDescriptionJsonConverter))] [JsonPropertyOrder(0)] public AvailableStates State { get; internal init; } - [JsonIgnore] public string ConversationId { get; internal init; } + /// + /// + [JsonIgnore] + public string ConversationId { get; internal init; } - [JsonPropertyOrder(1)] public MemberUser User { get; internal init; } + /// + /// Either the user id or name is required. + /// + [JsonPropertyOrder(1)] + public MemberUser User { get; internal init; } - [JsonPropertyOrder(2)] public MemberChannelV2 Channel { get; internal init; } + /// + /// + [JsonPropertyOrder(2)] + public MemberChannel Channel { get; internal init; } + /// + /// Knocker ID. A knocker is a pre-member of a conversation who does not exist yet + /// [JsonConverter(typeof(MaybeJsonConverter))] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] public Maybe KnockingId { get; internal init; } + /// + /// Member ID of the member that sends the invitation + /// [JsonConverter(typeof(MaybeJsonConverter))] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] public Maybe InvitingMemberId { get; internal init; } + /// + /// [JsonConverter(typeof(MaybeJsonConverter))] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] public Maybe From { get; internal init; } + /// + /// Details about the current media setting states + /// [JsonConverter(typeof(MaybeJsonConverter))] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] public Maybe Media { get; internal init; } @@ -74,4 +98,9 @@ private StringContent GetRequestContent() => "application/json"); } +/// +/// Represents a user +/// +/// User ID +/// Unique name for a user public record MemberUser(string Id, string Name); \ No newline at end of file diff --git a/Vonage/Conversations/CreateMember/CreateMemberRequestBuilder.cs b/Vonage/Conversations/CreateMember/CreateMemberRequestBuilder.cs index 9a566937..188b9b02 100644 --- a/Vonage/Conversations/CreateMember/CreateMemberRequestBuilder.cs +++ b/Vonage/Conversations/CreateMember/CreateMemberRequestBuilder.cs @@ -12,7 +12,7 @@ internal struct CreateMemberRequestBuilder : IBuilderForOptional { private string conversationId; - private MemberChannelV2 channel; + private MemberChannel channel; private MemberMedia media; private string from; private string knockingId; @@ -23,56 +23,56 @@ internal struct CreateMemberRequestBuilder : public IBuilderForOptional WithApp(string userId, params ChannelType[] types) => this with { - channel = new MemberChannelV2(ChannelType.App, - new MemberChannelFromV2(types), - new MemberChannelToV2(ChannelType.App, userId, Maybe.None, Maybe.None)), + channel = new MemberChannel(ChannelType.App, + MemberChannelFrom.FromChannels(types), + new MemberChannelToV(ChannelType.App, userId, Maybe.None, Maybe.None)), }; public IBuilderForOptional WithPhone(string number, params ChannelType[] types) => this with { - channel = new MemberChannelV2(ChannelType.Phone, - new MemberChannelFromV2(types), - new MemberChannelToV2(ChannelType.Phone, Maybe.None, number, Maybe.None)), + channel = new MemberChannel(ChannelType.Phone, + MemberChannelFrom.FromChannels(types), + new MemberChannelToV(ChannelType.Phone, Maybe.None, number, Maybe.None)), }; public IBuilderForOptional WithSms(string number, params ChannelType[] types) => this with { - channel = new MemberChannelV2(ChannelType.Sms, - new MemberChannelFromV2(types), - new MemberChannelToV2(ChannelType.Sms, Maybe.None, number, Maybe.None)), + channel = new MemberChannel(ChannelType.Sms, + MemberChannelFrom.FromChannels(types), + new MemberChannelToV(ChannelType.Sms, Maybe.None, number, Maybe.None)), }; public IBuilderForOptional WithMms(string number, params ChannelType[] types) => this with { - channel = new MemberChannelV2(ChannelType.Mms, - new MemberChannelFromV2(types), - new MemberChannelToV2(ChannelType.Mms, Maybe.None, number, Maybe.None)), + channel = new MemberChannel(ChannelType.Mms, + MemberChannelFrom.FromChannels(types), + new MemberChannelToV(ChannelType.Mms, Maybe.None, number, Maybe.None)), }; public IBuilderForOptional WithWhatsApp(string number, params ChannelType[] types) => this with { - channel = new MemberChannelV2(ChannelType.Whatsapp, - new MemberChannelFromV2(types), - new MemberChannelToV2(ChannelType.Whatsapp, Maybe.None, number, Maybe.None)), + channel = new MemberChannel(ChannelType.Whatsapp, + MemberChannelFrom.FromChannels(types), + new MemberChannelToV(ChannelType.Whatsapp, Maybe.None, number, Maybe.None)), }; public IBuilderForOptional WithViber(string id, params ChannelType[] types) => this with { - channel = new MemberChannelV2(ChannelType.Viber, - new MemberChannelFromV2(types), - new MemberChannelToV2(ChannelType.Viber, Maybe.None, Maybe.None, id)), + channel = new MemberChannel(ChannelType.Viber, + MemberChannelFrom.FromChannels(types), + new MemberChannelToV(ChannelType.Viber, Maybe.None, Maybe.None, id)), }; public IBuilderForOptional WithMessenger(string id, params ChannelType[] types) => this with { - channel = new MemberChannelV2(ChannelType.Messenger, - new MemberChannelFromV2(types), - new MemberChannelToV2(ChannelType.Messenger, Maybe.None, Maybe.None, id)), + channel = new MemberChannel(ChannelType.Messenger, + MemberChannelFrom.FromChannels(types), + new MemberChannelToV(ChannelType.Messenger, Maybe.None, Maybe.None, id)), }; public IBuilderForState WithConversationId(string value) => this with {conversationId = value}; @@ -98,7 +98,7 @@ private static Result VerifyUser(CreateMemberRequest reques InputValidation.VerifyNotNull(request, request.User, nameof(request.User)); private static Result VerifyChannelTypes(CreateMemberRequest request) => - InputValidation.VerifyNotEmpty(request, request.Channel.From.Channels, nameof(request.Channel.From.Channels)); + InputValidation.VerifyNotEmpty(request, request.Channel.From.Type, nameof(request.Channel.From.Type)); public IBuilderForOptional WithMedia(MemberMedia value) => this with {media = value}; diff --git a/Vonage/Conversations/Member.cs b/Vonage/Conversations/Member.cs index 78456018..06db5a0a 100644 --- a/Vonage/Conversations/Member.cs +++ b/Vonage/Conversations/Member.cs @@ -82,37 +82,30 @@ public enum ChannelType /// The channel type. /// Which channel types this member accepts messages from (if not set, all are accepted) /// Settings which control who this member can send messages to. -public record MemberChannel(string Type, MemberChannelFrom From, MemberChannelTo To); - -/// -/// Represents the source channel. -/// -/// -/// Comma separated list, can include channel types app, phone, sms, mms, whatsapp , viber, or -/// messenger. -/// -public record MemberChannelFrom(string Type); - -/// -/// Represents a channel. -/// -/// The channel type. -/// Which channel types this member accepts messages from (if not set, all are accepted) -/// Settings which control who this member can send messages to. -public record MemberChannelV2( +public record MemberChannel( [property: JsonConverter(typeof(EnumDescriptionJsonConverter))] ChannelType Type, - MemberChannelFromV2 From, - MemberChannelToV2 To); + MemberChannelFrom From, + MemberChannelToV To); /// /// Represents the source channel. /// /// Contains channel types -public record MemberChannelFromV2( - [property: JsonIgnore] params ChannelType[] Channels) +public struct MemberChannelFrom { - public string Type => string.Join(",", this.Channels.Select(channel => channel.AsString(EnumFormat.Description))); + /// + /// + /// + /// + public static MemberChannelFrom FromChannels(params ChannelType[] channels) => new MemberChannelFrom + { + Type = string.Join(",", channels.Select(channel => channel.AsString(EnumFormat.Description))), + }; + + /// + /// + public string Type { get; set; } }; /// @@ -122,7 +115,7 @@ public record MemberChannelFromV2( /// The user ID of the member that this member can send messages to. /// The phone number of the member that this member can send messages to. /// The Id. -public record MemberChannelToV2( +public record MemberChannelToV( [property: JsonConverter(typeof(MaybeJsonConverter))] [property: JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] Maybe Type, @@ -136,15 +129,6 @@ public record MemberChannelToV2( [property: JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] Maybe Id); -/// -/// Represents the destination channel. -/// -/// The channel type. -/// The user ID of the member that this member can send messages to. -/// The phone number of the member that this member can send messages to. -/// The Id. -public record MemberChannelTo(string Type, string User, string Number, string Id); - /// /// Represents the member timestamps. ///