Skip to content

Commit f256e95

Browse files
authored
Merge pull request #169 from supabase/chore/stripe-fdw-error
chore(stripe_fdw): remove a few unwrap calls
2 parents 0b36187 + 208d60a commit f256e95

File tree

2 files changed

+43
-35
lines changed

2 files changed

+43
-35
lines changed

Diff for: wrappers/src/fdw/stripe_fdw/mod.rs

+14-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
mod stripe_fdw;
33
mod tests;
44

5+
use http::header::InvalidHeaderValue;
56
use pgrx::pg_sys::panic::ErrorReport;
67
use pgrx::prelude::PgSqlErrorCode;
78
use thiserror::Error;
@@ -26,10 +27,22 @@ enum StripeFdwError {
2627
UrlParseError(#[from] url::ParseError),
2728

2829
#[error("request failed: {0}")]
29-
RequestError(#[from] reqwest_middleware::Error),
30+
RequestError(#[from] reqwest::Error),
31+
32+
#[error("request middleware failed: {0}")]
33+
RequestMiddlewareError(#[from] reqwest_middleware::Error),
3034

3135
#[error("parse JSON response failed: {0}")]
3236
JsonParseError(#[from] serde_json::Error),
37+
38+
#[error("invalid api_key header: {0}")]
39+
InvalidApiKeyHeader(#[from] InvalidHeaderValue),
40+
41+
#[error("invalid response")]
42+
InvalidResponse,
43+
44+
#[error("invalid stats: {0}")]
45+
InvalidStats(String),
3346
}
3447

3548
impl From<StripeFdwError> for ErrorReport {

Diff for: wrappers/src/fdw/stripe_fdw/stripe_fdw.rs

+29-34
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,19 @@ use supabase_wrappers::prelude::*;
1010

1111
use super::{StripeFdwError, StripeFdwResult};
1212

13-
fn create_client(api_key: &str) -> ClientWithMiddleware {
13+
fn create_client(api_key: &str) -> StripeFdwResult<ClientWithMiddleware> {
1414
let mut headers = header::HeaderMap::new();
1515
let value = format!("Bearer {}", api_key);
16-
let mut auth_value = header::HeaderValue::from_str(&value).unwrap();
16+
let mut auth_value = header::HeaderValue::from_str(&value)?;
1717
auth_value.set_sensitive(true);
1818
headers.insert(header::AUTHORIZATION, auth_value);
1919
let client = reqwest::Client::builder()
2020
.default_headers(headers)
21-
.build()
22-
.unwrap();
21+
.build()?;
2322
let retry_policy = ExponentialBackoff::builder().build_with_max_retries(3);
24-
ClientBuilder::new(client)
23+
Ok(ClientBuilder::new(client)
2524
.with(RetryTransientMiddleware::new_with_policy(retry_policy))
26-
.build()
25+
.build())
2726
}
2827

2928
fn body_to_rows(
@@ -57,8 +56,10 @@ fn body_to_rows(
5756
.as_object()
5857
.and_then(|v| v.get(*bal_type))
5958
.and_then(|v| v.as_array())
60-
.map(|v| v[0].as_object().unwrap().clone())
61-
.unwrap();
59+
.map(|v| v[0].as_object().ok_or(StripeFdwError::InvalidResponse))
60+
.transpose()?
61+
.ok_or(StripeFdwError::InvalidResponse)?
62+
.clone();
6263
obj.insert(
6364
"balance_type".to_string(),
6465
JsonValue::String(bal_type.to_string()),
@@ -71,14 +72,14 @@ fn body_to_rows(
7172
value
7273
.as_object()
7374
.map(|v| vec![JsonValue::Object(v.clone())])
74-
.unwrap()
75+
.ok_or(StripeFdwError::InvalidResponse)?
7576
};
7677
let objs = if is_list {
7778
value
7879
.as_object()
7980
.and_then(|v| v.get("data"))
8081
.and_then(|v| v.as_array())
81-
.unwrap()
82+
.ok_or(StripeFdwError::InvalidResponse)?
8283
} else {
8384
&single_wrapped
8485
};
@@ -237,10 +238,14 @@ fn set_stats_metadata(stats_metadata: JsonB) {
237238

238239
// increase stats metadata 'request_cnt' by 1
239240
#[inline]
240-
fn inc_stats_request_cnt(stats_metadata: &mut JsonB) {
241+
fn inc_stats_request_cnt(stats_metadata: &mut JsonB) -> StripeFdwResult<()> {
241242
if let Some(v) = stats_metadata.0.get_mut("request_cnt") {
242-
*v = (v.as_i64().unwrap() + 1).into();
243+
*v = (v.as_i64().ok_or(StripeFdwError::InvalidStats(
244+
"`request_cnt` is not a number".to_string(),
245+
))? + 1)
246+
.into();
243247
};
248+
Ok(())
244249
}
245250

246251
#[wrappers_fdw(
@@ -628,7 +633,8 @@ impl ForeignDataWrapper<StripeFdwError> for StripeFdw {
628633
let key_id = require_option("api_key_id", options)?;
629634
get_vault_secret(key_id).map(|api_key| create_client(&api_key))
630635
}
631-
};
636+
}
637+
.transpose()?;
632638

633639
stats::inc_stats(Self::FDW_NAME, stats::Metric::CreateTimes, 1);
634640

@@ -671,12 +677,11 @@ impl ForeignDataWrapper<StripeFdwError> for StripeFdw {
671677
while page < page_cnt {
672678
// build url
673679
let url = self.build_url(obj, quals, page_size, &cursor)?;
674-
if url.is_none() {
680+
let Some(url) = url else {
675681
return Ok(());
676-
}
677-
let url = url.unwrap();
682+
};
678683

679-
inc_stats_request_cnt(&mut stats_metadata);
684+
inc_stats_request_cnt(&mut stats_metadata)?;
680685

681686
// make api call
682687
let body = self.rt.block_on(client.get(url).send()).and_then(|resp| {
@@ -755,15 +760,15 @@ impl ForeignDataWrapper<StripeFdwError> for StripeFdw {
755760

756761
fn insert(&mut self, src: &Row) -> StripeFdwResult<()> {
757762
if let Some(ref mut client) = self.client {
758-
let url = self.base_url.join(&self.obj).unwrap();
763+
let url = self.base_url.join(&self.obj)?;
759764
let body = row_to_body(src)?;
760765
if body.is_null() {
761766
return Ok(());
762767
}
763768

764769
let mut stats_metadata = get_stats_metadata();
765770

766-
inc_stats_request_cnt(&mut stats_metadata);
771+
inc_stats_request_cnt(&mut stats_metadata)?;
767772

768773
// call Stripe API
769774
let body = self
@@ -798,18 +803,13 @@ impl ForeignDataWrapper<StripeFdwError> for StripeFdw {
798803

799804
match rowid {
800805
Cell::String(rowid) => {
801-
let url = self
802-
.base_url
803-
.join(&format!("{}/", self.obj))
804-
.unwrap()
805-
.join(rowid)
806-
.unwrap();
806+
let url = self.base_url.join(&format!("{}/", self.obj))?.join(rowid)?;
807807
let body = row_to_body(new_row)?;
808808
if body.is_null() {
809809
return Ok(());
810810
}
811811

812-
inc_stats_request_cnt(&mut stats_metadata);
812+
inc_stats_request_cnt(&mut stats_metadata)?;
813813

814814
// call Stripe API
815815
let body = self
@@ -847,14 +847,9 @@ impl ForeignDataWrapper<StripeFdwError> for StripeFdw {
847847

848848
match rowid {
849849
Cell::String(rowid) => {
850-
let url = self
851-
.base_url
852-
.join(&format!("{}/", self.obj))
853-
.unwrap()
854-
.join(rowid)
855-
.unwrap();
856-
857-
inc_stats_request_cnt(&mut stats_metadata);
850+
let url = self.base_url.join(&format!("{}/", self.obj))?.join(rowid)?;
851+
852+
inc_stats_request_cnt(&mut stats_metadata)?;
858853

859854
// call Stripe API
860855
let body = self

0 commit comments

Comments
 (0)