diff options
author | Michael McVady <femtonaut@gmail.com> | 2024-01-16 21:32:22 -0600 |
---|---|---|
committer | Michael McVady <femtonaut@gmail.com> | 2024-01-16 21:32:22 -0600 |
commit | 2d92280f0e7e605911da199757fa33d2b5089b0a (patch) | |
tree | 49987dc668ea478dfee21310c05feb02261e90f2 /src | |
parent | 7906e579ce5023ec85070b40a3d96bbcaa07d166 (diff) |
Support creating new entries
Diffstat (limited to 'src')
-rw-r--r-- | src/clog.c | 89 | ||||
-rw-r--r-- | src/queries.h | 5 |
2 files changed, 83 insertions, 11 deletions
@@ -16,11 +16,11 @@ #include "queries.h" // FIXME: Compilation fail if this is a .c file. KORE_SECCOMP_FILTER("clog", - KORE_SYSCALL_ALLOW(bind), - KORE_SYSCALL_ALLOW(getdents64), - KORE_SYSCALL_ALLOW(newfstatat), - KORE_SYSCALL_ALLOW(sendmmsg), - KORE_SYSCALL_ALLOW(uname) + KORE_SYSCALL_ALLOW(bind), + KORE_SYSCALL_ALLOW(getdents64), + KORE_SYSCALL_ALLOW(newfstatat), + KORE_SYSCALL_ALLOW(sendmmsg), + KORE_SYSCALL_ALLOW(uname) ) enum query_status { QUERY_STATUS_OK, QUERY_STATUS_ERROR, QUERY_STATUS_NOT_FOUND }; @@ -68,6 +68,8 @@ int get_index(struct http_request *req); int get_entry(struct http_request *req); int edit_entry(struct http_request *req); int update_entry(struct http_request *req); +int get_new_entry_form(struct http_request *req); +int save_new_entry(struct http_request *req); int sql_select(struct entry_query *eq); int sql_update(const char *id, const char *title, const char *body); @@ -364,7 +366,7 @@ int edit_entry(struct http_request *req) { kore_buf_appendf( content, (const char *) asset_entry_edit_html, - eq.entries[0]->id, eq.entries[0]->id, eq.entries[0]->title, eq.entries[0]->body + eq.entries[0]->id, eq.entries[0]->title, eq.entries[0]->body ); // Render MD. @@ -447,6 +449,63 @@ out: ; return KORE_RESULT_OK; } +int get_new_entry_form(struct http_request *req) { + struct kore_buf *content = NULL; + + content = kore_buf_alloc(0); + + kore_buf_appendf( + content, (const char *) asset_entry_edit_html, + "", "", "" + ); + + http_ok_resp(req, HTTP_STATUS_OK, content); + + kore_free(content); + + return KORE_RESULT_OK; +} + +int save_new_entry(struct http_request *req) { + int err = 0; + + char *title = NULL; + char *body = NULL; + + http_populate_post(req); + + if (http_argument_get_string(req, "title", &title)) { + kore_log(LOG_INFO, "form title %s.", title); + } + else { + kore_log(LOG_ERR, "Error no title"); + http_err_resp(req, HTTP_STATUS_BAD_REQUEST); + goto out; + } + + if (http_argument_get_string(req, "body", &body)) { + kore_log(LOG_INFO, "form body %s.", body); + } + else { + kore_log(LOG_ERR, "Error no body"); + http_err_resp(req, HTTP_STATUS_BAD_REQUEST); + goto out; + } + + err = sql_update(NULL, title, body); + if (err == KORE_RESULT_ERROR) { + kore_log(LOG_ERR, "Error saving new entry."); + http_err_resp(req, HTTP_STATUS_INTERNAL_ERROR); + goto out; + } + + http_err_resp(req, HTTP_STATUS_CREATED); + +out: ; + + return KORE_RESULT_OK; +} + int sql_select(struct entry_query *eq) { int err = KORE_RESULT_OK; @@ -502,7 +561,7 @@ int sql_select(struct entry_query *eq) { // Iterate over entries and render them. eq->num_entries = kore_pgsql_ntuples(&sql); for (i = 0; i < eq->num_entries; i++) { - // Fetch & copy data to entry + // Fetch & copy data to entry entry = kore_malloc(sizeof(struct entry)); entry->id = kore_strdup(kore_pgsql_getvalue(&sql, i, 0)); entry->title = kore_strdup(kore_pgsql_getvalue(&sql, i, 1)); @@ -535,10 +594,18 @@ int sql_update(const char *id, const char *title, const char *body) { goto out; } - err = kore_pgsql_query_params( - &sql, q_update_entry, 0, 4, KORE_PGSQL_PARAM_TEXT(title), KORE_PGSQL_PARAM_TEXT(body), - KORE_PGSQL_PARAM_TEXT(body), KORE_PGSQL_PARAM_TEXT(id) - ); + if (id) { + err = kore_pgsql_query_params( + &sql, q_update_entry, 0, 4, KORE_PGSQL_PARAM_TEXT(title), KORE_PGSQL_PARAM_TEXT(body), + KORE_PGSQL_PARAM_TEXT(body), KORE_PGSQL_PARAM_TEXT(id) + ); + } + else { + err = kore_pgsql_query_params( + &sql, q_insert_entry, 0, 3, KORE_PGSQL_PARAM_TEXT(title), KORE_PGSQL_PARAM_TEXT(body), + KORE_PGSQL_PARAM_TEXT(body) + ); + } if (err == KORE_RESULT_ERROR) { kore_pgsql_logerror(&sql); goto out; diff --git a/src/queries.h b/src/queries.h index 9e90581..696d42a 100644 --- a/src/queries.h +++ b/src/queries.h @@ -19,6 +19,11 @@ const char *q_search_entries = ") " "SELECT id, title, created_at::DATE, updated_at::DATE, body FROM query;"; +const char *q_insert_entry = +"INSERT INTO entries (title, body, search_vector) " +"VALUES ($1, $2, TO_TSVECTOR('english', $3)) " +"RETURNING id;"; + const char *q_update_entry = "UPDATE entries " "SET title = $1, body = $2, updated_at = NOW(), search_vector = TO_TSVECTOR('english', $3) " |