Corrected api-docs for channel variables
authorDavid M. Lee <dlee@digium.com>
Wed, 10 Jul 2013 13:50:48 +0000 (13:50 +0000)
committerDavid M. Lee <dlee@digium.com>
Wed, 10 Jul 2013 13:50:48 +0000 (13:50 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@393968 65c4cc65-6c06-0410-ace0-fbb531ad65f3

res/res_stasis_http_asterisk.c
res/res_stasis_http_channels.c
res/stasis_http/ari_model_validators.c
res/stasis_http/ari_model_validators.h
rest-api/api-docs/asterisk.json
rest-api/api-docs/channels.json

index c0ff660..3c03565 100644 (file)
@@ -106,9 +106,14 @@ static void stasis_http_get_asterisk_info_cb(
  * \param[out] response Response to the HTTP request.
  */
 static void stasis_http_get_global_var_cb(
-    struct ast_variable *get_params, struct ast_variable *path_vars,
-    struct ast_variable *headers, struct stasis_http_response *response)
+       struct ast_variable *get_params, struct ast_variable *path_vars,
+       struct ast_variable *headers, struct stasis_http_response *response)
 {
+#if defined(AST_DEVMODE)
+       int is_valid;
+       int code;
+#endif /* AST_DEVMODE */
+
        struct ast_get_global_var_args args = {};
        struct ast_variable *i;
 
@@ -119,6 +124,29 @@ static void stasis_http_get_global_var_cb(
                {}
        }
        stasis_http_get_global_var(headers, &args, response);
+#if defined(AST_DEVMODE)
+       code = response->response_code;
+
+       switch (code) {
+       case 500: /* Internal server error */
+               is_valid = 1;
+               break;
+       default:
+               if (200 <= code && code <= 299) {
+                       is_valid = ari_validate_variable(
+                               response->message);
+               } else {
+                       ast_log(LOG_ERROR, "Invalid error response %d for /asterisk/variable\n", code);
+                       is_valid = 0;
+               }
+       }
+
+       if (!is_valid) {
+               ast_log(LOG_ERROR, "Response validation failed for /asterisk/variable\n");
+               stasis_http_response_error(response, 500,
+                       "Internal Server Error", "Response validation failed");
+       }
+#endif /* AST_DEVMODE */
 }
 /*!
  * \brief Parameter parsing callback for /asterisk/variable.
@@ -128,9 +156,14 @@ static void stasis_http_get_global_var_cb(
  * \param[out] response Response to the HTTP request.
  */
 static void stasis_http_set_global_var_cb(
-    struct ast_variable *get_params, struct ast_variable *path_vars,
-    struct ast_variable *headers, struct stasis_http_response *response)
+       struct ast_variable *get_params, struct ast_variable *path_vars,
+       struct ast_variable *headers, struct stasis_http_response *response)
 {
+#if defined(AST_DEVMODE)
+       int is_valid;
+       int code;
+#endif /* AST_DEVMODE */
+
        struct ast_set_global_var_args args = {};
        struct ast_variable *i;
 
@@ -144,6 +177,29 @@ static void stasis_http_set_global_var_cb(
                {}
        }
        stasis_http_set_global_var(headers, &args, response);
+#if defined(AST_DEVMODE)
+       code = response->response_code;
+
+       switch (code) {
+       case 500: /* Internal server error */
+               is_valid = 1;
+               break;
+       default:
+               if (200 <= code && code <= 299) {
+                       is_valid = ari_validate_void(
+                               response->message);
+               } else {
+                       ast_log(LOG_ERROR, "Invalid error response %d for /asterisk/variable\n", code);
+                       is_valid = 0;
+               }
+       }
+
+       if (!is_valid) {
+               ast_log(LOG_ERROR, "Response validation failed for /asterisk/variable\n");
+               stasis_http_response_error(response, 500,
+                       "Internal Server Error", "Response validation failed");
+       }
+#endif /* AST_DEVMODE */
 }
 
 /*! \brief REST handler for /api-docs/asterisk.{format} */
index a3d2932..5c150df 100644 (file)
@@ -818,9 +818,14 @@ static void stasis_http_record_channel_cb(
  * \param[out] response Response to the HTTP request.
  */
 static void stasis_http_get_channel_var_cb(
-    struct ast_variable *get_params, struct ast_variable *path_vars,
-    struct ast_variable *headers, struct stasis_http_response *response)
+       struct ast_variable *get_params, struct ast_variable *path_vars,
+       struct ast_variable *headers, struct stasis_http_response *response)
 {
+#if defined(AST_DEVMODE)
+       int is_valid;
+       int code;
+#endif /* AST_DEVMODE */
+
        struct ast_get_channel_var_args args = {};
        struct ast_variable *i;
 
@@ -837,6 +842,31 @@ static void stasis_http_get_channel_var_cb(
                {}
        }
        stasis_http_get_channel_var(headers, &args, response);
+#if defined(AST_DEVMODE)
+       code = response->response_code;
+
+       switch (code) {
+       case 500: /* Internal server error */
+       case 404: /* Channel not found */
+       case 409: /* Channel not in a Stasis application */
+               is_valid = 1;
+               break;
+       default:
+               if (200 <= code && code <= 299) {
+                       is_valid = ari_validate_variable(
+                               response->message);
+               } else {
+                       ast_log(LOG_ERROR, "Invalid error response %d for /channels/{channelId}/variable\n", code);
+                       is_valid = 0;
+               }
+       }
+
+       if (!is_valid) {
+               ast_log(LOG_ERROR, "Response validation failed for /channels/{channelId}/variable\n");
+               stasis_http_response_error(response, 500,
+                       "Internal Server Error", "Response validation failed");
+       }
+#endif /* AST_DEVMODE */
 }
 /*!
  * \brief Parameter parsing callback for /channels/{channelId}/variable.
@@ -846,9 +876,14 @@ static void stasis_http_get_channel_var_cb(
  * \param[out] response Response to the HTTP request.
  */
 static void stasis_http_set_channel_var_cb(
-    struct ast_variable *get_params, struct ast_variable *path_vars,
-    struct ast_variable *headers, struct stasis_http_response *response)
+       struct ast_variable *get_params, struct ast_variable *path_vars,
+       struct ast_variable *headers, struct stasis_http_response *response)
 {
+#if defined(AST_DEVMODE)
+       int is_valid;
+       int code;
+#endif /* AST_DEVMODE */
+
        struct ast_set_channel_var_args args = {};
        struct ast_variable *i;
 
@@ -868,6 +903,31 @@ static void stasis_http_set_channel_var_cb(
                {}
        }
        stasis_http_set_channel_var(headers, &args, response);
+#if defined(AST_DEVMODE)
+       code = response->response_code;
+
+       switch (code) {
+       case 500: /* Internal server error */
+       case 404: /* Channel not found */
+       case 409: /* Channel not in a Stasis application */
+               is_valid = 1;
+               break;
+       default:
+               if (200 <= code && code <= 299) {
+                       is_valid = ari_validate_void(
+                               response->message);
+               } else {
+                       ast_log(LOG_ERROR, "Invalid error response %d for /channels/{channelId}/variable\n", code);
+                       is_valid = 0;
+               }
+       }
+
+       if (!is_valid) {
+               ast_log(LOG_ERROR, "Response validation failed for /channels/{channelId}/variable\n");
+               stasis_http_response_error(response, 500,
+                       "Internal Server Error", "Response validation failed");
+       }
+#endif /* AST_DEVMODE */
 }
 
 /*! \brief REST handler for /api-docs/channels.{format} */
index 14b5d69..bf3c0e7 100644 (file)
@@ -57,6 +57,44 @@ ari_validator ari_validate_asterisk_info_fn(void)
        return ari_validate_asterisk_info;
 }
 
+int ari_validate_variable(struct ast_json *json)
+{
+       int res = 1;
+       struct ast_json_iter *iter;
+       int has_value = 0;
+
+       for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+               if (strcmp("value", ast_json_object_iter_key(iter)) == 0) {
+                       int prop_is_valid;
+                       has_value = 1;
+                       prop_is_valid = ari_validate_string(
+                               ast_json_object_iter_value(iter));
+                       if (!prop_is_valid) {
+                               ast_log(LOG_ERROR, "ARI Variable field value failed validation\n");
+                               res = 0;
+                       }
+               } else
+               {
+                       ast_log(LOG_ERROR,
+                               "ARI Variable has undocumented field %s\n",
+                               ast_json_object_iter_key(iter));
+                       res = 0;
+               }
+       }
+
+       if (!has_value) {
+               ast_log(LOG_ERROR, "ARI Variable missing required field value\n");
+               res = 0;
+       }
+
+       return res;
+}
+
+ari_validator ari_validate_variable_fn(void)
+{
+       return ari_validate_variable;
+}
+
 int ari_validate_endpoint(struct ast_json *json)
 {
        int res = 1;
index ee3d093..2f64186 100644 (file)
@@ -162,6 +162,24 @@ int ari_validate_asterisk_info(struct ast_json *json);
 ari_validator ari_validate_asterisk_info_fn(void);
 
 /*!
+ * \brief Validator for Variable.
+ *
+ * The value of a channel variable
+ *
+ * \param json JSON object to validate.
+ * \returns True (non-zero) if valid.
+ * \returns False (zero) if invalid.
+ */
+int ari_validate_variable(struct ast_json *json);
+
+/*!
+ * \brief Function pointer to ari_validate_variable().
+ *
+ * See \ref ari_model_validators.h for more details.
+ */
+ari_validator ari_validate_variable_fn(void);
+
+/*!
  * \brief Validator for Endpoint.
  *
  * An external device that may offer/accept calls to/from Asterisk.
@@ -767,6 +785,8 @@ ari_validator ari_validate_stasis_start_fn(void);
  * JSON models
  *
  * AsteriskInfo
+ * Variable
+ * - value: string (required)
  * Endpoint
  * - channel_ids: List[string] (required)
  * - resource: string (required)
index 8c404a0..8bc8874 100644 (file)
@@ -92,8 +92,9 @@
                },
                "Variable": {
                        "id": "Variable",
+                       "description": "The value of a channel variable",
                        "properties": {
-                               "variable": {
+                               "value": {
                                        "required": true,
                                        "type": "string",
                                        "description": "The value of the variable requested"
index a97f225..c442d8e 100644 (file)
                                        "httpMethod": "GET",
                                        "summary": "Get the value of a channel variable or function.",
                                        "nickname": "getChannelVar",
-                                       "responseClass": "ChannelVariable",
+                                       "responseClass": "Variable",
                                        "parameters": [
                                                {
                                                        "name": "channelId",
                                        "description": "Timestamp when channel was created"
                                }
                        }
-               },
-               "Variable": {
-                       "id": "Variable",
-                       "properties": {
-                               "variable": {
-                                       "required": true,
-                                       "type": "string",
-                                       "description": "The value of the variable requested"
-                               }
-                       }
                }
        }
 }