768 lines · 27.6 KB · Rust
RawDownload
use anyhow::{Result, anyhow};use async_trait::async_trait;use cynic::{MutationBuilder, QueryBuilder};#[cfg(test)]use mockall::{automock, predicate::*};use warp_graphql::mutations::add_invite_link_domain_restriction::{    AddInviteLinkDomainRestriction, AddInviteLinkDomainRestrictionInput,    AddInviteLinkDomainRestrictionResult, AddInviteLinkDomainRestrictionVariables,};use warp_graphql::mutations::create_team::{    CreateTeam, CreateTeamInput, CreateTeamResult, CreateTeamVariables,};use warp_graphql::mutations::delete_invite_link_domain_restriction::{    DeleteInviteLinkDomainRestriction, DeleteInviteLinkDomainRestrictionInput,    DeleteInviteLinkDomainRestrictionResult, DeleteInviteLinkDomainRestrictionVariables,};use warp_graphql::mutations::delete_team_invite::{    DeleteTeamInvite, DeleteTeamInviteInput, DeleteTeamInviteResult, DeleteTeamInviteVariables,};use warp_graphql::mutations::join_team_in_workspace::{    JoinTeamInWorkspace, JoinTeamInWorkspaceInput, JoinTeamInWorkspaceResult,    JoinTeamInWorkspaceVariables,};use warp_graphql::mutations::join_team_with_team_discovery::{    JoinTeamWithTeamDiscovery, JoinTeamWithTeamDiscoveryInput, JoinTeamWithTeamDiscoveryResult,    JoinTeamWithTeamDiscoveryVariables, TeamDiscoveryEntrypoint,};use warp_graphql::mutations::remove_user_from_team::{    RemoveUserFromTeam, RemoveUserFromTeamInput, RemoveUserFromTeamResult,    RemoveUserFromTeamVariables,};use warp_graphql::mutations::rename_team::{    RenameTeam, RenameTeamInput, RenameTeamResult, RenameTeamVariables,};use warp_graphql::mutations::reset_invite_links::{    ResetInviteLinks, ResetInviteLinksInput, ResetInviteLinksResult, ResetInviteLinksVariables,};use warp_graphql::mutations::send_team_invite_email::{    SendTeamInviteEmail, SendTeamInviteEmailInput, SendTeamInviteEmailResult,    SendTeamInviteEmailVariables,};use warp_graphql::mutations::set_is_invite_link_enabled::{    SetIsInviteLinkEnabled, SetIsInviteLinkEnabledInput, SetIsInviteLinkEnabledResult,    SetIsInviteLinkEnabledVariables,};use warp_graphql::mutations::set_team_discoverability::{    SetTeamDiscoverability, SetTeamDiscoverabilityInput, SetTeamDiscoverabilityResult,    SetTeamDiscoverabilityVariables,};use warp_graphql::mutations::set_team_member_role::{    SetTeamMemberRole, SetTeamMemberRoleInput, SetTeamMemberRoleResult, SetTeamMemberRoleVariables,};use warp_graphql::mutations::transfer_team_ownership::{    TransferTeamOwnership, TransferTeamOwnershipInput, TransferTeamOwnershipResult,    TransferTeamOwnershipVariables,};use warp_graphql::queries::get_discoverable_teams::{    GetDiscoverableTeams, GetDiscoverableTeamsVariables,};use warp_graphql::queries::get_workspaces_metadata_for_user::{    GetWorkspacesMetadataForUser, GetWorkspacesMetadataForUserVariables, PricingInfoResult,}; use super::ServerApi;use crate::auth::UserUid;use crate::cloud_object::CloudObjectEventEntrypoint;use crate::server::graphql::{get_request_context, get_user_facing_error_message};use crate::server::ids::ServerId;use crate::workspaces::gql_convert::workspaces_metadata_response_from_gql;use crate::workspaces::team::{DiscoverableTeam, MembershipRole};use crate::workspaces::user_workspaces::{CreateTeamResponse, WorkspacesMetadataWithPricing};use crate::workspaces::workspace::Workspace; #[cfg_attr(test, automock)]#[cfg_attr(not(target_family = "wasm"), async_trait)]#[cfg_attr(target_family = "wasm", async_trait(?Send))]pub trait TeamClient: 'static + Send + Sync {    async fn workspaces_metadata(&self) -> Result<WorkspacesMetadataWithPricing>;     async fn add_invite_link_domain_restriction(        &self,        team_uid: ServerId,        domain: String,    ) -> Result<WorkspacesMetadataWithPricing>;     async fn delete_invite_link_domain_restriction(        &self,        team_uid: ServerId,        domain_uid: ServerId,    ) -> Result<WorkspacesMetadataWithPricing>;     /// Creates a team and returns the result from the server with the newly created team.    async fn create_team(        &self,        name: String,        entrypoint: CloudObjectEventEntrypoint,        discoverable: Option<bool>,    ) -> Result<CreateTeamResponse>;     /// Removes the user from the selected team and returns a list of all teams that a user is    /// still a member of (including updated team members).    async fn remove_user_from_team(        &self,        user_uid: UserUid,        team_uid: ServerId,        entrypoint: CloudObjectEventEntrypoint,    ) -> Result<WorkspacesMetadataWithPricing>;     /// Removes the _current_ user from the team (user leaving the team) and returns the list of    /// all teams that the current user is still a member of.    async fn leave_team(        &self,        user_uid: UserUid,        team_uid: ServerId,        entrypoint: CloudObjectEventEntrypoint,    ) -> Result<WorkspacesMetadataWithPricing>;     async fn join_team_with_team_discovery(        &self,        team_uid: ServerId,    ) -> Result<WorkspacesMetadataWithPricing>;    async fn join_team_in_workspace(        &self,        team_uid: ServerId,    ) -> Result<WorkspacesMetadataWithPricing>;     async fn send_team_invite_email(        &self,        team_uid: ServerId,        email: String,    ) -> Result<WorkspacesMetadataWithPricing>;     async fn delete_team_invite(        &self,        team_uid: ServerId,        email: String,    ) -> Result<WorkspacesMetadataWithPricing>;     async fn get_discoverable_teams(&self) -> Result<Vec<DiscoverableTeam>>;     async fn rename_team(        &self,        new_name: String,        team_uid: ServerId,    ) -> Result<WorkspacesMetadataWithPricing>;     async fn reset_invite_links(&self, team_uid: ServerId)    -> Result<WorkspacesMetadataWithPricing>;     async fn set_is_invite_link_enabled(        &self,        team_uid: ServerId,        new_value: bool,    ) -> Result<WorkspacesMetadataWithPricing>;     async fn set_team_discoverability(        &self,        team_uid: ServerId,        discoverable: bool,    ) -> Result<WorkspacesMetadataWithPricing>;     async fn transfer_team_ownership(        &self,        new_owner_email: String,    ) -> Result<WorkspacesMetadataWithPricing>;     async fn set_team_member_role(        &self,        user_uid: UserUid,        team_uid: ServerId,        role: MembershipRole,    ) -> Result<WorkspacesMetadataWithPricing>;} #[cfg_attr(not(target_family = "wasm"), async_trait)]#[cfg_attr(target_family = "wasm", async_trait(?Send))]impl TeamClient for ServerApi {    #[tracing::instrument(skip_all, err, fields(tags.cloud_agent = true))]    async fn workspaces_metadata(&self) -> Result<WorkspacesMetadataWithPricing> {        let variables = GetWorkspacesMetadataForUserVariables {            request_context: get_request_context(),        };        let operation = GetWorkspacesMetadataForUser::build(variables);        let response = self.send_graphql_request(operation, None).await?;         let metadata = match response.user {            warp_graphql::queries::get_workspaces_metadata_for_user::UserResult::UserOutput(                user_output,            ) => workspaces_metadata_response_from_gql(user_output.user, self.is_service_account()),            warp_graphql::queries::get_workspaces_metadata_for_user::UserResult::Unknown => {                return Err(anyhow!("Unable to fetch workspaces metadata"));            }        };         let pricing_info = match response.pricing_info {            PricingInfoResult::PricingInfoOutput(pricing_output) => {                Some(pricing_output.pricing_info)            }            PricingInfoResult::Unknown => None,        };         Ok(WorkspacesMetadataWithPricing {            metadata,            pricing_info,        })    }     async fn add_invite_link_domain_restriction(        &self,        team_uid: ServerId,        domain: String,    ) -> Result<WorkspacesMetadataWithPricing> {        let variables = AddInviteLinkDomainRestrictionVariables {            input: AddInviteLinkDomainRestrictionInput {                team_uid: team_uid.into(),                domain,            },            request_context: get_request_context(),        };         let operation = AddInviteLinkDomainRestriction::build(variables);        let result = self            .send_graphql_request(operation, None)            .await?            .add_invite_link_domain_restriction;         match result {            AddInviteLinkDomainRestrictionResult::AddInviteLinkDomainRestrictionOutput(result) => {                if !result.success {                    return Err(anyhow!("failed to add invite link domain restriction"));                }            }            AddInviteLinkDomainRestrictionResult::UserFacingError(user_facing_error) => {                return Err(anyhow!(get_user_facing_error_message(user_facing_error)));            }            AddInviteLinkDomainRestrictionResult::Unknown => {                return Err(anyhow!(                    "unknown error while adding invite link domain restriction"                ));            }        }         self.workspaces_metadata().await    }     async fn delete_invite_link_domain_restriction(        &self,        team_uid: ServerId,        domain_uid: ServerId,    ) -> Result<WorkspacesMetadataWithPricing> {        let variables = DeleteInviteLinkDomainRestrictionVariables {            input: DeleteInviteLinkDomainRestrictionInput {                uid: domain_uid.into(),                team_uid: team_uid.into(),            },            request_context: get_request_context(),        };        let operation = DeleteInviteLinkDomainRestriction::build(variables);        let result = self            .send_graphql_request(operation, None)            .await?            .delete_invite_link_domain_restriction;         match result {            DeleteInviteLinkDomainRestrictionResult::DeleteInviteLinkDomainRestrictionOutput(                result,            ) => {                if !result.success {                    return Err(anyhow!("failed to delete invite link domain restriction"));                }            }            DeleteInviteLinkDomainRestrictionResult::UserFacingError(user_facing_error) => {                return Err(anyhow!(get_user_facing_error_message(user_facing_error)));            }            DeleteInviteLinkDomainRestrictionResult::Unknown => {                return Err(anyhow!(                    "unknown error while deleting invite link domain restriction"                ));            }        }         self.workspaces_metadata().await    }     async fn create_team(        &self,        name: String,        entrypoint: CloudObjectEventEntrypoint,        discoverable: Option<bool>,    ) -> Result<CreateTeamResponse> {        let variables = CreateTeamVariables {            input: CreateTeamInput {                name,                entrypoint: entrypoint.into(),                discoverable: discoverable.unwrap_or(false),            },            request_context: get_request_context(),        };         let operation = CreateTeam::build(variables);        let result = self            .send_graphql_request(operation, None)            .await?            .create_team;         match result {            CreateTeamResult::CreateTeamOutput(output) => {                let workspace: Workspace = output.workspace.clone().into();                if let Some(team) = workspace.teams.first() {                    Ok(CreateTeamResponse {                        workspace: workspace.clone(),                        team: team.clone(),                    })                } else {                    Err(anyhow!("failed to create team"))                }            }            CreateTeamResult::UserFacingError(user_facing_error) => {                Err(anyhow!(get_user_facing_error_message(user_facing_error)))            }            CreateTeamResult::Unknown => Err(anyhow!("unknown error while creating team")),        }    }     async fn remove_user_from_team(        &self,        user_uid: UserUid,        team_uid: ServerId,        entrypoint: CloudObjectEventEntrypoint,    ) -> Result<WorkspacesMetadataWithPricing> {        let variables = RemoveUserFromTeamVariables {            input: RemoveUserFromTeamInput {                user_uid: user_uid.as_str().into(),                team_uid: team_uid.into(),                entrypoint: entrypoint.into(),            },            request_context: get_request_context(),        };         let operation = RemoveUserFromTeam::build(variables);        let result = self            .send_graphql_request(operation, None)            .await?            .remove_user_from_team;         match result {            RemoveUserFromTeamResult::RemoveUserFromTeamOutput(output) => {                if !output.success {                    return Err(anyhow!("failed to remove user from team"));                } else {                    self.workspaces_metadata().await                }            }            RemoveUserFromTeamResult::UserFacingError(user_facing_error) => {                Err(anyhow!(get_user_facing_error_message(user_facing_error)))            }            RemoveUserFromTeamResult::Unknown => {                Err(anyhow!("unknown error while removing user from team"))            }        }    }     async fn leave_team(        &self,        user_uid: UserUid,        team_uid: ServerId,        entrypoint: CloudObjectEventEntrypoint,    ) -> Result<WorkspacesMetadataWithPricing> {        let variables = RemoveUserFromTeamVariables {            input: RemoveUserFromTeamInput {                user_uid: user_uid.into(),                team_uid: team_uid.into(),                entrypoint: entrypoint.into(),            },            request_context: get_request_context(),        };         let operation = RemoveUserFromTeam::build(variables);        let result = self            .send_graphql_request(operation, None)            .await?            .remove_user_from_team;         match result {            RemoveUserFromTeamResult::RemoveUserFromTeamOutput(output) => {                if !output.success {                    return Err(anyhow!("failed to leave team"));                } else {                    self.workspaces_metadata().await                }            }            RemoveUserFromTeamResult::UserFacingError(user_facing_error) => {                Err(anyhow!(get_user_facing_error_message(user_facing_error)))            }            RemoveUserFromTeamResult::Unknown => Err(anyhow!("unknown error while leaving team")),        }    }     async fn join_team_with_team_discovery(        &self,        team_uid: ServerId,    ) -> Result<WorkspacesMetadataWithPricing> {        let variables = JoinTeamWithTeamDiscoveryVariables {            input: JoinTeamWithTeamDiscoveryInput {                team_uid: team_uid.into(),                entrypoint: TeamDiscoveryEntrypoint::TeamSettings,            },            request_context: get_request_context(),        };         let operation = JoinTeamWithTeamDiscovery::build(variables);        let result = self            .send_graphql_request(operation, None)            .await?            .join_team_with_team_discovery;         match result {            JoinTeamWithTeamDiscoveryResult::JoinTeamWithTeamDiscoveryOutput(output) => {                if !output.success {                    return Err(anyhow!("failed to join team"));                } else {                    self.workspaces_metadata().await                }            }            JoinTeamWithTeamDiscoveryResult::UserFacingError(user_facing_error) => {                Err(anyhow!(get_user_facing_error_message(user_facing_error)))            }            JoinTeamWithTeamDiscoveryResult::Unknown => {                Err(anyhow!("unknown error while joining team"))            }        }    }     async fn join_team_in_workspace(        &self,        team_uid: ServerId,    ) -> Result<WorkspacesMetadataWithPricing> {        let variables = JoinTeamInWorkspaceVariables {            input: JoinTeamInWorkspaceInput {                team_uid: team_uid.into(),            },            request_context: get_request_context(),        };         let operation = JoinTeamInWorkspace::build(variables);        let result = self            .send_graphql_request(operation, None)            .await?            .join_team_in_workspace;         match result {            JoinTeamInWorkspaceResult::JoinTeamInWorkspaceOutput(output) => {                if !output.success {                    return Err(anyhow!("failed to join team"));                }                self.workspaces_metadata().await            }            JoinTeamInWorkspaceResult::UserFacingError(user_facing_error) => {                Err(anyhow!(get_user_facing_error_message(user_facing_error)))            }            JoinTeamInWorkspaceResult::Unknown => Err(anyhow!("unknown error while joining team")),        }    }     async fn send_team_invite_email(        &self,        team_uid: ServerId,        email: String,    ) -> Result<WorkspacesMetadataWithPricing> {        let variables = SendTeamInviteEmailVariables {            input: SendTeamInviteEmailInput {                team_uid: team_uid.into(),                email,            },            request_context: get_request_context(),        };         let operation = SendTeamInviteEmail::build(variables);        let result = self            .send_graphql_request(operation, None)            .await?            .send_team_invite_email;         match result {            SendTeamInviteEmailResult::SendTeamInviteEmailOutput(output) => {                if !output.success {                    return Err(anyhow!("failed to send team invite"));                } else {                    self.workspaces_metadata().await                }            }            SendTeamInviteEmailResult::UserFacingError(user_facing_error) => {                Err(anyhow!(get_user_facing_error_message(user_facing_error)))            }            SendTeamInviteEmailResult::Unknown => {                Err(anyhow!("unknown error while sending team invite"))            }        }    } 

Lines 1–500 of 768.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t