summaryrefslogtreecommitdiff
path: root/src/web_frontend/util.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/web_frontend/util.rs')
-rw-r--r--src/web_frontend/util.rs67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/web_frontend/util.rs b/src/web_frontend/util.rs
index 208b5b9..8c24465 100644
--- a/src/web_frontend/util.rs
+++ b/src/web_frontend/util.rs
@@ -1,5 +1,6 @@
use chrono::{NaiveDate, Utc};
use chrono::Datelike;
+use regex::Regex;
#[derive(Debug)]
pub struct DateRange {
@@ -49,3 +50,69 @@ impl Iterator for DateRange {
return Some(chrono::NaiveDate::parse_from_str(&tmp, "%Y-%m-%d").unwrap())
}
}
+
+
+
+/*
+ This files contains the code to handle the /transactions requests
+*/
+
+struct TransactionFilter {
+ sender_name_filter : Vec<String>,
+ reference_filter : Vec<String>
+}
+
+/*
+ * files syntax: . seperates different search critereas
+ * a search crietera is a key value pair, with key as fiter type, e.g.
+ * sender name of transation. The value is what is should be and can be a regex
+ * key value pair is split by -
+ */
+pub fn apply_transaction_filter(filter : String, transactions : Vec<crate::banking::account::Transaction>) -> Vec<crate::banking::account::Transaction> {
+ let mut tmp = transactions.clone();
+ // special case if for general search
+ if !filter.to_string().contains(";") {
+ println!("in special case");
+ let re = Regex::new(&filter).unwrap();
+ tmp = transactions.into_iter().filter(|transaction| re.is_match(&transaction.sender_name) || re.is_match(&transaction.reference) ).collect();
+ return tmp;
+ }
+
+ // parse filter string and construct TransactionFilter struct
+ let mut sender_name_vec = Vec::new();
+ let mut reference_vec = Vec::new();
+ for entry in filter.to_string().split(";") {
+ let v : Vec<_> = entry.split("-").collect();
+ println!("{:?}", v);
+ if v.len() > 1 {
+ if v[0] == "sender" {
+ println!("Filter for sender_name");
+ sender_name_vec.push(v[1].to_string());
+ }
+ else if v[0] == "reference" {
+ println!("filter for reference");
+ reference_vec.push(v[1].to_string());
+ }
+ }
+
+ }
+ tmp = transactions.clone().into_iter().filter(|transaction| {
+ let mut sender_match = false;
+ let mut reference_match = false;
+ for sender in &sender_name_vec {
+ let re_sender = Regex::new(&sender).unwrap();
+ if re_sender.is_match(&transaction.sender_name) {
+ sender_match = true;
+ }
+ }
+ for reference in &reference_vec {
+ let re = Regex::new(&reference).unwrap();
+ if re.is_match(&transaction.reference) {
+ reference_match = true;
+ }
+ }
+ sender_match || reference_match
+ }).collect();
+ tmp
+
+}