Skip to content

Commit a2610f6

Browse files
authored
Merge pull request #44 from TheRipperoni/apiErrors
Standardize the response Object to be ApiError by @TheRipperoni
2 parents af4db30 + 4d87c71 commit a2610f6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+749
-998
lines changed

rsky-pds/src/apis/app/bsky/actor/get_preferences.rs

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1+
use crate::apis::ApiError;
12
use crate::auth_verifier::AccessStandard;
2-
use crate::models::{ErrorCode, ErrorMessageResponse};
33
use crate::repo::aws::s3::S3BlobStore;
44
use crate::repo::ActorStore;
55
use anyhow::Result;
66
use aws_config::SdkConfig;
7-
use rocket::http::Status;
8-
use rocket::response::status;
97
use rocket::serde::json::Json;
108
use rocket::State;
119
use rsky_lexicon::app::bsky::actor::{GetPreferencesOutput, RefPreferences};
@@ -34,19 +32,12 @@ async fn inner_get_preferences(
3432
pub async fn get_preferences(
3533
s3_config: &State<SdkConfig>,
3634
auth: AccessStandard,
37-
) -> Result<Json<GetPreferencesOutput>, status::Custom<Json<ErrorMessageResponse>>> {
35+
) -> Result<Json<GetPreferencesOutput>, ApiError> {
3836
match inner_get_preferences(s3_config, auth).await {
3937
Ok(res) => Ok(Json(res)),
4038
Err(error) => {
4139
eprintln!("@LOG: ERROR: {error}");
42-
let internal_error = ErrorMessageResponse {
43-
code: Some(ErrorCode::InternalServerError),
44-
message: Some(error.to_string()),
45-
};
46-
return Err(status::Custom(
47-
Status::InternalServerError,
48-
Json(internal_error),
49-
));
40+
Err(ApiError::RuntimeError)
5041
}
5142
}
5243
}

rsky-pds/src/apis/app/bsky/actor/get_profile.rs

Lines changed: 6 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,17 @@
1+
use crate::apis::ApiError;
12
use crate::auth_verifier::AccessStandard;
23
use crate::config::ServerConfig;
3-
use crate::models::{ErrorCode, ErrorMessageResponse};
44
use crate::read_after_write::types::LocalRecords;
55
use crate::read_after_write::util::{handle_read_after_write, ReadAfterWriteResponse};
66
use crate::read_after_write::viewer::LocalViewer;
77
use crate::xrpc_server::types::HandlerPipeThrough;
88
use crate::SharedLocalViewer;
99
use anyhow::Result;
1010
use aws_config::SdkConfig;
11-
use rocket::http::Status;
12-
use rocket::response::status;
13-
use rocket::serde::json::Json;
1411
use rocket::State;
1512
use rsky_lexicon::app::bsky::actor::ProfileViewDetailed;
1613

17-
const METHOD_NSID: &'static str = "app.bsky.actor.getProfile";
14+
const METHOD_NSID: &str = "app.bsky.actor.getProfile";
1815

1916
pub async fn inner_get_profile(
2017
// Forwarded by original url in pipethrough
@@ -23,7 +20,7 @@ pub async fn inner_get_profile(
2320
res: HandlerPipeThrough,
2421
s3_config: &State<SdkConfig>,
2522
state_local_viewer: &State<SharedLocalViewer>,
26-
) -> Result<ReadAfterWriteResponse<ProfileViewDetailed>> {
23+
) -> Result<ReadAfterWriteResponse<ProfileViewDetailed>, ApiError> {
2724
let requester: Option<String> = match auth.access.credentials {
2825
None => None,
2926
Some(credentials) => credentials.did,
@@ -56,28 +53,12 @@ pub async fn get_profile(
5653
s3_config: &State<SdkConfig>,
5754
state_local_viewer: &State<SharedLocalViewer>,
5855
cfg: &State<ServerConfig>,
59-
) -> Result<ReadAfterWriteResponse<ProfileViewDetailed>, status::Custom<Json<ErrorMessageResponse>>>
60-
{
56+
) -> Result<ReadAfterWriteResponse<ProfileViewDetailed>, ApiError> {
6157
match cfg.bsky_app_view {
62-
None => {
63-
let not_found = ErrorMessageResponse {
64-
code: Some(ErrorCode::NotFound),
65-
message: Some("not found".to_string()),
66-
};
67-
return Err(status::Custom(Status::NotFound, Json(not_found)));
68-
}
58+
None => Err(ApiError::AccountNotFound),
6959
Some(_) => match inner_get_profile(actor, auth, res, s3_config, state_local_viewer).await {
7060
Ok(response) => Ok(response),
71-
Err(error) => {
72-
let internal_error = ErrorMessageResponse {
73-
code: Some(ErrorCode::InternalServerError),
74-
message: Some(error.to_string()),
75-
};
76-
return Err(status::Custom(
77-
Status::InternalServerError,
78-
Json(internal_error),
79-
));
80-
}
61+
Err(error) => Err(error),
8162
},
8263
}
8364
}

rsky-pds/src/apis/app/bsky/actor/get_profiles.rs

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,25 @@
1+
use crate::apis::ApiError;
12
use crate::auth_verifier::AccessStandard;
23
use crate::config::ServerConfig;
3-
use crate::models::{ErrorCode, ErrorMessageResponse};
44
use crate::read_after_write::types::LocalRecords;
55
use crate::read_after_write::util::{handle_read_after_write, ReadAfterWriteResponse};
66
use crate::read_after_write::viewer::LocalViewer;
77
use crate::xrpc_server::types::HandlerPipeThrough;
88
use crate::SharedLocalViewer;
99
use anyhow::Result;
1010
use aws_config::SdkConfig;
11-
use rocket::http::Status;
12-
use rocket::response::status;
13-
use rocket::serde::json::Json;
1411
use rocket::State;
1512
use rsky_lexicon::app::bsky::actor::{GetProfilesOutput, ProfileViewDetailed};
1613

17-
const METHOD_NSID: &'static str = "app.bsky.actor.getProfiles";
14+
const METHOD_NSID: &str = "app.bsky.actor.getProfiles";
1815

1916
pub async fn inner_get_profiles(
2017
_actors: Vec<String>,
2118
auth: AccessStandard,
2219
res: HandlerPipeThrough,
2320
s3_config: &State<SdkConfig>,
2421
state_local_viewer: &State<SharedLocalViewer>,
25-
) -> Result<ReadAfterWriteResponse<GetProfilesOutput>> {
22+
) -> Result<ReadAfterWriteResponse<GetProfilesOutput>, ApiError> {
2623
let requester: String = match auth.access.credentials {
2724
None => "".to_string(),
2825
Some(credentials) => credentials.did.unwrap_or("".to_string()),
@@ -48,28 +45,13 @@ pub async fn get_profiles(
4845
s3_config: &State<SdkConfig>,
4946
state_local_viewer: &State<SharedLocalViewer>,
5047
cfg: &State<ServerConfig>,
51-
) -> Result<ReadAfterWriteResponse<GetProfilesOutput>, status::Custom<Json<ErrorMessageResponse>>> {
48+
) -> Result<ReadAfterWriteResponse<GetProfilesOutput>, ApiError> {
5249
match cfg.bsky_app_view {
53-
None => {
54-
let not_found = ErrorMessageResponse {
55-
code: Some(ErrorCode::NotFound),
56-
message: Some("not found".to_string()),
57-
};
58-
return Err(status::Custom(Status::NotFound, Json(not_found)));
59-
}
50+
None => Err(ApiError::AccountNotFound),
6051
Some(_) => match inner_get_profiles(actors, auth, res, s3_config, state_local_viewer).await
6152
{
6253
Ok(response) => Ok(response),
63-
Err(error) => {
64-
let internal_error = ErrorMessageResponse {
65-
code: Some(ErrorCode::InternalServerError),
66-
message: Some(error.to_string()),
67-
};
68-
return Err(status::Custom(
69-
Status::InternalServerError,
70-
Json(internal_error),
71-
));
72-
}
54+
Err(error) => Err(error),
7355
},
7456
}
7557
}
Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1+
use crate::apis::ApiError;
12
use crate::auth_verifier::AccessStandard;
2-
use crate::models::{ErrorCode, ErrorMessageResponse};
33
use crate::repo::aws::s3::S3BlobStore;
44
use crate::repo::ActorStore;
55
use anyhow::Result;
66
use aws_config::SdkConfig;
7-
use rocket::http::Status;
8-
use rocket::response::status;
97
use rocket::serde::json::Json;
108
use rocket::State;
119
use rsky_lexicon::app::bsky::actor::PutPreferencesInput;
@@ -14,7 +12,7 @@ async fn inner_put_preferences(
1412
body: Json<PutPreferencesInput>,
1513
s3_config: &State<SdkConfig>,
1614
auth: AccessStandard,
17-
) -> Result<()> {
15+
) -> Result<(), ApiError> {
1816
let PutPreferencesInput { preferences } = body.into_inner();
1917
let auth = auth.access.credentials.unwrap();
2018
let requester = auth.did.unwrap().clone();
@@ -25,7 +23,8 @@ async fn inner_put_preferences(
2523
actor_store
2624
.pref
2725
.put_preferences(preferences, "app.bsky".to_string(), auth.scope.unwrap())
28-
.await
26+
.await?;
27+
Ok(())
2928
}
3029

3130
#[rocket::post(
@@ -37,19 +36,9 @@ pub async fn put_preferences(
3736
body: Json<PutPreferencesInput>,
3837
s3_config: &State<SdkConfig>,
3938
auth: AccessStandard,
40-
) -> Result<(), status::Custom<Json<ErrorMessageResponse>>> {
39+
) -> Result<(), ApiError> {
4140
match inner_put_preferences(body, s3_config, auth).await {
4241
Ok(_) => Ok(()),
43-
Err(error) => {
44-
eprintln!("@LOG: ERROR: {error}");
45-
let internal_error = ErrorMessageResponse {
46-
code: Some(ErrorCode::InternalServerError),
47-
message: Some(error.to_string()),
48-
};
49-
return Err(status::Custom(
50-
Status::InternalServerError,
51-
Json(internal_error),
52-
));
53-
}
42+
Err(error) => Err(error),
5443
}
5544
}

rsky-pds/src/apis/app/bsky/feed/get_actor_likes.rs

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,17 @@
1+
use crate::apis::ApiError;
12
use crate::auth_verifier::AccessStandard;
23
use crate::config::ServerConfig;
3-
use crate::models::{ErrorCode, ErrorMessageResponse};
44
use crate::read_after_write::types::LocalRecords;
55
use crate::read_after_write::util::{handle_read_after_write, ReadAfterWriteResponse};
66
use crate::read_after_write::viewer::LocalViewer;
77
use crate::xrpc_server::types::HandlerPipeThrough;
88
use crate::SharedLocalViewer;
99
use anyhow::Result;
1010
use aws_config::SdkConfig;
11-
use rocket::http::Status;
12-
use rocket::response::status;
13-
use rocket::serde::json::Json;
1411
use rocket::State;
1512
use rsky_lexicon::app::bsky::feed::{AuthorFeed, FeedViewPost, PostView};
1613

17-
const METHOD_NSID: &'static str = "app.bsky.feed.getActorLikes";
14+
const METHOD_NSID: &str = "app.bsky.feed.getActorLikes";
1815

1916
pub async fn inner_get_actor_likes(
2017
_actor: String,
@@ -57,24 +54,14 @@ pub async fn get_actor_likes(
5754
s3_config: &State<SdkConfig>,
5855
state_local_viewer: &State<SharedLocalViewer>,
5956
cfg: &State<ServerConfig>,
60-
) -> Result<ReadAfterWriteResponse<AuthorFeed>, status::Custom<Json<ErrorMessageResponse>>> {
57+
) -> Result<ReadAfterWriteResponse<AuthorFeed>, ApiError> {
6158
if let Some(limit) = limit {
6259
if limit > 100 {
63-
let bad_request = ErrorMessageResponse {
64-
code: Some(ErrorCode::BadRequest),
65-
message: Some("invalid limit".to_string()),
66-
};
67-
return Err(status::Custom(Status::BadRequest, Json(bad_request)));
60+
return Err(ApiError::InvalidRequest("invalid limit".to_string()));
6861
}
6962
}
7063
match cfg.bsky_app_view {
71-
None => {
72-
let not_found = ErrorMessageResponse {
73-
code: Some(ErrorCode::NotFound),
74-
message: Some("not found".to_string()),
75-
};
76-
return Err(status::Custom(Status::NotFound, Json(not_found)));
77-
}
64+
None => Err(ApiError::RuntimeError),
7865
Some(_) => match inner_get_actor_likes(
7966
actor,
8067
limit,
@@ -88,14 +75,8 @@ pub async fn get_actor_likes(
8875
{
8976
Ok(response) => Ok(response),
9077
Err(error) => {
91-
let internal_error = ErrorMessageResponse {
92-
code: Some(ErrorCode::InternalServerError),
93-
message: Some(error.to_string()),
94-
};
95-
return Err(status::Custom(
96-
Status::InternalServerError,
97-
Json(internal_error),
98-
));
78+
eprintln!("{error}");
79+
Err(ApiError::RuntimeError)
9980
}
10081
},
10182
}

rsky-pds/src/apis/app/bsky/feed/get_author_feed.rs

Lines changed: 16 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
use crate::apis::ApiError;
12
use crate::auth_verifier::AccessStandard;
23
use crate::config::ServerConfig;
3-
use crate::models::{ErrorCode, ErrorMessageResponse};
44
use crate::read_after_write::types::LocalRecords;
55
use crate::read_after_write::util::{handle_read_after_write, ReadAfterWriteResponse};
66
use crate::read_after_write::viewer::LocalViewer;
@@ -9,13 +9,10 @@ use crate::SharedLocalViewer;
99
use anyhow::Result;
1010
use aws_config::SdkConfig;
1111
use rocket::form::validate::Contains;
12-
use rocket::http::Status;
13-
use rocket::response::status;
14-
use rocket::serde::json::Json;
1512
use rocket::State;
1613
use rsky_lexicon::app::bsky::feed::{AuthorFeed, FeedViewPost, PostView};
1714

18-
const METHOD_NSID: &'static str = "app.bsky.feed.getAuthorFeed";
15+
const METHOD_NSID: &str = "app.bsky.feed.getAuthorFeed";
1916

2017
pub async fn inner_get_author_feed(
2118
_actor: String,
@@ -60,14 +57,13 @@ pub async fn get_author_feed(
6057
s3_config: &State<SdkConfig>,
6158
state_local_viewer: &State<SharedLocalViewer>,
6259
cfg: &State<ServerConfig>,
63-
) -> Result<ReadAfterWriteResponse<AuthorFeed>, status::Custom<Json<ErrorMessageResponse>>> {
60+
) -> Result<ReadAfterWriteResponse<AuthorFeed>, ApiError> {
6461
if let Some(limit) = limit {
6562
if limit > 100 {
66-
let bad_request = ErrorMessageResponse {
67-
code: Some(ErrorCode::BadRequest),
68-
message: Some("invalid limit".to_string()),
69-
};
70-
return Err(status::Custom(Status::BadRequest, Json(bad_request)));
63+
return Err(ApiError::BadRequest(
64+
"invalid_limit".to_string(),
65+
"invalid_limit".to_string(),
66+
));
7167
}
7268
}
7369
if let Some(ref filter) = filter {
@@ -79,20 +75,18 @@ pub async fn get_author_feed(
7975
]
8076
.contains(filter.as_str())
8177
{
82-
let bad_request = ErrorMessageResponse {
83-
code: Some(ErrorCode::BadRequest),
84-
message: Some("invalid filter".to_string()),
85-
};
86-
return Err(status::Custom(Status::BadRequest, Json(bad_request)));
78+
return Err(ApiError::BadRequest(
79+
"invalid filter".to_string(),
80+
"invalid filter".to_string(),
81+
));
8782
}
8883
}
8984
match cfg.bsky_app_view {
9085
None => {
91-
let not_found = ErrorMessageResponse {
92-
code: Some(ErrorCode::NotFound),
93-
message: Some("not found".to_string()),
94-
};
95-
return Err(status::Custom(Status::NotFound, Json(not_found)));
86+
return Err(ApiError::BadRequest(
87+
"not found".to_string(),
88+
"not found".to_string(),
89+
));
9690
}
9791
Some(_) => match inner_get_author_feed(
9892
actor,
@@ -107,16 +101,7 @@ pub async fn get_author_feed(
107101
.await
108102
{
109103
Ok(response) => Ok(response),
110-
Err(error) => {
111-
let internal_error = ErrorMessageResponse {
112-
code: Some(ErrorCode::InternalServerError),
113-
message: Some(error.to_string()),
114-
};
115-
return Err(status::Custom(
116-
Status::InternalServerError,
117-
Json(internal_error),
118-
));
119-
}
104+
Err(error) => Err(ApiError::RuntimeError),
120105
},
121106
}
122107
}

0 commit comments

Comments
 (0)