From 1fdb7e6d1cf0709b1079b2d9990c0d53d8740461 Mon Sep 17 00:00:00 2001 From: Javier Sánchez Parra Date: Fri, 4 Jun 2021 12:46:15 +0200 Subject: #915 Add commands and procedures to procedure creation Adds the possibility to create a procedure with commands and other procedures integrated as steps. Note: "steps" parameter is optional and "steps" array object order defines execution order. Request: POST /procedure/add { "center": "1", "name": "procedure", "description": "My procedure", "steps": [ { "command": "wol", "params": { "type": "broadcast" } }, { "procedure": 22 }, { "command": "poweroff", "params": {} } ] } Response: 200 OK This commit also updates unit tests for /procedure/add POST method to include steps. --- src/json.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) (limited to 'src/json.c') diff --git a/src/json.c b/src/json.c index a2b300f..3765782 100644 --- a/src/json.c +++ b/src/json.c @@ -140,3 +140,75 @@ int og_json_parse_partition(json_t *element, struct og_partition *part, return err; } + +static int og_json_parse_procedure_cmd(json_t *element, int position, + struct og_procedure *proc) +{ + struct og_procedure_step *step; + uint32_t err = 0; + const char *key; + json_t *value; + + step = &proc->steps[proc->num_steps++]; + step->type = OG_STEP_COMMAND; + step->position = position; + + json_object_foreach(element, key, value) { + if (!strcmp(key, "command")) + err = og_json_parse_string(value, &step->cmd.type); + else if (!strcmp(key, "params")) + step->cmd.json = value; + else + return -1; + } + + return err; +} + +static int og_json_parse_procedure_call(json_t *element, int position, + struct og_procedure *proc) +{ + struct og_procedure_step *step; + uint32_t err = 0; + const char *key; + json_t *value; + + step = &proc->steps[proc->num_steps++]; + step->type = OG_STEP_PROCEDURE; + step->position = position; + + json_object_foreach(element, key, value) { + if (!strcmp(key, "procedure")) + err = og_json_parse_uint64(value, &step->procedure.id); + else + return -1; + } + + return err; +} + +int og_json_parse_procedure(json_t *element, struct og_procedure *proc) +{ + unsigned int i; + json_t *item; + int err = 0; + + if (json_typeof(element) != JSON_ARRAY) + return -1; + + for (i = 0; i < json_array_size(element) && i < OG_PROCEDURE_STEPS_MAX; ++i) { + item = json_array_get(element, i); + + if (json_object_get(item, "command")) + err = og_json_parse_procedure_cmd(item, i, proc); + else if (json_object_get(item, "procedure")) + err = og_json_parse_procedure_call(item, i, proc); + else + err = -1; + + if (err) + break; + } + + return err; +} -- cgit v1.2.3-18-g5258