diff --git a/backend/prepare.sql b/backend/prepare.sql index 979a828..de14924 100644 --- a/backend/prepare.sql +++ b/backend/prepare.sql @@ -35,7 +35,8 @@ CREATE TABLE IF NOT EXISTS product_prices ( CREATE TABLE IF NOT EXISTS receipts ( id INTEGER PRIMARY KEY, user INTEGER NOT NULL, - datetime INTEGER NOT NULL, + total_dkk_cent INTEGER NOT NULL, + timestamp INTEGER NOT NULL, FOREIGN KEY(user) REFERENCES users(id) ); diff --git a/backend/src/controllers/carts.c b/backend/src/controllers/carts.c index a1ea7d5..374c49b 100644 --- a/backend/src/controllers/carts.c +++ b/backend/src/controllers/carts.c @@ -73,6 +73,7 @@ void route_post_carts_purchase(HttpCtx* ctx) .id = 0, .user_id = session->user_id, .timestamp = NULL, + .total_dkk_cent = total_dkk_cent, .products = (ReceiptProductVec) { 0 }, }; receipt_product_vec_construct(&receipt.products); diff --git a/backend/src/controllers/receipts.c b/backend/src/controllers/receipts.c index 38b1d49..1d8126b 100644 --- a/backend/src/controllers/receipts.c +++ b/backend/src/controllers/receipts.c @@ -49,6 +49,7 @@ void route_get_receipts_one(HttpCtx* ctx) ReceiptsOneRes res = { .receipt_id = receipt.id, + .total_dkk_cent = receipt.total_dkk_cent, .timestamp = str_dup(receipt.timestamp), .products = (ReceiptsOneResProductVec) { 0 }, }; diff --git a/backend/src/db/db_sqlite.c b/backend/src/db/db_sqlite.c index e56058b..48e3152 100644 --- a/backend/src/db/db_sqlite.c +++ b/backend/src/db/db_sqlite.c @@ -517,7 +517,7 @@ l0_return: DbRes db_receipt_insert(Db* db, const Receipt* receipt, int64_t* id) { - static_assert(sizeof(Receipt) == 48, "model has changed"); + static_assert(sizeof(Receipt) == 56, "model has changed"); static_assert(sizeof(ReceiptProduct) == 32, "model has changed"); sqlite3* connection; @@ -526,8 +526,8 @@ DbRes db_receipt_insert(Db* db, const Receipt* receipt, int64_t* id) sqlite3_stmt* stmt; int prepare_res = sqlite3_prepare_v2(connection, - "INSERT INTO receipts (user, datetime) " - "VALUES (?, unixepoch('now'))", + "INSERT INTO receipts (user, total_dkk_cent, timestamp) " + "VALUES (?, ?, unixepoch('now'))", -1, &stmt, NULL); @@ -539,10 +539,11 @@ DbRes db_receipt_insert(Db* db, const Receipt* receipt, int64_t* id) } sqlite3_bind_int64(stmt, 1, receipt->user_id); + sqlite3_bind_int64(stmt, 2, receipt->total_dkk_cent); int step_res = sqlite3_step(stmt); if (step_res != SQLITE_DONE) { - fprintf(stderr, "error: %s\n", sqlite3_errmsg(connection)); + REPORT_SQLITE3_ERROR(); res = DbRes_Error; goto l0_return; } @@ -574,7 +575,7 @@ DbRes db_receipt_insert(Db* db, const Receipt* receipt, int64_t* id) int step_res = sqlite3_step(stmt); if (step_res != SQLITE_DONE) { - fprintf(stderr, "error: %s\n", sqlite3_errmsg(connection)); + REPORT_SQLITE3_ERROR(); res = DbRes_Error; goto l0_return; } @@ -591,7 +592,7 @@ l0_return: DbRes db_receipt_with_id_and_user_id( Db* db, Receipt* receipt, int64_t id, int64_t user_id) { - static_assert(sizeof(Receipt) == 48, "model has changed"); + static_assert(sizeof(Receipt) == 56, "model has changed"); sqlite3* connection; CONNECT; @@ -599,7 +600,9 @@ DbRes db_receipt_with_id_and_user_id( sqlite3_stmt* stmt = NULL; int prepare_res = sqlite3_prepare_v2(connection, - "SELECT id, user, datetime(datetime, 'unixepoch') FROM receipts" + "SELECT id, user, total_dkk_cent, datetime(timestamp, 'unixepoch') " + "FROM " + "receipts" " WHERE id = ? AND user = ?", -1, &stmt, @@ -627,7 +630,8 @@ DbRes db_receipt_with_id_and_user_id( *receipt = (Receipt) { .id = GET_INT(0), .user_id = GET_INT(1), - .timestamp = GET_STR(2), + .total_dkk_cent = GET_INT(2), + .timestamp = GET_STR(3), .products = (ReceiptProductVec) { 0 }, }; @@ -674,7 +678,8 @@ l0_return: DbRes db_receipt_all_headers_with_user_id( Db* db, ReceiptHeaderVec* receipts, int64_t user_id) { - static_assert(sizeof(Receipt) == 48, "model has changed"); + static_assert(sizeof(Receipt) == 56, "model has changed"); + static_assert(sizeof(ReceiptHeader) == 32, "model has changed"); sqlite3* connection; CONNECT; @@ -683,8 +688,10 @@ DbRes db_receipt_all_headers_with_user_id( sqlite3_stmt* stmt; sqlite_res = sqlite3_prepare_v2(connection, - "SELECT id, user, datetime(datetime, 'unixepoch') FROM receipts WHERE " - "user = ?", + "SELECT id, user, total_dkk_cent, datetime(timestamp, 'unixepoch')" + " FROM" + " receipts WHERE" + " user = ?", -1, &stmt, NULL); @@ -700,7 +707,8 @@ DbRes db_receipt_all_headers_with_user_id( ReceiptHeader receipt = { .id = GET_INT(0), .user_id = GET_INT(1), - .timestamp = GET_STR(2), + .total_dkk_cent = GET_INT(2), + .timestamp = GET_STR(3), }; receipt_header_vec_push(receipts, receipt); } diff --git a/backend/src/main.c b/backend/src/main.c index abef007..10ad31e 100644 --- a/backend/src/main.c +++ b/backend/src/main.c @@ -42,7 +42,7 @@ int main(void) server, "/product_editor/index.html", route_get_product_editor_html); http_server_get(server, "/product_editor/product_editor.js", - route_get_product_editor_js); + route_get_product_editor_html); http_server_post(server, "/api/carts/purchase", route_post_carts_purchase); diff --git a/backend/src/models/models.c b/backend/src/models/models.c index 83a03ca..89211a5 100644 --- a/backend/src/models/models.c +++ b/backend/src/models/models.c @@ -48,7 +48,7 @@ void receipt_product_destroy(ReceiptProduct* m) void receipt_destroy(Receipt* m) { - static_assert(sizeof(Receipt) == 48, "model has changed"); + static_assert(sizeof(Receipt) == 56, "model has changed"); free(m->timestamp); for (size_t i = 0; i < m->products.size; ++i) @@ -58,7 +58,7 @@ void receipt_destroy(Receipt* m) void receipt_header_destroy(ReceiptHeader* m) { - static_assert(sizeof(ReceiptHeader) == 24, "model has changed"); + static_assert(sizeof(ReceiptHeader) == 32, "model has changed"); free(m->timestamp); } @@ -96,7 +96,7 @@ void receipts_one_res_product_destroy(ReceiptsOneResProduct* m) void receipts_one_res_destroy(ReceiptsOneRes* m) { - static_assert(sizeof(ReceiptsOneRes) == 40, "model has changed"); + static_assert(sizeof(ReceiptsOneRes) == 48, "model has changed"); free(m->timestamp); for (size_t i = 0; i < m->products.size; ++i) @@ -200,7 +200,7 @@ char* product_price_to_json_string(const ProductPrice* m) char* receipt_to_json_string(const Receipt* m) { - static_assert(sizeof(Receipt) == 48, "model has changed"); + static_assert(sizeof(Receipt) == 56, "model has changed"); String string; string_construct(&string); @@ -208,10 +208,12 @@ char* receipt_to_json_string(const Receipt* m) "{" "\"id\":%ld," "\"user_id\":%ld," + "\"total_dkk_cent\":%ld," "\"timestamp\":\"%s\"," "\"products\":[", m->id, m->user_id, + m->total_dkk_cent, m->timestamp); for (size_t i = 0; i < m->products.size; ++i) { @@ -238,7 +240,7 @@ char* receipt_to_json_string(const Receipt* m) char* receipt_header_to_json_string(const ReceiptHeader* m) { - static_assert(sizeof(ReceiptHeader) == 24, "model has changed"); + static_assert(sizeof(ReceiptHeader) == 32, "model has changed"); String string; string_construct(&string); @@ -246,9 +248,12 @@ char* receipt_header_to_json_string(const ReceiptHeader* m) "{" "\"id\":%ld," "\"user_id\":%ld," - "\"timestamp\":\"%s\"}", + "\"total_dkk_cent\":%ld," + "\"timestamp\":\"%s\"" + "}", m->id, m->user_id, + m->total_dkk_cent, m->timestamp); char* result = string_copy(&string); string_destroy(&string); @@ -327,16 +332,18 @@ char* receipts_one_res_product_to_json_string(const ReceiptsOneResProduct* m) char* receipts_one_res_to_json_string(const ReceiptsOneRes* m) { - static_assert(sizeof(ReceiptsOneRes) == 40, "model has changed"); + static_assert(sizeof(ReceiptsOneRes) == 48, "model has changed"); String string; string_construct(&string); string_pushf(&string, "{" "\"receipt_id\":%ld," + "\"total_dkk_cent\":%ld," "\"timestamp\":\"%s\"," "\"products\":[", m->receipt_id, + m->total_dkk_cent, m->timestamp); for (size_t i = 0; i < m->products.size; ++i) { @@ -475,13 +482,13 @@ int product_price_from_json(ProductPrice* m, const JsonValue* json) int receipt_from_json(Receipt* m, const JsonValue* json) { - static_assert(sizeof(Receipt) == 48, "model has changed"); + static_assert(sizeof(Receipt) == 56, "model has changed"); PANIC("not implemented"); } int receipt_header_from_json(ReceiptHeader* m, const JsonValue* json) { - static_assert(sizeof(ReceiptHeader) == 24, "model has changed"); + static_assert(sizeof(ReceiptHeader) == 32, "model has changed"); PANIC("not implemented"); } @@ -571,7 +578,7 @@ int receipts_one_res_product_from_json( int receipts_one_res_from_json(ReceiptsOneRes* m, const JsonValue* json) { - static_assert(sizeof(ReceiptsOneRes) == 40, "model has changed"); + static_assert(sizeof(ReceiptsOneRes) == 48, "model has changed"); PANIC("not implemented"); } diff --git a/backend/src/models/models.h b/backend/src/models/models.h index 27411ce..1ed0119 100644 --- a/backend/src/models/models.h +++ b/backend/src/models/models.h @@ -46,6 +46,7 @@ DECLARE_VEC_TYPE(ReceiptProduct, ReceiptProductVec, receipt_product_vec, ) typedef struct { int64_t id; int64_t user_id; + int64_t total_dkk_cent; char* timestamp; ReceiptProductVec products; } Receipt; @@ -55,6 +56,7 @@ DECLARE_VEC_TYPE(Receipt, ReceiptVec, receipt_vec, ) typedef struct { int64_t id; int64_t user_id; + int64_t total_dkk_cent; char* timestamp; } ReceiptHeader; @@ -113,6 +115,7 @@ DECLARE_VEC_TYPE(ReceiptsOneResProduct, typedef struct { int64_t receipt_id; + int64_t total_dkk_cent; char* timestamp; ReceiptsOneResProductVec products; } ReceiptsOneRes;