Skip to content

Commit

Permalink
Merge pull request #247 from Vonage/feature/detail-status-webhooks
Browse files Browse the repository at this point in the history
adding detail to status-webhooks
  • Loading branch information
slorello89 authored Mar 9, 2021
2 parents 71440cb + a4e3c48 commit 9266a31
Show file tree
Hide file tree
Showing 3 changed files with 135 additions and 1 deletion.
59 changes: 58 additions & 1 deletion Vonage.Test.Unit/WebhookStructsTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,11 +59,68 @@ public void TestCallStatusEvent(string type)
Assert.Equal("aaaaaaaa-bbbb-cccc-dddd-0123456789ab", callStatusWebhook.Uuid);
Assert.Equal("CON-aaaaaaaa-bbbb-cccc-dddd-0123456789ab", callStatusWebhook.ConversationUuid);
Assert.Equal(type, callStatusWebhook.Status);
Assert.Equal(DetailedStatus.no_detail, callStatusWebhook.Detail);
Assert.Null(callStatusWebhook.DetailString);
Assert.Equal(Direction.outbound, callStatusWebhook.Direction);
Assert.Equal(DateTime.ParseExact("2020-01-01T12:00:00.000Z", "yyyy-MM-dd'T'HH:mm:ss.fff'Z'", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal |
DateTimeStyles.AdjustToUniversal), (callStatusWebhook.TimeStamp));
}


[Fact]
public void TestCallStatusEventWithDetail()
{
var json = @"
{
""from"":""442079460000"",
""to"":""447700900000"",
""uuid"":""aaaaaaaa-bbbb-cccc-dddd-0123456789ab"",
""conversation_uuid"":""CON-aaaaaaaa-bbbb-cccc-dddd-0123456789ab"",
""status"":""rejected"",
""direction"":""outbound"",
""timestamp"":""2020-01-01T12:00:00.000Z"",
""detail"":""restricted""
}";
var callStatusWebhook = (CallStatusEvent)EventBase.ParseEvent(json);

Assert.Equal("442079460000", callStatusWebhook.From);
Assert.Equal("447700900000", callStatusWebhook.To);
Assert.Equal("aaaaaaaa-bbbb-cccc-dddd-0123456789ab", callStatusWebhook.Uuid);
Assert.Equal("CON-aaaaaaaa-bbbb-cccc-dddd-0123456789ab", callStatusWebhook.ConversationUuid);
Assert.Equal("rejected", callStatusWebhook.Status);
Assert.Equal(DetailedStatus.restricted, callStatusWebhook.Detail);
Assert.Equal(Direction.outbound, callStatusWebhook.Direction);
Assert.Equal(DateTime.ParseExact("2020-01-01T12:00:00.000Z", "yyyy-MM-dd'T'HH:mm:ss.fff'Z'", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal |
DateTimeStyles.AdjustToUniversal), (callStatusWebhook.TimeStamp));
}

[Fact]
public void TestCallbackStatusEventWithUnenumeratedDetail()
{
var json = @"
{
""from"":""442079460000"",
""to"":""447700900000"",
""uuid"":""aaaaaaaa-bbbb-cccc-dddd-0123456789ab"",
""conversation_uuid"":""CON-aaaaaaaa-bbbb-cccc-dddd-0123456789ab"",
""status"":""rejected"",
""direction"":""outbound"",
""timestamp"":""2020-01-01T12:00:00.000Z"",
""detail"":""as-yet-unknown-detail""
}";
var callStatusWebhook = (CallStatusEvent)EventBase.ParseEvent(json);

Assert.Equal("442079460000", callStatusWebhook.From);
Assert.Equal("447700900000", callStatusWebhook.To);
Assert.Equal("aaaaaaaa-bbbb-cccc-dddd-0123456789ab", callStatusWebhook.Uuid);
Assert.Equal("CON-aaaaaaaa-bbbb-cccc-dddd-0123456789ab", callStatusWebhook.ConversationUuid);
Assert.Equal("rejected", callStatusWebhook.Status);
Assert.Equal(DetailedStatus.unmapped_detail, callStatusWebhook.Detail);
Assert.Equal("as-yet-unknown-detail", callStatusWebhook.DetailString);
Assert.Equal(Direction.outbound, callStatusWebhook.Direction);
Assert.Equal(DateTime.ParseExact("2020-01-01T12:00:00.000Z", "yyyy-MM-dd'T'HH:mm:ss.fff'Z'", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal |
DateTimeStyles.AdjustToUniversal), (callStatusWebhook.TimeStamp));
}

[Theory]
[InlineData("human")]
[InlineData("machine")]
Expand Down
27 changes: 27 additions & 0 deletions Vonage/Voice/EventWebhooks/CallStatusEvent.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;

namespace Vonage.Voice.EventWebhooks
{
Expand Down Expand Up @@ -35,5 +36,31 @@ public class CallStatusEvent : Event
[JsonProperty("direction")]
[JsonConverter(typeof(StringEnumConverter))]
public Direction Direction { get; set; }

/// <summary>
/// Extra detail for the status webhook - only present in some instances
/// </summary>
[JsonIgnore]
public DetailedStatus Detail {
get
{
DetailedStatus detail;
if (string.IsNullOrEmpty(DetailString))
{
return DetailedStatus.no_detail;
}
if (Enum.TryParse(DetailString, out detail))
{
return detail;
}
else
{
return DetailedStatus.unmapped_detail;
}
}
}

[JsonProperty("detail")]
public string DetailString { get; set; }
}
}
50 changes: 50 additions & 0 deletions Vonage/Voice/EventWebhooks/DetailedStatus.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace Vonage.Voice.EventWebhooks
{
public enum DetailedStatus
{
/// <summary>
/// no detail provided
/// </summary>
no_detail,
/// <summary>
/// detail provided but not mapped to an enum
/// </summary>
unmapped_detail,
/// <summary>
/// number invalid
/// </summary>
invalid_number,
/// <summary>
/// Rejected by carrier
/// </summary>
restricted,
/// <summary>
/// rejected by callee
/// </summary>
declined,
/// <summary>
/// cannot route to the number
/// </summary>
cannot_route,
/// <summary>
/// Number is not available anymore.
/// </summary>
number_out_of_service,
/// <summary>
/// Server error or failure
/// </summary>
internal_error,
/// <summary>
/// Carrier timed out
/// </summary>
carrier_timeout,
/// <summary>
/// Callee is temorarily unavailable.
/// </summary>
unavailable
}
}

0 comments on commit 9266a31

Please # to comment.