api webui: simplified webui API by removing "args" field
The API code has also been updated to use the htsmsg auto conversion of strings to map/list where required. Basic approach is check for list/map first and if that fails fallback to string (if that's whats appropriate for a mixed type field).
This commit is contained in:
parent
91cfb24bbb
commit
ecfacc5aed
4 changed files with 51 additions and 82 deletions
|
@ -187,7 +187,7 @@ api_idnode_load
|
|||
{
|
||||
int err = 0;
|
||||
idnode_t *in;
|
||||
htsmsg_t *t, *l = NULL;
|
||||
htsmsg_t *uuids, *l = NULL;
|
||||
htsmsg_field_t *f;
|
||||
const char *uuid, *class;
|
||||
|
||||
|
@ -195,35 +195,32 @@ api_idnode_load
|
|||
if ((class = htsmsg_get_str(args, "class")))
|
||||
return api_idnode_load_by_class(class, args, resp);
|
||||
|
||||
/* ID based */
|
||||
/* UUIDs */
|
||||
if (!(f = htsmsg_field_find(args, "uuid")))
|
||||
return EINVAL;
|
||||
if (!(uuids = htsmsg_field_get_list(f)))
|
||||
if (!(uuid = htsmsg_field_get_str(f)))
|
||||
return EINVAL;
|
||||
|
||||
pthread_mutex_lock(&global_lock);
|
||||
|
||||
/* Single */
|
||||
if (f->hmf_type == HMF_STR) {
|
||||
uuid = htsmsg_field_get_string(f);
|
||||
in = idnode_find(uuid, NULL);
|
||||
if (in) {
|
||||
l = htsmsg_create_list();
|
||||
htsmsg_add_msg(l, NULL, idnode_serialize(in));
|
||||
} else
|
||||
err = ENOENT;
|
||||
|
||||
/* Multiple */
|
||||
} else if (f->hmf_type == HMF_LIST) {
|
||||
t = htsmsg_get_list_by_field(f);
|
||||
if (uuids) {
|
||||
l = htsmsg_create_list();
|
||||
HTSMSG_FOREACH(f, t) {
|
||||
if (!(uuid = htsmsg_field_get_string(f))) continue;
|
||||
HTSMSG_FOREACH(f, uuids) {
|
||||
if (!(uuid = htsmsg_field_get_str(f))) continue;
|
||||
if (!(in = idnode_find(uuid, NULL))) continue;
|
||||
htsmsg_add_msg(l, NULL, idnode_serialize(in));
|
||||
}
|
||||
|
||||
/* Invalid */
|
||||
/* Single */
|
||||
} else {
|
||||
err = EINVAL;
|
||||
if (!(in = idnode_find(uuid, NULL)))
|
||||
err = ENOENT;
|
||||
else {
|
||||
l = htsmsg_create_list();
|
||||
htsmsg_add_msg(l, NULL, idnode_serialize(in));
|
||||
}
|
||||
}
|
||||
|
||||
if (l) {
|
||||
|
@ -242,30 +239,31 @@ api_idnode_save
|
|||
{
|
||||
int err = EINVAL;
|
||||
idnode_t *in;
|
||||
htsmsg_t *conf, *l;
|
||||
htsmsg_t *msg, *conf;
|
||||
htsmsg_field_t *f;
|
||||
const char *uuid;
|
||||
|
||||
if (!(f = htsmsg_field_find(args, "node")))
|
||||
return EINVAL;
|
||||
if (!(msg = htsmsg_field_get_list(f)))
|
||||
if (!(msg = htsmsg_field_get_map(f)))
|
||||
return EINVAL;
|
||||
|
||||
pthread_mutex_lock(&global_lock);
|
||||
|
||||
/* Single */
|
||||
if (f->hmf_type == HMF_MAP) {
|
||||
conf = htsmsg_get_map_by_field(f);
|
||||
if (!(uuid = htsmsg_get_str(conf, "uuid")))
|
||||
if (!msg->hm_islist) {
|
||||
if (!(uuid = htsmsg_get_str(msg, "uuid")))
|
||||
goto exit;
|
||||
if (!(in = idnode_find(uuid, NULL)))
|
||||
goto exit;
|
||||
idnode_update(in, conf);
|
||||
idnode_update(in, msg);
|
||||
err = 0;
|
||||
|
||||
/* Multiple */
|
||||
} else if (f->hmf_type == HMF_LIST) {
|
||||
l = htsmsg_get_list_by_field(f);
|
||||
HTSMSG_FOREACH(f, l) {
|
||||
if (!(conf = htsmsg_get_map_by_field(f)))
|
||||
} else {
|
||||
HTSMSG_FOREACH(f, msg) {
|
||||
if (!(conf = htsmsg_field_get_map(f)))
|
||||
continue;
|
||||
if (!(uuid = htsmsg_get_str(conf, "uuid")))
|
||||
continue;
|
||||
|
@ -274,10 +272,6 @@ api_idnode_save
|
|||
idnode_update(in, conf);
|
||||
}
|
||||
err = 0;
|
||||
|
||||
/* Invalid */
|
||||
} else {
|
||||
err = EINVAL;
|
||||
}
|
||||
|
||||
// TODO: return updated UUIDs?
|
||||
|
@ -382,39 +376,36 @@ api_idnode_delete
|
|||
{
|
||||
int err = 0;
|
||||
idnode_t *in;
|
||||
htsmsg_t *l;
|
||||
htsmsg_t *uuids;
|
||||
htsmsg_field_t *f;
|
||||
const char *uuid;
|
||||
|
||||
/* ID based */
|
||||
if (!(f = htsmsg_field_find(args, "uuid")))
|
||||
return EINVAL;
|
||||
if (!(uuids = htsmsg_field_get_list(f)))
|
||||
if (!(uuid = htsmsg_field_get_str(f)))
|
||||
return EINVAL;
|
||||
|
||||
pthread_mutex_lock(&global_lock);
|
||||
|
||||
/* Single */
|
||||
if (f->hmf_type == HMF_STR) {
|
||||
uuid = htsmsg_field_get_string(f);
|
||||
in = idnode_find(uuid, NULL);
|
||||
if (in) {
|
||||
idnode_delete(in);
|
||||
} else
|
||||
err = ENOENT;
|
||||
|
||||
/* Multiple */
|
||||
} else if (f->hmf_type == HMF_LIST) {
|
||||
l = htsmsg_get_list_by_field(f);
|
||||
HTSMSG_FOREACH(f, l) {
|
||||
if (uuids) {
|
||||
HTSMSG_FOREACH(f, uuids) {
|
||||
if (!(uuid = htsmsg_field_get_string(f))) continue;
|
||||
if (!(in = idnode_find(uuid, NULL))) continue;
|
||||
idnode_delete(in);
|
||||
}
|
||||
|
||||
/* Single */
|
||||
} else {
|
||||
uuid = htsmsg_field_get_string(f);
|
||||
if (!(in = idnode_find(uuid, NULL)))
|
||||
err = ENOENT;
|
||||
else
|
||||
idnode_delete(in);
|
||||
}
|
||||
|
||||
// TODO: should we return the UUIDs that are deleted?
|
||||
if (!err)
|
||||
*resp = htsmsg_create_map();
|
||||
|
||||
pthread_mutex_unlock(&global_lock);
|
||||
|
||||
return err;
|
||||
|
|
|
@ -117,9 +117,9 @@ api_mpegts_network_create
|
|||
mpegts_network_t *mn;
|
||||
|
||||
if (!(class = htsmsg_get_str(args, "class")))
|
||||
return -EINVAL;
|
||||
return EINVAL;
|
||||
if (!(conf = htsmsg_get_map(args, "conf")))
|
||||
return -EINVAL;
|
||||
return EINVAL;
|
||||
|
||||
pthread_mutex_lock(&global_lock);
|
||||
mn = mpegts_network_build(class, conf);
|
||||
|
@ -128,7 +128,7 @@ api_mpegts_network_create
|
|||
*resp = htsmsg_create_map();
|
||||
mn->mn_config_save(mn);
|
||||
} else {
|
||||
err = -EINVAL;
|
||||
err = EINVAL;
|
||||
}
|
||||
pthread_mutex_unlock(&global_lock);
|
||||
|
||||
|
|
|
@ -210,7 +210,7 @@ tvheadend.idnode_editor = function(item, conf)
|
|||
Ext.Ajax.request({
|
||||
url : 'api/idnode/save',
|
||||
params : {
|
||||
args : Ext.encode({node: node})
|
||||
node: Ext.encode(node)
|
||||
},
|
||||
success : function(d) {
|
||||
}
|
||||
|
@ -258,12 +258,10 @@ tvheadend.idnode_create = function(conf)
|
|||
params['uuid'] = puuid;
|
||||
if (pclass)
|
||||
params['class'] = pclass
|
||||
params['conf'] = panel.getForm().getFieldValues();
|
||||
params['conf'] = Ext.encode(panel.getForm().getFieldValues());
|
||||
Ext.Ajax.request({
|
||||
url : conf.create.url || conf.url + '/create',
|
||||
params : {
|
||||
args : Ext.util.JSON.encode(params)
|
||||
},
|
||||
params : params,
|
||||
success : function(d) {
|
||||
win.close();
|
||||
}
|
||||
|
@ -507,7 +505,7 @@ tvheadend.idnode_grid = function(panel, conf)
|
|||
Ext.Ajax.request({
|
||||
url : 'api/idnode/save',
|
||||
params : {
|
||||
args : Ext.encode({node : out})
|
||||
node: Ext.encode(out)
|
||||
},
|
||||
success : function(d)
|
||||
{
|
||||
|
@ -554,7 +552,7 @@ tvheadend.idnode_grid = function(panel, conf)
|
|||
Ext.Ajax.request({
|
||||
url : 'api/idnode/delete',
|
||||
params : {
|
||||
args : Ext.util.JSON.encode({ uuid: uuids})
|
||||
uuid: Ext.encode(uuids)
|
||||
},
|
||||
success : function(d)
|
||||
{
|
||||
|
|
|
@ -32,36 +32,16 @@ webui_api_handler
|
|||
int r;
|
||||
http_arg_t *ha;
|
||||
htsmsg_t *args, *resp = NULL;
|
||||
const char *a = http_arg_get(&hc->hc_req_args, "args");
|
||||
const char *op = http_arg_get(&hc->hc_req_args, "method");
|
||||
|
||||
// Compat
|
||||
if (!op)
|
||||
op = http_arg_get(&hc->hc_req_args, "op");
|
||||
|
||||
/* Parse arguments */
|
||||
if (a)
|
||||
args = htsmsg_json_deserialize(a);
|
||||
else
|
||||
args = htsmsg_create_map();
|
||||
if (!args)
|
||||
return HTTP_STATUS_BAD_REQUEST;
|
||||
|
||||
/* Add HTTP arguments?? */
|
||||
/* Build arguments */
|
||||
args = htsmsg_create_map();
|
||||
TAILQ_FOREACH(ha, &hc->hc_req_args, link) {
|
||||
// Ignore obvious keys
|
||||
if (strcmp("op", ha->key) &&
|
||||
strcmp("method", ha->key) &&
|
||||
strcmp("args", ha->key))
|
||||
htsmsg_add_str(args, ha->key, ha->val);
|
||||
htsmsg_add_str(args, ha->key, ha->val);
|
||||
}
|
||||
|
||||
/* Add operation */
|
||||
if (!htsmsg_get_str(args, "method") && op)
|
||||
htsmsg_add_str(args, "method", op);
|
||||
|
||||
/* Call */
|
||||
r = api_exec(remain, args, &resp);
|
||||
htsmsg_destroy(args);
|
||||
|
||||
/* Convert error */
|
||||
if (r) {
|
||||
|
|
Loading…
Add table
Reference in a new issue