summaryrefslogtreecommitdiff
path: root/lib/handler.ml
diff options
context:
space:
mode:
Diffstat (limited to 'lib/handler.ml')
-rw-r--r--lib/handler.ml69
1 files changed, 26 insertions, 43 deletions
diff --git a/lib/handler.ml b/lib/handler.ml
index c02ed71..fb43239 100644
--- a/lib/handler.ml
+++ b/lib/handler.ml
@@ -1,39 +1,40 @@
open Piaf
-let valid_debit value limit balance =
- let balance_after_op = balance - value in
- not (balance_after_op < limit * -1)
-;;
+type pool = ((module Rapper_helper.CONNECTION), Caqti_error.t) Caqti_eio.Pool.t
-let create_transaction client_id (db_pool : Query.pool) (request : Request.t) =
+let create_transaction client_id (db_pool : pool) (request : Request.t) =
Caqti_eio.Pool.use
(fun conn ->
let module C = (val conn : Rapper_helper.CONNECTION) in
C.with_transaction
@@ fun () ->
- let _ = Query.lock client_id conn in
+ ignore @@ Query.lock client_id conn;
let client_opt =
Option.join @@ Result.to_option @@ Query.find_client client_id conn
in
match client_opt with
| Some client ->
+ let body = Result.to_option @@ Body.to_string request.body in
+ let json =
+ Option.map
+ (fun str ->
+ try Yojson.Safe.from_string str with
+ | _ -> `Null)
+ body
+ in
+ let decoded_op = Option.bind json (Utils.Decoder.decode Operation.decoder) in
let insert_result =
- let body = Result.to_option @@ Body.to_string request.body in
- let json =
- Option.map
- (fun str ->
- try Yojson.Safe.from_string str with
- | _ -> `Null)
- body
- in
- let decoded_op = Option.bind json (Utils.Decoder.decode Operation.decoder) in
match decoded_op with
| Some (`Credit { value = _value; description = _desc } as op) ->
(match Query.execute_transaction ~client_id ~op conn with
| Ok _ as ok -> ok
| Error e -> Error (`DB e))
| Some (`Debit { value; description = _desc } as op) ->
- if valid_debit value client.mov_limit client.balance
+ let valid_debit =
+ let balance_after_op = client.balance - value in
+ not (balance_after_op < client.mov_limit * -1)
+ in
+ if valid_debit
then (
match Query.execute_transaction ~client_id ~op conn with
| Ok _ as ok -> ok
@@ -54,7 +55,7 @@ let create_transaction client_id (db_pool : Query.pool) (request : Request.t) =
db_pool
;;
-let get_balance client_id (db_pool : Query.pool) (_request : Request.t) =
+let get_balance client_id (db_pool : pool) (_request : Request.t) =
Caqti_eio.Pool.use
(fun conn ->
let client_opt =
@@ -62,33 +63,15 @@ let get_balance client_id (db_pool : Query.pool) (_request : Request.t) =
in
match client_opt with
| Some client ->
- let client_balance_opt =
- Option.join @@ Result.to_option @@ Query.balance client_id conn
+ let transaction_list =
+ (* NOTE: Talvez isso aqui não seja uma boa ideia *)
+ Result.fold ~ok:Fun.id ~error:(fun _ -> []) @@ Query.transactions client_id conn
in
- (match client_balance_opt with
- | Some (balance_value, time) ->
- let json : Yojson.Safe.t =
- let balance =
- let total = `Int balance_value in
- let date =
- `String
- (Format.asprintf "%a" (Ptime.pp_rfc3339 ~tz_offset_s:(-10800) ()) time)
- in
- let limit = `Int client.mov_limit in
- `Assoc [ "total", total; "data_extrato", date; "limite", limit ]
- in
- let t =
- (* NOTE: Talvez isso aqui não seja uma boa ideia *)
- Result.fold ~ok:Fun.id ~error:(fun _ -> [])
- @@ Query.transactions client_id conn
- in
- let last_transactions = `List (List.map Serializer.transaction t) in
- `Assoc [ "saldo", balance; "ultimas_transacoes", last_transactions ]
- in
- Ok (Response.of_string ~body:(Yojson.Safe.to_string json) `OK)
- | None ->
- Logs.info (fun m -> m "Não encontrei o extrato do cliente %d" client_id);
- Ok (Response.create `Not_found))
+ let json =
+ let time = Option.get @@ Ptime.of_float_s (Unix.time ()) in
+ Serializer.bank_statement time client transaction_list
+ in
+ Ok (Response.of_string ~body:(Yojson.Safe.to_string json) `OK)
| None ->
Logs.info (fun m -> m "Não encontrei o cliente %d" client_id);
Ok (Response.create `Not_found))