From 18dd51842832ac21d81b398cc512e9c6ef245039 Mon Sep 17 00:00:00 2001 From: Benedict Börger Date: Mon, 24 Jun 2019 21:49:51 +0200 Subject: [web_frontend] move transaction_filter to util Since the sites transactions and chart both filter the transactions, move the function to util, whre both can access it. --- src/web_frontend/util.rs | 67 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) (limited to 'src/web_frontend/util.rs') 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, + reference_filter : Vec +} + +/* + * 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) -> Vec { + 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 + +} -- cgit v1.2.3-70-g09d2