screenshotfreeapi 1.0.0

Official Rust client for ScreenshotFreeAPI — Screenshot-as-a-Service
Documentation
use std::sync::Arc;

use crate::error::Result;
use crate::http::HttpClient;
use crate::types::{
    CreateWorkspaceRequest, InviteRequest, UpdateRoleRequest, Workspace, WorkspaceActionResponse,
    WorkspaceDetail,
};

/// Workspaces resource — team collaboration and member management.
///
/// All workspace endpoints require a **management JWT**.
/// Obtain one via [`AuthResource::token`](crate::resources::auth::AuthResource::token).
///
/// # Example
///
/// ```rust,no_run
/// use screenshotfreeapi::{ScreenshotFreeAPIClient, CreateWorkspaceRequest};
///
/// #[tokio::main]
/// async fn main() -> screenshotfreeapi::Result<()> {
///     let client = ScreenshotFreeAPIClient::new("sfa_your_api_key");
///     let jwt = "eyJ...";
///
///     let ws = client.workspaces.create(
///         CreateWorkspaceRequest { name: "My Team".into() },
///         jwt,
///     ).await?;
///     println!("Created workspace: {}", ws.id);
///     Ok(())
/// }
/// ```
#[derive(Clone)]
pub struct WorkspacesResource {
    pub(crate) http: Arc<HttpClient>,
}

impl WorkspacesResource {
    /// List all workspaces the caller belongs to.
    ///
    /// Corresponds to `GET /workspaces`.
    pub async fn list(&self, jwt: &str) -> Result<Vec<Workspace>> {
        self.http.get("/workspaces", Some(jwt)).await
    }

    /// Create a new workspace.
    ///
    /// Corresponds to `POST /workspaces`.
    pub async fn create(
        &self,
        request: CreateWorkspaceRequest,
        jwt: &str,
    ) -> Result<Workspace> {
        self.http.post("/workspaces", &request, Some(jwt)).await
    }

    /// Get details of a single workspace, including its member list.
    ///
    /// Corresponds to `GET /workspaces/:id`.
    pub async fn get(&self, workspace_id: &str, jwt: &str) -> Result<WorkspaceDetail> {
        self.http
            .get(&format!("/workspaces/{workspace_id}"), Some(jwt))
            .await
    }

    /// Invite a user to the workspace by email.
    ///
    /// `role` — one of `"admin"`, `"member"`, `"viewer"`.
    ///
    /// Corresponds to `POST /workspaces/:id/invite`.
    pub async fn invite(
        &self,
        workspace_id: &str,
        request: InviteRequest,
        jwt: &str,
    ) -> Result<WorkspaceActionResponse> {
        self.http
            .post(&format!("/workspaces/{workspace_id}/invite"), &request, Some(jwt))
            .await
    }

    /// Change a member's role.
    ///
    /// Corresponds to `PATCH /workspaces/:id/members/:userId`.
    pub async fn update_member_role(
        &self,
        workspace_id: &str,
        user_id: &str,
        request: UpdateRoleRequest,
        jwt: &str,
    ) -> Result<WorkspaceActionResponse> {
        self.http
            .patch(
                &format!("/workspaces/{workspace_id}/members/{user_id}"),
                &request,
                Some(jwt),
            )
            .await
    }

    /// Remove a member from the workspace.
    ///
    /// Corresponds to `DELETE /workspaces/:id/members/:userId`.
    pub async fn remove_member(
        &self,
        workspace_id: &str,
        user_id: &str,
        jwt: &str,
    ) -> Result<WorkspaceActionResponse> {
        self.http
            .delete(
                &format!("/workspaces/{workspace_id}/members/{user_id}"),
                Some(jwt),
            )
            .await
    }
}