rest: Add support for deleting folders

Add support for deleting folders containing rooms. Delete rooms that are
in folder.
Computers inside rooms are automatically deleted in cascade when room is
deleted (implemented in sql)

Add support for deleting folders containing clients. Delete clients that are
in folder.
master
Javier Hernandez 2024-01-10 11:47:51 +01:00 committed by OpenGnSys Support Team
parent 1fb425694c
commit bc787a9a68
1 changed files with 132 additions and 0 deletions

View File

@ -1995,6 +1995,123 @@ static int og_cmd_post_folder_add(json_t *element,
return err;
}
static int og_delete_computer_folder(struct og_dbi *dbi, uint32_t folder_id)
{
const char *msglog;
dbi_result result;
folder_id = folder_id & 0x0000ffff;
result = dbi_conn_queryf(dbi->conn,
"DELETE FROM gruposordenadores "
"WHERE idgrupo=%u",
folder_id);
if (!result) {
dbi_conn_error(dbi->conn, &msglog);
syslog(LOG_ERR, "failed to delete computer-group from database "
"(%s:%d) %s\n",
__func__, __LINE__, msglog);
return -1;
}
if (dbi_result_get_numrows_affected(result) < 1) {
syslog(LOG_ERR, "delete did not modify any row (%s:%d)\n",
__func__, __LINE__);
dbi_result_free(result);
return -1;
}
result = dbi_conn_queryf(dbi->conn,
"DELETE FROM ordenadores "
"WHERE grupoid=%u",
folder_id);
if (!result) {
dbi_conn_error(dbi->conn, &msglog);
syslog(LOG_ERR, "failed to delete computers from database "
"(%s:%d) %s\n",
__func__, __LINE__, msglog);
return -1;
}
dbi_result_free(result);
return 0;
}
static int og_delete_room_folder(struct og_dbi *dbi, uint32_t folder_id)
{
const char *msglog;
dbi_result result;
result = dbi_conn_queryf(dbi->conn,
"DELETE FROM grupos "
"WHERE idgrupo=%u",
folder_id);
if (!result) {
dbi_conn_error(dbi->conn, &msglog);
syslog(LOG_ERR, "failed to delete room-group from database "
"(%s:%d) %s\n",
__func__, __LINE__, msglog);
return -1;
}
if (dbi_result_get_numrows_affected(result) < 1) {
syslog(LOG_ERR, "delete did not modify any row (%s:%d)\n",
__func__, __LINE__);
dbi_result_free(result);
return -1;
}
dbi_result_free(result);
result = dbi_conn_queryf(dbi->conn,
"DELETE FROM aulas "
"WHERE grupoid=%u",
folder_id);
if (!result) {
dbi_conn_error(dbi->conn, &msglog);
syslog(LOG_ERR, "failed to delete rooms from database "
"(%s:%d) %s\n",
__func__, __LINE__, msglog);
return -1;
}
dbi_result_free(result);
return 0;
}
static int og_cmd_post_folder_delete(json_t *element,
struct og_msg_params *params)
{
struct og_dbi *dbi;
uint32_t folder_id;
const char *key;
json_t *value;
int err = 0;
json_object_foreach(element, key, value) {
if (!strcmp(key, "id")) {
err = og_json_parse_uint(value, &folder_id);
params->flags |= OG_REST_PARAM_ID;
}
if (err < 0)
return err;
}
if (!og_msg_params_validate(params, OG_REST_PARAM_ID))
return -1;
dbi = og_dbi_open(&ogconfig.db);
if (!dbi) {
syslog(LOG_ERR, "cannot open conection database (%s:%d)\n",
__func__, __LINE__);
return -1;
}
if (folder_id & 0x00010000) {
err = og_delete_computer_folder(dbi, folder_id);
} else {
err = og_delete_room_folder(dbi, folder_id);
}
og_dbi_close(dbi);
return err;
}
static int og_cmd_post_client_add(json_t *element,
struct og_msg_params *params,
char *buffer_reply)
@ -7005,6 +7122,21 @@ int og_client_state_process_payload_rest(struct og_client *cli)
err = og_cmd_post_folder_add(root, &params);
} else if (!strncmp(cmd, "folder/delete", strlen("folder/delete"))) {
if (method != OG_METHOD_POST) {
err = og_client_method_not_found(cli);
goto err_process_rest_payload;
}
if (!root) {
syslog(LOG_ERR,
"command folder delete with no payload\n");
err = og_client_bad_request(cli);
goto err_process_rest_payload;
}
err = og_cmd_post_folder_delete(root, &params);
} else if (!strncmp(cmd, "wol", strlen("wol"))) {
if (method != OG_METHOD_POST) {
err = og_client_method_not_found(cli);