@@ -147,84 +147,22 @@ impl BankAccountService {
147147 }
148148}
149149
150- #[ derive( Debug , Serialize , Deserialize ) ]
151- struct Statementredis {
152- balance : i32 ,
153- transactions : Vec < Transaction > ,
154- }
155-
156- struct TransactionRepository {
157- conn : deadpool_postgres:: Pool ,
158- }
159-
160- impl TransactionRepository {
161- async fn save_transaction ( & self , user_id : i32 , transaction : & Transaction ) {
162- let conn = self . conn . get ( ) . await . unwrap ( ) ;
163-
164- let query = r#"
165- WITH insertion
166- AS (INSERT INTO transaction (amount, description, account_id) VALUES ($1, $2, $3)
167- RETURNING account_id, amount )
168- SELECT rb.account_id, running_balance + i.amount
169- FROM running_balance rb
170- INNER JOIN insertion i ON rb.account_id = i.account_id;"# ;
171- let stmt = conn. prepare_cached ( query) . await . unwrap ( ) ;
172-
173- let desc = transaction. descricao . 0 . as_str ( ) ;
174- let amount = transaction. valor ;
175-
176- let res = conn
177- . execute ( & stmt, & [ & i32:: from ( amount) , & desc, & user_id] )
178- . await
179- . unwrap ( ) ;
180- }
181- }
182-
183- struct TransactionCache {
184- re_conn : redis:: aio:: ConnectionManager ,
185- }
150+ let ( acc, _) = trans_cache. get_account ( user, false ) . await ;
151+ let acc = acc
152+ . add_transaction ( & transaction)
153+ . or_else ( |_| bail ! ( "no credits bro" ) ) ?;
186154
187- impl TransactionCache {
188- const TRANSACTIONS_KEY : & ' static str = "transactions" ;
189-
190- fn key_fn ( user_id : i32 ) -> CompactString {
191- let key = Self :: TRANSACTIONS_KEY ;
192- compact_str:: format_compact!( "{key}:{user_id}" )
193- }
194-
195- pub async fn get_latest_n ( & self , n : i32 ) -> Vec < Transaction > {
196- let key = Self :: key_fn ( 1 ) ;
197-
198- let stream_result: StreamRangeReply = self
199- . re_conn
200- . clone ( )
201- . xrevrange_count ( key. as_str ( ) , "+" , "-" , n)
202- . await
203- . unwrap ( ) ;
204-
205- stream_result
206- . ids
207- . into_iter ( )
208- . flat_map ( |v| v. map . into_iter ( ) )
209- . filter_map ( |( _, val) | {
210- if let Value :: Data ( data) = val {
211- let transaction = bitcode:: deserialize :: < Transaction > ( & data) . unwrap ( ) ;
212- Some ( transaction)
213- } else {
214- None
155+ {
156+ // let guard = redis_lock.acquire().await.unwrap();
157+ trans_repo. save_and_get_balance ( user, & transaction) . await ?;
158+ trans_cache
159+ . save_account ( user, & acc, Some ( & transaction) )
160+ . await ;
161+ // guard.release().await;
215162 }
216- } )
217- . collect :: < Vec < Transaction > > ( )
218- }
219-
220- pub async fn append ( & self , user_id : i32 , transaction : & Transaction ) {
221- let serialized = bitcode:: serialize ( & transaction) . unwrap ( ) ;
222- let key = Self :: key_fn ( user_id) ;
223163
224- self . re_conn
225- . clone ( )
226- . xadd ( key. as_str ( ) , "*" , & [ ( user_id, serialized) ] )
227- . await
228- . unwrap ( )
164+ Ok ( ( ) )
165+ }
166+ }
229167 }
230168}
0 commit comments