From 8cc7b055d2668a1610982cc2beec7bec84c3d6a4 Mon Sep 17 00:00:00 2001 From: sugyan Date: Wed, 26 Jun 2024 23:31:23 +0900 Subject: [PATCH 1/2] Update API, based on the latest lexicon schemas https://github.com/bluesky-social/atproto/commit/af7d3912a3b304a752ed72947eaa8cf28b35ec02 --- atrium-api/src/app/bsky/actor/defs.rs | 12 + atrium-api/src/app/bsky/actor/profile.rs | 4 + atrium-api/src/app/bsky/graph.rs | 10 + atrium-api/src/app/bsky/graph/defs.rs | 46 ++++ .../app/bsky/graph/get_actor_starter_packs.rs | 29 +++ .../src/app/bsky/graph/get_starter_pack.rs | 24 ++ .../src/app/bsky/graph/get_starter_packs.rs | 23 ++ atrium-api/src/app/bsky/graph/starterpack.rs | 24 ++ .../bsky/notification/list_notifications.rs | 2 +- atrium-api/src/client.rs | 233 +++++++++++++++++- atrium-api/src/records.rs | 4 + atrium-api/src/tools/ozone.rs | 1 + atrium-api/src/tools/ozone/team.rs | 7 + atrium-api/src/tools/ozone/team/add_member.rs | 30 +++ atrium-api/src/tools/ozone/team/defs.rs | 25 ++ .../src/tools/ozone/team/delete_member.rs | 36 +++ .../src/tools/ozone/team/list_members.rs | 28 +++ .../src/tools/ozone/team/update_member.rs | 33 +++ 18 files changed, 569 insertions(+), 2 deletions(-) create mode 100644 atrium-api/src/app/bsky/graph/get_actor_starter_packs.rs create mode 100644 atrium-api/src/app/bsky/graph/get_starter_pack.rs create mode 100644 atrium-api/src/app/bsky/graph/get_starter_packs.rs create mode 100644 atrium-api/src/app/bsky/graph/starterpack.rs create mode 100644 atrium-api/src/tools/ozone/team.rs create mode 100644 atrium-api/src/tools/ozone/team/add_member.rs create mode 100644 atrium-api/src/tools/ozone/team/defs.rs create mode 100644 atrium-api/src/tools/ozone/team/delete_member.rs create mode 100644 atrium-api/src/tools/ozone/team/list_members.rs create mode 100644 atrium-api/src/tools/ozone/team/update_member.rs diff --git a/atrium-api/src/app/bsky/actor/defs.rs b/atrium-api/src/app/bsky/actor/defs.rs index d2d25324..21fd5860 100644 --- a/atrium-api/src/app/bsky/actor/defs.rs +++ b/atrium-api/src/app/bsky/actor/defs.rs @@ -110,6 +110,8 @@ pub struct ProfileAssociatedData { pub labeler: Option, #[serde(skip_serializing_if = "Option::is_none")] pub lists: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub starter_packs: Option, } pub type ProfileAssociated = crate::types::Object; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] @@ -126,6 +128,8 @@ pub struct ProfileViewData { #[serde(skip_serializing_if = "Option::is_none")] pub avatar: Option, #[serde(skip_serializing_if = "Option::is_none")] + pub created_at: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub description: Option, pub did: crate::types::string::Did, #[serde(skip_serializing_if = "Option::is_none")] @@ -146,6 +150,8 @@ pub struct ProfileViewBasicData { pub associated: Option, #[serde(skip_serializing_if = "Option::is_none")] pub avatar: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub created_at: Option, pub did: crate::types::string::Did, #[serde(skip_serializing_if = "Option::is_none")] pub display_name: Option, @@ -166,6 +172,8 @@ pub struct ProfileViewDetailedData { #[serde(skip_serializing_if = "Option::is_none")] pub banner: Option, #[serde(skip_serializing_if = "Option::is_none")] + pub created_at: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub description: Option, pub did: crate::types::string::Did, #[serde(skip_serializing_if = "Option::is_none")] @@ -178,6 +186,10 @@ pub struct ProfileViewDetailedData { #[serde(skip_serializing_if = "Option::is_none")] pub indexed_at: Option, #[serde(skip_serializing_if = "Option::is_none")] + pub joined_via_starter_pack: Option< + crate::app::bsky::graph::defs::StarterPackViewBasic, + >, + #[serde(skip_serializing_if = "Option::is_none")] pub labels: Option>, #[serde(skip_serializing_if = "Option::is_none")] pub posts_count: Option, diff --git a/atrium-api/src/app/bsky/actor/profile.rs b/atrium-api/src/app/bsky/actor/profile.rs index 538fd942..4c51ba8c 100644 --- a/atrium-api/src/app/bsky/actor/profile.rs +++ b/atrium-api/src/app/bsky/actor/profile.rs @@ -9,11 +9,15 @@ pub struct RecordData { ///Larger horizontal image to display behind profile view. #[serde(skip_serializing_if = "Option::is_none")] pub banner: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub created_at: Option, ///Free-form profile description text. #[serde(skip_serializing_if = "Option::is_none")] pub description: Option, #[serde(skip_serializing_if = "Option::is_none")] pub display_name: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub joined_via_starter_pack: Option, ///Self-label values, specific to the Bluesky application, on the overall account. #[serde(skip_serializing_if = "Option::is_none")] pub labels: Option>, diff --git a/atrium-api/src/app/bsky/graph.rs b/atrium-api/src/app/bsky/graph.rs index a1276105..73e9fbe2 100644 --- a/atrium-api/src/app/bsky/graph.rs +++ b/atrium-api/src/app/bsky/graph.rs @@ -3,6 +3,7 @@ pub mod block; pub mod defs; pub mod follow; +pub mod get_actor_starter_packs; pub mod get_blocks; pub mod get_followers; pub mod get_follows; @@ -13,6 +14,8 @@ pub mod get_list_mutes; pub mod get_lists; pub mod get_mutes; pub mod get_relationships; +pub mod get_starter_pack; +pub mod get_starter_packs; pub mod get_suggested_follows_by_actor; pub mod list; pub mod listblock; @@ -20,6 +23,7 @@ pub mod listitem; pub mod mute_actor; pub mod mute_actor_list; pub mod mute_thread; +pub mod starterpack; pub mod unmute_actor; pub mod unmute_actor_list; pub mod unmute_thread; @@ -53,3 +57,9 @@ impl crate::types::Collection for Listitem { const NSID: &'static str = "app.bsky.graph.listitem"; type Record = listitem::Record; } +#[derive(Debug)] +pub struct Starterpack; +impl crate::types::Collection for Starterpack { + const NSID: &'static str = "app.bsky.graph.starterpack"; + type Record = starterpack::Record; +} diff --git a/atrium-api/src/app/bsky/graph/defs.rs b/atrium-api/src/app/bsky/graph/defs.rs index a5ef5003..3236b338 100644 --- a/atrium-api/src/app/bsky/graph/defs.rs +++ b/atrium-api/src/app/bsky/graph/defs.rs @@ -24,6 +24,8 @@ pub struct ListViewData { pub indexed_at: crate::types::string::Datetime, #[serde(skip_serializing_if = "Option::is_none")] pub labels: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub list_item_count: Option, pub name: String, pub purpose: ListPurpose, pub uri: String, @@ -41,6 +43,8 @@ pub struct ListViewBasicData { pub indexed_at: Option, #[serde(skip_serializing_if = "Option::is_none")] pub labels: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub list_item_count: Option, pub name: String, pub purpose: ListPurpose, pub uri: String, @@ -67,6 +71,8 @@ pub struct NotFoundActorData { pub not_found: bool, } pub type NotFoundActor = crate::types::Object; +///A list of actors used for only for reference purposes such as within a starter pack. +pub const REFERENCELIST: &str = "app.bsky.graph.defs#referencelist"; ///lists the bi-directional graph relationships between one actor (not indicated in the object), and the target actors (the DID included in the object) #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "camelCase")] @@ -80,3 +86,43 @@ pub struct RelationshipData { pub following: Option, } pub type Relationship = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct StarterPackViewData { + pub cid: crate::types::string::Cid, + pub creator: crate::app::bsky::actor::defs::ProfileViewBasic, + #[serde(skip_serializing_if = "Option::is_none")] + pub feeds: Option>, + pub indexed_at: crate::types::string::Datetime, + #[serde(skip_serializing_if = "Option::is_none")] + pub joined_all_time_count: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub joined_week_count: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub labels: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub list: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub list_items_sample: Option>, + pub record: crate::records::Record, + pub uri: String, +} +pub type StarterPackView = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct StarterPackViewBasicData { + pub cid: crate::types::string::Cid, + pub creator: crate::app::bsky::actor::defs::ProfileViewBasic, + pub indexed_at: crate::types::string::Datetime, + #[serde(skip_serializing_if = "Option::is_none")] + pub joined_all_time_count: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub joined_week_count: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub labels: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub list_item_count: Option, + pub record: crate::records::Record, + pub uri: String, +} +pub type StarterPackViewBasic = crate::types::Object; diff --git a/atrium-api/src/app/bsky/graph/get_actor_starter_packs.rs b/atrium-api/src/app/bsky/graph/get_actor_starter_packs.rs new file mode 100644 index 00000000..f72c3add --- /dev/null +++ b/atrium-api/src/app/bsky/graph/get_actor_starter_packs.rs @@ -0,0 +1,29 @@ +// This file is generated by atrium-codegen. DO NOT EDIT. +//!Definitions for the `app.bsky.graph.getActorStarterPacks` namespace. +pub const NSID: &str = "app.bsky.graph.getActorStarterPacks"; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct ParametersData { + pub actor: crate::types::string::AtIdentifier, + #[serde(skip_serializing_if = "Option::is_none")] + pub cursor: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub limit: Option>, +} +pub type Parameters = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct OutputData { + #[serde(skip_serializing_if = "Option::is_none")] + pub cursor: Option, + pub starter_packs: Vec, +} +pub type Output = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(tag = "error", content = "message")] +pub enum Error {} +impl std::fmt::Display for Error { + fn fmt(&self, _f: &mut std::fmt::Formatter) -> std::fmt::Result { + Ok(()) + } +} diff --git a/atrium-api/src/app/bsky/graph/get_starter_pack.rs b/atrium-api/src/app/bsky/graph/get_starter_pack.rs new file mode 100644 index 00000000..88ca0468 --- /dev/null +++ b/atrium-api/src/app/bsky/graph/get_starter_pack.rs @@ -0,0 +1,24 @@ +// This file is generated by atrium-codegen. DO NOT EDIT. +//!Definitions for the `app.bsky.graph.getStarterPack` namespace. +pub const NSID: &str = "app.bsky.graph.getStarterPack"; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct ParametersData { + ///Reference (AT-URI) of the starter pack record. + pub starter_pack: String, +} +pub type Parameters = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct OutputData { + pub starter_pack: crate::app::bsky::graph::defs::StarterPackView, +} +pub type Output = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(tag = "error", content = "message")] +pub enum Error {} +impl std::fmt::Display for Error { + fn fmt(&self, _f: &mut std::fmt::Formatter) -> std::fmt::Result { + Ok(()) + } +} diff --git a/atrium-api/src/app/bsky/graph/get_starter_packs.rs b/atrium-api/src/app/bsky/graph/get_starter_packs.rs new file mode 100644 index 00000000..01b04b00 --- /dev/null +++ b/atrium-api/src/app/bsky/graph/get_starter_packs.rs @@ -0,0 +1,23 @@ +// This file is generated by atrium-codegen. DO NOT EDIT. +//!Definitions for the `app.bsky.graph.getStarterPacks` namespace. +pub const NSID: &str = "app.bsky.graph.getStarterPacks"; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct ParametersData { + pub uris: Vec, +} +pub type Parameters = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct OutputData { + pub starter_packs: Vec, +} +pub type Output = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(tag = "error", content = "message")] +pub enum Error {} +impl std::fmt::Display for Error { + fn fmt(&self, _f: &mut std::fmt::Formatter) -> std::fmt::Result { + Ok(()) + } +} diff --git a/atrium-api/src/app/bsky/graph/starterpack.rs b/atrium-api/src/app/bsky/graph/starterpack.rs new file mode 100644 index 00000000..96805c19 --- /dev/null +++ b/atrium-api/src/app/bsky/graph/starterpack.rs @@ -0,0 +1,24 @@ +// This file is generated by atrium-codegen. DO NOT EDIT. +//!Definitions for the `app.bsky.graph.starterpack` namespace. +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct RecordData { + pub created_at: crate::types::string::Datetime, + #[serde(skip_serializing_if = "Option::is_none")] + pub description: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub description_facets: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub feeds: Option>, + ///Reference (AT-URI) to the list record. + pub list: String, + ///Display name for starter pack; can not be empty. + pub name: String, +} +pub type Record = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct FeedItemData { + pub uri: String, +} +pub type FeedItem = crate::types::Object; diff --git a/atrium-api/src/app/bsky/notification/list_notifications.rs b/atrium-api/src/app/bsky/notification/list_notifications.rs index 95979f3d..d94ae048 100644 --- a/atrium-api/src/app/bsky/notification/list_notifications.rs +++ b/atrium-api/src/app/bsky/notification/list_notifications.rs @@ -39,7 +39,7 @@ pub struct NotificationData { pub is_read: bool, #[serde(skip_serializing_if = "Option::is_none")] pub labels: Option>, - ///Expected values are 'like', 'repost', 'follow', 'mention', 'reply', and 'quote'. + ///Expected values are 'like', 'repost', 'follow', 'mention', 'reply', 'quote', and 'starterpack-joined'. pub reason: String, #[serde(skip_serializing_if = "Option::is_none")] pub reason_subject: Option, diff --git a/atrium-api/src/client.rs b/atrium-api/src/client.rs index 5ac2172e..3ac5436e 100644 --- a/atrium-api/src/client.rs +++ b/atrium-api/src/client.rs @@ -276,6 +276,7 @@ pub mod tools { pub communication: communication::Service, pub moderation: moderation::Service, pub server: server::Service, + pub team: team::Service, pub(crate) _phantom: core::marker::PhantomData, } pub mod communication { @@ -305,6 +306,15 @@ pub mod tools { pub(crate) _phantom: core::marker::PhantomData, } } + pub mod team { + pub struct Service + where + T: atrium_xrpc::XrpcClient + Send + Sync, + { + pub(crate) xrpc: std::sync::Arc, + pub(crate) _phantom: core::marker::PhantomData, + } + } } } impl self::Service @@ -1109,6 +1119,36 @@ where _phantom: core::marker::PhantomData, } } + ///Get a list of starter packs created by the actor. + pub async fn get_actor_starter_packs( + &self, + params: crate::app::bsky::graph::get_actor_starter_packs::Parameters, + ) -> atrium_xrpc::Result< + crate::app::bsky::graph::get_actor_starter_packs::Output, + crate::app::bsky::graph::get_actor_starter_packs::Error, + > { + let response = self + .xrpc + .send_xrpc::< + _, + (), + _, + _, + >( + &atrium_xrpc::XrpcRequest { + method: http::Method::GET, + nsid: crate::app::bsky::graph::get_actor_starter_packs::NSID.into(), + parameters: Some(params), + input: None, + encoding: None, + }, + ) + .await?; + match response { + atrium_xrpc::OutputDataOrBytes::Data(data) => Ok(data), + _ => Err(atrium_xrpc::Error::UnexpectedResponseType), + } + } ///Enumerates which accounts the requesting account is currently blocking. Requires auth. pub async fn get_blocks( &self, @@ -1409,6 +1449,66 @@ where _ => Err(atrium_xrpc::Error::UnexpectedResponseType), } } + ///Gets a view of a starter pack. + pub async fn get_starter_pack( + &self, + params: crate::app::bsky::graph::get_starter_pack::Parameters, + ) -> atrium_xrpc::Result< + crate::app::bsky::graph::get_starter_pack::Output, + crate::app::bsky::graph::get_starter_pack::Error, + > { + let response = self + .xrpc + .send_xrpc::< + _, + (), + _, + _, + >( + &atrium_xrpc::XrpcRequest { + method: http::Method::GET, + nsid: crate::app::bsky::graph::get_starter_pack::NSID.into(), + parameters: Some(params), + input: None, + encoding: None, + }, + ) + .await?; + match response { + atrium_xrpc::OutputDataOrBytes::Data(data) => Ok(data), + _ => Err(atrium_xrpc::Error::UnexpectedResponseType), + } + } + ///Get views for a list of starter packs. + pub async fn get_starter_packs( + &self, + params: crate::app::bsky::graph::get_starter_packs::Parameters, + ) -> atrium_xrpc::Result< + crate::app::bsky::graph::get_starter_packs::Output, + crate::app::bsky::graph::get_starter_packs::Error, + > { + let response = self + .xrpc + .send_xrpc::< + _, + (), + _, + _, + >( + &atrium_xrpc::XrpcRequest { + method: http::Method::GET, + nsid: crate::app::bsky::graph::get_starter_packs::NSID.into(), + parameters: Some(params), + input: None, + encoding: None, + }, + ) + .await?; + match response { + atrium_xrpc::OutputDataOrBytes::Data(data) => Ok(data), + _ => Err(atrium_xrpc::Error::UnexpectedResponseType), + } + } ///Enumerates follows similar to a given account (actor). Expected use is to recommend additional accounts immediately after following one account. pub async fn get_suggested_follows_by_actor( &self, @@ -4520,7 +4620,7 @@ where _ => Err(atrium_xrpc::Error::UnexpectedResponseType), } } - ///List blob CIDso for an account, since some repo revision. Does not require auth; implemented by PDS. + ///List blob CIDs for an account, since some repo revision. Does not require auth; implemented by PDS. pub async fn list_blobs( &self, params: crate::com::atproto::sync::list_blobs::Parameters, @@ -4765,6 +4865,7 @@ where std::sync::Arc::clone(&xrpc), ), server: tools::ozone::server::Service::new(std::sync::Arc::clone(&xrpc)), + team: tools::ozone::team::Service::new(std::sync::Arc::clone(&xrpc)), _phantom: core::marker::PhantomData, } } @@ -5170,3 +5271,133 @@ where } } } +#[cfg(feature = "namespace-toolsozone")] +impl tools::ozone::team::Service +where + T: atrium_xrpc::XrpcClient + Send + Sync, +{ + #[allow(unused_variables)] + pub(crate) fn new(xrpc: std::sync::Arc) -> Self { + Self { + xrpc, + _phantom: core::marker::PhantomData, + } + } + ///Add a member to the ozone team. Requires admin role. + pub async fn add_member( + &self, + input: crate::tools::ozone::team::add_member::Input, + ) -> atrium_xrpc::Result< + crate::tools::ozone::team::add_member::Output, + crate::tools::ozone::team::add_member::Error, + > { + let response = self + .xrpc + .send_xrpc::< + (), + _, + _, + _, + >( + &atrium_xrpc::XrpcRequest { + method: http::Method::POST, + nsid: crate::tools::ozone::team::add_member::NSID.into(), + parameters: None, + input: Some(atrium_xrpc::InputDataOrBytes::Data(input)), + encoding: Some(String::from("application/json")), + }, + ) + .await?; + match response { + atrium_xrpc::OutputDataOrBytes::Data(data) => Ok(data), + _ => Err(atrium_xrpc::Error::UnexpectedResponseType), + } + } + ///Delete a member from ozone team. Requires admin role. + pub async fn delete_member( + &self, + input: crate::tools::ozone::team::delete_member::Input, + ) -> atrium_xrpc::Result<(), crate::tools::ozone::team::delete_member::Error> { + let response = self + .xrpc + .send_xrpc::< + (), + _, + (), + _, + >( + &atrium_xrpc::XrpcRequest { + method: http::Method::POST, + nsid: crate::tools::ozone::team::delete_member::NSID.into(), + parameters: None, + input: Some(atrium_xrpc::InputDataOrBytes::Data(input)), + encoding: Some(String::from("application/json")), + }, + ) + .await?; + match response { + atrium_xrpc::OutputDataOrBytes::Bytes(_) => Ok(()), + _ => Err(atrium_xrpc::Error::UnexpectedResponseType), + } + } + ///List all members with access to the ozone service. + pub async fn list_members( + &self, + params: crate::tools::ozone::team::list_members::Parameters, + ) -> atrium_xrpc::Result< + crate::tools::ozone::team::list_members::Output, + crate::tools::ozone::team::list_members::Error, + > { + let response = self + .xrpc + .send_xrpc::< + _, + (), + _, + _, + >( + &atrium_xrpc::XrpcRequest { + method: http::Method::GET, + nsid: crate::tools::ozone::team::list_members::NSID.into(), + parameters: Some(params), + input: None, + encoding: None, + }, + ) + .await?; + match response { + atrium_xrpc::OutputDataOrBytes::Data(data) => Ok(data), + _ => Err(atrium_xrpc::Error::UnexpectedResponseType), + } + } + ///Update a member in the ozone service. Requires admin role. + pub async fn update_member( + &self, + input: crate::tools::ozone::team::update_member::Input, + ) -> atrium_xrpc::Result< + crate::tools::ozone::team::update_member::Output, + crate::tools::ozone::team::update_member::Error, + > { + let response = self + .xrpc + .send_xrpc::< + (), + _, + _, + _, + >( + &atrium_xrpc::XrpcRequest { + method: http::Method::POST, + nsid: crate::tools::ozone::team::update_member::NSID.into(), + parameters: None, + input: Some(atrium_xrpc::InputDataOrBytes::Data(input)), + encoding: Some(String::from("application/json")), + }, + ) + .await?; + match response { + atrium_xrpc::OutputDataOrBytes::Data(data) => Ok(data), + _ => Err(atrium_xrpc::Error::UnexpectedResponseType), + } + } +} diff --git a/atrium-api/src/records.rs b/atrium-api/src/records.rs index e297ee01..4c8258d2 100644 --- a/atrium-api/src/records.rs +++ b/atrium-api/src/records.rs @@ -55,6 +55,10 @@ pub enum KnownRecord { AppBskyGraphListitem(Box), #[cfg_attr(docsrs, doc(cfg(feature = "namespace-appbsky")))] #[cfg(feature = "namespace-appbsky")] + #[serde(rename = "app.bsky.graph.starterpack")] + AppBskyGraphStarterpack(Box), + #[cfg_attr(docsrs, doc(cfg(feature = "namespace-appbsky")))] + #[cfg(feature = "namespace-appbsky")] #[serde(rename = "app.bsky.labeler.service")] AppBskyLabelerService(Box), #[cfg_attr(docsrs, doc(cfg(feature = "namespace-chatbsky")))] diff --git a/atrium-api/src/tools/ozone.rs b/atrium-api/src/tools/ozone.rs index 07942ff6..c3b0479c 100644 --- a/atrium-api/src/tools/ozone.rs +++ b/atrium-api/src/tools/ozone.rs @@ -3,3 +3,4 @@ pub mod communication; pub mod moderation; pub mod server; +pub mod team; diff --git a/atrium-api/src/tools/ozone/team.rs b/atrium-api/src/tools/ozone/team.rs new file mode 100644 index 00000000..a0a86988 --- /dev/null +++ b/atrium-api/src/tools/ozone/team.rs @@ -0,0 +1,7 @@ +// This file is generated by atrium-codegen. DO NOT EDIT. +//!Definitions for the `tools.ozone.team` namespace. +pub mod add_member; +pub mod defs; +pub mod delete_member; +pub mod list_members; +pub mod update_member; diff --git a/atrium-api/src/tools/ozone/team/add_member.rs b/atrium-api/src/tools/ozone/team/add_member.rs new file mode 100644 index 00000000..10a0f1c3 --- /dev/null +++ b/atrium-api/src/tools/ozone/team/add_member.rs @@ -0,0 +1,30 @@ +// This file is generated by atrium-codegen. DO NOT EDIT. +//!Definitions for the `tools.ozone.team.addMember` namespace. +pub const NSID: &str = "tools.ozone.team.addMember"; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct InputData { + pub did: crate::types::string::Did, + pub role: String, +} +pub type Input = crate::types::Object; +pub type Output = crate::tools::ozone::team::defs::Member; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(tag = "error", content = "message")] +pub enum Error { + ///Member already exists in the team. + MemberAlreadyExists(Option), +} +impl std::fmt::Display for Error { + fn fmt(&self, _f: &mut std::fmt::Formatter) -> std::fmt::Result { + match self { + Error::MemberAlreadyExists(msg) => { + write!(_f, "MemberAlreadyExists")?; + if let Some(msg) = msg { + write!(_f, ": {msg}")?; + } + } + } + Ok(()) + } +} diff --git a/atrium-api/src/tools/ozone/team/defs.rs b/atrium-api/src/tools/ozone/team/defs.rs new file mode 100644 index 00000000..6ac052cd --- /dev/null +++ b/atrium-api/src/tools/ozone/team/defs.rs @@ -0,0 +1,25 @@ +// This file is generated by atrium-codegen. DO NOT EDIT. +//!Definitions for the `tools.ozone.team.defs` namespace. +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct MemberData { + #[serde(skip_serializing_if = "Option::is_none")] + pub created_at: Option, + pub did: crate::types::string::Did, + #[serde(skip_serializing_if = "Option::is_none")] + pub disabled: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub last_updated_by: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub profile: Option, + pub role: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub updated_at: Option, +} +pub type Member = crate::types::Object; +///Admin role. Highest level of access, can perform all actions. +pub const ROLE_ADMIN: &str = "tools.ozone.team.defs#roleAdmin"; +///Moderator role. Can perform most actions. +pub const ROLE_MODERATOR: &str = "tools.ozone.team.defs#roleModerator"; +///Triage role. Mostly intended for monitoring and escalating issues. +pub const ROLE_TRIAGE: &str = "tools.ozone.team.defs#roleTriage"; diff --git a/atrium-api/src/tools/ozone/team/delete_member.rs b/atrium-api/src/tools/ozone/team/delete_member.rs new file mode 100644 index 00000000..eb3d42bc --- /dev/null +++ b/atrium-api/src/tools/ozone/team/delete_member.rs @@ -0,0 +1,36 @@ +// This file is generated by atrium-codegen. DO NOT EDIT. +//!Definitions for the `tools.ozone.team.deleteMember` namespace. +pub const NSID: &str = "tools.ozone.team.deleteMember"; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct InputData { + pub did: crate::types::string::Did, +} +pub type Input = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(tag = "error", content = "message")] +pub enum Error { + ///The member being deleted does not exist + MemberNotFound(Option), + ///You can not delete yourself from the team + CannotDeleteSelf(Option), +} +impl std::fmt::Display for Error { + fn fmt(&self, _f: &mut std::fmt::Formatter) -> std::fmt::Result { + match self { + Error::MemberNotFound(msg) => { + write!(_f, "MemberNotFound")?; + if let Some(msg) = msg { + write!(_f, ": {msg}")?; + } + } + Error::CannotDeleteSelf(msg) => { + write!(_f, "CannotDeleteSelf")?; + if let Some(msg) = msg { + write!(_f, ": {msg}")?; + } + } + } + Ok(()) + } +} diff --git a/atrium-api/src/tools/ozone/team/list_members.rs b/atrium-api/src/tools/ozone/team/list_members.rs new file mode 100644 index 00000000..41217ac6 --- /dev/null +++ b/atrium-api/src/tools/ozone/team/list_members.rs @@ -0,0 +1,28 @@ +// This file is generated by atrium-codegen. DO NOT EDIT. +//!Definitions for the `tools.ozone.team.listMembers` namespace. +pub const NSID: &str = "tools.ozone.team.listMembers"; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct ParametersData { + #[serde(skip_serializing_if = "Option::is_none")] + pub cursor: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub limit: Option>, +} +pub type Parameters = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct OutputData { + #[serde(skip_serializing_if = "Option::is_none")] + pub cursor: Option, + pub members: Vec, +} +pub type Output = crate::types::Object; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(tag = "error", content = "message")] +pub enum Error {} +impl std::fmt::Display for Error { + fn fmt(&self, _f: &mut std::fmt::Formatter) -> std::fmt::Result { + Ok(()) + } +} diff --git a/atrium-api/src/tools/ozone/team/update_member.rs b/atrium-api/src/tools/ozone/team/update_member.rs new file mode 100644 index 00000000..0cf072b1 --- /dev/null +++ b/atrium-api/src/tools/ozone/team/update_member.rs @@ -0,0 +1,33 @@ +// This file is generated by atrium-codegen. DO NOT EDIT. +//!Definitions for the `tools.ozone.team.updateMember` namespace. +pub const NSID: &str = "tools.ozone.team.updateMember"; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(rename_all = "camelCase")] +pub struct InputData { + pub did: crate::types::string::Did, + #[serde(skip_serializing_if = "Option::is_none")] + pub disabled: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub role: Option, +} +pub type Input = crate::types::Object; +pub type Output = crate::tools::ozone::team::defs::Member; +#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq)] +#[serde(tag = "error", content = "message")] +pub enum Error { + ///The member being updated does not exist in the team + MemberNotFound(Option), +} +impl std::fmt::Display for Error { + fn fmt(&self, _f: &mut std::fmt::Formatter) -> std::fmt::Result { + match self { + Error::MemberNotFound(msg) => { + write!(_f, "MemberNotFound")?; + if let Some(msg) = msg { + write!(_f, ": {msg}")?; + } + } + } + Ok(()) + } +} From 8f2309042baeb21a4a3146a87940efa50a60aee0 Mon Sep 17 00:00:00 2001 From: sugyan Date: Wed, 26 Jun 2024 23:37:41 +0900 Subject: [PATCH 2/2] Fix tests --- bsky-sdk/src/moderation/tests.rs | 1 + bsky-sdk/src/moderation/tests/behaviors.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/bsky-sdk/src/moderation/tests.rs b/bsky-sdk/src/moderation/tests.rs index 1595f989..f7eb5fba 100644 --- a/bsky-sdk/src/moderation/tests.rs +++ b/bsky-sdk/src/moderation/tests.rs @@ -60,6 +60,7 @@ fn profile_view_basic( ProfileViewBasicData { associated: None, avatar: None, + created_at: None, did: format!("did:web:{handle}").parse().expect("invalid did"), display_name: display_name.map(String::from), handle: handle.parse().expect("invalid handle"), diff --git a/bsky-sdk/src/moderation/tests/behaviors.rs b/bsky-sdk/src/moderation/tests/behaviors.rs index fefd85e5..18f3df6f 100644 --- a/bsky-sdk/src/moderation/tests/behaviors.rs +++ b/bsky-sdk/src/moderation/tests/behaviors.rs @@ -14,6 +14,7 @@ fn list_view_basic(name: &str) -> ListViewBasic { cid: FAKE_CID.parse().expect("invalid cid"), indexed_at: Some(Datetime::now()), labels: None, + list_item_count: None, name: name.into(), purpose: ListPurpose::from("app.bsky.graph.defs#modlist"), uri: String::from("at://did:plc:fake/app.bsky.graph.list/fake"),