From e60ab43abde0b31c6ce4bef994c82497ad823f91 Mon Sep 17 00:00:00 2001 From: Joshua Coles Date: Thu, 31 Oct 2024 12:03:36 +0000 Subject: [PATCH] Add `/shortcuts-csv-import` --- src/ingestion/routes.rs | 26 ++++++++++++++++++++++++++ src/main.rs | 3 ++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/ingestion/routes.rs b/src/ingestion/routes.rs index 0ad7c0a..10fa40a 100644 --- a/src/ingestion/routes.rs +++ b/src/ingestion/routes.rs @@ -50,6 +50,32 @@ async fn extract_csv_and_account_name(mut multipart: Multipart) -> Result<(Optio Ok((csv, account_name)) } + +#[derive(serde::Deserialize, Debug, Clone)] +struct ShortcutBody { + pub body: String, + pub account_name: String, +} + +pub async fn shortcuts_csv( + Extension(db): Extension, + Json(shortcut_body): Json +) -> Result<&'static str, AppError> { + let account_id = db::get_account_id(&db, Some(shortcut_body.account_name)).await?; + + let csv = Cursor::new(shortcut_body.body.as_bytes()); + let mut csv = csv::Reader::from_reader(csv); + let data = csv.records(); + let data = data + .filter_map(|f| f.ok()) + .map(from_csv_row) + .collect::>()?; + + db::insert(&db, data, account_id).await?; + + Ok("Ok") +} + pub async fn monzo_batched_csv( Extension(db): Extension, multipart: Multipart, diff --git a/src/main.rs b/src/main.rs index dc8090a..64fa954 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,7 +4,7 @@ mod ingestion; use crate::error::AppError; use crate::ingestion::db; use crate::ingestion::ingestion_logic::from_csv_row; -use crate::ingestion::routes::{monzo_batched_csv, monzo_batched_json}; +use crate::ingestion::routes::{monzo_batched_csv, monzo_batched_json, shortcuts_csv}; use axum::routing::{get, post}; use axum::{Extension, Router}; use clap::{Parser, Subcommand}; @@ -119,6 +119,7 @@ async fn serve_web(address: SocketAddr, connection: DatabaseConnection) -> anyho .route("/health", get(health_check)) .route("/monzo-batch-export", post(monzo_batched_json)) .route("/monzo-csv-ingestion", post(monzo_batched_csv)) + .route("/shortcuts-csv-import", post(shortcuts_csv)) .layer(Extension(connection.clone())) .layer(TraceLayer::new_for_http());