#include #include #include #include #include #include #include #include void api_v1_controllers_STR_GET(struct http_message *hm, endpoint_args_t *args, endpoint_response_t *response) { (void)hm; uuid_t target_uid; if(uuid_parse(args[0].value.v_str, target_uid)) { LOG_DEBUG("failed to unparse uid\n"); static const char content[] = "given id was invalid"; endpoint_response_text(response, 400, content, STRLEN(content)); return; } controller_t* controller = controller_get_by_uid(target_uid); if(!controller) { LOG_DEBUG("could not find a controller for uid '%s'\n", args[0].value.v_str); static const char content[] = "no controller for id found"; endpoint_response_text(response, 404, content, STRLEN(content)); return; } cJSON *json = controller_to_json(controller); endpoint_response_json(response, 200, json); cJSON_Delete(json); controller_free(controller); } void api_v1_controllers_STR_PUT(struct http_message *hm, endpoint_args_t *args, endpoint_response_t *response) { (void)hm; uuid_t target_uid; if(uuid_parse(args[0].value.v_str, target_uid)) { LOG_DEBUG("failed to unparse uid\n"); static const char content[] = "given id was invalid"; endpoint_response_text(response, 400, content, STRLEN(content)); return; } controller_t* controller = controller_get_by_uid(target_uid); if(!controller) { LOG_DEBUG("could not find a controller for uid '%s'\n", args[0].value.v_str); static const char content[] = "no controller for id found"; endpoint_response_text(response, 404, content, STRLEN(content)); return; } cJSON *json = cJSON_ParseWithLength(hm->body.p, hm->body.len); if(json == NULL) { static const char content[] = "no valid json was supplied"; endpoint_response_text(response, 400, content, STRLEN(content)); return; } cJSON *json_name = cJSON_GetObjectItemCaseSensitive(json, "name"); if(cJSON_IsString(json_name) && json_name->valuestring) { strncpy(controller->name, json_name->valuestring, MAX_NAME_LENGTH); controller->name[MAX_NAME_LENGTH] = '\0'; } cJSON *json_ip = cJSON_GetObjectItemCaseSensitive(json, "ip"); if(cJSON_IsString(json_ip) && json_ip->valuestring) { strncpy(controller->ip, json_ip->valuestring, IP_LENGTH); controller->ip[IP_LENGTH] = '\0'; } if(controller_save(controller)) { LOG_ERROR("failed to save controller\n"); free(controller); cJSON_Delete(json); static const char content[] = "failed to save controller to database"; response->status_code = 500; response->content_type = "text/plain"; response->content_length = STRLEN(content);; response->content = content; response->alloced_content = false; return; } cJSON_Delete(json); json = controller_to_json(controller); command_set_controller_name(controller); char *json_str = cJSON_Print(json); if (json_str == NULL) { LOG_ERROR("failed to print controller json\n"); static const char content[] = "failed to print json for controller"; response->status_code = 500; response->content_type = "text/plain"; response->content_length = STRLEN(content);; response->content = content; response->alloced_content = false; } else { response->status_code = 200; response->content_type = "application/json"; response->content_length = strlen(json_str); response->content = json_str; response->alloced_content = true; } cJSON_Delete(json); controller_free(controller); } void api_v1_controllers_STR_DELETE(struct http_message *hm, endpoint_args_t *args, endpoint_response_t *response) { (void)hm; const char *target_uid_str = args[0].value.v_str; uuid_t target_uid; if(uuid_parse(target_uid_str, target_uid)) { LOG_DEBUG("failed to unparse uid\n"); static const char content[] = "given id was invalid"; response->status_code = 400; response->content_type = "text/plain"; response->content_length = STRLEN(content);; response->content = content; response->alloced_content = false; return; } controller_t* controller = controller_get_by_uid(target_uid); if(!controller) { LOG_DEBUG("could not find a controller for uid '%s'\n", args[0].value.v_str); static const char content[] = "no controller for id found"; response->status_code = 404; response->content_type = "text/plain"; response->content_length = STRLEN(content);; response->content = content; response->alloced_content = false; return; } if(controller_remove(controller)) { LOG_ERROR("failed to remove controller from database\n"); static const char content[] = "failed to remove controller from database"; response->status_code = 500; response->content_type = "text/plain"; response->content_length = STRLEN(content);; response->content = content; response->alloced_content = false; } else { response->status_code = 200; response->content_type = "application/json"; response->content_length = 0; response->content = ""; response->alloced_content = false; } controller_free(controller); return; }