maybe working gateway

This commit is contained in:
Djkáťo 2024-03-14 14:33:22 +01:00
parent 332084b105
commit 4f972771bc
8 changed files with 470 additions and 47 deletions

283
Cargo.lock generated
View file

@ -71,6 +71,17 @@ dependencies = [
"opaque-debug", "opaque-debug",
] ]
[[package]]
name = "ahash"
version = "0.7.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9"
dependencies = [
"getrandom 0.2.12",
"once_cell",
"version_check",
]
[[package]] [[package]]
name = "aho-corasick" name = "aho-corasick"
version = "1.1.2" version = "1.1.2"
@ -113,6 +124,12 @@ version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6"
[[package]]
name = "arrayvec"
version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
[[package]] [[package]]
name = "ascii" name = "ascii"
version = "0.9.3" version = "0.9.3"
@ -386,6 +403,18 @@ version = "2.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf"
[[package]]
name = "bitvec"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c"
dependencies = [
"funty",
"radium",
"tap",
"wyz",
]
[[package]] [[package]]
name = "block-buffer" name = "block-buffer"
version = "0.9.0" version = "0.9.0"
@ -420,6 +449,30 @@ dependencies = [
"tracing", "tracing",
] ]
[[package]]
name = "borsh"
version = "1.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f58b559fd6448c6e2fd0adb5720cd98a2506594cafa4737ff98c396f3e82f667"
dependencies = [
"borsh-derive",
"cfg_aliases",
]
[[package]]
name = "borsh-derive"
version = "1.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7aadb5b6ccbd078890f6d7003694e33816e6b784358f18e15e7e6d9f065a57cd"
dependencies = [
"once_cell",
"proc-macro-crate",
"proc-macro2",
"quote",
"syn 2.0.48",
"syn_derive",
]
[[package]] [[package]]
name = "bstr" name = "bstr"
version = "1.9.1" version = "1.9.1"
@ -436,6 +489,28 @@ version = "3.15.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b" checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b"
[[package]]
name = "bytecheck"
version = "0.6.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2"
dependencies = [
"bytecheck_derive",
"ptr_meta",
"simdutf8",
]
[[package]]
name = "bytecheck_derive"
version = "0.6.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659"
dependencies = [
"proc-macro2",
"quote",
"syn 1.0.109",
]
[[package]] [[package]]
name = "byteorder" name = "byteorder"
version = "1.5.0" version = "1.5.0"
@ -469,6 +544,12 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "cfg_aliases"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e"
[[package]] [[package]]
name = "chrono" name = "chrono"
version = "0.4.34" version = "0.4.34"
@ -1011,6 +1092,12 @@ dependencies = [
"percent-encoding", "percent-encoding",
] ]
[[package]]
name = "funty"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
[[package]] [[package]]
name = "futures" name = "futures"
version = "0.3.30" version = "0.3.30"
@ -1268,6 +1355,15 @@ version = "1.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403"
[[package]]
name = "hashbrown"
version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
dependencies = [
"ahash",
]
[[package]] [[package]]
name = "hashbrown" name = "hashbrown"
version = "0.14.3" version = "0.14.3"
@ -1550,7 +1646,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177"
dependencies = [ dependencies = [
"equivalent", "equivalent",
"hashbrown", "hashbrown 0.14.3",
] ]
[[package]] [[package]]
@ -2139,6 +2235,38 @@ version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
[[package]]
name = "proc-macro-crate"
version = "3.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284"
dependencies = [
"toml_edit",
]
[[package]]
name = "proc-macro-error"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
dependencies = [
"proc-macro-error-attr",
"proc-macro2",
"quote",
"version_check",
]
[[package]]
name = "proc-macro-error-attr"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
dependencies = [
"proc-macro2",
"quote",
"version_check",
]
[[package]] [[package]]
name = "proc-macro-hack" name = "proc-macro-hack"
version = "0.5.20+deprecated" version = "0.5.20+deprecated"
@ -2167,6 +2295,26 @@ dependencies = [
"yansi", "yansi",
] ]
[[package]]
name = "ptr_meta"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1"
dependencies = [
"ptr_meta_derive",
]
[[package]]
name = "ptr_meta_derive"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac"
dependencies = [
"proc-macro2",
"quote",
"syn 1.0.109",
]
[[package]] [[package]]
name = "quick-xml" name = "quick-xml"
version = "0.31.0" version = "0.31.0"
@ -2186,6 +2334,12 @@ dependencies = [
"proc-macro2", "proc-macro2",
] ]
[[package]]
name = "radium"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
[[package]] [[package]]
name = "rand" name = "rand"
version = "0.7.3" version = "0.7.3"
@ -2354,6 +2508,15 @@ version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
[[package]]
name = "rend"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c"
dependencies = [
"bytecheck",
]
[[package]] [[package]]
name = "reqwest" name = "reqwest"
version = "0.11.24" version = "0.11.24"
@ -2409,6 +2572,51 @@ dependencies = [
"windows-sys 0.52.0", "windows-sys 0.52.0",
] ]
[[package]]
name = "rkyv"
version = "0.7.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5cba464629b3394fc4dbc6f940ff8f5b4ff5c7aef40f29166fd4ad12acbc99c0"
dependencies = [
"bitvec",
"bytecheck",
"bytes 1.5.0",
"hashbrown 0.12.3",
"ptr_meta",
"rend",
"rkyv_derive",
"seahash",
"tinyvec",
"uuid",
]
[[package]]
name = "rkyv_derive"
version = "0.7.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a7dddfff8de25e6f62b9d64e6e432bf1c6736c57d20323e15ee10435fbda7c65"
dependencies = [
"proc-macro2",
"quote",
"syn 1.0.109",
]
[[package]]
name = "rust_decimal"
version = "1.34.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b39449a79f45e8da28c57c341891b69a183044b29518bb8f86dbac9df60bb7df"
dependencies = [
"arrayvec",
"borsh",
"bytes 1.5.0",
"num-traits",
"rand 0.8.5",
"rkyv",
"serde",
"serde_json",
]
[[package]] [[package]]
name = "rustc-demangle" name = "rustc-demangle"
version = "0.1.23" version = "0.1.23"
@ -2485,6 +2693,7 @@ dependencies = [
"jsonwebtoken", "jsonwebtoken",
"redis", "redis",
"reqwest", "reqwest",
"rust_decimal",
"serde", "serde",
"serde_json", "serde_json",
"strum", "strum",
@ -2542,6 +2751,12 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
name = "seahash"
version = "4.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b"
[[package]] [[package]]
name = "security-framework" name = "security-framework"
version = "2.9.2" version = "2.9.2"
@ -2711,6 +2926,12 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "simdutf8"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a"
[[package]] [[package]]
name = "simple-payment-gateway" name = "simple-payment-gateway"
version = "0.1.0" version = "0.1.0"
@ -2724,6 +2945,7 @@ dependencies = [
"enum-iterator", "enum-iterator",
"envy", "envy",
"redis", "redis",
"rust_decimal",
"saleor-app-sdk", "saleor-app-sdk",
"serde", "serde",
"serde_json", "serde_json",
@ -2990,6 +3212,18 @@ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]]
name = "syn_derive"
version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b"
dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
"syn 2.0.48",
]
[[package]] [[package]]
name = "sync_wrapper" name = "sync_wrapper"
version = "0.1.2" version = "0.1.2"
@ -3017,6 +3251,12 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "tap"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
[[package]] [[package]]
name = "tempfile" name = "tempfile"
version = "3.10.1" version = "3.10.1"
@ -3234,6 +3474,23 @@ dependencies = [
"tracing", "tracing",
] ]
[[package]]
name = "toml_datetime"
version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1"
[[package]]
name = "toml_edit"
version = "0.21.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1"
dependencies = [
"indexmap",
"toml_datetime",
"winnow",
]
[[package]] [[package]]
name = "tower" name = "tower"
version = "0.4.13" version = "0.4.13"
@ -3510,6 +3767,12 @@ dependencies = [
"serde", "serde",
] ]
[[package]]
name = "uuid"
version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a"
[[package]] [[package]]
name = "valuable" name = "valuable"
version = "0.1.0" version = "0.1.0"
@ -3825,6 +4088,15 @@ version = "0.52.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8"
[[package]]
name = "winnow"
version = "0.5.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876"
dependencies = [
"memchr",
]
[[package]] [[package]]
name = "winreg" name = "winreg"
version = "0.50.0" version = "0.50.0"
@ -3835,6 +4107,15 @@ dependencies = [
"windows-sys 0.48.0", "windows-sys 0.48.0",
] ]
[[package]]
name = "wyz"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed"
dependencies = [
"tap",
]
[[package]] [[package]]
name = "xml-builder" name = "xml-builder"
version = "0.5.2" version = "0.5.2"

View file

@ -24,3 +24,4 @@ saleor-app-sdk = { path = "sdk" }
tower = { version = "0.4.13", features = ["util"] } tower = { version = "0.4.13", features = ["util"] }
tower-http = { version = "0.5.2", features = ["fs", "trace"] } tower-http = { version = "0.5.2", features = ["fs", "trace"] }
cynic-codegen = "3.4.3" cynic-codegen = "3.4.3"
rust_decimal = { version = "1.34.3", features = ["serde-float"] }

View file

@ -26,6 +26,7 @@ serde_json.workspace = true
envy.workspace = true envy.workspace = true
dotenvy.workspace = true dotenvy.workspace = true
tower = { workspace = true } tower = { workspace = true }
rust_decimal = { workspace = true, features = ["serde-float"] }
reqwest = { version = "0.11.24", features = ["json"] } reqwest = { version = "0.11.24", features = ["json"] }
jsonwebtoken = "9.2.0" jsonwebtoken = "9.2.0"
async-trait = "0.1.77" async-trait = "0.1.77"

View file

@ -1,19 +1,26 @@
use rust_decimal::Decimal;
use serde::Serialize; use serde::Serialize;
//Why are these few in snake_case but rest is camelCase? //Why are these few in snake_case but rest is camelCase?
#[derive(Serialize, Debug, Clone)] #[derive(Serialize, Debug, Clone)]
pub struct CheckoutCalculateTaxesResponse { pub struct CheckoutCalculateTaxesResponse {
pub shipping_price_gross_amount: f32, #[serde(with = "rust_decimal::serde::float")]
pub shipping_price_net_amount: f32, pub shipping_price_gross_amount: Decimal,
pub shipping_tax_rate: f32, #[serde(with = "rust_decimal::serde::float")]
pub shipping_price_net_amount: Decimal,
#[serde(with = "rust_decimal::serde::float")]
pub shipping_tax_rate: Decimal,
pub lines: Vec<LinesResponse>, pub lines: Vec<LinesResponse>,
} }
#[derive(Serialize, Debug, Clone)] #[derive(Serialize, Debug, Clone)]
pub struct LinesResponse { pub struct LinesResponse {
pub total_gross_amount: f32, #[serde(with = "rust_decimal::serde::float")]
pub total_net_amount: f32, pub total_gross_amount: Decimal,
pub tax_rate: f32, #[serde(with = "rust_decimal::serde::float")]
pub total_net_amount: Decimal,
#[serde(with = "rust_decimal::serde::float")]
pub tax_rate: Decimal,
} }
#[derive(Serialize, Debug, Clone)] #[derive(Serialize, Debug, Clone)]
@ -40,7 +47,8 @@ pub struct ShippingListMethodsForCheckout(Vec<ShippingListMethodsForCheckoutVec>
struct ShippingListMethodsForCheckoutVec { struct ShippingListMethodsForCheckoutVec {
pub id: String, pub id: String,
pub name: Option<String>, pub name: Option<String>,
pub amount: f32, #[serde(with = "rust_decimal::serde::float")]
pub amount: Decimal,
pub currency: String, pub currency: String,
pub maximum_delivery_days: Option<i32>, pub maximum_delivery_days: Option<i32>,
} }
@ -56,7 +64,8 @@ pub enum ChargeRequestedResult {
pub struct TransactionChargeRequestedResponse { pub struct TransactionChargeRequestedResponse {
pub psp_reference: String, pub psp_reference: String,
pub result: Option<ChargeRequestedResult>, pub result: Option<ChargeRequestedResult>,
pub amount: Option<f32>, #[serde(with = "rust_decimal::serde::float_option")]
pub amount: Option<Decimal>,
pub time: Option<String>, pub time: Option<String>,
pub external_url: Option<String>, pub external_url: Option<String>,
pub message: Option<String>, pub message: Option<String>,
@ -74,7 +83,8 @@ pub enum RefundRequestedResult {
pub struct TransactionRefundRequestedResponse { pub struct TransactionRefundRequestedResponse {
pub psp_reference: String, pub psp_reference: String,
pub result: Option<RefundRequestedResult>, pub result: Option<RefundRequestedResult>,
pub amount: Option<f32>, #[serde(with = "rust_decimal::serde::float_option")]
pub amount: Option<Decimal>,
pub time: Option<String>, pub time: Option<String>,
pub external_url: Option<String>, pub external_url: Option<String>,
pub message: Option<String>, pub message: Option<String>,
@ -92,7 +102,8 @@ pub enum CancelationRequestedResult {
pub struct TransactionCancelationRequestedResponse { pub struct TransactionCancelationRequestedResponse {
pub psp_reference: String, pub psp_reference: String,
pub result: Option<CancelationRequestedResult>, pub result: Option<CancelationRequestedResult>,
pub amount: Option<f32>, #[serde(with = "rust_decimal::serde::float_option")]
pub amount: Option<Decimal>,
pub time: Option<String>, pub time: Option<String>,
pub external_url: Option<String>, pub external_url: Option<String>,
pub message: Option<String>, pub message: Option<String>,
@ -100,7 +111,7 @@ pub struct TransactionCancelationRequestedResponse {
#[derive(Serialize, Debug, Clone)] #[derive(Serialize, Debug, Clone)]
pub struct PaymentGatewayInitializeSessionResponse<T: Serialize> { pub struct PaymentGatewayInitializeSessionResponse<T: Serialize> {
pub data: T, pub data: Option<T>,
} }
#[derive(Serialize, Debug, Clone)] #[derive(Serialize, Debug, Clone)]
@ -122,7 +133,8 @@ pub struct TransactionInitializeSessionResponse<T: Serialize> {
pub psp_reference: Option<String>, pub psp_reference: Option<String>,
pub data: Option<T>, pub data: Option<T>,
pub result: TransactionSessionResult, pub result: TransactionSessionResult,
pub amount: f32, #[serde(with = "rust_decimal::serde::float")]
pub amount: Decimal,
pub time: Option<String>, pub time: Option<String>,
pub external_url: Option<String>, pub external_url: Option<String>,
pub message: Option<String>, pub message: Option<String>,
@ -134,7 +146,8 @@ pub struct TransactionProcessSessionResponse<T: Serialize> {
pub psp_reference: Option<String>, pub psp_reference: Option<String>,
pub data: Option<T>, pub data: Option<T>,
pub result: TransactionSessionResult, pub result: TransactionSessionResult,
pub amount: f32, #[serde(with = "rust_decimal::serde::float")]
pub amount: Decimal,
pub time: Option<String>, pub time: Option<String>,
pub external_url: Option<String>, pub external_url: Option<String>,
pub message: Option<String>, pub message: Option<String>,

View file

@ -33,6 +33,7 @@ tower-http = { workspace = true, features = ["fs", "trace"] }
surf.workspace = true surf.workspace = true
cynic = { workspace = true, features = ["http-surf"] } cynic = { workspace = true, features = ["http-surf"] }
cynic-codegen.workspace = true cynic-codegen.workspace = true
rust_decimal = { workspace = true, features = ["serde-float"] }
const_format = "0.2.32" const_format = "0.2.32"
enum-iterator = "2.0.0" enum-iterator = "2.0.0"

View file

@ -43,6 +43,7 @@ pub fn trace_to_std(config: &Config) {
} }
#[derive(Debug, Clone, Sequence, Serialize)] #[derive(Debug, Clone, Sequence, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum GatewayType { pub enum GatewayType {
Accreditation, Accreditation,
Cash, Cash,
@ -82,10 +83,30 @@ pub fn get_active_gateways_from_env() -> anyhow::Result<Vec<ActiveGateway>> {
true => Some(g), true => Some(g),
false => None, false => None,
}) })
.map(|g| ) .map(|g| ActiveGateway {
gateway_type: g.clone(),
currencies: vec!["EUR".to_owned()],
id: format!("{:?}", &g).to_lowercase(),
config: [],
name: match (g, &locale) {
(GatewayType::COD, LocaleCode::Sk) => "Dobierka".to_owned(),
(GatewayType::Cash, LocaleCode::Sk) => "Hotovosť".to_owned(),
(GatewayType::Transfer, LocaleCode::Sk) => "Bankový prevod".to_owned(),
(GatewayType::Inkaso, LocaleCode::Sk) => "Inkaso".to_owned(),
(GatewayType::Accreditation, LocaleCode::Sk) => "Vzajomný zápočet".to_owned(),
(GatewayType::Other, LocaleCode::Sk) => "Iné".to_owned(),
(GatewayType::COD, LocaleCode::En) => "Cash on delivery".to_owned(),
(GatewayType::Cash, LocaleCode::En) => "Cash".to_owned(),
(GatewayType::Transfer, LocaleCode::En) => "Bank transfer".to_owned(),
(GatewayType::Inkaso, LocaleCode::En) => "Encashment".to_owned(),
(GatewayType::Accreditation, LocaleCode::En) => "Mutual credit".to_owned(),
(GatewayType::Other, LocaleCode::En) => "Other".to_owned(),
(g, l) => unimplemented!("Gateway {:?} in locale {:?} not implemented", g, l),
},
})
.collect::<Vec<_>>(); .collect::<Vec<_>>();
todo!() Ok(gateway_types)
} }
#[derive(Debug, Clone, Serialize)] #[derive(Debug, Clone, Serialize)]
@ -97,11 +118,3 @@ pub struct ActiveGateway {
//don't need this one yet //don't need this one yet
pub config: [(); 0], pub config: [(); 0],
} }
impl ActiveGateway{
fn from_gateway_type(ty: &GatewayType) -> Self {
all_currencies =
match type {
}
}
}

View file

@ -70,7 +70,7 @@ pub enum TransactionUpdateErrorCode {
Unique, Unique,
} }
#[derive(cynic::InputObject, Debug)] #[derive(cynic::InputObject, Debug, Default)]
pub struct TransactionUpdateInput<'a> { pub struct TransactionUpdateInput<'a> {
pub name: Option<&'a str>, pub name: Option<&'a str>,
pub message: Option<&'a str>, pub message: Option<&'a str>,

View file

@ -1,5 +1,3 @@
use std::str::FromStr;
use anyhow::Context; use anyhow::Context;
use axum::{ use axum::{
body::Body, body::Body,
@ -8,20 +6,38 @@ use axum::{
response::Response, response::Response,
Json, Json,
}; };
use cynic::{http::SurfExt, MutationBuilder};
use rust_decimal::Decimal;
use saleor_app_sdk::{ use saleor_app_sdk::{
headers::SALEOR_API_URL_HEADER, headers::SALEOR_API_URL_HEADER,
webhooks::{ webhooks::{
sync_response::{
ChargeRequestedResult, PaymentGatewayInitializeSessionResponse, RefundRequestedResult,
TransactionChargeRequestedResponse, TransactionInitializeSessionResponse,
TransactionProcessSessionResponse, TransactionRefundRequestedResponse,
TransactionSessionResult,
},
utils::{get_webhook_event_type, EitherWebhookType}, utils::{get_webhook_event_type, EitherWebhookType},
SyncWebhookEventType, SyncWebhookEventType,
}, },
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use serde_json::Value; use serde_json::Value;
use std::str::FromStr;
use tracing::{debug, error, info}; use tracing::{debug, error, info};
use crate::{ use crate::{
app::{ActiveGateway, AppError, AppState}, app::{ActiveGateway, AppError, AppState, GatewayType},
queries::event_transactions::PaymentGatewayInitializeSession, queries::{
event_transactions::{
PaymentGatewayInitializeSession, TransactionActionEnum, TransactionChargeRequested2,
TransactionFlowStrategyEnum, TransactionInitializeSession2, TransactionProcessSession,
TransactionProcessSession2, TransactionRefundRequested2,
},
mutation_transaction_update::{
TransactionUpdate, TransactionUpdateInput, TransactionUpdateVariables,
},
},
}; };
pub async fn webhooks( pub async fn webhooks(
@ -33,7 +49,7 @@ pub async fn webhooks(
debug!("req: {:?}", body); debug!("req: {:?}", body);
debug!("headers: {:?}", headers); debug!("headers: {:?}", headers);
let url = headers let saleor_api_url = headers
.get(SALEOR_API_URL_HEADER) .get(SALEOR_API_URL_HEADER)
.context("missing saleor api url header")? .context("missing saleor api url header")?
.to_str()? .to_str()?
@ -41,19 +57,117 @@ pub async fn webhooks(
let event_type = get_webhook_event_type(&headers)?; let event_type = get_webhook_event_type(&headers)?;
let res: Json<Value> = match event_type { let res: Json<Value> = match event_type {
EitherWebhookType::Sync(a) => match a { EitherWebhookType::Sync(a) => match a {
SyncWebhookEventType::PaymentGatewayInitializeSession => { SyncWebhookEventType::PaymentGatewayInitializeSession => Json::from(
Json::from(serde_json::to_value(JsonResponse { serde_json::to_value(PaymentGatewayInitializeSessionResponse::<u8> { data: None })?,
data: JsonResponseData { ),
current_gateway: ActiveGateway::COD, SyncWebhookEventType::TransactionProcessSession => {
let data = serde_json::from_str::<TransactionProcessSession2>(&body)?;
Json::from(serde_json::to_value(TransactionProcessSessionResponse::<
u8,
> {
data: None,
time: None,
psp_reference: None,
external_url: None,
message: None,
amount: Decimal::from_str(&data.action.amount.0)?,
result: match data.action.action_type {
TransactionFlowStrategyEnum::Charge => {
TransactionSessionResult::ChargeSuccess
}
TransactionFlowStrategyEnum::Authorization => {
TransactionSessionResult::AuthorizationSuccess
}
}, },
})?) })?)
} }
SyncWebhookEventType::TransactionProcessSession SyncWebhookEventType::TransactionChargeRequested => {
| SyncWebhookEventType::TransactionChargeRequested let data = serde_json::from_str::<TransactionChargeRequested2>(&body)?;
| SyncWebhookEventType::TransactionRefundRequested Json::from(serde_json::to_value(TransactionChargeRequestedResponse {
| SyncWebhookEventType::TransactionInitializeSession => { time: None,
update_transaction_response(&state, &url).await?; psp_reference: "".to_owned(),
todo!() external_url: None,
message: None,
amount: data
.action
.amount
.and_then(|a| Decimal::from_str(&a.0).ok()),
result: Some(ChargeRequestedResult::ChargeSuccess),
})?)
}
SyncWebhookEventType::TransactionRefundRequested => {
let data = serde_json::from_str::<TransactionRefundRequested2>(&body)?;
Json::from(serde_json::to_value(TransactionRefundRequestedResponse {
time: None,
psp_reference: "".to_owned(),
external_url: None,
message: None,
amount: data
.action
.amount
.and_then(|a| Decimal::from_str(&a.0).ok()),
result: Some(RefundRequestedResult::RefundSuccess),
})?)
}
SyncWebhookEventType::TransactionInitializeSession => {
let data = serde_json::from_str::<TransactionInitializeSession2>(&body)?;
let app = state.saleor_app.lock().await;
let auth_data = app.apl.get(&saleor_api_url).await?;
let operation = TransactionUpdate::build(TransactionUpdateVariables {
id: &data.transaction.id,
transaction: Some(TransactionUpdateInput {
message: Some(""),
..Default::default()
}),
});
let mut res = surf::post(&saleor_api_url).run_graphql(operation).await;
let mut webhook_result = WebhookResult::Failiure;
if let Ok(r) = &mut res
&& let Some(data) = &mut r.data
&& let Some(q_res) = &mut data.transaction_update
{
if !q_res.errors.is_empty() {
q_res
.errors
.iter()
.for_each(|e| error!("failed update transaction, {:?}", e));
} else {
if let Some(tr) = &mut q_res.transaction {
tr.message = serde_json::to_string(&PaymentMethod {
payment_method: GatewayType::COD,
})?;
webhook_result = WebhookResult::Success;
}
}
}
Json::from(serde_json::to_value(
TransactionInitializeSessionResponse::<u8> {
data: None,
time: None,
psp_reference: None,
external_url: None,
message: None,
amount: Decimal::from_str(&data.action.amount.0)?,
result: match (data.action.action_type, webhook_result) {
(TransactionFlowStrategyEnum::Charge, WebhookResult::Success) => {
TransactionSessionResult::ChargeSuccess
}
(
TransactionFlowStrategyEnum::Authorization,
WebhookResult::Success,
) => TransactionSessionResult::AuthorizationSuccess,
(TransactionFlowStrategyEnum::Charge, WebhookResult::Failiure) => {
TransactionSessionResult::ChargeFailiure
}
(
TransactionFlowStrategyEnum::Authorization,
WebhookResult::Failiure,
) => TransactionSessionResult::AuthorizationFailure,
},
},
)?)
} }
_ => Json::from(Value::from_str("")?), _ => Json::from(Value::from_str("")?),
}, },
@ -73,13 +187,12 @@ pub struct JsonResponse {
pub struct JsonResponseData { pub struct JsonResponseData {
current_gateway: ActiveGateway, current_gateway: ActiveGateway,
} }
enum WebhookResult {
async fn update_transaction_response(state: &AppState, saleor_api_url: &str) -> anyhow::Result<()> { Success,
todo!() Failiure,
} }
async fn new_transaction_response(state: &AppState, saleor_api_url: &str) -> anyhow::Result<()> { #[derive(Serialize, Clone, Debug)]
debug!("Creating new transaction"); struct PaymentMethod {
payment_method: GatewayType,
todo!()
} }