#include <arpa/inet.h> #include <cJSON.h> #include <macros.h> #include <command.h> #include <constants.h> #include <endpoints/api_v1_controllers.h> #include <logger.h> #include <models/controller.h> #include <models/tag.h> void api_v1_controllers_STR_GET(struct mg_connection *nc, struct http_message *hm, endpoint_args_t *args, endpoint_response_t *response) { (void)hm; (void)nc; uuid_t target_uid; if(uuid_parse(args[0].value.v_str, target_uid)) { M_RESPONSE_400_NO_VALID_ID(response); return; } controller_t* controller = controller_get_by_uid(target_uid); if(!controller) { M_RESPONSE_TEXT_STATIC(LOGGER_DEBUG, response, 404, "no controller found for id"); return; } LOGGER_DEBUG("returning controller for uid '%s'\n", args[0].value.v_str); 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 mg_connection *nc, struct http_message *hm, endpoint_args_t *args, endpoint_response_t *response) { (void)hm; (void)nc; uuid_t target_uid; if(uuid_parse(args[0].value.v_str, target_uid)) { M_RESPONSE_400_NO_VALID_ID(response); return; } controller_t* controller = controller_get_by_uid(target_uid); if(!controller) { M_RESPONSE_404_NO_CONTROLLER_FOUND_FOR_ID(response); return; } LOGGER_DEBUG("starting overwrite for controller %s\n", args[0].value.v_str); cJSON *json = cJSON_ParseWithLength(hm->body.p, hm->body.len); if(json == NULL) { controller_free(controller); M_RESPONSE_400_NO_VALID_JSON(response); return; } cJSON *json_name = cJSON_GetObjectItemCaseSensitive(json, "name"); if(json_name) { if(!cJSON_IsString(json_name) || json_name->valuestring == NULL) { cJSON_Delete(json); controller_free(controller); M_RESPONSE_TEXT_STATIC(LOGGER_DEBUG, response, 400, "the given name is invalid"); return; } strncpy(controller->name, json_name->valuestring, MAX_NAME_LENGTH); controller->name[MAX_NAME_LENGTH] = '\0'; LOGGER_DEBUG("new controller name: %s\n", controller->name); } cJSON *json_ip = cJSON_GetObjectItemCaseSensitive(json, "ip"); if(json_ip) { if(!cJSON_IsString(json_ip) || json_ip->valuestring == NULL) { cJSON_Delete(json); controller_free(controller); M_RESPONSE_TEXT_STATIC(LOGGER_DEBUG, response, 400, "no ip address given"); return; } unsigned char buf[sizeof(struct in_addr)]; if(inet_pton(AF_INET, json_ip->valuestring, buf)) { strncpy(controller->ip, json_ip->valuestring, IP_LENGTH); controller->ip[IP_LENGTH] = '\0'; LOGGER_DEBUG("new controller ip: %s\n", controller->ip); } else { cJSON_Delete(json); controller_free(controller); M_RESPONSE_TEXT_STATIC(LOGGER_DEBUG, response, 400, "the given ip address is not valid"); return; } } if(controller_save(controller)) { controller_free(controller); cJSON_Delete(json); M_RESPONSE_TEXT_STATIC(LOGGER_ERR, response, 500, "failed to save controller to database"); return; } LOGGER_DEBUG("saved controller %s\n", args[0].value.v_str); cJSON_Delete(json); json = controller_to_json(controller); command_controller_name_set(controller); endpoint_response_json(response, 200, json); cJSON_Delete(json); controller_free(controller); } void api_v1_controllers_STR_DELETE(struct mg_connection *nc, struct http_message *hm, endpoint_args_t *args, endpoint_response_t *response) { (void)hm; (void)nc; const char *target_uid_str = args[0].value.v_str; uuid_t target_uid; if(uuid_parse(target_uid_str, target_uid)) { M_RESPONSE_400_NO_VALID_ID(response); return; } controller_t* controller = controller_get_by_uid(target_uid); if(!controller) { M_RESPONSE_404_NO_CONTROLLER_FOUND_FOR_ID(response); return; } if(controller_remove(controller)) { M_RESPONSE_TEXT_STATIC(LOGGER_ERR, response, 500, "failed to remove controller from database"); } else { M_RESPONSE_TEXT_STATIC(LOGGER_DEBUG, response, 200, "deleted controller"); } controller_free(controller); return; }