<p>Friendly Automation <strong>merged</strong> this change.</p><p><a href="https://gerrit.asterisk.org/c/asterisk/+/11175">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  George Joseph: Looks good to me, approved
  Friendly Automation: Approved for Submit

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">res/res_ari: Added timestamp as a requirement for all ARI events<br><br>Changed to requirement to having timestamp for all of ARI events.<br>The below ARI events were changed to having timestamp.<br>PlaybackStarted, PlaybackContinuing, PlaybackFinished,<br>RecordingStarted, RecordingFinished, RecordingFailed,<br>ApplicationReplaced, ApplicationMoveFailed<br><br>ASTERISK-28326<br><br>Change-Id: I382c2fef58f5fe107e1074869a6d05310accb41f<br>---<br>M res/ari/ari_model_validators.c<br>M res/ari/ari_model_validators.h<br>M res/res_stasis.c<br>M res/res_stasis_playback.c<br>M res/res_stasis_recording.c<br>M res/stasis/app.c<br>M rest-api/api-docs/events.json<br>M tests/test_res_stasis.c<br>8 files changed, 335 insertions(+), 58 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/res/ari/ari_model_validators.c b/res/ari/ari_model_validators.c</span><br><span>index d5f1885..bc7ac6b 100644</span><br><span>--- a/res/ari/ari_model_validators.c</span><br><span>+++ b/res/ari/ari_model_validators.c</span><br><span>@@ -2171,6 +2171,7 @@</span><br><span>        struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span> </span><br><span>   for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {</span><br><span>                if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {</span><br><span>@@ -2204,6 +2205,7 @@</span><br><span>          } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -2229,6 +2231,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI ApplicationReplaced missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  return res;</span><br><span> }</span><br><span> </span><br><span>@@ -2243,6 +2250,7 @@</span><br><span>         struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_destination_type = 0;</span><br><span>        int has_is_external = 0;</span><br><span>     int has_result = 0;</span><br><span>@@ -2281,6 +2289,7 @@</span><br><span>          } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -2455,6 +2464,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI BridgeAttendedTransfer missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_destination_type) {</span><br><span>                 ast_log(LOG_ERROR, "ARI BridgeAttendedTransfer missing required field destination_type\n");</span><br><span>                res = 0;</span><br><span>@@ -2494,6 +2508,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_channel = 0;</span><br><span>         int has_context = 0;</span><br><span>         int has_exten = 0;</span><br><span>@@ -2532,6 +2547,7 @@</span><br><span>           } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -2634,6 +2650,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI BridgeBlindTransfer missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_channel) {</span><br><span>          ast_log(LOG_ERROR, "ARI BridgeBlindTransfer missing required field channel\n");</span><br><span>            res = 0;</span><br><span>@@ -2673,6 +2694,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_bridge = 0;</span><br><span> </span><br><span>      for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {</span><br><span>@@ -2707,6 +2729,7 @@</span><br><span>                } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -2742,6 +2765,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI BridgeCreated missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_bridge) {</span><br><span>           ast_log(LOG_ERROR, "ARI BridgeCreated missing required field bridge\n");</span><br><span>           res = 0;</span><br><span>@@ -2761,6 +2789,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_bridge = 0;</span><br><span> </span><br><span>      for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {</span><br><span>@@ -2795,6 +2824,7 @@</span><br><span>                } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -2830,6 +2860,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI BridgeDestroyed missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_bridge) {</span><br><span>           ast_log(LOG_ERROR, "ARI BridgeDestroyed missing required field bridge\n");</span><br><span>                 res = 0;</span><br><span>@@ -2849,6 +2884,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_bridge = 0;</span><br><span>  int has_bridge_from = 0;</span><br><span> </span><br><span>@@ -2884,6 +2920,7 @@</span><br><span>                 } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -2929,6 +2966,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI BridgeMerged missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_bridge) {</span><br><span>           ast_log(LOG_ERROR, "ARI BridgeMerged missing required field bridge\n");</span><br><span>            res = 0;</span><br><span>@@ -2953,6 +2995,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_bridge = 0;</span><br><span> </span><br><span>      for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {</span><br><span>@@ -2987,6 +3030,7 @@</span><br><span>                } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -3031,6 +3075,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI BridgeVideoSourceChanged missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_bridge) {</span><br><span>           ast_log(LOG_ERROR, "ARI BridgeVideoSourceChanged missing required field bridge\n");</span><br><span>                res = 0;</span><br><span>@@ -3050,6 +3099,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_caller_presentation = 0;</span><br><span>     int has_caller_presentation_txt = 0;</span><br><span>         int has_channel = 0;</span><br><span>@@ -3086,6 +3136,7 @@</span><br><span>                 } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -3141,6 +3192,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI ChannelCallerId missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_caller_presentation) {</span><br><span>              ast_log(LOG_ERROR, "ARI ChannelCallerId missing required field caller_presentation\n");</span><br><span>            res = 0;</span><br><span>@@ -3170,6 +3226,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_channel = 0;</span><br><span> </span><br><span>     for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {</span><br><span>@@ -3204,6 +3261,7 @@</span><br><span>                } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -3239,6 +3297,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI ChannelConnectedLine missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_channel) {</span><br><span>          ast_log(LOG_ERROR, "ARI ChannelConnectedLine missing required field channel\n");</span><br><span>           res = 0;</span><br><span>@@ -3258,6 +3321,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_channel = 0;</span><br><span> </span><br><span>     for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {</span><br><span>@@ -3292,6 +3356,7 @@</span><br><span>                } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -3327,6 +3392,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI ChannelCreated missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_channel) {</span><br><span>          ast_log(LOG_ERROR, "ARI ChannelCreated missing required field channel\n");</span><br><span>                 res = 0;</span><br><span>@@ -3346,6 +3416,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_cause = 0;</span><br><span>   int has_cause_txt = 0;</span><br><span>       int has_channel = 0;</span><br><span>@@ -3382,6 +3453,7 @@</span><br><span>                 } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -3437,6 +3509,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI ChannelDestroyed missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_cause) {</span><br><span>            ast_log(LOG_ERROR, "ARI ChannelDestroyed missing required field cause\n");</span><br><span>                 res = 0;</span><br><span>@@ -3466,6 +3543,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_channel = 0;</span><br><span>         int has_dialplan_app = 0;</span><br><span>    int has_dialplan_app_data = 0;</span><br><span>@@ -3502,6 +3580,7 @@</span><br><span>               } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -3557,6 +3636,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI ChannelDialplan missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_channel) {</span><br><span>          ast_log(LOG_ERROR, "ARI ChannelDialplan missing required field channel\n");</span><br><span>                res = 0;</span><br><span>@@ -3586,6 +3670,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_channel = 0;</span><br><span>         int has_digit = 0;</span><br><span>   int has_duration_ms = 0;</span><br><span>@@ -3622,6 +3707,7 @@</span><br><span>             } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -3677,6 +3763,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI ChannelDtmfReceived missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_channel) {</span><br><span>          ast_log(LOG_ERROR, "ARI ChannelDtmfReceived missing required field channel\n");</span><br><span>            res = 0;</span><br><span>@@ -3706,6 +3797,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_bridge = 0;</span><br><span> </span><br><span>      for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {</span><br><span>@@ -3740,6 +3832,7 @@</span><br><span>                } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -3784,6 +3877,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI ChannelEnteredBridge missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_bridge) {</span><br><span>           ast_log(LOG_ERROR, "ARI ChannelEnteredBridge missing required field bridge\n");</span><br><span>            res = 0;</span><br><span>@@ -3803,6 +3901,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_channel = 0;</span><br><span> </span><br><span>     for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {</span><br><span>@@ -3837,6 +3936,7 @@</span><br><span>                } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -3890,6 +3990,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI ChannelHangupRequest missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_channel) {</span><br><span>          ast_log(LOG_ERROR, "ARI ChannelHangupRequest missing required field channel\n");</span><br><span>           res = 0;</span><br><span>@@ -3909,6 +4014,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_channel = 0;</span><br><span> </span><br><span>     for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {</span><br><span>@@ -3943,6 +4049,7 @@</span><br><span>                } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -3987,6 +4094,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI ChannelHold missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_channel) {</span><br><span>          ast_log(LOG_ERROR, "ARI ChannelHold missing required field channel\n");</span><br><span>            res = 0;</span><br><span>@@ -4006,6 +4118,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_bridge = 0;</span><br><span>  int has_channel = 0;</span><br><span> </span><br><span>@@ -4041,6 +4154,7 @@</span><br><span>             } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -4086,6 +4200,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI ChannelLeftBridge missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+             res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_bridge) {</span><br><span>           ast_log(LOG_ERROR, "ARI ChannelLeftBridge missing required field bridge\n");</span><br><span>               res = 0;</span><br><span>@@ -4110,6 +4229,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_channel = 0;</span><br><span> </span><br><span>     for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {</span><br><span>@@ -4144,6 +4264,7 @@</span><br><span>                } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -4179,6 +4300,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI ChannelStateChange missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_channel) {</span><br><span>          ast_log(LOG_ERROR, "ARI ChannelStateChange missing required field channel\n");</span><br><span>             res = 0;</span><br><span>@@ -4198,6 +4324,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_channel = 0;</span><br><span>         int has_duration = 0;</span><br><span> </span><br><span>@@ -4233,6 +4360,7 @@</span><br><span>            } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -4278,6 +4406,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI ChannelTalkingFinished missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_channel) {</span><br><span>          ast_log(LOG_ERROR, "ARI ChannelTalkingFinished missing required field channel\n");</span><br><span>                 res = 0;</span><br><span>@@ -4302,6 +4435,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_channel = 0;</span><br><span> </span><br><span>     for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {</span><br><span>@@ -4336,6 +4470,7 @@</span><br><span>                } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -4371,6 +4506,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI ChannelTalkingStarted missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_channel) {</span><br><span>          ast_log(LOG_ERROR, "ARI ChannelTalkingStarted missing required field channel\n");</span><br><span>          res = 0;</span><br><span>@@ -4390,6 +4530,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_channel = 0;</span><br><span> </span><br><span>     for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {</span><br><span>@@ -4424,6 +4565,7 @@</span><br><span>                } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -4459,6 +4601,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI ChannelUnhold missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_channel) {</span><br><span>          ast_log(LOG_ERROR, "ARI ChannelUnhold missing required field channel\n");</span><br><span>          res = 0;</span><br><span>@@ -4478,6 +4625,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_eventname = 0;</span><br><span>       int has_userevent = 0;</span><br><span> </span><br><span>@@ -4513,6 +4661,7 @@</span><br><span>           } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -4585,6 +4734,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI ChannelUserevent missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_eventname) {</span><br><span>                ast_log(LOG_ERROR, "ARI ChannelUserevent missing required field eventname\n");</span><br><span>             res = 0;</span><br><span>@@ -4609,6 +4763,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_value = 0;</span><br><span>   int has_variable = 0;</span><br><span> </span><br><span>@@ -4644,6 +4799,7 @@</span><br><span>            } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -4698,6 +4854,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI ChannelVarset missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_value) {</span><br><span>            ast_log(LOG_ERROR, "ARI ChannelVarset missing required field value\n");</span><br><span>            res = 0;</span><br><span>@@ -4801,6 +4962,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_contact_info = 0;</span><br><span>    int has_endpoint = 0;</span><br><span> </span><br><span>@@ -4836,6 +4998,7 @@</span><br><span>            } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -4881,6 +5044,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI ContactStatusChange missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_contact_info) {</span><br><span>             ast_log(LOG_ERROR, "ARI ContactStatusChange missing required field contact_info\n");</span><br><span>               res = 0;</span><br><span>@@ -4905,6 +5073,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_device_state = 0;</span><br><span> </span><br><span>        for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {</span><br><span>@@ -4939,6 +5108,7 @@</span><br><span>                } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -4974,6 +5144,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI DeviceStateChanged missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_device_state) {</span><br><span>             ast_log(LOG_ERROR, "ARI DeviceStateChanged missing required field device_state\n");</span><br><span>                res = 0;</span><br><span>@@ -4993,6 +5168,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_dialstatus = 0;</span><br><span>      int has_peer = 0;</span><br><span> </span><br><span>@@ -5028,6 +5204,7 @@</span><br><span>                } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -5109,6 +5286,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI Dial missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_dialstatus) {</span><br><span>               ast_log(LOG_ERROR, "ARI Dial missing required field dialstatus\n");</span><br><span>                res = 0;</span><br><span>@@ -5133,6 +5315,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_endpoint = 0;</span><br><span> </span><br><span>    for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {</span><br><span>@@ -5167,6 +5350,7 @@</span><br><span>                } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -5202,6 +5386,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI EndpointStateChange missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_endpoint) {</span><br><span>                 ast_log(LOG_ERROR, "ARI EndpointStateChange missing required field endpoint\n");</span><br><span>           res = 0;</span><br><span>@@ -5221,6 +5410,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       const char *discriminator;</span><br><span> </span><br><span>       discriminator = ast_json_string_get(ast_json_object_get(json, "type"));</span><br><span>@@ -5384,6 +5574,7 @@</span><br><span>            } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -5409,6 +5600,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI Event missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  return res;</span><br><span> }</span><br><span> </span><br><span>@@ -5744,6 +5940,7 @@</span><br><span>         struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_endpoint = 0;</span><br><span>        int has_peer = 0;</span><br><span> </span><br><span>@@ -5779,6 +5976,7 @@</span><br><span>                } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -5824,6 +6022,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI PeerStatusChange missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_endpoint) {</span><br><span>                 ast_log(LOG_ERROR, "ARI PeerStatusChange missing required field endpoint\n");</span><br><span>              res = 0;</span><br><span>@@ -5848,6 +6051,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_playback = 0;</span><br><span> </span><br><span>    for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {</span><br><span>@@ -5882,6 +6086,7 @@</span><br><span>                } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -5917,6 +6122,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI PlaybackContinuing missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_playback) {</span><br><span>                 ast_log(LOG_ERROR, "ARI PlaybackContinuing missing required field playback\n");</span><br><span>            res = 0;</span><br><span>@@ -5936,6 +6146,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_playback = 0;</span><br><span> </span><br><span>    for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {</span><br><span>@@ -5970,6 +6181,7 @@</span><br><span>                } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -6005,6 +6217,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI PlaybackFinished missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_playback) {</span><br><span>                 ast_log(LOG_ERROR, "ARI PlaybackFinished missing required field playback\n");</span><br><span>              res = 0;</span><br><span>@@ -6024,6 +6241,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_playback = 0;</span><br><span> </span><br><span>    for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {</span><br><span>@@ -6058,6 +6276,7 @@</span><br><span>                } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -6093,6 +6312,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI PlaybackStarted missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_playback) {</span><br><span>                 ast_log(LOG_ERROR, "ARI PlaybackStarted missing required field playback\n");</span><br><span>               res = 0;</span><br><span>@@ -6112,6 +6336,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_recording = 0;</span><br><span> </span><br><span>   for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {</span><br><span>@@ -6146,6 +6371,7 @@</span><br><span>                } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -6181,6 +6407,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI RecordingFailed missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_recording) {</span><br><span>                ast_log(LOG_ERROR, "ARI RecordingFailed missing required field recording\n");</span><br><span>              res = 0;</span><br><span>@@ -6200,6 +6431,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_recording = 0;</span><br><span> </span><br><span>   for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {</span><br><span>@@ -6234,6 +6466,7 @@</span><br><span>                } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -6269,6 +6502,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI RecordingFinished missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+             res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_recording) {</span><br><span>                ast_log(LOG_ERROR, "ARI RecordingFinished missing required field recording\n");</span><br><span>            res = 0;</span><br><span>@@ -6288,6 +6526,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_recording = 0;</span><br><span> </span><br><span>   for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {</span><br><span>@@ -6322,6 +6561,7 @@</span><br><span>                } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -6357,6 +6597,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI RecordingStarted missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_recording) {</span><br><span>                ast_log(LOG_ERROR, "ARI RecordingStarted missing required field recording\n");</span><br><span>             res = 0;</span><br><span>@@ -6376,6 +6621,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_channel = 0;</span><br><span> </span><br><span>     for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {</span><br><span>@@ -6410,6 +6656,7 @@</span><br><span>                } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -6445,6 +6692,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI StasisEnd missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+             res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_channel) {</span><br><span>          ast_log(LOG_ERROR, "ARI StasisEnd missing required field channel\n");</span><br><span>              res = 0;</span><br><span>@@ -6464,6 +6716,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_args = 0;</span><br><span>    int has_channel = 0;</span><br><span> </span><br><span>@@ -6499,6 +6752,7 @@</span><br><span>             } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -6554,6 +6808,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI StasisStart missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_args) {</span><br><span>             ast_log(LOG_ERROR, "ARI StasisStart missing required field args\n");</span><br><span>               res = 0;</span><br><span>@@ -6578,6 +6837,7 @@</span><br><span>     struct ast_json_iter *iter;</span><br><span>  int has_type = 0;</span><br><span>    int has_application = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      int has_timestamp = 0;</span><br><span>       int has_message = 0;</span><br><span> </span><br><span>     for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {</span><br><span>@@ -6612,6 +6872,7 @@</span><br><span>                } else</span><br><span>               if (strcmp("timestamp", ast_json_object_iter_key(iter)) == 0) {</span><br><span>                    int prop_is_valid;</span><br><span style="color: hsl(120, 100%, 40%);">+                    has_timestamp = 1;</span><br><span>                   prop_is_valid = ast_ari_validate_date(</span><br><span>                               ast_json_object_iter_value(iter));</span><br><span>                   if (!prop_is_valid) {</span><br><span>@@ -6656,6 +6917,11 @@</span><br><span>               res = 0;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (!has_timestamp) {</span><br><span style="color: hsl(120, 100%, 40%);">+         ast_log(LOG_ERROR, "ARI TextMessageReceived missing required field timestamp\n");</span><br><span style="color: hsl(120, 100%, 40%);">+           res = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!has_message) {</span><br><span>          ast_log(LOG_ERROR, "ARI TextMessageReceived missing required field message\n");</span><br><span>            res = 0;</span><br><span>diff --git a/res/ari/ari_model_validators.h b/res/ari/ari_model_validators.h</span><br><span>index 484f9c1..8fa28bc 100644</span><br><span>--- a/res/ari/ari_model_validators.h</span><br><span>+++ b/res/ari/ari_model_validators.h</span><br><span>@@ -1558,12 +1558,12 @@</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * BridgeAttendedTransfer</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - destination_application: string</span><br><span>  * - destination_bridge: string</span><br><span>  * - destination_link_first_leg: Channel</span><br><span>@@ -1584,7 +1584,7 @@</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - bridge: Bridge</span><br><span>  * - channel: Channel (required)</span><br><span>  * - context: string (required)</span><br><span>@@ -1597,33 +1597,33 @@</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - bridge: Bridge (required)</span><br><span>  * BridgeDestroyed</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - bridge: Bridge (required)</span><br><span>  * BridgeMerged</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - bridge: Bridge (required)</span><br><span>  * - bridge_from: Bridge (required)</span><br><span>  * BridgeVideoSourceChanged</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - bridge: Bridge (required)</span><br><span>  * - old_video_source_id: string</span><br><span>  * ChannelCallerId</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - caller_presentation: int (required)</span><br><span>  * - caller_presentation_txt: string (required)</span><br><span>  * - channel: Channel (required)</span><br><span>@@ -1631,19 +1631,19 @@</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - channel: Channel (required)</span><br><span>  * ChannelCreated</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - channel: Channel (required)</span><br><span>  * ChannelDestroyed</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - cause: int (required)</span><br><span>  * - cause_txt: string (required)</span><br><span>  * - channel: Channel (required)</span><br><span>@@ -1651,7 +1651,7 @@</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - channel: Channel (required)</span><br><span>  * - dialplan_app: string (required)</span><br><span>  * - dialplan_app_data: string (required)</span><br><span>@@ -1659,7 +1659,7 @@</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - channel: Channel (required)</span><br><span>  * - digit: string (required)</span><br><span>  * - duration_ms: int (required)</span><br><span>@@ -1667,14 +1667,14 @@</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - bridge: Bridge (required)</span><br><span>  * - channel: Channel</span><br><span>  * ChannelHangupRequest</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - cause: int</span><br><span>  * - channel: Channel (required)</span><br><span>  * - soft: boolean</span><br><span>@@ -1682,46 +1682,46 @@</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - channel: Channel (required)</span><br><span>  * - musicclass: string</span><br><span>  * ChannelLeftBridge</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - bridge: Bridge (required)</span><br><span>  * - channel: Channel (required)</span><br><span>  * ChannelStateChange</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - channel: Channel (required)</span><br><span>  * ChannelTalkingFinished</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - channel: Channel (required)</span><br><span>  * - duration: int (required)</span><br><span>  * ChannelTalkingStarted</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - channel: Channel (required)</span><br><span>  * ChannelUnhold</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - channel: Channel (required)</span><br><span>  * ChannelUserevent</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - bridge: Bridge</span><br><span>  * - channel: Channel</span><br><span>  * - endpoint: Endpoint</span><br><span>@@ -1731,7 +1731,7 @@</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - channel: Channel</span><br><span>  * - value: string (required)</span><br><span>  * - variable: string (required)</span><br><span>@@ -1744,20 +1744,20 @@</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - contact_info: ContactInfo (required)</span><br><span>  * - endpoint: Endpoint (required)</span><br><span>  * DeviceStateChanged</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - device_state: DeviceState (required)</span><br><span>  * Dial</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - caller: Channel</span><br><span>  * - dialstatus: string (required)</span><br><span>  * - dialstring: string</span><br><span>@@ -1768,13 +1768,13 @@</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - endpoint: Endpoint (required)</span><br><span>  * Event</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * Message</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>@@ -1792,56 +1792,56 @@</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - endpoint: Endpoint (required)</span><br><span>  * - peer: Peer (required)</span><br><span>  * PlaybackContinuing</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - playback: Playback (required)</span><br><span>  * PlaybackFinished</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - playback: Playback (required)</span><br><span>  * PlaybackStarted</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - playback: Playback (required)</span><br><span>  * RecordingFailed</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - recording: LiveRecording (required)</span><br><span>  * RecordingFinished</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - recording: LiveRecording (required)</span><br><span>  * RecordingStarted</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - recording: LiveRecording (required)</span><br><span>  * StasisEnd</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - channel: Channel (required)</span><br><span>  * StasisStart</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - args: List[string] (required)</span><br><span>  * - channel: Channel (required)</span><br><span>  * - replace_channel: Channel</span><br><span>@@ -1849,7 +1849,7 @@</span><br><span>  * - asterisk_id: string</span><br><span>  * - type: string (required)</span><br><span>  * - application: string (required)</span><br><span style="color: hsl(0, 100%, 40%);">- * - timestamp: Date</span><br><span style="color: hsl(120, 100%, 40%);">+ * - timestamp: Date (required)</span><br><span>  * - endpoint: Endpoint</span><br><span>  * - message: TextMessage (required)</span><br><span>  * Application</span><br><span>diff --git a/res/res_stasis.c b/res/res_stasis.c</span><br><span>index 25e2fe9..5cc758c 100644</span><br><span>--- a/res/res_stasis.c</span><br><span>+++ b/res/res_stasis.c</span><br><span>@@ -1470,30 +1470,35 @@</span><br><span>                                   int next_argc = control_next_app_args_size(control);</span><br><span>                                         char **next_argv = control_next_app_args(control);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                                  msg = ast_json_pack("{s: s, s: o, s: s, s: []}",</span><br><span style="color: hsl(120, 100%, 40%);">+                                    msg = ast_json_pack("{s: s, s: o, s: o, s: s, s: []}",</span><br><span>                                             "type", "ApplicationMoveFailed",</span><br><span style="color: hsl(120, 100%, 40%);">+                                          "timestamp", ast_json_timeval(ast_tvnow(), NULL),</span><br><span>                                          "channel", ast_channel_snapshot_to_json(snapshot, NULL),</span><br><span>                                           "destination", control_next_app(control),</span><br><span>                                          "args");</span><br><span style="color: hsl(0, 100%, 40%);">-                                      json_args = ast_json_object_get(msg, "args");</span><br><span style="color: hsl(0, 100%, 40%);">-                                 if (!json_args) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                               ast_log(LOG_ERROR, "Could not get args json array");</span><br><span style="color: hsl(120, 100%, 40%);">+                                        if (!msg) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                           ast_log(LOG_ERROR, "Failed to pack JSON for ApplicationMoveFailed message\n");</span><br><span>                                     } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                int r = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                                              int idx;</span><br><span style="color: hsl(0, 100%, 40%);">-                                                for (idx = 0; idx < next_argc; ++idx) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                      r = ast_json_array_append(json_args,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                            ast_json_string_create(next_argv[idx]));</span><br><span style="color: hsl(0, 100%, 40%);">-                                                        if (r != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                           ast_log(LOG_ERROR, "Error appending to ApplicationMoveFailed message\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                                                             break;</span><br><span style="color: hsl(120, 100%, 40%);">+                                                json_args = ast_json_object_get(msg, "args");</span><br><span style="color: hsl(120, 100%, 40%);">+                                               if (!json_args) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     ast_log(LOG_ERROR, "Could not get args json array");</span><br><span style="color: hsl(120, 100%, 40%);">+                                                } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      int r = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    int idx;</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      for (idx = 0; idx < next_argc; ++idx) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                            r = ast_json_array_append(json_args,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                  ast_json_string_create(next_argv[idx]));</span><br><span style="color: hsl(120, 100%, 40%);">+                                                              if (r != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                 ast_log(LOG_ERROR, "Error appending to ApplicationMoveFailed message\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                   break;</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                }</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     }</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     if (r == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                         app_send(control_app(control), msg);</span><br><span>                                                         }</span><br><span>                                            }</span><br><span style="color: hsl(0, 100%, 40%);">-                                               if (r == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                   app_send(control_app(control), msg);</span><br><span style="color: hsl(0, 100%, 40%);">-                                            }</span><br><span style="color: hsl(120, 100%, 40%);">+                                             ast_json_unref(msg);</span><br><span>                                         }</span><br><span style="color: hsl(0, 100%, 40%);">-                                       ast_json_unref(msg);</span><br><span>                                 }</span><br><span>                    }</span><br><span>                    control_move_cleanup(control);</span><br><span>diff --git a/res/res_stasis_playback.c b/res/res_stasis_playback.c</span><br><span>index 4a8e84d..4a75382 100644</span><br><span>--- a/res/res_stasis_playback.c</span><br><span>+++ b/res/res_stasis_playback.c</span><br><span>@@ -111,8 +111,9 @@</span><br><span>                return NULL;</span><br><span>         }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   return ast_json_pack("{s: s, s: O}",</span><br><span style="color: hsl(120, 100%, 40%);">+        return ast_json_pack("{s: s, s: o?, s: O}",</span><br><span>                "type", type,</span><br><span style="color: hsl(120, 100%, 40%);">+               "timestamp", ast_json_timeval(*stasis_message_timestamp(message), NULL),</span><br><span>           "playback", blob);</span><br><span> }</span><br><span> </span><br><span>diff --git a/res/res_stasis_recording.c b/res/res_stasis_recording.c</span><br><span>index 4077fc8..0ab50e4d 100644</span><br><span>--- a/res/res_stasis_recording.c</span><br><span>+++ b/res/res_stasis_recording.c</span><br><span>@@ -89,8 +89,9 @@</span><br><span>              return NULL;</span><br><span>         }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   return ast_json_pack("{s: s, s: O}",</span><br><span style="color: hsl(120, 100%, 40%);">+        return ast_json_pack("{s: s, s: o?, s: O}",</span><br><span>                "type", type,</span><br><span style="color: hsl(120, 100%, 40%);">+               "timestamp", ast_json_timeval(*stasis_message_timestamp(message), NULL),</span><br><span>           "recording", blob);</span><br><span> }</span><br><span> </span><br><span>diff --git a/res/stasis/app.c b/res/stasis/app.c</span><br><span>index eee60ef..859c3d1 100644</span><br><span>--- a/res/stasis/app.c</span><br><span>+++ b/res/stasis/app.c</span><br><span>@@ -1161,8 +1161,9 @@</span><br><span> </span><br><span>              ast_verb(1, "Replacing Stasis app '%s'\n", app->name);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-         msg = ast_json_pack("{s: s, s: s}",</span><br><span style="color: hsl(120, 100%, 40%);">+         msg = ast_json_pack("{s: s, s: o?, s: s}",</span><br><span>                         "type", "ApplicationReplaced",</span><br><span style="color: hsl(120, 100%, 40%);">+                    "timestamp", ast_json_timeval(ast_tvnow(), NULL),</span><br><span>                  "application", app->name);</span><br><span>              if (msg) {</span><br><span>                   app_send(app, msg);</span><br><span>diff --git a/rest-api/api-docs/events.json b/rest-api/api-docs/events.json</span><br><span>index c9f4b6a..c9822f6 100644</span><br><span>--- a/rest-api/api-docs/events.json</span><br><span>+++ b/rest-api/api-docs/events.json</span><br><span>@@ -148,7 +148,7 @@</span><br><span>                           "timestamp": {</span><br><span>                                     "type": "Date",</span><br><span>                                  "description": "Time at which this event was created.",</span><br><span style="color: hsl(0, 100%, 40%);">-                                     "required": false</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "required": true</span><br><span>                           }</span><br><span>                    },</span><br><span>                   "subTypes": [</span><br><span>diff --git a/tests/test_res_stasis.c b/tests/test_res_stasis.c</span><br><span>index 1d90a28..1727107 100644</span><br><span>--- a/tests/test_res_stasis.c</span><br><span>+++ b/tests/test_res_stasis.c</span><br><span>@@ -167,7 +167,10 @@</span><br><span>      res = stasis_app_send(app_name, message);</span><br><span>    ast_test_validate(test, 0 == res);</span><br><span>   ast_test_validate(test, 1 == app_data1->invocations);</span><br><span style="color: hsl(120, 100%, 40%);">+      ast_test_validate(test, ast_json_object_get(ast_json_array_get(app_data1->messages, 0), "timestamp")? 1: 0);</span><br><span style="color: hsl(120, 100%, 40%);">+     ast_json_object_del(ast_json_array_get(app_data1->messages, 0), "timestamp");</span><br><span>   ast_test_validate(test, ast_json_equal(expected_message1, app_data1->messages));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>        ast_test_validate(test, 1 == app_data2->invocations);</span><br><span>     ast_test_validate(test, ast_json_equal(expected_message2, app_data2->messages));</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/c/asterisk/+/11175">change 11175</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/c/asterisk/+/11175"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: 16 </div>
<div style="display:none"> Gerrit-Change-Id: I382c2fef58f5fe107e1074869a6d05310accb41f </div>
<div style="display:none"> Gerrit-Change-Number: 11175 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: sungtae kim <pchero21@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Friendly Automation </div>
<div style="display:none"> Gerrit-Reviewer: George Joseph <gjoseph@digium.com> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>