diff --git a/Cargo.lock b/Cargo.lock index 26538c4f86..50e5e015a9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -99,12 +99,12 @@ dependencies = [ [[package]] name = "actix-macros" -version = "0.2.4" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" +checksum = "465a6172cf69b960917811022d8f29bc0b7fa1398bc4f78b3c466673db1213b6" dependencies = [ "quote", - "syn 2.0.28", + "syn 1.0.109", ] [[package]] @@ -182,7 +182,7 @@ dependencies = [ "futures-util", "mio", "num_cpus", - "socket2 0.4.9", + "socket2", "tokio", "tracing", ] @@ -263,7 +263,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "smallvec", - "socket2 0.4.9", + "socket2", "time 0.3.22", "url", ] @@ -291,27 +291,12 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "addr2line" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" -dependencies = [ - "gimli", -] - [[package]] name = "adler" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" -[[package]] -name = "adler32" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" - [[package]] name = "ahash" version = "0.7.6" @@ -337,9 +322,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.0.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8f9420f797f2d9e935edf629310eb938a0d839f984e25327f3c7eed22300c" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" dependencies = [ "memchr", ] @@ -376,15 +361,15 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd" +checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" [[package]] name = "anyhow" -version = "1.0.72" +version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" +checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" [[package]] name = "api_models" @@ -394,14 +379,15 @@ dependencies = [ "cards", "common_enums", "common_utils", - "error-stack", + "frunk", + "frunk_core", "masking", "mime", "reqwest", "router_derive", "serde", "serde_json", - "strum 0.24.1", + "strum", "time 0.3.22", "url", "utoipa", @@ -427,9 +413,9 @@ checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "8868f09ff8cea88b079da74ae569d9b8c62a23c68c746240b704ee6f7525c89c" [[package]] name = "assert-json-diff" @@ -455,9 +441,9 @@ dependencies = [ [[package]] name = "async-channel" -version = "1.9.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833" dependencies = [ "concurrent-queue", "event-listener", @@ -466,9 +452,9 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b74f44609f0f91493e3082d3734d98497e094777144380ea4db9f9905dd5b6" +checksum = "5b0122885821398cc923ece939e24d1056a2384ee719432397fa9db87230ff11" dependencies = [ "flate2", "futures-core", @@ -491,17 +477,17 @@ dependencies = [ "log", "parking", "polling", - "rustix 0.37.23", + "rustix", "slab", - "socket2 0.4.9", + "socket2", "waker-fn", ] [[package]] name = "async-lock" -version = "2.8.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7" dependencies = [ "event-listener", ] @@ -525,18 +511,18 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.18", ] [[package]] name = "async-trait" -version = "0.1.72" +version = "0.1.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" +checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.18", ] [[package]] @@ -609,7 +595,7 @@ dependencies = [ "aws-smithy-types", "aws-types", "bytes", - "fastrand 1.9.0", + "fastrand", "hex", "http", "hyper", @@ -629,7 +615,7 @@ checksum = "1fcdb2f7acbc076ff5ad05e7864bdb191ca70a6fd07668dc3a1a8bcd051de5ae" dependencies = [ "aws-smithy-async", "aws-smithy-types", - "fastrand 1.9.0", + "fastrand", "tokio", "tracing", "zeroize", @@ -882,7 +868,7 @@ dependencies = [ "aws-smithy-http-tower", "aws-smithy-types", "bytes", - "fastrand 1.9.0", + "fastrand", "http", "http-body", "hyper", @@ -1004,9 +990,9 @@ dependencies = [ [[package]] name = "axum" -version = "0.6.20" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +checksum = "f8175979259124331c1d7bf6586ee7e0da434155e4b2d48ec2c8386281d8df39" dependencies = [ "async-trait", "axum-core", @@ -1047,21 +1033,6 @@ dependencies = [ "tower-service", ] -[[package]] -name = "backtrace" -version = "0.3.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide 0.7.1", - "object", - "rustc-demangle", -] - [[package]] name = "base64" version = "0.13.1" @@ -1129,9 +1100,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.3.3" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" +checksum = "6dbe3c979c178231552ecba20214a8272df4e09f232a87aef4320cf06539aded" [[package]] name = "blake3" @@ -1189,12 +1160,6 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c676a478f63e9fa2dd5368a42f28bba0d6c560b775f38583c8bbaa7fcd67c9c" -[[package]] -name = "bytemuck" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" - [[package]] name = "byteorder" version = "1.4.3" @@ -1228,9 +1193,9 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.6" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" +checksum = "c530edf18f37068ac2d977409ed5cd50d53d73bc653c7647b48eb78976ac9ae2" dependencies = [ "serde", ] @@ -1251,9 +1216,9 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.3" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cfa25e60aea747ec7e1124f238816749faa93759c6ff5b31f1ccdda137f4479" +checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27" dependencies = [ "serde", ] @@ -1287,12 +1252,11 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.82" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "305fe645edc1442a0fa8b6726ba61d422798d37a52e12eaecf4b022ebbb88f01" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" dependencies = [ "jobserver", - "libc", ] [[package]] @@ -1312,12 +1276,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "checked_int_cast" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17cc5e6b5ab06331c33589842070416baa137e8b0eb912b008cfd4a78ada7919" - [[package]] name = "chrono" version = "0.4.26" @@ -1336,9 +1294,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.3.21" +version = "4.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c27cdf28c0f604ba3f512b0c9a409f8de8513e4816705deb0498b627e7c3a3fd" +checksum = "80672091db20273a15cf9fdd4e47ed43b5091ec9841bf4c6145c9dfbbcae09ed" dependencies = [ "clap_builder", "clap_derive", @@ -1347,24 +1305,25 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.3.21" +version = "4.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08a9f1ab5e9f01a9b81f202e8562eb9a10de70abf9eaeac1be465c28b75aa4aa" +checksum = "c1458a1df40e1e2afebb7ab60ce55c1fa8f431146205aa5f4887e0b111c27636" dependencies = [ "anstyle", + "bitflags 1.3.2", "clap_lex", ] [[package]] name = "clap_derive" -version = "4.3.12" +version = "4.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a9bb5758fc5dfe728d1019941681eccaf0cf8a4189b692a0ee2f2ecf90a050" +checksum = "b8cd2b2a819ad6eec39e8f1d6b53001af1e5469f8c177579cdaeb313115b825f" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.18", ] [[package]] @@ -1373,23 +1332,15 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" -[[package]] -name = "color_quant" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" - [[package]] name = "common_enums" version = "0.1.0" dependencies = [ - "common_utils", "diesel", "router_derive", "serde", "serde_json", - "strum 0.25.0", - "time 0.3.22", + "strum", "utoipa", ] @@ -1501,9 +1452,9 @@ checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" dependencies = [ "libc", ] @@ -1516,9 +1467,9 @@ checksum = "338089f42c427b86394a5ee60ff321da23a5c89c9d89514c829687b26359fcff" [[package]] name = "crc32c" -version = "0.6.4" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8f48d60e5b4d2c53d5c2b1d8a58c849a70ae5e5509b08a48d047e3b65714a74" +checksum = "3dfea2db42e9927a3845fb268a10a72faed6d416065f77873f05e411457c363e" dependencies = [ "rustc_version", ] @@ -1542,17 +1493,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "crossbeam-deque" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" -dependencies = [ - "cfg-if", - "crossbeam-epoch", - "crossbeam-utils", -] - [[package]] name = "crossbeam-epoch" version = "0.9.15" @@ -1597,12 +1537,12 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.3" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +checksum = "0558d22a7b463ed0241e993f76f09f30b126687447751a8638587b864e4b3944" dependencies = [ - "darling_core 0.20.3", - "darling_macro 0.20.3", + "darling_core 0.20.1", + "darling_macro 0.20.1", ] [[package]] @@ -1621,16 +1561,16 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.3" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +checksum = "ab8bfa2e259f8ee1ce5e97824a3c55ec4404a0d772ca7fa96bf19f0752a046eb" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.28", + "syn 2.0.18", ] [[package]] @@ -1646,44 +1586,28 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.20.3" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +checksum = "29a358ff9f12ec09c3e61fef9b5a9902623a695a46a917b07f269bff1445611a" dependencies = [ - "darling_core 0.20.3", + "darling_core 0.20.1", "quote", - "syn 2.0.28", + "syn 2.0.18", ] [[package]] name = "dashmap" -version = "5.5.0" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6943ae99c34386c84a470c499d3414f66502a41340aa895406e0d2e4a207b91d" +checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" dependencies = [ "cfg-if", - "hashbrown 0.14.0", + "hashbrown 0.12.3", "lock_api", "once_cell", "parking_lot_core", ] -[[package]] -name = "data_models" -version = "0.1.0" -dependencies = [ - "api_models", - "async-trait", - "common_enums", - "common_utils", - "error-stack", - "serde", - "serde_json", - "strum 0.25.0", - "thiserror", - "time 0.3.22", -] - [[package]] name = "deadpool" version = "0.9.5" @@ -1703,16 +1627,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eaa37046cc0f6c3cc6090fbdbf73ef0b8ef4cfcc37f6befc0020f63e8cf121e1" -[[package]] -name = "deflate" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174" -dependencies = [ - "adler32", - "byteorder", -] - [[package]] name = "derive_deref" version = "1.1.1" @@ -1743,7 +1657,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7a532c1f99a0f596f6960a60d1e119e91582b24b39e2d83a190e61262c3ef0c" dependencies = [ - "bitflags 2.3.3", + "bitflags 2.3.2", "byteorder", "diesel_derives", "itoa", @@ -1762,28 +1676,7 @@ dependencies = [ "diesel_table_macro_syntax", "proc-macro2", "quote", - "syn 2.0.28", -] - -[[package]] -name = "diesel_models" -version = "0.1.0" -dependencies = [ - "async-bb8-diesel", - "common_enums", - "common_utils", - "diesel", - "error-stack", - "frunk", - "frunk_core", - "masking", - "router_derive", - "router_env", - "serde", - "serde_json", - "strum 0.24.1", - "thiserror", - "time 0.3.22", + "syn 2.0.18", ] [[package]] @@ -1792,7 +1685,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5" dependencies = [ - "syn 2.0.28", + "syn 2.0.18", ] [[package]] @@ -1848,31 +1741,30 @@ dependencies = [ "common_utils", "config", "diesel", - "diesel_models", "error-stack", "external_services", - "masking", "once_cell", "redis_interface", "router_env", "serde", "serde_json", "serde_path_to_error", + "storage_models", "thiserror", "tokio", ] [[package]] name = "dyn-clone" -version = "1.0.12" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "304e6508efa593091e97a9abbc10f90aa7ca635b6d2784feff3c89d41dd12272" +checksum = "68b0cf012f1230e43cd00ebb729c6bb58707ecfa8ad08b52ef3a4ccd2697fc30" [[package]] name = "either" -version = "1.9.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" [[package]] name = "encoding_rs" @@ -1904,13 +1796,13 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" dependencies = [ "errno-dragonfly", "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2011,12 +1903,6 @@ dependencies = [ "instant", ] -[[package]] -name = "fastrand" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" - [[package]] name = "flate2" version = "1.0.26" @@ -2024,7 +1910,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" dependencies = [ "crc32fast", - "miniz_oxide 0.7.1", + "miniz_oxide", ] [[package]] @@ -2098,9 +1984,9 @@ dependencies = [ [[package]] name = "frunk" -version = "0.4.2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11a351b59e12f97b4176ee78497dff72e4276fb1ceb13e19056aca7fa0206287" +checksum = "a89c703bf50009f383a0873845357cc400a95fc535f836feddfe015d7df6e1e0" dependencies = [ "frunk_core", "frunk_derives", @@ -2109,43 +1995,55 @@ dependencies = [ [[package]] name = "frunk_core" -version = "0.4.2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af2469fab0bd07e64ccf0ad57a1438f63160c69b2e57f04a439653d68eb558d6" +checksum = "2a446d01a558301dca28ef43222864a9fa2bd9a2e71370f769d5d5d5ec9f3537" [[package]] name = "frunk_derives" -version = "0.4.2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fa992f1656e1707946bbba340ad244f0814009ef8c0118eb7b658395f19a2e" +checksum = "b83164912bb4c97cfe0772913c7af7387ee2e00cb6d4636fb65a35b3d0c8f173" dependencies = [ "frunk_proc_macro_helpers", "quote", - "syn 2.0.28", + "syn 1.0.109", ] [[package]] name = "frunk_proc_macro_helpers" -version = "0.1.2" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35b54add839292b743aeda6ebedbd8b11e93404f902c56223e51b9ec18a13d2c" +checksum = "015425591bbeb0f5b8a75593340f1789af428e9f887a4f1e36c0c471f067ef50" dependencies = [ "frunk_core", "proc-macro2", "quote", - "syn 2.0.28", + "syn 1.0.109", ] [[package]] name = "frunk_proc_macros" -version = "0.1.2" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71b85a1d4a9a6b300b41c05e8e13ef2feca03e0334127f29eca9506a7fe13a93" +checksum = "ea01524f285deab48affffb342b97f186e657b119c3f1821ac531780e0fbfae0" +dependencies = [ + "frunk_core", + "frunk_proc_macros_impl", + "proc-macro-hack", +] + +[[package]] +name = "frunk_proc_macros_impl" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a802d974cc18ee7fe1a7868fc9ce31086294fd96ba62f8da64ecb44e92a2653" dependencies = [ "frunk_core", "frunk_proc_macro_helpers", + "proc-macro-hack", "quote", - "syn 2.0.28", + "syn 1.0.109", ] [[package]] @@ -2202,7 +2100,7 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" dependencies = [ - "fastrand 1.9.0", + "fastrand", "futures-core", "futures-io", "memchr", @@ -2219,7 +2117,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.18", ] [[package]] @@ -2300,22 +2198,6 @@ dependencies = [ "wasi 0.11.0+wasi-snapshot-preview1", ] -[[package]] -name = "gif" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3edd93c6756b4dfaf2709eafcc345ba2636565295c198a9cfbf75fa5e3e00b06" -dependencies = [ - "color_quant", - "weezl", -] - -[[package]] -name = "gimli" -version = "0.27.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" - [[package]] name = "git2" version = "0.17.2" @@ -2337,9 +2219,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "h2" -version = "0.3.20" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" +checksum = "d357c7ae988e7d2182f7d7871d0b963962420b0678b0997ce7de72001aeab782" dependencies = [ "bytes", "fnv", @@ -2386,9 +2268,18 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.2" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" [[package]] name = "hex" @@ -2471,9 +2362,9 @@ dependencies = [ [[package]] name = "hyper" -version = "0.14.27" +version = "0.14.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" dependencies = [ "bytes", "futures-channel", @@ -2486,7 +2377,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.9", + "socket2", "tokio", "tower-service", "tracing", @@ -2572,25 +2463,6 @@ dependencies = [ "unicode-normalization", ] -[[package]] -name = "image" -version = "0.23.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1" -dependencies = [ - "bytemuck", - "byteorder", - "color_quant", - "gif", - "jpeg-decoder", - "num-iter", - "num-rational", - "num-traits", - "png", - "scoped_threadpool", - "tiff", -] - [[package]] name = "indexmap" version = "1.9.3" @@ -2610,7 +2482,6 @@ checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" dependencies = [ "equivalent", "hashbrown 0.14.0", - "serde", ] [[package]] @@ -2643,16 +2514,16 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi 0.3.2", + "hermit-abi 0.3.1", "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "ipnet" -version = "2.8.0" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" +checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" [[package]] name = "itertools" @@ -2665,9 +2536,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" [[package]] name = "jobserver" @@ -2696,15 +2567,6 @@ dependencies = [ "time 0.3.22", ] -[[package]] -name = "jpeg-decoder" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2" -dependencies = [ - "rayon", -] - [[package]] name = "js-sys" version = "0.3.64" @@ -2753,9 +2615,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.147" +version = "0.2.146" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b" [[package]] name = "libgit2-sys" @@ -2787,9 +2649,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.12" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d97137b25e321a73eef1418d1d5d2eda4d77e12813f8e6dead84bc52c5870a7b" +checksum = "56ee889ecc9568871456d42f603d6a0ce59ff328d291063a45cbdf0036baf6db" dependencies = [ "cc", "libc", @@ -2809,12 +2671,6 @@ version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" -[[package]] -name = "linux-raw-sys" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" - [[package]] name = "literally" version = "0.1.3" @@ -2900,14 +2756,14 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] [[package]] name = "matchit" -version = "0.7.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed1202b2a6f884ae56f04cff409ab315c5ce26b5e58d7412e484f01fd52f52ef" +checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40" [[package]] name = "maud" @@ -2994,25 +2850,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" -[[package]] -name = "miniz_oxide" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435" -dependencies = [ - "adler32", -] - -[[package]] -name = "miniz_oxide" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" -dependencies = [ - "adler", - "autocfg", -] - [[package]] name = "miniz_oxide" version = "0.7.1" @@ -3031,14 +2868,14 @@ dependencies = [ "libc", "log", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "moka" -version = "0.11.3" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa6e72583bf6830c956235bff0d5afec8cf2952f579ebad18ae7821a917d950f" +checksum = "206bf83f415b0579fd885fe0804eb828e727636657dc1bf73d80d2f1218e14a1" dependencies = [ "async-io", "async-lock", @@ -3127,33 +2964,11 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-iter" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" -version = "0.2.16" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", "libm", @@ -3161,32 +2976,14 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.16.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" dependencies = [ - "hermit-abi 0.3.2", + "hermit-abi 0.2.6", "libc", ] -[[package]] -name = "num_threads" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" -dependencies = [ - "libc", -] - -[[package]] -name = "object" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" -dependencies = [ - "memchr", -] - [[package]] name = "once_cell" version = "1.18.0" @@ -3201,9 +2998,9 @@ checksum = "44d11de466f4a3006fe8a5e7ec84e93b79c70cb992ae0aa0eb631ad2df8abfe2" [[package]] name = "openssl" -version = "0.10.56" +version = "0.10.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "729b745ad4a5575dd06a3e1af1414bd330ee561c01b3899eb584baeaa8def17e" +checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" dependencies = [ "bitflags 1.3.2", "cfg-if", @@ -3222,7 +3019,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.18", ] [[package]] @@ -3233,9 +3030,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.91" +version = "0.9.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "866b5f16f90776b9bb8dc1e1802ac6f0513de3a7a7465867bfbc563dc737faac" +checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" dependencies = [ "cc", "libc", @@ -3381,9 +3178,9 @@ checksum = "944553dd59c802559559161f9816429058b869003836120e262e8caec061b7ae" [[package]] name = "paste" -version = "1.0.14" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" [[package]] name = "pathdiff" @@ -3408,9 +3205,9 @@ checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pest" -version = "2.7.2" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1acb4a4365a13f749a93f1a094a7805e5cfa0955373a9de860d962eaa3a5fe5a" +checksum = "e68e84bfb01f0507134eac1e9b410a12ba379d064eab48c50ba4ce329a527b70" dependencies = [ "thiserror", "ucd-trie", @@ -3418,9 +3215,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.7.2" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "666d00490d4ac815001da55838c500eafb0320019bbaa44444137c48b443a853" +checksum = "6b79d4c71c865a25a4322296122e3924d30bc8ee0834c8bfc8b95f7f054afbfb" dependencies = [ "pest", "pest_generator", @@ -3428,22 +3225,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.2" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ca01446f50dbda87c1786af8770d535423fa8a53aec03b8f4e3d7eb10e0929" +checksum = "6c435bf1076437b851ebc8edc3a18442796b30f1728ffea6262d59bbe28b077e" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.18", ] [[package]] name = "pest_meta" -version = "2.7.2" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56af0a30af74d0445c0bf6d9d051c979b516a1a5af790d251daee76005420a48" +checksum = "745a452f8eb71e39ffd8ee32b3c5f51d03845f99786fa9b68db6ff509c505411" dependencies = [ "once_cell", "pest", @@ -3472,29 +3269,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "c95a7476719eab1e366eaf73d0260af3021184f18177925b07f54b30089ceead" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "39407670928234ebc5e6e580247dd567ad73a3578460c5990f9503df207e8f07" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.18", ] [[package]] name = "pin-project-lite" -version = "0.2.12" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12cc1b0bf1727a77a54b6654e7b5f1af8604923edc8b81885f8ec92f9e3f0a05" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" [[package]] name = "pin-utils" @@ -3508,18 +3305,6 @@ version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" -[[package]] -name = "png" -version = "0.16.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3287920cb847dee3de33d301c463fba14dda99db24214ddf93f83d3021f4c6" -dependencies = [ - "bitflags 1.3.2", - "crc32fast", - "deflate", - "miniz_oxide 0.3.7", -] - [[package]] name = "polling" version = "2.8.0" @@ -3533,7 +3318,7 @@ dependencies = [ "libc", "log", "pin-project-lite", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -3586,10 +3371,16 @@ dependencies = [ ] [[package]] -name = "proc-macro2" -version = "1.0.66" +name = "proc-macro-hack" +version = "0.5.20+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406" dependencies = [ "unicode-ident", ] @@ -3648,16 +3439,6 @@ dependencies = [ "unicase", ] -[[package]] -name = "qrcode" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d2f1455f3630c6e5107b4f2b94e74d76dea80736de0981fd27644216cff57f" -dependencies = [ - "checked_int_cast", - "image", -] - [[package]] name = "quanta" version = "0.11.1" @@ -3692,9 +3473,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.32" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" +checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" dependencies = [ "proc-macro2", ] @@ -3799,28 +3580,6 @@ dependencies = [ "bitflags 1.3.2", ] -[[package]] -name = "rayon" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-utils", - "num_cpus", -] - [[package]] name = "redis-protocol" version = "4.1.0" @@ -3880,14 +3639,13 @@ dependencies = [ [[package]] name = "regex" -version = "1.9.3" +version = "1.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" +checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.3.6", - "regex-syntax 0.7.4", + "regex-syntax 0.7.2", ] [[package]] @@ -3899,17 +3657,6 @@ dependencies = [ "regex-syntax 0.6.29", ] -[[package]] -name = "regex-automata" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.7.4", -] - [[package]] name = "regex-cache" version = "0.2.1" @@ -3930,9 +3677,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.4" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" +checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" [[package]] name = "reqwest" @@ -4030,18 +3777,18 @@ dependencies = [ "clap", "common_utils", "config", - "data_models", + "crc32fast", "derive_deref", "diesel", - "diesel_models", "dyn-clone", "encoding_rs", "error-stack", "external_services", + "frunk", + "frunk_core", "futures", "hex", "http", - "image", "infer 0.13.0", "josekit", "jsonwebtoken", @@ -4050,10 +3797,10 @@ dependencies = [ "maud", "mimalloc", "mime", + "moka", "nanoid", "num_cpus", "once_cell", - "qrcode", "rand 0.8.5", "redis_interface", "regex", @@ -4061,7 +3808,6 @@ dependencies = [ "ring", "router_derive", "router_env", - "roxmltree", "serde", "serde_json", "serde_path_to_error", @@ -4071,14 +3817,14 @@ dependencies = [ "serial_test", "signal-hook", "signal-hook-tokio", - "storage_impl", - "strum 0.24.1", + "storage_models", + "strum", "test_utils", "thirtyfour", "thiserror", "time 0.3.22", "tokio", - "toml 0.7.6", + "toml 0.7.4", "url", "utoipa", "utoipa-swagger-ui", @@ -4097,7 +3843,7 @@ dependencies = [ "quote", "serde", "serde_json", - "strum 0.24.1", + "strum", "syn 1.0.109", ] @@ -4115,7 +3861,7 @@ dependencies = [ "serde", "serde_json", "serde_path_to_error", - "strum 0.24.1", + "strum", "time 0.3.22", "tokio", "tracing", @@ -4127,20 +3873,11 @@ dependencies = [ "vergen", ] -[[package]] -name = "roxmltree" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8f595a457b6b8c6cda66a48503e92ee8d19342f905948f29c383200ec9eb1d8" -dependencies = [ - "xmlparser", -] - [[package]] name = "rust-embed" -version = "6.8.1" +version = "6.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a36224c3276f8c4ebc8c20f158eca7ca4359c8db89991c4925132aaaf6702661" +checksum = "b73e721f488c353141288f223b599b4ae9303ecf3e62923f40a492f0634a4dc3" dependencies = [ "rust-embed-impl", "rust-embed-utils", @@ -4149,23 +3886,23 @@ dependencies = [ [[package]] name = "rust-embed-impl" -version = "6.8.1" +version = "6.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b94b81e5b2c284684141a2fb9e2a31be90638caf040bf9afbc5a0416afe1ac" +checksum = "e22ce362f5561923889196595504317a4372b84210e6e335da529a65ea5452b5" dependencies = [ "proc-macro2", "quote", "rust-embed-utils", "shellexpand", - "syn 2.0.28", + "syn 2.0.18", "walkdir", ] [[package]] name = "rust-embed-utils" -version = "7.8.1" +version = "7.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d38ff6bf570dc3bb7100fce9f7b60c33fa71d80e88da3f2580df4ff2bdded74" +checksum = "512b0ab6853f7e14e3c8754acb43d6f748bb9ced66aa5915a6553ac8213f7731" dependencies = [ "sha2", "walkdir", @@ -4181,12 +3918,6 @@ dependencies = [ "ordered-multimap", ] -[[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - [[package]] name = "rustc-hash" version = "1.1.0" @@ -4204,29 +3935,16 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.23" +version = "0.37.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" +checksum = "b96e891d04aa506a6d1f318d2771bcb1c7dfda84e126660ace067c9b474bb2c0" dependencies = [ "bitflags 1.3.2", "errno", "io-lifetimes", "libc", - "linux-raw-sys 0.3.8", - "windows-sys", -] - -[[package]] -name = "rustix" -version = "0.38.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "172891ebdceb05aa0005f533a6cbfca599ddd7d966f6f5d4d9b2e70478e70399" -dependencies = [ - "bitflags 2.3.3", - "errno", - "libc", - "linux-raw-sys 0.4.5", - "windows-sys", + "linux-raw-sys", + "windows-sys 0.48.0", ] [[package]] @@ -4255,18 +3973,18 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "1.0.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" dependencies = [ "base64 0.21.2", ] [[package]] name = "rustversion" -version = "1.0.14" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" [[package]] name = "rusty-fork" @@ -4282,9 +4000,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" [[package]] name = "same-file" @@ -4297,11 +4015,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.22" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" dependencies = [ - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -4313,17 +4031,11 @@ dependencies = [ "parking_lot", ] -[[package]] -name = "scoped_threadpool" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" - [[package]] name = "scopeguard" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "sct" @@ -4337,9 +4049,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.9.2" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" +checksum = "1fc758eb7bffce5b308734e9b0c1468893cae9ff70ebf13e7090be8dcbcc83a8" dependencies = [ "bitflags 1.3.2", "core-foundation", @@ -4350,9 +4062,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.9.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" +checksum = "f51d0c0d83bec45f16480d0ce0058397a69e48fcdc52d1dc8855fb68acbd31a7" dependencies = [ "core-foundation-sys", "libc", @@ -4360,40 +4072,40 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.18" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" +checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" dependencies = [ "serde", ] [[package]] name = "serde" -version = "1.0.183" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32ac8da02677876d532745a130fc9d8e6edfa81a269b107c5b00829b91d8eb3c" +checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.183" +version = "1.0.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aafe972d60b0b9bee71a91b92fee2d4fb3c9d7e8f6b179aa99f27203d99a4816" +checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.18", ] [[package]] name = "serde_json" -version = "1.0.104" +version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" dependencies = [ - "indexmap 2.0.0", + "indexmap 1.9.3", "itoa", "ryu", "serde", @@ -4401,11 +4113,10 @@ dependencies = [ [[package]] name = "serde_path_to_error" -version = "0.1.14" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4beec8bce849d58d06238cb50db2e1c417cfeafa4c63f692b15c82b7c80f8335" +checksum = "f7f05c1d5476066defcdfacce1f52fc3cae3af1d3089727100c02ae92e5abbe0" dependencies = [ - "itoa", "serde", ] @@ -4442,20 +4153,20 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.16" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8725e1dfadb3a50f7e5ce0b1a540466f6ed3fe7a0fca2ac2b8b831d31316bd00" +checksum = "bcec881020c684085e55a25f7fd888954d56609ef363479dc5a1305eb0d40cab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.18", ] [[package]] name = "serde_spanned" -version = "0.6.3" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +checksum = "93107647184f6027e3b7dcb2e11034cf95ffa1e3a682c67951963ac69c1c007d" dependencies = [ "serde", ] @@ -4474,15 +4185,14 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.2.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1402f54f9a3b9e2efe71c1cea24e648acce55887983553eeb858cf3115acfd49" +checksum = "9f02d8aa6e3c385bf084924f660ce2a3a6bd333ba55b35e8590b321f35d88513" dependencies = [ "base64 0.21.2", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.0.0", "serde", "serde_json", "serde_with_macros", @@ -4491,14 +4201,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.2.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9197f1ad0e3c173a0222d3c4404fb04c3afe87e962bcb327af73e8301fa203c7" +checksum = "edc7d5d3932fb12ce722ee5e64dd38c504efba37567f0c402f6ca728c3b8b070" dependencies = [ - "darling 0.20.3", + "darling 0.20.1", "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.18", ] [[package]] @@ -4523,7 +4233,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.18", ] [[package]] @@ -4550,9 +4260,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.7" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" dependencies = [ "cfg-if", "cpufeatures", @@ -4579,9 +4289,9 @@ dependencies = [ [[package]] name = "signal-hook" -version = "0.3.17" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +checksum = "732768f1176d21d09e076c23a93123d40bba92d50c4058da34d45c8de8e682b9" dependencies = [ "libc", "signal-hook-registry", @@ -4646,9 +4356,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] name = "socket2" @@ -4660,16 +4370,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "socket2" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" -dependencies = [ - "libc", - "windows-sys", -] - [[package]] name = "spin" version = "0.5.2" @@ -4677,27 +4377,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] -name = "storage_impl" +name = "storage_models" version = "0.1.0" dependencies = [ - "api_models", "async-bb8-diesel", - "async-trait", - "bb8", + "common_enums", "common_utils", - "crc32fast", - "data_models", "diesel", - "diesel_models", - "dyn-clone", "error-stack", - "futures", + "frunk", + "frunk_core", "masking", - "moka", - "once_cell", - "redis_interface", + "router_derive", "router_env", - "tokio", + "serde", + "serde_json", + "strum", + "thiserror", + "time 0.3.22", ] [[package]] @@ -4721,16 +4418,7 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" dependencies = [ - "strum_macros 0.24.3", -] - -[[package]] -name = "strum" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" -dependencies = [ - "strum_macros 0.25.2", + "strum_macros", ] [[package]] @@ -4746,19 +4434,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "strum_macros" -version = "0.25.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8d03b598d3d0fff69bf533ee3ef19b8eeb342729596df84bcc7e1f96ec4059" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.28", -] - [[package]] name = "subtle" version = "2.4.1" @@ -4778,9 +4453,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.28" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567" +checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" dependencies = [ "proc-macro2", "quote", @@ -4801,15 +4476,16 @@ checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" [[package]] name = "tempfile" -version = "3.7.1" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc02fddf48964c42031a0b3fe0428320ecf3a73c401040fc0096f97794310651" +checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" dependencies = [ + "autocfg", "cfg-if", - "fastrand 2.0.0", + "fastrand", "redox_syscall 0.3.5", - "rustix 0.38.7", - "windows-sys", + "rustix", + "windows-sys 0.48.0", ] [[package]] @@ -4860,27 +4536,14 @@ dependencies = [ name = "test_utils" version = "0.1.0" dependencies = [ - "actix-http", - "actix-web", "api_models", - "async-trait", - "awc", - "base64 0.21.2", "clap", - "derive_deref", "masking", - "rand 0.8.5", - "reqwest", + "router", "serde", "serde_json", "serde_path_to_error", - "serde_urlencoded", - "serial_test", - "thirtyfour", - "time 0.3.22", - "tokio", - "toml 0.7.6", - "uuid", + "toml 0.7.4", ] [[package]] @@ -4923,22 +4586,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.44" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.44" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.18", ] [[package]] @@ -4951,17 +4614,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "tiff" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a53f4706d65497df0c4349241deddf35f84cee19c87ed86ea8ca590f4464437" -dependencies = [ - "jpeg-decoder", - "miniz_oxide 0.4.4", - "weezl", -] - [[package]] name = "time" version = "0.1.45" @@ -4980,8 +4632,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea9e1b3cf1243ae005d9e74085d4d542f3125458f3a81af210d901dcd7411efd" dependencies = [ "itoa", - "libc", - "num_threads", "serde", "time-core", "time-macros", @@ -5019,11 +4669,11 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.30.0" +version = "1.28.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3ce25f50619af8b0aec2eb23deebe84249e19e2ddd393a6e16e3300a6dadfd" +checksum = "94d7b1cfd2aa4011f2de74c2c4c63665e27a71006b0a192dcd2710272e73dfa2" dependencies = [ - "backtrace", + "autocfg", "bytes", "libc", "mio", @@ -5031,9 +4681,9 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.3", + "socket2", "tokio-macros", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -5054,7 +4704,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.18", ] [[package]] @@ -5114,9 +4764,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.7.6" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" +checksum = "d6135d499e69981f9ff0ef2167955a5333c35e36f6937d382974566b3d5b94ec" dependencies = [ "serde", "serde_spanned", @@ -5126,20 +4776,20 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "5a76a9312f5ba4c2dec6b9161fdf25d87ad8a09256ccea5a556fef03c706a10f" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.19.14" +version = "0.19.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" +checksum = "2380d56e8670370eee6566b0bfd4265f65b3f432e8c6d85623f728d4fa31f739" dependencies = [ - "indexmap 2.0.0", + "indexmap 1.9.3", "serde", "serde_spanned", "toml_datetime", @@ -5225,9 +4875,9 @@ dependencies = [ [[package]] name = "tracing-actix-web" -version = "0.7.6" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c0b08ce08cbde6a96fc1e4ebb8132053e53ec7a5cd27eef93ede6b73ebbda06" +checksum = "ce52ffaf2d544e317d3bef63f49a6a22022866505fa4840a4339b1756834a2a9" dependencies = [ "actix-web", "opentelemetry", @@ -5337,9 +4987,9 @@ dependencies = [ [[package]] name = "triomphe" -version = "0.1.9" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee8098afad3fb0c54a9007aab6804558410503ad676d4633f9c2559a00ac0f" +checksum = "f1ee9bd9239c339d714d657fac840c6d2a4f9c45f4f9ec7b0975113458be78db" [[package]] name = "try-lock" @@ -5355,9 +5005,9 @@ checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "ucd-trie" -version = "0.1.6" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" [[package]] name = "unarray" @@ -5382,9 +5032,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.11" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" [[package]] name = "unicode-normalization" @@ -5427,9 +5077,9 @@ dependencies = [ [[package]] name = "urlencoding" -version = "2.1.3" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" +checksum = "e8db7427f936968176eaa7cdf81b7f98b980b18495ec28f1b5791ac3bfe3eea9" [[package]] name = "urlparse" @@ -5439,11 +5089,11 @@ checksum = "110352d4e9076c67839003c7788d8604e24dcded13e0b375af3efaa8cf468517" [[package]] name = "utoipa" -version = "3.4.4" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de634b7f8178c9c246c88ea251f3a0215c9a4d80778db2d7bd4423a78b5170ec" +checksum = "68ae74ef183fae36d650f063ae7bde1cacbe1cd7e72b617cbe1e985551878b98" dependencies = [ - "indexmap 2.0.0", + "indexmap 1.9.3", "serde", "serde_json", "utoipa-gen", @@ -5451,21 +5101,21 @@ dependencies = [ [[package]] name = "utoipa-gen" -version = "3.4.5" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcba79cb3e5020d9bcc8313cd5aadaf51d6d54a6b3fd08c3d0360ae6b3c83d0" +checksum = "7ea8ac818da7e746a63285594cce8a96f5e00ee31994e655bd827569cb8b137b" dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.18", ] [[package]] name = "utoipa-swagger-ui" -version = "3.1.5" +version = "3.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84614caa239fb25b2bb373a52859ffd94605ceb256eeb1d63436325cf81e3653" +checksum = "062bba5a3568e126ac72049a63254f4cb1da2eb713db0c1ab2a4c76be191db8c" dependencies = [ "actix-web", "mime_guess", @@ -5479,9 +5129,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.4.1" +version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" +checksum = "0fa2982af2eec27de306107c027578ff7f423d65f7250e40ce0fea8f45248b81" dependencies = [ "getrandom 0.2.10", "serde", @@ -5501,9 +5151,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "vergen" -version = "8.2.4" +version = "8.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbc5ad0d9d26b2c49a5ab7da76c3e79d3ee37e7821799f8223fcb8f2f391a2e7" +checksum = "8b3c89c2c7e50f33e4d35527e5bf9c11d6d132226dbbd1753f0fbe9f19ef88c6" dependencies = [ "anyhow", "git2", @@ -5597,7 +5247,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.18", "wasm-bindgen-shared", ] @@ -5631,7 +5281,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.18", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5690,12 +5340,6 @@ dependencies = [ "webpki", ] -[[package]] -name = "weezl" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" - [[package]] name = "winapi" version = "0.3.9" @@ -5736,6 +5380,21 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -5747,55 +5406,97 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.1" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_aarch64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_i686_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + [[package]] name = "windows_x86_64_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "windows_x86_64_msvc" version = "0.48.0" @@ -5804,9 +5505,9 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "winnow" -version = "0.5.4" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acaaa1190073b2b101e15083c38ee8ec891b5e05cbee516521e94ec008f61e64" +checksum = "ca0ace3845f0d96209f0375e6d367e3eb87eb65d27d445bdc9f1843a26f39448" dependencies = [ "memchr", ] @@ -5877,18 +5578,18 @@ dependencies = [ [[package]] name = "zstd" -version = "0.12.4" +version = "0.12.3+zstd.1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a27595e173641171fc74a1232b7b1c7a7cb6e18222c11e9dfb9888fa424c53c" +checksum = "76eea132fb024e0e13fd9c2f5d5d595d8a967aa72382ac2f9d39fcc95afd0806" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "6.0.6" +version = "6.0.5+zstd.1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee98ffd0b48ee95e6c5168188e44a54550b1564d9d530ee21d5f0eaed1069581" +checksum = "d56d9e60b4b1758206c238a10165fbcae3ca37b01744e394c463463f6529d23b" dependencies = [ "libc", "zstd-sys", diff --git a/crates/api_models/src/payments.rs b/crates/api_models/src/payments.rs index 9efa70da0a..c8d8b6de5e 100644 --- a/crates/api_models/src/payments.rs +++ b/crates/api_models/src/payments.rs @@ -308,7 +308,7 @@ pub struct PaymentAttemptResponse { /// The payment attempt amount. Amount for the payment in lowest denomination of the currency. (i.e) in cents for USD denomination, in paisa for INR denomination etc., pub amount: i64, /// The currency of the amount of the payment attempt - #[schema(value_type = Option, example = "usd")] + #[schema(value_type = Option, example = "USD")] pub currency: Option, /// The connector used for the payment pub connector: Option, @@ -346,6 +346,38 @@ pub struct PaymentAttemptResponse { pub reference_id: Option, } +#[derive( + Default, Debug, serde::Serialize, Clone, PartialEq, ToSchema, router_derive::PolymorphicSchema, +)] +pub struct CaptureResponse { + /// unique identifier for the capture + pub capture_id: String, + /// The status of the capture + #[schema(value_type = CaptureStatus, example = "charged")] + pub status: enums::CaptureStatus, + /// The capture amount. Amount for the payment in lowest denomination of the currency. (i.e) in cents for USD denomination, in paisa for INR denomination etc., + pub amount: i64, + /// The currency of the amount of the capture + #[schema(value_type = Option, example = "USD")] + pub currency: Option, + /// The connector used for the payment + pub connector: String, + /// unique identifier for the parent attempt on which this capture is made + pub authorized_attempt_id: String, + /// A unique identifier for a capture provided by the connector + pub connector_capture_id: Option, + /// sequence number of this capture + pub capture_sequence: i16, + /// If there was an error while calling the connector the error message is received here + pub error_message: Option, + /// If there was an error while calling the connectors the code is received here + pub error_code: Option, + /// If there was an error while calling the connectors the reason is received here + pub error_reason: Option, + /// reference to the capture at connector side + pub reference_id: Option, +} + impl PaymentsRequest { pub fn get_feature_metadata_as_value( &self, @@ -1711,6 +1743,11 @@ pub struct PaymentsResponse { #[serde(skip_serializing_if = "Option::is_none")] pub attempts: Option>, + /// List of captures done on latest attempt + #[schema(value_type = Option>)] + #[serde(skip_serializing_if = "Option::is_none")] + pub captures: Option>, + /// A unique identifier to link the payment to a mandate, can be use instead of payment_method_data #[schema(max_length = 255, example = "mandate_iwer89rnjef349dni3")] pub mandate_id: Option, diff --git a/crates/common_enums/src/enums.rs b/crates/common_enums/src/enums.rs index f90f183648..469ba6ee3b 100644 --- a/crates/common_enums/src/enums.rs +++ b/crates/common_enums/src/enums.rs @@ -7,11 +7,12 @@ use utoipa::ToSchema; pub mod diesel_exports { pub use super::{ DbAttemptStatus as AttemptStatus, DbAuthenticationType as AuthenticationType, - DbCaptureMethod as CaptureMethod, DbConnectorType as ConnectorType, - DbCountryAlpha2 as CountryAlpha2, DbCurrency as Currency, DbDisputeStage as DisputeStage, - DbDisputeStatus as DisputeStatus, DbEventType as EventType, DbFutureUsage as FutureUsage, - DbIntentStatus as IntentStatus, DbMandateStatus as MandateStatus, - DbPaymentMethodIssuerCode as PaymentMethodIssuerCode, DbRefundStatus as RefundStatus, + DbCaptureMethod as CaptureMethod, DbCaptureStatus as CaptureStatus, + DbConnectorType as ConnectorType, DbCountryAlpha2 as CountryAlpha2, DbCurrency as Currency, + DbDisputeStage as DisputeStage, DbDisputeStatus as DisputeStatus, DbEventType as EventType, + DbFutureUsage as FutureUsage, DbIntentStatus as IntentStatus, + DbMandateStatus as MandateStatus, DbPaymentMethodIssuerCode as PaymentMethodIssuerCode, + DbRefundStatus as RefundStatus, }; } @@ -96,6 +97,7 @@ pub enum AuthenticationType { serde::Serialize, strum::Display, strum::EnumString, + ToSchema, Hash, )] #[router_derive::diesel_enum(storage_type = "pg_enum")] diff --git a/crates/diesel_models/src/capture.rs b/crates/diesel_models/src/capture.rs index a747960b13..30eee900cf 100644 --- a/crates/diesel_models/src/capture.rs +++ b/crates/diesel_models/src/capture.rs @@ -4,7 +4,7 @@ use time::PrimitiveDateTime; use crate::{enums as storage_enums, schema::captures}; -#[derive(Clone, Debug, Eq, PartialEq, Identifiable, Queryable, Serialize, Deserialize)] +#[derive(Clone, Debug, Eq, PartialEq, Identifiable, Queryable, Serialize, Deserialize, Hash)] #[diesel(table_name = captures)] #[diesel(primary_key(capture_id))] pub struct Capture { @@ -14,7 +14,7 @@ pub struct Capture { pub status: storage_enums::CaptureStatus, pub amount: i64, pub currency: Option, - pub connector: Option, + pub connector: String, pub error_message: Option, pub error_code: Option, pub error_reason: Option, @@ -24,8 +24,10 @@ pub struct Capture { #[serde(with = "common_utils::custom_serde::iso8601")] pub modified_at: PrimitiveDateTime, pub authorized_attempt_id: String, - pub connector_transaction_id: Option, + pub connector_capture_id: Option, pub capture_sequence: i16, + // reference to the capture at connector side + pub connector_response_reference_id: Option, } #[derive(Clone, Debug, Insertable, router_derive::DebugAsDisplay, Serialize, Deserialize)] @@ -37,7 +39,7 @@ pub struct CaptureNew { pub status: storage_enums::CaptureStatus, pub amount: i64, pub currency: Option, - pub connector: Option, + pub connector: String, pub error_message: Option, pub error_code: Option, pub error_reason: Option, @@ -47,15 +49,17 @@ pub struct CaptureNew { #[serde(with = "common_utils::custom_serde::iso8601")] pub modified_at: PrimitiveDateTime, pub authorized_attempt_id: String, - pub connector_transaction_id: Option, + pub connector_capture_id: Option, pub capture_sequence: i16, + pub connector_response_reference_id: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] pub enum CaptureUpdate { ResponseUpdate { status: storage_enums::CaptureStatus, - connector_transaction_id: Option, + connector_capture_id: Option, + connector_response_reference_id: Option, }, ErrorUpdate { status: storage_enums::CaptureStatus, @@ -73,7 +77,8 @@ pub struct CaptureUpdateInternal { pub error_code: Option, pub error_reason: Option, pub modified_at: Option, - pub connector_transaction_id: Option, + pub connector_capture_id: Option, + pub connector_response_reference_id: Option, } impl CaptureUpdate { @@ -96,11 +101,13 @@ impl From for CaptureUpdateInternal { match payment_attempt_child_update { CaptureUpdate::ResponseUpdate { status, - connector_transaction_id, + connector_capture_id: connector_transaction_id, + connector_response_reference_id, } => Self { status: Some(status), - connector_transaction_id, + connector_capture_id: connector_transaction_id, modified_at: now, + connector_response_reference_id, ..Self::default() }, CaptureUpdate::ErrorUpdate { diff --git a/crates/diesel_models/src/payment_attempt.rs b/crates/diesel_models/src/payment_attempt.rs index 6ab17c34a0..07021fee68 100644 --- a/crates/diesel_models/src/payment_attempt.rs +++ b/crates/diesel_models/src/payment_attempt.rs @@ -193,9 +193,8 @@ pub enum PaymentAttemptUpdate { error_message: Option>, error_reason: Option>, }, - MultipleCaptureUpdate { - status: Option, - multiple_capture_count: Option, + MultipleCaptureCountUpdate { + multiple_capture_count: i16, }, PreprocessingUpdate { status: storage_enums::AttemptStatus, @@ -444,12 +443,10 @@ impl From for PaymentAttemptUpdateInternal { connector_response_reference_id, ..Default::default() }, - PaymentAttemptUpdate::MultipleCaptureUpdate { - status, + PaymentAttemptUpdate::MultipleCaptureCountUpdate { multiple_capture_count, } => Self { - status, - multiple_capture_count, + multiple_capture_count: Some(multiple_capture_count), ..Default::default() }, } diff --git a/crates/diesel_models/src/query/capture.rs b/crates/diesel_models/src/query/capture.rs index 26623b0160..c5a5725f11 100644 --- a/crates/diesel_models/src/query/capture.rs +++ b/crates/diesel_models/src/query/capture.rs @@ -1,4 +1,4 @@ -use diesel::{associations::HasTable, BoolExpressionMethods, ExpressionMethods, Table}; +use diesel::{associations::HasTable, BoolExpressionMethods, ExpressionMethods}; use router_env::{instrument, tracing}; use super::generics; @@ -58,12 +58,7 @@ impl Capture { authorized_attempt_id: &str, conn: &PgPooledConn, ) -> StorageResult> { - generics::generic_filter::< - ::Table, - _, - <::Table as Table>::PrimaryKey, - _, - >( + generics::generic_filter::<::Table, _, _, _>( conn, dsl::authorized_attempt_id .eq(authorized_attempt_id.to_owned()) @@ -71,7 +66,7 @@ impl Capture { .and(dsl::payment_id.eq(payment_id.to_owned())), None, None, - None, + Some(dsl::created_at.asc()), ) .await } diff --git a/crates/diesel_models/src/schema.rs b/crates/diesel_models/src/schema.rs index 7acbcf0232..e580da33a2 100644 --- a/crates/diesel_models/src/schema.rs +++ b/crates/diesel_models/src/schema.rs @@ -96,7 +96,7 @@ diesel::table! { amount -> Int8, currency -> Nullable, #[max_length = 255] - connector -> Nullable, + connector -> Varchar, #[max_length = 255] error_message -> Nullable, #[max_length = 255] @@ -109,8 +109,10 @@ diesel::table! { #[max_length = 64] authorized_attempt_id -> Varchar, #[max_length = 128] - connector_transaction_id -> Nullable, + connector_capture_id -> Nullable, capture_sequence -> Int2, + #[max_length = 128] + connector_response_reference_id -> Nullable, } } diff --git a/crates/router/src/core/payments.rs b/crates/router/src/core/payments.rs index 6f1dee662c..95b3a32d50 100644 --- a/crates/router/src/core/payments.rs +++ b/crates/router/src/core/payments.rs @@ -5,8 +5,9 @@ pub mod helpers; pub mod operations; pub mod tokenization; pub mod transformers; +pub mod types; -use std::{collections::HashMap, fmt::Debug, marker::PhantomData, ops::Deref, time::Instant}; +use std::{fmt::Debug, marker::PhantomData, ops::Deref, time::Instant}; use api_models::payments::FrmMessage; use common_utils::{ext_traits::AsyncExt, pii}; @@ -36,7 +37,7 @@ use crate::{ scheduler::{utils as pt_utils, workflows::payment_sync}, services::{self, api::Authenticate}, types::{ - self, api, domain, + self as router_types, api, domain, storage::{self, enums as storage_enums, ProcessTrackerExt}, }, utils::{add_connector_http_status_code_metrics, Encode, OptionExt, ValueExt}, @@ -58,12 +59,12 @@ where Op: Operation + Send + Sync, // To create connector flow specific interface data - PaymentData: ConstructFlowSpecificData, - types::RouterData: Feature, + PaymentData: ConstructFlowSpecificData, + router_types::RouterData: Feature, // To construct connector flow specific api - dyn types::api::Connector: - services::api::ConnectorIntegration, + dyn router_types::api::Connector: + services::api::ConnectorIntegration, // To perform router related operation for PaymentResponse PaymentResponse: Operation, @@ -251,12 +252,12 @@ where Req: Debug + Authenticate, Res: transformers::ToResponse, Op>, // To create connector flow specific interface data - PaymentData: ConstructFlowSpecificData, - types::RouterData: Feature, + PaymentData: ConstructFlowSpecificData, + router_types::RouterData: Feature, // To construct connector flow specific api - dyn types::api::Connector: - services::api::ConnectorIntegration, + dyn router_types::api::Connector: + services::api::ConnectorIntegration, // To perform router related operation for PaymentResponse PaymentResponse: Operation, @@ -315,7 +316,7 @@ pub trait PaymentRedirectFlow: Sync { fn generate_response( &self, payments_response: api_models::payments::PaymentsResponse, - merchant_account: types::domain::MerchantAccount, + merchant_account: router_types::domain::MerchantAccount, payment_id: String, connector: String, ) -> RouterResult; @@ -435,7 +436,7 @@ impl PaymentRedirectFlow for PaymentRedirectCompleteAuthorize { fn generate_response( &self, payments_response: api_models::payments::PaymentsResponse, - merchant_account: types::domain::MerchantAccount, + merchant_account: router_types::domain::MerchantAccount, payment_id: String, connector: String, ) -> RouterResult { @@ -524,7 +525,7 @@ impl PaymentRedirectFlow for PaymentRedirectSync { fn generate_response( &self, payments_response: api_models::payments::PaymentsResponse, - merchant_account: types::domain::MerchantAccount, + merchant_account: router_types::domain::MerchantAccount, payment_id: String, connector: String, ) -> RouterResult { @@ -555,18 +556,19 @@ pub async fn call_connector_service( updated_customer: Option, requeue: bool, schedule_time: Option, -) -> RouterResult> +) -> RouterResult> where F: Send + Clone + Sync, RouterDReq: Send + Sync, // To create connector flow specific interface data - PaymentData: ConstructFlowSpecificData, - types::RouterData: Feature + Send, + PaymentData: ConstructFlowSpecificData, + router_types::RouterData: + Feature + Send, // To construct connector flow specific api dyn api::Connector: - services::api::ConnectorIntegration, + services::api::ConnectorIntegration, { let stime_connector = Instant::now(); @@ -607,7 +609,7 @@ where ) .await?; - if let Ok(types::PaymentsResponseData::PreProcessingResponse { + if let Ok(router_types::PaymentsResponseData::PreProcessingResponse { session_token: Some(session_token), .. }) = router_data.response.to_owned() @@ -697,11 +699,12 @@ where F: Send + Clone, // To create connector flow specific interface data - PaymentData: ConstructFlowSpecificData, - types::RouterData: Feature, + PaymentData: ConstructFlowSpecificData, + router_types::RouterData: Feature, // To construct connector flow specific api - dyn api::Connector: services::api::ConnectorIntegration, + dyn api::Connector: + services::api::ConnectorIntegration, // To perform router related operation for PaymentResponse PaymentResponse: Operation, @@ -733,8 +736,10 @@ where let connector_name = session_connector.connector.connector_name.to_string(); match connector_res { Ok(connector_response) => { - if let Ok(types::PaymentsResponseData::SessionResponse { session_token, .. }) = - connector_response.response + if let Ok(router_types::PaymentsResponseData::SessionResponse { + session_token, + .. + }) = connector_response.response { // If session token is NoSessionTokenReceived, it is not pushed into the sessions_token as there is no response or there can be some error // In case of error, that error is already logged @@ -776,11 +781,12 @@ where Req: Send + Sync, // To create connector flow specific interface data - PaymentData: ConstructFlowSpecificData, - types::RouterData: Feature + Send, + PaymentData: ConstructFlowSpecificData, + router_types::RouterData: Feature + Send, // To construct connector flow specific api - dyn api::Connector: services::api::ConnectorIntegration, + dyn api::Connector: + services::api::ConnectorIntegration, // To perform router related operation for PaymentResponse PaymentResponse: Operation, @@ -850,21 +856,25 @@ async fn complete_preprocessing_steps_if_required( state: &AppState, connector: &api::ConnectorData, payment_data: &PaymentData, - mut router_data: types::RouterData, + mut router_data: router_types::RouterData, should_continue_payment: bool, -) -> RouterResult<(types::RouterData, bool)> +) -> RouterResult<( + router_types::RouterData, + bool, +)> where F: Send + Clone + Sync, Req: Send + Sync, - types::RouterData: Feature + Send, - dyn api::Connector: services::api::ConnectorIntegration, + router_types::RouterData: Feature + Send, + dyn api::Connector: + services::api::ConnectorIntegration, { //TODO: For ACH transfers, if preprocessing_step is not required for connectors encountered in future, add the check let router_data_and_should_continue_payment = match payment_data.payment_method_data.clone() { Some(api_models::payments::PaymentMethodData::BankTransfer(data)) => match data.deref() { api_models::payments::BankTransferData::AchBankTransfer { .. } | api_models::payments::BankTransferData::MultibancoBankTransfer { .. } - if connector.connector_name == types::Connector::Stripe => + if connector.connector_name == router_types::Connector::Stripe => { if payment_data.payment_attempt.preprocessing_step_id.is_none() { ( @@ -888,7 +898,7 @@ where } } Some(api_models::payments::PaymentMethodData::Card(_)) => { - if connector.connector_name == types::Connector::Payme { + if connector.connector_name == router_types::Connector::Payme { router_data = router_data.preprocessing_steps(state, connector).await?; let is_error_in_response = router_data.response.is_err(); @@ -1118,7 +1128,7 @@ where pub flow: PhantomData, pub payment_intent: storage::PaymentIntent, pub payment_attempt: storage::PaymentAttempt, - pub multiple_capture_data: Option, + pub multiple_capture_data: Option, pub connector_response: storage::ConnectorResponse, pub amount: api::Amount, pub mandate_id: Option, @@ -1145,96 +1155,6 @@ where pub frm_message: Option, } -#[derive(Clone)] -pub struct MultipleCaptureData { - previous_captures: Vec, - current_capture: storage::Capture, -} - -impl MultipleCaptureData { - fn get_previously_blocked_amount(&self) -> i64 { - self.previous_captures - .iter() - .fold(0, |accumulator, capture| { - accumulator - + match capture.status { - storage_enums::CaptureStatus::Charged - | storage_enums::CaptureStatus::Pending => capture.amount, - storage_enums::CaptureStatus::Started - | storage_enums::CaptureStatus::Failed => 0, - } - }) - } - fn get_total_blocked_amount(&self) -> i64 { - self.get_previously_blocked_amount() - + match self.current_capture.status { - api_models::enums::CaptureStatus::Charged - | api_models::enums::CaptureStatus::Pending => self.current_capture.amount, - api_models::enums::CaptureStatus::Failed - | api_models::enums::CaptureStatus::Started => 0, - } - } - fn get_previously_charged_amount(&self) -> i64 { - self.previous_captures - .iter() - .fold(0, |accumulator, capture| { - accumulator - + match capture.status { - storage_enums::CaptureStatus::Charged => capture.amount, - storage_enums::CaptureStatus::Pending - | storage_enums::CaptureStatus::Started - | storage_enums::CaptureStatus::Failed => 0, - } - }) - } - fn get_total_charged_amount(&self) -> i64 { - self.get_previously_charged_amount() - + match self.current_capture.status { - storage_enums::CaptureStatus::Charged => self.current_capture.amount, - storage_enums::CaptureStatus::Pending - | storage_enums::CaptureStatus::Started - | storage_enums::CaptureStatus::Failed => 0, - } - } - fn get_captures_count(&self) -> RouterResult { - i16::try_from(1 + self.previous_captures.len()) - .into_report() - .change_context(errors::ApiErrorResponse::InternalServerError) - .attach_printable("Error while converting from usize to i16") - } - fn get_status_count(&self) -> HashMap { - let mut hash_map: HashMap = HashMap::new(); - hash_map.insert(storage_enums::CaptureStatus::Charged, 0); - hash_map.insert(storage_enums::CaptureStatus::Pending, 0); - hash_map.insert(storage_enums::CaptureStatus::Started, 0); - hash_map.insert(storage_enums::CaptureStatus::Failed, 0); - hash_map - .entry(self.current_capture.status) - .and_modify(|count| *count += 1); - self.previous_captures - .iter() - .fold(hash_map, |mut accumulator, capture| { - let current_capture_status = capture.status; - accumulator - .entry(current_capture_status) - .and_modify(|count| *count += 1); - accumulator - }) - } - fn get_attempt_status(&self, authorized_amount: i64) -> storage_enums::AttemptStatus { - let total_captured_amount = self.get_total_charged_amount(); - if authorized_amount == total_captured_amount { - return storage_enums::AttemptStatus::Charged; - } - let status_count_map = self.get_status_count(); - if status_count_map.get(&storage_enums::CaptureStatus::Charged) > Some(&0) { - storage_enums::AttemptStatus::PartialCharged - } else { - storage_enums::AttemptStatus::CaptureInitiated - } - } -} - #[derive(Debug, Default, Clone)] pub struct RecurringMandatePaymentData { pub payment_method_type: Option, //required for making recurring payment using saved payment method through stripe diff --git a/crates/router/src/core/payments/flows/psync_flow.rs b/crates/router/src/core/payments/flows/psync_flow.rs index 40093fbed9..e1646502fc 100644 --- a/crates/router/src/core/payments/flows/psync_flow.rs +++ b/crates/router/src/core/payments/flows/psync_flow.rs @@ -1,9 +1,11 @@ +use std::collections::HashMap; + use async_trait::async_trait; use super::{ConstructFlowSpecificData, Feature}; use crate::{ core::{ - errors::{ConnectorErrorExt, RouterResult}, + errors::{ApiErrorResponse, ConnectorErrorExt, RouterResult}, payments::{self, access_token, transformers, PaymentData}, }, routes::AppState, @@ -42,7 +44,7 @@ impl Feature for types::RouterData { async fn decide_flows<'a>( - self, + mut self, state: &AppState, connector: &api::ConnectorData, _customer: &Option, @@ -56,17 +58,44 @@ impl Feature types::PaymentsSyncData, types::PaymentsResponseData, > = connector.connector.get_connector_integration(); - let resp = services::execute_connector_processing_step( - state, - connector_integration, - &self, - call_connector_action, - connector_request, - ) - .await - .to_payment_failed_response()?; - Ok(resp) + let capture_sync_method_result = connector_integration + .get_multiple_capture_sync_method() + .to_payment_failed_response(); + + match ( + self.request.capture_sync_type.clone(), + capture_sync_method_result, + ) { + ( + types::CaptureSyncType::MultipleCaptureSync(pending_connector_capture_id_list), + Ok(services::CaptureSyncMethod::Individual), + ) => { + let resp = self + .execute_connector_processing_step_for_each_capture( + state, + pending_connector_capture_id_list, + call_connector_action, + connector_integration, + ) + .await?; + Ok(resp) + } + (types::CaptureSyncType::MultipleCaptureSync(_), Err(err)) => Err(err), + _ => { + // for bulk sync of captures, above logic needs to be handled at connector end + let resp = services::execute_connector_processing_step( + state, + connector_integration, + &self, + call_connector_action, + connector_request, + ) + .await + .to_payment_failed_response()?; + Ok(resp) + } + } } async fn add_access_token<'a>( @@ -103,3 +132,57 @@ impl Feature Ok((request, true)) } } + +impl types::RouterData { + async fn execute_connector_processing_step_for_each_capture( + mut self, + state: &AppState, + pending_connector_capture_id_list: Vec, + call_connector_action: payments::CallConnectorAction, + connector_integration: services::BoxedConnectorIntegration< + '_, + api::PSync, + types::PaymentsSyncData, + types::PaymentsResponseData, + >, + ) -> RouterResult { + let mut capture_sync_response_list = HashMap::new(); + for connector_capture_id in pending_connector_capture_id_list { + self.request.connector_transaction_id = + types::ResponseId::ConnectorTransactionId(connector_capture_id.clone()); + let resp = services::execute_connector_processing_step( + state, + connector_integration.clone(), + &self, + call_connector_action.clone(), + None, + ) + .await + .to_payment_failed_response()?; + let capture_sync_response = match resp.response { + Err(err) => types::CaptureSyncResponse::Error { + code: err.code, + message: err.message, + reason: err.reason, + status_code: err.status_code, + }, + Ok(types::PaymentsResponseData::TransactionResponse { + resource_id, + connector_response_reference_id, + .. + }) => types::CaptureSyncResponse::Success { + resource_id, + status: resp.status, + connector_response_reference_id, + }, + // this error is never meant to occur. response type will always be PaymentsResponseData::TransactionResponse + _ => Err(ApiErrorResponse::PreconditionFailed { message: "Response type must be PaymentsResponseData::TransactionResponse for payment sync".into() })?, + }; + capture_sync_response_list.insert(connector_capture_id.clone(), capture_sync_response); + } + self.response = Ok(types::PaymentsResponseData::MultipleCaptureResponse { + capture_sync_response_list, + }); + Ok(self) + } +} diff --git a/crates/router/src/core/payments/operations/payment_capture.rs b/crates/router/src/core/payments/operations/payment_capture.rs index 028b5c9a22..ed47e4705d 100644 --- a/crates/router/src/core/payments/operations/payment_capture.rs +++ b/crates/router/src/core/payments/operations/payment_capture.rs @@ -11,7 +11,7 @@ use super::{BoxedOperation, Domain, GetTracker, Operation, UpdateTracker, Valida use crate::{ core::{ errors::{self, RouterResult, StorageErrorExt}, - payments::{self, helpers, operations}, + payments::{self, helpers, operations, types::MultipleCaptureData}, }, db::StorageInterface, routes::AppState, @@ -85,78 +85,77 @@ impl GetTracker, api::PaymentsCaptu helpers::validate_capture_method(capture_method)?; - let (multiple_capture_data, connector_response) = - if capture_method == enums::CaptureMethod::ManualMultiple { - let amount_to_capture = request - .amount_to_capture - .get_required_value("amount_to_capture")?; - let previous_captures = db - .find_all_captures_by_merchant_id_payment_id_authorized_attempt_id( - &payment_attempt.merchant_id, - &payment_attempt.payment_id, - &payment_attempt.attempt_id, - storage_scheme, - ) - .await - .to_not_found_response(errors::ApiErrorResponse::PaymentNotFound)?; - let previously_blocked_amount = - previous_captures.iter().fold(0, |accumulator, capture| { - accumulator - + match capture.status { - enums::CaptureStatus::Charged | enums::CaptureStatus::Pending => { - capture.amount - } - enums::CaptureStatus::Started | enums::CaptureStatus::Failed => 0, - } - }); - helpers::validate_amount_to_capture( - payment_attempt.amount - previously_blocked_amount, - Some(amount_to_capture), - )?; - - let capture = db - .insert_capture( - payment_attempt - .make_new_capture(amount_to_capture, enums::CaptureStatus::Started), - storage_scheme, - ) - .await - .to_not_found_response(errors::ApiErrorResponse::DuplicatePayment { - payment_id: payment_id.clone(), - })?; - let new_connector_response = db - .insert_connector_response( - ConnectorResponse::make_new_connector_response( - capture.payment_id.clone(), - capture.merchant_id.clone(), - capture.capture_id.clone(), - capture.connector.clone(), - ), - storage_scheme, - ) - .await - .to_not_found_response(errors::ApiErrorResponse::DuplicatePayment { - payment_id: payment_id.clone(), - })?; - ( - Some(payments::MultipleCaptureData { - previous_captures, - current_capture: capture, - }), - new_connector_response, + let (multiple_capture_data, connector_response) = if capture_method + == enums::CaptureMethod::ManualMultiple + { + let amount_to_capture = request + .amount_to_capture + .get_required_value("amount_to_capture")?; + let previous_captures = db + .find_all_captures_by_merchant_id_payment_id_authorized_attempt_id( + &payment_attempt.merchant_id, + &payment_attempt.payment_id, + &payment_attempt.attempt_id, + storage_scheme, ) - } else { - let connector_response = db - .find_connector_response_by_payment_id_merchant_id_attempt_id( - &payment_attempt.payment_id, - &payment_attempt.merchant_id, - &payment_attempt.attempt_id, - storage_scheme, - ) - .await - .to_not_found_response(errors::ApiErrorResponse::PaymentNotFound)?; - (None, connector_response) - }; + .await + .to_not_found_response(errors::ApiErrorResponse::PaymentNotFound)?; + let previously_blocked_amount = + previous_captures.iter().fold(0, |accumulator, capture| { + accumulator + + match capture.status { + enums::CaptureStatus::Charged | enums::CaptureStatus::Pending => { + capture.amount + } + enums::CaptureStatus::Started | enums::CaptureStatus::Failed => 0, + } + }); + helpers::validate_amount_to_capture( + payment_attempt.amount - previously_blocked_amount, + Some(amount_to_capture), + )?; + + let capture = db + .insert_capture( + payment_attempt + .make_new_capture(amount_to_capture, enums::CaptureStatus::Started)?, + storage_scheme, + ) + .await + .to_not_found_response(errors::ApiErrorResponse::DuplicatePayment { + payment_id: payment_id.clone(), + })?; + let new_connector_response = db + .insert_connector_response( + ConnectorResponse::make_new_connector_response( + capture.payment_id.clone(), + capture.merchant_id.clone(), + capture.capture_id.clone(), + Some(capture.connector.clone()), + ), + storage_scheme, + ) + .await + .to_not_found_response(errors::ApiErrorResponse::DuplicatePayment { payment_id })?; + ( + Some(MultipleCaptureData::new_for_create( + previous_captures, + capture, + )), + new_connector_response, + ) + } else { + let connector_response = db + .find_connector_response_by_payment_id_merchant_id_attempt_id( + &payment_attempt.payment_id, + &payment_attempt.merchant_id, + &payment_attempt.attempt_id, + storage_scheme, + ) + .await + .to_not_found_response(errors::ApiErrorResponse::PaymentNotFound)?; + (None, connector_response) + }; currency = payment_attempt.currency.get_required_value("currency")?; @@ -262,24 +261,16 @@ impl UpdateTracker, api::PaymentsCaptureRe F: 'b + Send, { payment_data.payment_attempt = match &payment_data.multiple_capture_data { - Some(multiple_capture_data) => { - let mut updated_payment_attempt = db - .update_payment_attempt_with_attempt_id( - payment_data.payment_attempt, - storage::PaymentAttemptUpdate::MultipleCaptureUpdate { - status: None, - multiple_capture_count: Some( - multiple_capture_data.current_capture.capture_sequence, - ), - }, - storage_scheme, - ) - .await - .to_not_found_response(errors::ApiErrorResponse::PaymentNotFound)?; - updated_payment_attempt.amount_to_capture = - Some(multiple_capture_data.current_capture.amount); - updated_payment_attempt - } + Some(multiple_capture_data) => db + .update_payment_attempt_with_attempt_id( + payment_data.payment_attempt, + storage::PaymentAttemptUpdate::MultipleCaptureCountUpdate { + multiple_capture_count: multiple_capture_data.get_captures_count()?, + }, + storage_scheme, + ) + .await + .to_not_found_response(errors::ApiErrorResponse::PaymentNotFound)?, None => payment_data.payment_attempt, }; Ok((Box::new(self), payment_data)) diff --git a/crates/router/src/core/payments/operations/payment_response.rs b/crates/router/src/core/payments/operations/payment_response.rs index db36eb11a1..a5268f39dc 100644 --- a/crates/router/src/core/payments/operations/payment_response.rs +++ b/crates/router/src/core/payments/operations/payment_response.rs @@ -1,3 +1,5 @@ +use std::collections::HashMap; + use async_trait::async_trait; use error_stack::ResultExt; use router_derive; @@ -7,7 +9,7 @@ use crate::{ core::{ errors::{self, RouterResult, StorageErrorExt}, mandate, - payments::PaymentData, + payments::{types::MultipleCaptureData, PaymentData}, }, db::StorageInterface, routes::metrics, @@ -16,6 +18,7 @@ use crate::{ self, api, storage::{self, enums}, transformers::{ForeignFrom, ForeignTryFrom}, + CaptureSyncResponse, }, utils, }; @@ -229,8 +232,8 @@ async fn payment_response_update_tracker( { Err(err) => { let (capture_update, attempt_update) = match payment_data.multiple_capture_data { - Some(_) => ( - Some(storage::CaptureUpdate::ErrorUpdate { + Some(multiple_capture_data) => { + let capture_update = storage::CaptureUpdate::ErrorUpdate { status: match err.status_code { 500..=511 => storage::enums::CaptureStatus::Pending, _ => storage::enums::CaptureStatus::Failed, @@ -238,10 +241,13 @@ async fn payment_response_update_tracker( error_code: Some(err.code), error_message: Some(err.message), error_reason: err.reason, - }), - // attempt status will depend on collective capture status - None, - ), + }; + let capture_update_list = vec![( + multiple_capture_data.get_latest_capture().clone(), + capture_update, + )]; + (Some((multiple_capture_data, capture_update_list)), None) + } None => ( None, Some(storage::PaymentAttemptUpdate::ErrorUpdate { @@ -327,17 +333,20 @@ async fn payment_response_update_tracker( metrics::SUCCESSFUL_PAYMENT.add(&metrics::CONTEXT, 1, &[]); } - let (capture_update, payment_attempt_update) = + let (capture_updates, payment_attempt_update) = match payment_data.multiple_capture_data { - Some(_) => ( - //if payment_data.multiple_capture_data will be Some only for multiple partial capture. - Some(storage::CaptureUpdate::ResponseUpdate { + Some(multiple_capture_data) => { + let capture_update = storage::CaptureUpdate::ResponseUpdate { status: enums::CaptureStatus::foreign_try_from(router_data.status)?, - connector_transaction_id: connector_transaction_id.clone(), - }), - // attempt status will depend on collective capture status - None, - ), + connector_capture_id: connector_transaction_id.clone(), + connector_response_reference_id, + }; + let capture_update_list = vec![( + multiple_capture_data.get_latest_capture().clone(), + capture_update, + )]; + (Some((multiple_capture_data, capture_update_list)), None) + } None => ( None, Some(storage::PaymentAttemptUpdate::ResponseUpdate { @@ -368,7 +377,7 @@ async fn payment_response_update_tracker( }; ( - capture_update, + capture_updates, payment_attempt_update, Some(connector_response_update), ) @@ -403,28 +412,38 @@ async fn payment_response_update_tracker( types::PaymentsResponseData::TokenizationResponse { .. } => (None, None, None), types::PaymentsResponseData::ConnectorCustomerResponse { .. } => (None, None, None), types::PaymentsResponseData::ThreeDSEnrollmentResponse { .. } => (None, None, None), + types::PaymentsResponseData::MultipleCaptureResponse { + capture_sync_response_list, + } => match payment_data.multiple_capture_data { + Some(multiple_capture_data) => { + let capture_update_list = response_to_capture_update( + &multiple_capture_data, + capture_sync_response_list, + )?; + ( + Some((multiple_capture_data, capture_update_list)), + None, + None, + ) + } + None => (None, None, None), + }, }, }; - payment_data.multiple_capture_data = match capture_update - .zip(payment_data.multiple_capture_data) - { - Some((capture_update, mut multiple_capture_data)) => { - let updated_capture = db - .update_capture_with_capture_id( - multiple_capture_data.current_capture, - capture_update, - storage_scheme, - ) - .await - .to_not_found_response(errors::ApiErrorResponse::PaymentNotFound)?; - - multiple_capture_data.current_capture = updated_capture; + payment_data.multiple_capture_data = match capture_update { + Some((mut multiple_capture_data, capture_updates)) => { + for (capture, capture_update) in capture_updates { + let updated_capture = db + .update_capture_with_capture_id(capture, capture_update, storage_scheme) + .await + .to_not_found_response(errors::ApiErrorResponse::PaymentNotFound)?; + multiple_capture_data.update_capture(updated_capture); + } let authorized_amount = payment_data.payment_attempt.amount; - payment_attempt_update = Some(storage::PaymentAttemptUpdate::MultipleCaptureUpdate { - status: Some(multiple_capture_data.get_attempt_status(authorized_amount)), - multiple_capture_count: Some(multiple_capture_data.get_captures_count()?), + payment_attempt_update = Some(storage::PaymentAttemptUpdate::StatusUpdate { + status: multiple_capture_data.get_attempt_status(authorized_amount), }); Some(multiple_capture_data) } @@ -492,6 +511,21 @@ async fn payment_response_update_tracker( Ok(payment_data) } +fn response_to_capture_update( + multiple_capture_data: &MultipleCaptureData, + response_list: HashMap, +) -> RouterResult> { + let mut capture_update_list = vec![]; + for (connector_capture_id, capture_sync_response) in response_list { + let capture = + multiple_capture_data.get_capture_by_connector_capture_id(connector_capture_id); + if let Some(capture) = capture { + capture_update_list.push((capture.clone(), capture_sync_response.try_into()?)) + } + } + Ok(capture_update_list) +} + fn get_total_amount_captured( request: T, amount_captured: Option, diff --git a/crates/router/src/core/payments/operations/payment_status.rs b/crates/router/src/core/payments/operations/payment_status.rs index 30a2ac24c4..7960b46859 100644 --- a/crates/router/src/core/payments/operations/payment_status.rs +++ b/crates/router/src/core/payments/operations/payment_status.rs @@ -11,7 +11,7 @@ use super::{BoxedOperation, Domain, GetTracker, Operation, UpdateTracker, Valida use crate::{ core::{ errors::{self, CustomResult, RouterResult, StorageErrorExt}, - payments::{helpers, operations, CustomerDetails, PaymentAddress, PaymentData}, + payments::{helpers, operations, types, CustomerDetails, PaymentAddress, PaymentData}, }, db::StorageInterface, routes::AppState, @@ -218,7 +218,7 @@ async fn get_tracker_for_sync< storage_scheme, ) .await - .change_context(errors::ApiErrorResponse::InternalServerError) + .change_context(errors::ApiErrorResponse::PaymentNotFound) .attach_printable("Database error when finding connector response")?; connector_response.encoded_data = request.param.clone(); @@ -243,7 +243,7 @@ async fn get_tracker_for_sync< Some(db .find_attempts_by_merchant_id_payment_id(merchant_id, &payment_id_str, storage_scheme) .await - .change_context(errors::ApiErrorResponse::InternalServerError) + .change_context(errors::ApiErrorResponse::PaymentNotFound) .attach_printable_lazy(|| { format!("Error while retrieving attempt list for, merchant_id: {merchant_id}, payment_id: {payment_id_str}") })?) @@ -251,10 +251,28 @@ async fn get_tracker_for_sync< _ => None, }; + let multiple_capture_data = if payment_attempt.multiple_capture_count > Some(0) { + let captures = db + .find_all_captures_by_merchant_id_payment_id_authorized_attempt_id( + &payment_attempt.merchant_id, + &payment_attempt.payment_id, + &payment_attempt.attempt_id, + storage_scheme, + ) + .await + .change_context(errors::ApiErrorResponse::PaymentNotFound) + .attach_printable_lazy(|| { + format!("Error while retrieving capture list for, merchant_id: {merchant_id}, payment_id: {payment_id_str}") + })?; + Some(types::MultipleCaptureData::new_for_sync(captures)?) + } else { + None + }; + let refunds = db .find_refund_by_payment_id_merchant_id(&payment_id_str, merchant_id, storage_scheme) .await - .change_context(errors::ApiErrorResponse::InternalServerError) + .change_context(errors::ApiErrorResponse::PaymentNotFound) .attach_printable_lazy(|| { format!( "Failed while getting refund list for, payment_id: {}, merchant_id: {}", @@ -265,7 +283,7 @@ async fn get_tracker_for_sync< let disputes = db .find_disputes_by_merchant_id_payment_id(merchant_id, &payment_id_str) .await - .change_context(errors::ApiErrorResponse::InternalServerError) + .change_context(errors::ApiErrorResponse::PaymentNotFound) .attach_printable_lazy(|| { format!("Error while retrieving dispute list for, merchant_id: {merchant_id}, payment_id: {payment_id_str}") })?; @@ -273,7 +291,7 @@ async fn get_tracker_for_sync< let frm_response = db .find_fraud_check_by_payment_id(payment_id_str.to_string(), merchant_id.to_string()) .await - .change_context(errors::ApiErrorResponse::InternalServerError) + .change_context(errors::ApiErrorResponse::PaymentNotFound) .attach_printable_lazy(|| { format!("Error while retrieving frm_response, merchant_id: {merchant_id}, payment_id: {payment_id_str}") }); @@ -353,7 +371,7 @@ async fn get_tracker_for_sync< connector_customer_id: None, recurring_mandate_payment_data: None, ephemeral_key: None, - multiple_capture_data: None, + multiple_capture_data, redirect_response: None, frm_message, }, diff --git a/crates/router/src/core/payments/transformers.rs b/crates/router/src/core/payments/transformers.rs index 56ff409aaf..6eb9b735bc 100644 --- a/crates/router/src/core/payments/transformers.rs +++ b/crates/router/src/core/payments/transformers.rs @@ -19,7 +19,8 @@ use crate::{ types::{ self, api, domain, storage::{self, enums}, - transformers::{ForeignFrom, ForeignInto}, + transformers::{ForeignFrom, ForeignInto, ForeignTryFrom}, + MultipleCaptureRequestData, }, utils::{OptionExt, ValueExt}, }; @@ -185,6 +186,15 @@ where payment_data.refunds, payment_data.disputes, payment_data.attempts, + payment_data + .multiple_capture_data + .map(|multiple_capture_data| { + multiple_capture_data + .get_all_captures() + .into_iter() + .cloned() + .collect() + }), payment_data.payment_method_data, customer, auth_flow, @@ -300,6 +310,7 @@ pub fn payments_to_payments_response( refunds: Vec, disputes: Vec, option_attempts: Option>, + captures: Option>, payment_method_data: Option, customer: Option, auth_flow: services::AuthFlow, @@ -349,6 +360,14 @@ where .map(ForeignInto::foreign_into) .collect() }); + + let captures_response = captures.map(|captures| { + captures + .into_iter() + .map(ForeignInto::foreign_into) + .collect() + }); + let merchant_id = payment_attempt.merchant_id.to_owned(); let payment_method_type = payment_attempt .payment_method_type @@ -508,6 +527,7 @@ where .set_refunds(refunds_response) // refunds.iter().map(refund_to_refund_response), .set_disputes(disputes_response) .set_attempts(attempts_response) + .set_captures(captures_response) .set_payment_method( payment_attempt.payment_method, auth_flow == services::AuthFlow::Merchant, @@ -577,6 +597,7 @@ where refunds: refunds_response, disputes: disputes_response, attempts: attempts_response, + captures: captures_response, payment_method: payment_attempt.payment_method, capture_method: payment_attempt.capture_method, error_message: payment_attempt @@ -920,6 +941,12 @@ impl TryFrom> for types::PaymentsSyncData encoded_data: payment_data.connector_response.encoded_data, capture_method: payment_data.payment_attempt.capture_method, connector_meta: payment_data.payment_attempt.connector_metadata, + capture_sync_type: match payment_data.multiple_capture_data { + Some(multiple_capture_data) => types::CaptureSyncType::MultipleCaptureSync( + multiple_capture_data.get_pending_connector_capture_ids(), + ), + None => types::CaptureSyncType::SingleCaptureSync, + }, }) } } @@ -975,10 +1002,16 @@ impl TryFrom> for types::PaymentsCaptureD .ok_or(errors::ApiErrorResponse::ResourceIdNotFound)?, payment_amount: payment_data.amount.into(), connector_meta: payment_data.payment_attempt.connector_metadata, - capture_method: payment_data - .payment_attempt - .capture_method - .unwrap_or_default(), + multiple_capture_data: match payment_data.multiple_capture_data { + Some(multiple_capture_data) => Some(MultipleCaptureRequestData { + capture_sequence: multiple_capture_data.get_captures_count()?, + capture_reference: multiple_capture_data + .get_latest_capture() + .capture_id + .clone(), + }), + None => None, + }, }) } } @@ -1084,6 +1117,44 @@ impl TryFrom> for types::VerifyRequestDat } } +impl TryFrom for storage::CaptureUpdate { + type Error = error_stack::Report; + + fn try_from(capture_sync_response: types::CaptureSyncResponse) -> Result { + match capture_sync_response { + types::CaptureSyncResponse::Success { + resource_id, + status, + connector_response_reference_id, + } => { + let connector_capture_id = match resource_id { + types::ResponseId::ConnectorTransactionId(id) => Some(id), + types::ResponseId::EncodedData(_) | types::ResponseId::NoResponseId => None, + }; + Ok(Self::ResponseUpdate { + status: enums::CaptureStatus::foreign_try_from(status)?, + connector_capture_id, + connector_response_reference_id, + }) + } + types::CaptureSyncResponse::Error { + code, + message, + reason, + status_code, + } => Ok(Self::ErrorUpdate { + status: match status_code { + 500..=511 => storage::enums::CaptureStatus::Pending, + _ => storage::enums::CaptureStatus::Failed, + }, + error_code: Some(code), + error_message: Some(message), + error_reason: reason, + }), + } + } +} + impl TryFrom> for types::CompleteAuthorizeData { type Error = error_stack::Report; diff --git a/crates/router/src/core/payments/types.rs b/crates/router/src/core/payments/types.rs new file mode 100644 index 0000000000..89f6e094d7 --- /dev/null +++ b/crates/router/src/core/payments/types.rs @@ -0,0 +1,154 @@ +use std::collections::HashMap; + +use error_stack::{IntoReport, ResultExt}; + +use crate::{ + core::errors::{self, RouterResult}, + types::storage::{self, enums as storage_enums}, +}; + +#[derive(Clone, Debug)] +pub struct MultipleCaptureData { + // key -> capture_id, value -> Capture + all_captures: HashMap, + latest_capture: storage::Capture, + _private: Private, // to restrict direct construction of MultipleCaptureData +} +#[derive(Clone, Debug)] +struct Private {} + +impl MultipleCaptureData { + pub fn new_for_sync(captures: Vec) -> RouterResult { + let latest_capture = captures + .last() + .ok_or(errors::ApiErrorResponse::InternalServerError) + .into_report() + .attach_printable("Cannot create MultipleCaptureData with empty captures list")? + .clone(); + let multiple_capture_data = Self { + all_captures: captures + .into_iter() + .map(|capture| (capture.capture_id.clone(), capture)) + .collect(), + latest_capture, + _private: Private {}, + }; + Ok(multiple_capture_data) + } + + pub fn new_for_create( + mut previous_captures: Vec, + new_capture: storage::Capture, + ) -> Self { + previous_captures.push(new_capture.clone()); + Self { + all_captures: previous_captures + .into_iter() + .map(|capture| (capture.capture_id.clone(), capture)) + .collect(), + latest_capture: new_capture, + _private: Private {}, + } + } + + pub fn update_capture(&mut self, updated_capture: storage::Capture) { + let capture_id = &updated_capture.capture_id; + if self.all_captures.contains_key(capture_id) { + self.all_captures + .entry(capture_id.into()) + .and_modify(|capture| *capture = updated_capture.clone()); + } + } + pub fn get_total_blocked_amount(&self) -> i64 { + self.all_captures.iter().fold(0, |accumulator, capture| { + accumulator + + match capture.1.status { + storage_enums::CaptureStatus::Charged + | storage_enums::CaptureStatus::Pending => capture.1.amount, + storage_enums::CaptureStatus::Started + | storage_enums::CaptureStatus::Failed => 0, + } + }) + } + pub fn get_total_charged_amount(&self) -> i64 { + self.all_captures.iter().fold(0, |accumulator, capture| { + accumulator + + match capture.1.status { + storage_enums::CaptureStatus::Charged => capture.1.amount, + storage_enums::CaptureStatus::Pending + | storage_enums::CaptureStatus::Started + | storage_enums::CaptureStatus::Failed => 0, + } + }) + } + pub fn get_captures_count(&self) -> RouterResult { + i16::try_from(self.all_captures.len()) + .into_report() + .change_context(errors::ApiErrorResponse::InternalServerError) + .attach_printable("Error while converting from usize to i16") + } + pub fn get_status_count(&self) -> HashMap { + let mut hash_map: HashMap = HashMap::new(); + hash_map.insert(storage_enums::CaptureStatus::Charged, 0); + hash_map.insert(storage_enums::CaptureStatus::Pending, 0); + hash_map.insert(storage_enums::CaptureStatus::Started, 0); + hash_map.insert(storage_enums::CaptureStatus::Failed, 0); + self.all_captures + .iter() + .fold(hash_map, |mut accumulator, capture| { + let current_capture_status = capture.1.status; + accumulator + .entry(current_capture_status) + .and_modify(|count| *count += 1); + accumulator + }) + } + pub fn get_attempt_status(&self, authorized_amount: i64) -> storage_enums::AttemptStatus { + let total_captured_amount = self.get_total_charged_amount(); + if authorized_amount == total_captured_amount { + return storage_enums::AttemptStatus::Charged; + } + let status_count_map = self.get_status_count(); + if status_count_map.get(&storage_enums::CaptureStatus::Charged) > Some(&0) { + storage_enums::AttemptStatus::PartialCharged + } else { + storage_enums::AttemptStatus::CaptureInitiated + } + } + pub fn get_pending_captures(&self) -> Vec<&storage::Capture> { + self.all_captures + .iter() + .filter(|capture| capture.1.status == storage_enums::CaptureStatus::Pending) + .map(|key_value| key_value.1) + .collect() + } + pub fn get_all_captures(&self) -> Vec<&storage::Capture> { + self.all_captures + .iter() + .map(|key_value| key_value.1) + .collect() + } + pub fn get_capture_by_capture_id(&self, capture_id: String) -> Option<&storage::Capture> { + self.all_captures.get(&capture_id) + } + pub fn get_capture_by_connector_capture_id( + &self, + connector_capture_id: String, + ) -> Option<&storage::Capture> { + self.all_captures + .iter() + .find(|(_, capture)| capture.connector_capture_id == Some(connector_capture_id.clone())) + .map(|(_, capture)| capture) + } + pub fn get_latest_capture(&self) -> &storage::Capture { + &self.latest_capture + } + pub fn get_pending_connector_capture_ids(&self) -> Vec { + let pending_connector_capture_ids = self + .get_pending_captures() + .into_iter() + .filter_map(|capture| capture.connector_capture_id.clone()) + .collect(); + pending_connector_capture_ids + } +} diff --git a/crates/router/src/db/capture.rs b/crates/router/src/db/capture.rs index 41840e1ec3..3c84f83aea 100644 --- a/crates/router/src/db/capture.rs +++ b/crates/router/src/db/capture.rs @@ -192,7 +192,8 @@ impl CaptureInterface for MockDb { modified_at: capture.modified_at, authorized_attempt_id: capture.authorized_attempt_id, capture_sequence: capture.capture_sequence, - connector_transaction_id: capture.connector_transaction_id, + connector_capture_id: capture.connector_capture_id, + connector_response_reference_id: capture.connector_response_reference_id, }; captures.push(capture.clone()); Ok(capture) diff --git a/crates/router/src/openapi.rs b/crates/router/src/openapi.rs index 22240c3ac1..32e3ca14d7 100644 --- a/crates/router/src/openapi.rs +++ b/crates/router/src/openapi.rs @@ -164,6 +164,7 @@ Never share your secret api keys. Keep them guarded and secure. api_models::enums::FrmPreferredFlowTypes, api_models::enums::RetryAction, api_models::enums::AttemptStatus, + api_models::enums::CaptureStatus, api_models::admin::MerchantConnectorCreate, api_models::admin::MerchantConnectorUpdate, api_models::admin::PrimaryBusinessDetails, @@ -292,6 +293,7 @@ Never share your secret api keys. Keep them guarded and secure. api_models::payments::BacsBankTransferInstructions, api_models::payments::RedirectResponse, api_models::payments::PaymentAttemptResponse, + api_models::payments::CaptureResponse, api_models::payment_methods::RequiredFieldInfo, api_models::refunds::RefundListRequest, api_models::refunds::RefundListResponse, diff --git a/crates/router/src/services/api.rs b/crates/router/src/services/api.rs index daf6fcfce7..1f5b43e351 100644 --- a/crates/router/src/services/api.rs +++ b/crates/router/src/services/api.rs @@ -171,6 +171,16 @@ pub trait ConnectorIntegration: ConnectorIntegrationAny CustomResult { + Err( + errors::ConnectorError::NotImplemented("multiple capture sync not implemented".into()) + .into(), + ) + } + fn get_certificate( &self, _req: &types::RouterData, @@ -186,6 +196,11 @@ pub trait ConnectorIntegration: ConnectorIntegrationAny, pub connector_meta: Option, } +#[allow(dead_code)] +#[derive(Debug, Clone, Default)] +pub struct MultipleCaptureRequestData { + pub capture_sequence: i16, + pub capture_reference: String, +} + #[derive(Debug, Clone)] pub struct AuthorizeSessionTokenData { pub amount_to_capture: Option, @@ -405,9 +412,17 @@ pub struct PaymentsSyncData { pub encoded_data: Option, pub capture_method: Option, pub connector_meta: Option, + pub capture_sync_type: CaptureSyncType, pub mandate_id: Option, } +#[derive(Debug, Default, Clone)] +pub enum CaptureSyncType { + MultipleCaptureSync(Vec), + #[default] + SingleCaptureSync, +} + #[derive(Debug, Default, Clone)] pub struct PaymentsCancelData { pub amount: Option, @@ -494,6 +509,21 @@ pub struct MandateReference { pub payment_method_id: Option, } +#[derive(Debug, Clone)] +pub enum CaptureSyncResponse { + Success { + resource_id: ResponseId, + status: storage_enums::AttemptStatus, + connector_response_reference_id: Option, + }, + Error { + code: String, + message: String, + reason: Option, + status_code: u16, + }, +} + #[derive(Debug, Clone)] pub enum PaymentsResponseData { TransactionResponse { @@ -504,6 +534,10 @@ pub enum PaymentsResponseData { network_txn_id: Option, connector_response_reference_id: Option, }, + MultipleCaptureResponse { + // pending_capture_id_list: Vec, + capture_sync_response_list: HashMap, + }, SessionResponse { session_token: api::SessionToken, }, diff --git a/crates/router/src/types/storage/payment_attempt.rs b/crates/router/src/types/storage/payment_attempt.rs index 8edfc77d65..906f51a708 100644 --- a/crates/router/src/types/storage/payment_attempt.rs +++ b/crates/router/src/types/storage/payment_attempt.rs @@ -2,6 +2,9 @@ pub use diesel_models::payment_attempt::{ PaymentAttempt, PaymentAttemptNew, PaymentAttemptUpdate, PaymentAttemptUpdateInternal, }; use diesel_models::{capture::CaptureNew, enums}; +use error_stack::ResultExt; + +use crate::{core::errors, errors::RouterResult, utils::OptionExt}; #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] pub struct RoutingData { @@ -14,7 +17,7 @@ pub trait PaymentAttemptExt { &self, capture_amount: i64, capture_status: enums::CaptureStatus, - ) -> CaptureNew; + ) -> RouterResult; fn get_next_capture_id(&self) -> String; } @@ -24,17 +27,24 @@ impl PaymentAttemptExt for PaymentAttempt { &self, capture_amount: i64, capture_status: enums::CaptureStatus, - ) -> CaptureNew { + ) -> RouterResult { let capture_sequence = self.multiple_capture_count.unwrap_or_default() + 1; let now = common_utils::date_time::now(); - CaptureNew { + Ok(CaptureNew { payment_id: self.payment_id.clone(), merchant_id: self.merchant_id.clone(), capture_id: self.get_next_capture_id(), status: capture_status, amount: capture_amount, currency: self.currency, - connector: self.connector.clone(), + connector: self + .connector + .clone() + .get_required_value("connector") + .change_context(errors::ApiErrorResponse::InternalServerError) + .attach_printable( + "connector field is required in payment_attempt to create a capture", + )?, error_message: None, tax_amount: None, created_at: now, @@ -43,8 +53,9 @@ impl PaymentAttemptExt for PaymentAttempt { error_reason: None, authorized_attempt_id: self.attempt_id.clone(), capture_sequence, - connector_transaction_id: None, - } + connector_capture_id: None, + connector_response_reference_id: None, + }) } fn get_next_capture_id(&self) -> String { let next_sequence_number = self.multiple_capture_count.unwrap_or_default() + 1; diff --git a/crates/router/src/types/transformers.rs b/crates/router/src/types/transformers.rs index df8022cfc0..54b15431eb 100644 --- a/crates/router/src/types/transformers.rs +++ b/crates/router/src/types/transformers.rs @@ -636,6 +636,25 @@ impl ForeignFrom for api_models::payments::PaymentAttem } } +impl ForeignFrom for api_models::payments::CaptureResponse { + fn foreign_from(capture: storage::Capture) -> Self { + Self { + capture_id: capture.capture_id, + status: capture.status, + amount: capture.amount, + currency: capture.currency, + connector: capture.connector, + authorized_attempt_id: capture.authorized_attempt_id, + connector_capture_id: capture.connector_capture_id, + capture_sequence: capture.capture_sequence, + error_message: capture.error_message, + error_code: capture.error_code, + error_reason: capture.error_reason, + reference_id: capture.connector_response_reference_id, + } + } +} + impl ForeignFrom for api_enums::PaymentMethodType { fn foreign_from(value: api_models::payouts::Bank) -> Self { match value { diff --git a/crates/router/tests/connectors/aci.rs b/crates/router/tests/connectors/aci.rs index 0287f6258f..d4ae6fe559 100644 --- a/crates/router/tests/connectors/aci.rs +++ b/crates/router/tests/connectors/aci.rs @@ -80,6 +80,7 @@ fn construct_payment_router_data() -> types::PaymentsAuthorizeRouterData { payment_method_token: None, connector_customer: None, recurring_mandate_payment_data: None, + preprocessing_id: None, connector_request_reference_id: uuid::Uuid::new_v4().to_string(), #[cfg(feature = "payouts")] @@ -133,6 +134,7 @@ fn construct_refund_router_data() -> types::RefundsRouterData { payment_method_token: None, connector_customer: None, recurring_mandate_payment_data: None, + preprocessing_id: None, connector_request_reference_id: uuid::Uuid::new_v4().to_string(), #[cfg(feature = "payouts")] diff --git a/crates/router/tests/connectors/bambora.rs b/crates/router/tests/connectors/bambora.rs index a6dd7d17b0..121bad9d93 100644 --- a/crates/router/tests/connectors/bambora.rs +++ b/crates/router/tests/connectors/bambora.rs @@ -106,6 +106,7 @@ async fn should_sync_authorized_payment() { ), encoded_data: None, capture_method: Some(diesel_models::enums::CaptureMethod::Manual), + capture_sync_type: types::CaptureSyncType::SingleCaptureSync, connector_meta: None, }), None, @@ -219,6 +220,7 @@ async fn should_sync_auto_captured_payment() { ), encoded_data: None, capture_method: Some(enums::CaptureMethod::Automatic), + capture_sync_type: types::CaptureSyncType::SingleCaptureSync, connector_meta: None, }), None, diff --git a/crates/router/tests/connectors/forte.rs b/crates/router/tests/connectors/forte.rs index 61899258fd..89af2e1b64 100644 --- a/crates/router/tests/connectors/forte.rs +++ b/crates/router/tests/connectors/forte.rs @@ -150,6 +150,7 @@ async fn should_sync_authorized_payment() { ), encoded_data: None, capture_method: None, + capture_sync_type: types::CaptureSyncType::SingleCaptureSync, connector_meta: None, mandate_id: None, }), diff --git a/crates/router/tests/connectors/nexinets.rs b/crates/router/tests/connectors/nexinets.rs index 21380c27a6..ec77ede13a 100644 --- a/crates/router/tests/connectors/nexinets.rs +++ b/crates/router/tests/connectors/nexinets.rs @@ -120,6 +120,7 @@ async fn should_sync_authorized_payment() { connector_transaction_id: router::types::ResponseId::ConnectorTransactionId(txn_id), encoded_data: None, capture_method: None, + capture_sync_type: types::CaptureSyncType::SingleCaptureSync, connector_meta, mandate_id: None, }), diff --git a/crates/router/tests/connectors/paypal.rs b/crates/router/tests/connectors/paypal.rs index 7a6d1b4866..4affb82785 100644 --- a/crates/router/tests/connectors/paypal.rs +++ b/crates/router/tests/connectors/paypal.rs @@ -138,6 +138,7 @@ async fn should_sync_authorized_payment() { connector_transaction_id: router::types::ResponseId::ConnectorTransactionId(txn_id), encoded_data: None, capture_method: None, + capture_sync_type: types::CaptureSyncType::SingleCaptureSync, connector_meta, }), get_default_payment_info(), @@ -330,6 +331,7 @@ async fn should_sync_auto_captured_payment() { ), encoded_data: None, capture_method: Some(enums::CaptureMethod::Automatic), + capture_sync_type: types::CaptureSyncType::SingleCaptureSync, connector_meta, }), get_default_payment_info(), diff --git a/crates/router/tests/connectors/utils.rs b/crates/router/tests/connectors/utils.rs index 84174f1dbf..1af3752845 100644 --- a/crates/router/tests/connectors/utils.rs +++ b/crates/router/tests/connectors/utils.rs @@ -496,6 +496,7 @@ pub trait ConnectorActions: Connector { payment_method_token: info.clone().and_then(|a| a.payment_method_token), connector_customer: info.clone().and_then(|a| a.connector_customer), recurring_mandate_payment_data: None, + preprocessing_id: None, connector_request_reference_id: uuid::Uuid::new_v4().to_string(), #[cfg(feature = "payouts")] @@ -523,6 +524,7 @@ pub trait ConnectorActions: Connector { Ok(types::PaymentsResponseData::ConnectorCustomerResponse { .. }) => None, Ok(types::PaymentsResponseData::PreProcessingResponse { .. }) => None, Ok(types::PaymentsResponseData::ThreeDSEnrollmentResponse { .. }) => None, + Ok(types::PaymentsResponseData::MultipleCaptureResponse { .. }) => None, Err(_) => None, } } @@ -918,6 +920,7 @@ impl Default for PaymentSyncType { ), encoded_data: None, capture_method: None, + capture_sync_type: types::CaptureSyncType::SingleCaptureSync, connector_meta: None, }; Self(data) @@ -978,6 +981,7 @@ pub fn get_connector_transaction_id( Ok(types::PaymentsResponseData::PreProcessingResponse { .. }) => None, Ok(types::PaymentsResponseData::ConnectorCustomerResponse { .. }) => None, Ok(types::PaymentsResponseData::ThreeDSEnrollmentResponse { .. }) => None, + Ok(types::PaymentsResponseData::MultipleCaptureResponse { .. }) => None, Err(_) => None, } } diff --git a/crates/router/tests/connectors/zen.rs b/crates/router/tests/connectors/zen.rs index 5a73b0befa..83d79d90a8 100644 --- a/crates/router/tests/connectors/zen.rs +++ b/crates/router/tests/connectors/zen.rs @@ -99,6 +99,7 @@ async fn should_sync_authorized_payment() { ), encoded_data: None, capture_method: None, + capture_sync_type: types::CaptureSyncType::SingleCaptureSync, connector_meta: None, mandate_id: None, }), @@ -212,6 +213,7 @@ async fn should_sync_auto_captured_payment() { ), encoded_data: None, capture_method: Some(enums::CaptureMethod::Automatic), + capture_sync_type: types::CaptureSyncType::SingleCaptureSync, connector_meta: None, mandate_id: None, }), diff --git a/migrations/2023-08-16-080721_make_connector_field_mandatory_capture_table/down.sql b/migrations/2023-08-16-080721_make_connector_field_mandatory_capture_table/down.sql new file mode 100644 index 0000000000..ddec232e49 --- /dev/null +++ b/migrations/2023-08-16-080721_make_connector_field_mandatory_capture_table/down.sql @@ -0,0 +1,4 @@ +-- This file should undo anything in `up.sql` +ALTER TABLE captures ALTER COLUMN connector DROP NOT NULL; +ALTER TABLE captures RENAME COLUMN connector_capture_id TO connector_transaction_id; +ALTER TABLE captures DROP COLUMN IF EXISTS connector_response_reference_id; \ No newline at end of file diff --git a/migrations/2023-08-16-080721_make_connector_field_mandatory_capture_table/up.sql b/migrations/2023-08-16-080721_make_connector_field_mandatory_capture_table/up.sql new file mode 100644 index 0000000000..f15b605854 --- /dev/null +++ b/migrations/2023-08-16-080721_make_connector_field_mandatory_capture_table/up.sql @@ -0,0 +1,4 @@ +-- Your SQL goes here +ALTER TABLE captures ALTER COLUMN connector SET NOT NULL; +ALTER TABLE captures RENAME COLUMN connector_transaction_id TO connector_capture_id; +ALTER TABLE captures add COLUMN IF NOT EXISTS connector_response_reference_id VARCHAR(128); \ No newline at end of file diff --git a/openapi/openapi_spec.json b/openapi/openapi_spec.json index 03f94b0d81..d57c73010e 100644 --- a/openapi/openapi_spec.json +++ b/openapi/openapi_spec.json @@ -3571,6 +3571,86 @@ "scheduled" ] }, + "CaptureResponse": { + "type": "object", + "required": [ + "capture_id", + "status", + "amount", + "connector", + "authorized_attempt_id", + "capture_sequence" + ], + "properties": { + "capture_id": { + "type": "string", + "description": "unique identifier for the capture" + }, + "status": { + "$ref": "#/components/schemas/CaptureStatus" + }, + "amount": { + "type": "integer", + "format": "int64", + "description": "The capture amount. Amount for the payment in lowest denomination of the currency. (i.e) in cents for USD denomination, in paisa for INR denomination etc.," + }, + "currency": { + "allOf": [ + { + "$ref": "#/components/schemas/Currency" + } + ], + "nullable": true + }, + "connector": { + "type": "string", + "description": "The connector used for the payment" + }, + "authorized_attempt_id": { + "type": "string", + "description": "unique identifier for the parent attempt on which this capture is made" + }, + "connector_capture_id": { + "type": "string", + "description": "A unique identifier for a capture provided by the connector", + "nullable": true + }, + "capture_sequence": { + "type": "integer", + "format": "int32", + "description": "sequence number of this capture" + }, + "error_message": { + "type": "string", + "description": "If there was an error while calling the connector the error message is received here", + "nullable": true + }, + "error_code": { + "type": "string", + "description": "If there was an error while calling the connectors the code is received here", + "nullable": true + }, + "error_reason": { + "type": "string", + "description": "If there was an error while calling the connectors the reason is received here", + "nullable": true + }, + "reference_id": { + "type": "string", + "description": "reference to the capture at connector side", + "nullable": true + } + } + }, + "CaptureStatus": { + "type": "string", + "enum": [ + "started", + "charged", + "pending", + "failed" + ] + }, "Card": { "type": "object", "required": [ @@ -5931,7 +6011,7 @@ "description": "Will be used to expire client secret after certain amount of time to be supplied in seconds\n(900) for 15 mins", "example": 900, "nullable": true, - "minimum": 0 + "minimum": 0.0 }, "organization_id": { "type": "string", @@ -6225,7 +6305,7 @@ "format": "int32", "description": "Will be used to expire client secret after certain amount of time to be supplied in seconds\n(900) for 15 mins", "nullable": true, - "minimum": 0 + "minimum": 0.0 } } }, @@ -6946,13 +7026,13 @@ "type": "integer", "format": "int64", "description": "Timestamp at which session is requested", - "minimum": 0 + "minimum": 0.0 }, "expires_at": { "type": "integer", "format": "int64", "description": "Timestamp at which session expires", - "minimum": 0 + "minimum": 0.0 }, "merchant_session_identifier": { "type": "string", @@ -6986,7 +7066,7 @@ "type": "integer", "format": "int32", "description": "The number of retries to get the session response", - "minimum": 0 + "minimum": 0.0 }, "psp_id": { "type": "string", @@ -7040,7 +7120,7 @@ "format": "int32", "description": "The quantity of the product to be purchased", "example": 1, - "minimum": 0 + "minimum": 0.0 } } }, @@ -7063,7 +7143,7 @@ "format": "int32", "description": "The quantity of the product to be purchased", "example": 1, - "minimum": 0 + "minimum": 0.0 }, "amount": { "type": "integer", @@ -7375,7 +7455,6 @@ "$ref": "#/components/schemas/AuthenticationType" } ], - "default": "three_ds", "nullable": true }, "cancellation_reason": { @@ -7564,7 +7643,7 @@ "size": { "type": "integer", "description": "The number of payments included in the list", - "minimum": 0 + "minimum": 0.0 }, "data": { "type": "array", @@ -8215,7 +8294,7 @@ "description": "The payment amount. Amount for the payment in lowest denomination of the currency. (i.e) in cents for USD denomination, in paisa for INR denomination etc.,", "example": 6540, "nullable": true, - "minimum": 0 + "minimum": 0.0 }, "routing": { "allOf": [ @@ -8349,7 +8428,6 @@ "$ref": "#/components/schemas/AuthenticationType" } ], - "default": "three_ds", "nullable": true }, "payment_method_data": { @@ -8550,7 +8628,7 @@ "description": "The payment amount. Amount for the payment in lowest denomination of the currency. (i.e) in cents for USD denomination, in paisa for INR denomination etc.,", "example": 6540, "nullable": true, - "minimum": 0 + "minimum": 0.0 }, "routing": { "allOf": [ @@ -8684,7 +8762,6 @@ "$ref": "#/components/schemas/AuthenticationType" } ], - "default": "three_ds", "nullable": true }, "payment_method_data": { @@ -8888,12 +8965,7 @@ "maxLength": 255 }, "status": { - "allOf": [ - { - "$ref": "#/components/schemas/IntentStatus" - } - ], - "default": "requires_confirmation" + "$ref": "#/components/schemas/IntentStatus" }, "amount": { "type": "integer", @@ -8907,7 +8979,7 @@ "description": "The maximum amount that could be captured from the payment", "example": 6540, "nullable": true, - "minimum": 100 + "minimum": 100.0 }, "amount_received": { "type": "integer", @@ -8915,7 +8987,7 @@ "description": "The amount which is already captured from the payment", "example": 6540, "nullable": true, - "minimum": 100 + "minimum": 100.0 }, "connector": { "type": "string", @@ -8976,6 +9048,14 @@ "description": "List of attempts that happened on this intent", "nullable": true }, + "captures": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CaptureResponse" + }, + "description": "List of captures done on latest attempt", + "nullable": true + }, "mandate_id": { "type": "string", "description": "A unique identifier to link the payment to a mandate, can be use instead of payment_method_data", @@ -9095,7 +9175,6 @@ "$ref": "#/components/schemas/AuthenticationType" } ], - "default": "three_ds", "nullable": true }, "statement_descriptor_name": { @@ -9987,7 +10066,12 @@ "count": { "type": "integer", "description": "The number of refunds included in the list", - "minimum": 0 + "minimum": 0.0 + }, + "total_count": { + "type": "integer", + "format": "int64", + "description": "The total number of refunds in the list" }, "total_count": { "type": "integer", @@ -10037,7 +10121,7 @@ "description": "Total amount for which the refund is to be initiated. Amount for the payment in lowest denomination of the currency. (i.e) in cents for USD denomination, in paisa for INR denomination etc., If not provided, this will default to the full payment amount", "example": 6540, "nullable": true, - "minimum": 100 + "minimum": 100.0 }, "reason": { "type": "string", @@ -10052,7 +10136,6 @@ "$ref": "#/components/schemas/RefundType" } ], - "default": "Instant", "nullable": true }, "metadata": {