diff options
Diffstat (limited to 'res/ari')
-rw-r--r-- | res/ari/ari_model_validators.c | 45 | ||||
-rw-r--r-- | res/ari/ari_model_validators.h | 6 | ||||
-rw-r--r-- | res/ari/resource_recordings.c | 110 | ||||
-rw-r--r-- | res/ari/resource_recordings.h | 11 |
4 files changed, 115 insertions, 57 deletions
diff --git a/res/ari/ari_model_validators.c b/res/ari/ari_model_validators.c index 6932cf5ac..0905642c8 100644 --- a/res/ari/ari_model_validators.c +++ b/res/ari/ari_model_validators.c @@ -1061,46 +1061,27 @@ int ast_ari_validate_stored_recording(struct ast_json *json) { int res = 1; struct ast_json_iter *iter; - int has_formats = 0; - int has_id = 0; + int has_format = 0; + int has_name = 0; for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) { - if (strcmp("duration_seconds", ast_json_object_iter_key(iter)) == 0) { - int prop_is_valid; - prop_is_valid = ast_ari_validate_int( - ast_json_object_iter_value(iter)); - if (!prop_is_valid) { - ast_log(LOG_ERROR, "ARI StoredRecording field duration_seconds failed validation\n"); - res = 0; - } - } else - if (strcmp("formats", ast_json_object_iter_key(iter)) == 0) { - int prop_is_valid; - has_formats = 1; - prop_is_valid = ast_ari_validate_list( - ast_json_object_iter_value(iter), - ast_ari_validate_string); - if (!prop_is_valid) { - ast_log(LOG_ERROR, "ARI StoredRecording field formats failed validation\n"); - res = 0; - } - } else - if (strcmp("id", ast_json_object_iter_key(iter)) == 0) { + if (strcmp("format", ast_json_object_iter_key(iter)) == 0) { int prop_is_valid; - has_id = 1; + has_format = 1; prop_is_valid = ast_ari_validate_string( ast_json_object_iter_value(iter)); if (!prop_is_valid) { - ast_log(LOG_ERROR, "ARI StoredRecording field id failed validation\n"); + ast_log(LOG_ERROR, "ARI StoredRecording field format failed validation\n"); res = 0; } } else - if (strcmp("time", ast_json_object_iter_key(iter)) == 0) { + if (strcmp("name", ast_json_object_iter_key(iter)) == 0) { int prop_is_valid; - prop_is_valid = ast_ari_validate_date( + has_name = 1; + prop_is_valid = ast_ari_validate_string( ast_json_object_iter_value(iter)); if (!prop_is_valid) { - ast_log(LOG_ERROR, "ARI StoredRecording field time failed validation\n"); + ast_log(LOG_ERROR, "ARI StoredRecording field name failed validation\n"); res = 0; } } else @@ -1112,13 +1093,13 @@ int ast_ari_validate_stored_recording(struct ast_json *json) } } - if (!has_formats) { - ast_log(LOG_ERROR, "ARI StoredRecording missing required field formats\n"); + if (!has_format) { + ast_log(LOG_ERROR, "ARI StoredRecording missing required field format\n"); res = 0; } - if (!has_id) { - ast_log(LOG_ERROR, "ARI StoredRecording missing required field id\n"); + if (!has_name) { + ast_log(LOG_ERROR, "ARI StoredRecording missing required field name\n"); res = 0; } diff --git a/res/ari/ari_model_validators.h b/res/ari/ari_model_validators.h index e8ef8e210..a8a856f15 100644 --- a/res/ari/ari_model_validators.h +++ b/res/ari/ari_model_validators.h @@ -937,10 +937,8 @@ ari_validator ast_ari_validate_stasis_start_fn(void); * - name: string (required) * - state: string (required) * StoredRecording - * - duration_seconds: int - * - formats: List[string] (required) - * - id: string (required) - * - time: Date + * - format: string (required) + * - name: string (required) * FormatLangPair * - format: string (required) * - language: string (required) diff --git a/res/ari/resource_recordings.c b/res/ari/resource_recordings.c index f87ff0a0a..d6803469f 100644 --- a/res/ari/resource_recordings.c +++ b/res/ari/resource_recordings.c @@ -30,21 +30,111 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/stasis_app_recording.h" #include "resource_recordings.h" -void ast_ari_get_stored_recordings(struct ast_variable *headers, struct ast_get_stored_recordings_args *args, struct ast_ari_response *response) -{ - ast_log(LOG_ERROR, "TODO: ast_ari_get_stored_recordings\n"); -} -void ast_ari_get_stored_recording(struct ast_variable *headers, struct ast_get_stored_recording_args *args, struct ast_ari_response *response) +void ast_ari_get_stored_recordings(struct ast_variable *headers, + struct ast_get_stored_recordings_args *args, + struct ast_ari_response *response) { - ast_log(LOG_ERROR, "TODO: ast_ari_get_stored_recording\n"); + RAII_VAR(struct ao2_container *, recordings, NULL, ao2_cleanup); + RAII_VAR(struct ast_json *, json, NULL, ast_json_unref); + struct ao2_iterator i; + void *obj; + + recordings = stasis_app_stored_recording_find_all(); + + if (!recordings) { + ast_ari_response_alloc_failed(response); + return; + } + + json = ast_json_array_create(); + if (!json) { + ast_ari_response_alloc_failed(response); + return; + } + + i = ao2_iterator_init(recordings, 0); + while ((obj = ao2_iterator_next(&i))) { + RAII_VAR(struct stasis_app_stored_recording *, recording, obj, + ao2_cleanup); + + int r = ast_json_array_append( + json, stasis_app_stored_recording_to_json(recording)); + if (r != 0) { + ast_ari_response_alloc_failed(response); + ao2_iterator_destroy(&i); + return; + } + } + ao2_iterator_destroy(&i); + + ast_ari_response_ok(response, ast_json_ref(json)); } -void ast_ari_delete_stored_recording(struct ast_variable *headers, struct ast_delete_stored_recording_args *args, struct ast_ari_response *response) + +void ast_ari_get_stored_recording(struct ast_variable *headers, + struct ast_get_stored_recording_args *args, + struct ast_ari_response *response) { - ast_log(LOG_ERROR, "TODO: ast_ari_delete_stored_recording\n"); + RAII_VAR(struct stasis_app_stored_recording *, recording, NULL, + ao2_cleanup); + RAII_VAR(struct ast_json *, json, NULL, ast_json_unref); + + recording = stasis_app_stored_recording_find_by_name( + args->recording_name); + if (recording == NULL) { + ast_ari_response_error(response, 404, "Not Found", + "Recording not found"); + return; + } + + json = stasis_app_stored_recording_to_json(recording); + if (json == NULL) { + ast_ari_response_error(response, 500, + "Internal Server Error", "Error building response"); + return; + } + + ast_ari_response_ok(response, ast_json_ref(json)); } -void ast_ari_get_live_recordings(struct ast_variable *headers, struct ast_get_live_recordings_args *args, struct ast_ari_response *response) + +void ast_ari_delete_stored_recording(struct ast_variable *headers, + struct ast_delete_stored_recording_args *args, + struct ast_ari_response *response) { - ast_log(LOG_ERROR, "TODO: ast_ari_get_live_recordings\n"); + RAII_VAR(struct stasis_app_stored_recording *, recording, NULL, + ao2_cleanup); + int res; + + recording = stasis_app_stored_recording_find_by_name( + args->recording_name); + if (recording == NULL) { + ast_ari_response_error(response, 404, "Not Found", + "Recording not found"); + return; + } + + res = stasis_app_stored_recording_delete(recording); + + if (res != 0) { + switch (errno) { + case EACCES: + case EPERM: + ast_ari_response_error(response, 500, + "Internal Server Error", + "Delete failed"); + break; + default: + ast_log(LOG_WARNING, + "Unexpected error deleting recording %s: %s\n", + args->recording_name, strerror(errno)); + ast_ari_response_error(response, 500, + "Internal Server Error", + "Delete failed"); + break; + } + return; + } + + ast_ari_response_no_content(response); } void ast_ari_get_live_recording(struct ast_variable *headers, diff --git a/res/ari/resource_recordings.h b/res/ari/resource_recordings.h index 2529766e7..682b45c56 100644 --- a/res/ari/resource_recordings.h +++ b/res/ari/resource_recordings.h @@ -76,17 +76,6 @@ struct ast_delete_stored_recording_args { * \param[out] response HTTP response */ void ast_ari_delete_stored_recording(struct ast_variable *headers, struct ast_delete_stored_recording_args *args, struct ast_ari_response *response); -/*! \brief Argument struct for ast_ari_get_live_recordings() */ -struct ast_get_live_recordings_args { -}; -/*! - * \brief List libe recordings. - * - * \param headers HTTP headers - * \param args Swagger parameters - * \param[out] response HTTP response - */ -void ast_ari_get_live_recordings(struct ast_variable *headers, struct ast_get_live_recordings_args *args, struct ast_ari_response *response); /*! \brief Argument struct for ast_ari_get_live_recording() */ struct ast_get_live_recording_args { /*! \brief The name of the recording */ |