mirror of
https://github.com/Mercantec-GHC/h4-projekt-gruppe-0-sm.git
synced 2025-04-27 16:24:07 +02:00
121 lines
3.7 KiB
C
121 lines
3.7 KiB
C
#include "../models/models_json.h"
|
|
#include "../util/str.h"
|
|
#include "controllers.h"
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
void route_get_receipts_one(HttpCtx* ctx)
|
|
{
|
|
Cx* cx = http_ctx_user_ctx(ctx);
|
|
const Session* session = middleware_session(ctx);
|
|
if (!session)
|
|
return;
|
|
|
|
const char* query = http_ctx_req_query(ctx);
|
|
if (!query) {
|
|
RESPOND_BAD_REQUEST(ctx, "no receipt_id parameter");
|
|
return;
|
|
}
|
|
HttpQueryParams* params = http_parse_query_params(query);
|
|
char* receipt_id_str = http_query_params_get(params, "receipt_id");
|
|
http_query_params_free(params);
|
|
if (!receipt_id_str) {
|
|
RESPOND_BAD_REQUEST(ctx, "no receipt_id parameter");
|
|
return;
|
|
}
|
|
|
|
int64_t receipt_id = strtol(receipt_id_str, NULL, 10);
|
|
free(receipt_id_str);
|
|
|
|
Receipt receipt;
|
|
DbRes db_res = db_receipt_with_id_and_user_id(
|
|
cx->db, &receipt, receipt_id, session->user_id);
|
|
if (db_res != DbRes_Ok) {
|
|
RESPOND_BAD_REQUEST(ctx, "receipt not found");
|
|
return;
|
|
}
|
|
|
|
ProductPriceVec product_prices = { 0 };
|
|
product_price_vec_construct(&product_prices);
|
|
db_res = db_receipt_prices(cx->db, &product_prices, receipt_id);
|
|
if (db_res != DbRes_Ok) {
|
|
RESPOND_SERVER_ERROR(ctx);
|
|
return;
|
|
}
|
|
|
|
ProductVec products = { 0 };
|
|
product_vec_construct(&products);
|
|
db_res = db_receipt_products(cx->db, &products, receipt_id);
|
|
if (db_res != DbRes_Ok) {
|
|
RESPOND_SERVER_ERROR(ctx);
|
|
return;
|
|
}
|
|
|
|
ReceiptsOneRes res = {
|
|
.receipt_id = receipt.id,
|
|
.total_dkk_cent = receipt.total_dkk_cent,
|
|
.timestamp = str_dup(receipt.timestamp),
|
|
.products = (ReceiptsOneResProductVec) { 0 },
|
|
};
|
|
receipts_one_res_product_vec_construct(&res.products);
|
|
for (size_t i = 0; i < receipt.products.size; ++i) {
|
|
receipts_one_res_product_vec_push(&res.products,
|
|
(ReceiptsOneResProduct) {
|
|
.product_id = products.data[i].id,
|
|
.name = str_dup(products.data[i].name),
|
|
.price_dkk_cent = product_prices.data[i].price_dkk_cent,
|
|
.amount = receipt.products.data[i].amount,
|
|
});
|
|
}
|
|
|
|
char* res_json = receipts_one_res_to_json_string(&res);
|
|
|
|
RESPOND_JSON(ctx, 200, "{\"ok\":true,\"receipt\":%s}", res_json);
|
|
|
|
free(res_json);
|
|
receipts_one_res_destroy(&res);
|
|
for (size_t i = 0; i < products.size; ++i)
|
|
product_destroy(&products.data[i]);
|
|
product_vec_destroy(&products);
|
|
for (size_t i = 0; i < products.size; ++i)
|
|
product_price_destroy(&product_prices.data[i]);
|
|
product_price_vec_destroy(&product_prices);
|
|
receipt_destroy(&receipt);
|
|
}
|
|
|
|
void route_get_receipts_all(HttpCtx* ctx)
|
|
{
|
|
Cx* cx = http_ctx_user_ctx(ctx);
|
|
const Session* session = middleware_session(ctx);
|
|
if (!session)
|
|
return;
|
|
|
|
ReceiptHeaderVec receipts;
|
|
receipt_header_vec_construct(&receipts);
|
|
DbRes db_res = db_receipt_all_headers_with_user_id(
|
|
cx->db, &receipts, session->user_id);
|
|
if (db_res != DbRes_Ok) {
|
|
RESPOND_SERVER_ERROR(ctx);
|
|
return;
|
|
}
|
|
|
|
String receipts_str;
|
|
string_construct(&receipts_str);
|
|
string_push_str(&receipts_str, "");
|
|
for (size_t i = 0; i < receipts.size; ++i) {
|
|
if (i != 0) {
|
|
string_pushf(&receipts_str, ",");
|
|
}
|
|
char* receipt_json = receipt_header_to_json_string(&receipts.data[i]);
|
|
string_push_str(&receipts_str, receipt_json);
|
|
free(receipt_json);
|
|
}
|
|
|
|
RESPOND_JSON(
|
|
ctx, 200, "{\"ok\":true,\"receipts\":[%s]}", receipts_str.data);
|
|
string_destroy(&receipts_str);
|
|
for (size_t i = 0; i < receipts.size; ++i)
|
|
receipt_header_destroy(&receipts.data[i]);
|
|
receipt_header_vec_destroy(&receipts);
|
|
}
|