#appwrite #unofficial #baas #server

unofficial_appwrite

appwrite API 包装器 -> https://appwrite.io/docs

5 个版本

0.2.3 2024年5月29日
0.2.2 2024年5月26日
0.2.1 2024年5月25日
0.2.0 2024年5月24日
0.1.0 2024年4月13日

#4 in #unofficial

Download history 12/week @ 2024-04-16 459/week @ 2024-05-21 148/week @ 2024-05-28 6/week @ 2024-06-04

298 每月下载次数

MIT 许可证

420KB
9K SLoC

非官方 Appwrite Rust SDK


此 SDK 与 Appwrite 服务器版本 1.5.x 兼容。这是用于从您的 Rust 服务器端代码集成 Appwrite 的 Rust SDK


Appwrite 是一个开源的 BaaS 服务器,通过简单的 REST API 抽象和简化了复杂的重复性开发任务。Appwrite 旨在帮助您更快、更安全地开发应用程序。使用 Rust 将您的应用程序与 Appwrite 服务器集成,以便轻松交互所有 Appwrite 后端 API 和工具。有关完整的 API 文档和教程,请访问 https://appwrite.io/docs

安装


将此添加到您的包的 Cargo.toml 文件中

[dependencies]
unofficial_appwrite = "0.1.0"
serde_json = "1.0.111"

您可以从命令行安装包

cargo add unofficial_appwrite serde_json

入门


初始化 & 发送 API 请求


一旦添加了依赖项,使用 SDK 入门变得极其简单;您需要做的只是将包导入到代码中,设置您的 Appwrite 凭据,并开始调用 API。以下是一个简单的示例


use unofficial_appwrite::client::ClientBuilder;
use unofficial_appwrite::error::Error;
use unofficial_appwrite::services::server::users::Users;
use unofficial_appwrite::id::ID;

#[tokio::main]
async fn main() -> Result<(), Error> {
    let  client = ClientBuilder::default()
    .set_endpoint("http://[HOSTNAME_OR_IP]/v1") // Make sure your endpoint is accessible
    .set_project("5ff...")? // Your project ID
    .set_key("cd868c7af8bdc893b4...93b7535db89")?
    //.set_self_signed(false)? // Use only on dev mode with a self-signed SSL cert
    .build()?;

    //create new user
 let create_user = Users::create(
        &client,
        ID::unique(),
        Some("[email protected]"),
        None,
        Some("password"),
        Some("Walter O'Brien"),
    )
    .await?;
    dbg!("{:?}", create_user);
}

其他示例


用户


use unofficial_appwrite::client::ClientBuilder;
use unofficial_appwrite::error::Error;
use unofficial_appwrite::services::server::users::Users;
use serde_json::{json, Map};

#[tokio::main]
async fn main() -> Result<(), Error> {
    let  client = ClientBuilder::default()
    .set_endpoint("http://[HOSTNAME_OR_IP]/v1") // Make sure your endpoint is accessible
    .set_project("5ff33...")? // Your project ID
    .set_key("cd868c7af8bdc893b4...93b7535db89")?
    //.set_self_signed(false)? // Use only on dev mode with a self-signed SSL cert
    .build()?;

//create user preference
let user_prefs = Users::get_prefs(&client, "6...64").await?;
    dbg!("{:#?}", user_prefs);

    let mut prefs = Map::new();
    prefs.insert("isAdmin".to_string(), json!(true));
    let user_update_prefs = Users::update_prefs(&client, "6...4", prefs).await?;
    dbg!("{:#?}", user_update_prefs);
}

数据库

use unofficial_appwrite::client::ClientBuilder;
use unofficial_appwrite::error::Error;
use serde_json::{json, Map};
use unofficial_appwrite::id::ID;
use unofficial_appwrite::services::server::databases::Databases;
use unofficial_appwrite::permission::Permission;
use unofficial_appwrite::enums::relationship_type::RelationshipType;
use unofficial_appwrite::query::Query;

#[tokio::main]
async fn main() -> Result<(), Error> {

     let  client = ClientBuilder::default()
    .set_endpoint("http://[HOSTNAME_OR_IP]/v1") // Make sure your endpoint is accessible
    .set_project("5ff3379a01d25")? // Your project ID
    .set_key("cd868c7af8bdc893b4...93b7535db89")?
    //.set_self_signed(false)? // Use only on dev mode with a self-signed SSL cert
    .build()?;

    // create database
     let create_db = Databases::create(&client, ID::unique(), "test_db", None).await?;
    dbg!(create_db);

    let create_collection = Databases::create_collection(
        &client,"6618...76",ID::unique(),"test_collection_1",
        Some(vec![
            Permission::read("any"),
            Permission::create("user:22222346"),
        ]),
        None,None,).await?;
    dbg!(create_collection);

    // create boolean attribute
    let att = Databases::create_boolean_attribute(
        &client,"6618...76","6618...d4","isAdmin",true,None,None,).await?;
    dbg!(att);

    // create string attribute
    let name = Databases::create_string_attribute(
        &client,"6618...76","6618...d4","title",255,true,None,None,None,).await?;
    dbg!(name);

    // create documents
    let mut data = Map::new();
    data.insert(String::from("isAdmin"), json!(false));
    data.insert(String::from("title"), json!("next1"));
    let create_doc = Databases::create_documents(
        &client,"6618...76","6618...d4",ID::unique(),data,None,).await?;
    dbg!(create_doc);

    // create relationship attribute
    let relationship = Databases::create_relationship_attribute(
        &client,"6618...76","6618...d4","6619...1e",
        RelationshipType::OneToOne,
        None,Some("test_col_2"),None,None,).await?;
    dbg!(relationship);

    // get a list on collections
    let queries = vec![Query::equal(r"$id", json!(vec!["6618ef06d269bf4110d4"]))];

    let col_list = Databases::list_collections(
        &client,
        "6618eec286a4ef198076",
        Some(Query::equal(r"$id", json!(vec!["6619010ddab914e6b01e"]))),
        Some(queries),
    )
    .await?;
    dbg!(col_list);
}

存储

use unofficial_appwrite::client::ClientBuilder;
use unofficial_appwrite::error::Error;
use unofficial_appwrite::id::ID;
use unofficial_appwrite::services::server::storage::Storage;
use futures_util::{pin_mut, StreamExt};
use std::fs;

#[tokio::main]
async fn main() -> Result<(), Error> {

     let  client = ClientBuilder::default()
    .set_endpoint("http://[HOSTNAME_OR_IP]/v1") // Make sure your endpoint is accessible
    .set_project("5ff3379a01d25")? // Your project ID
    .set_key("cd868c7af8bdc893b4...93b7535db89")?
    //.set_self_signed(false)? // Use only on dev mode with a self-signed SSL cert
    .build()?;

    // create bucket
let create_buk = Storage::create_bucket(
        &client,ID::unique(),"My Bucket",None,None,None,None,None,None,None,None,).await?;
    dbg!(create_buk);

    // create a file without getting upload progress
    let create_file_with_no_progress = Storage::create_files(
        &client,
        "65d20d5c8096032a03cd",
        ID::unique(),
        r"c:\Users\pc\Downloads\Video\New folder (2)\Folder 1\Ultimate Flutter for Cross-Platform App Development (Temidayo Adefioye) (Z-Library).pdf",
        String::from("sgs_deadlines_next.pdf"),
        None,
    )
    .await?;
    dbg!(create_file_with_no_progress);

    //or create a file and get upload progress through streams
    let create_file_and_stream_upload_progress = Storage::create_files_streamed(
        &client,
        "65d20d5c8096032a03cd",
        ID::unique(),
        r"c:\Users\pc\Downloads\Video\New folder (2)\Folder 1\Ultimate Flutter for Cross-Platform App Development (Temidayo Adefioye) (Z-Library).pdf",
        String::from("sgs_deadlines_next_3.pdf"),
        None,
    )
    .await;
    pin_mut!(create_file_and_stream_upload_progress);
    while let Some(data) = create_file_and_stream_upload_progress.next().await {
        let res = data.unwrap();
        let file = res.0;
        println!("==>{:?}===>{:?}", file, res.1);
    }

    // get file
    let get_file =
        Storage::get_file(&client, "661...e9", "661...71e").await?;
    dbg!(get_file);

    // download file
    let get_file_download =
        Storage::get_file_download(&client, "661...e9", "661...71e").await?;
    fs::write(
        r"C:\Users\pc\Downloads\Documents\test\second\new.mp4",
        get_file_download,
    )
    .expect("didn't work");
}

实时

use futures_util::{pin_mut, StreamExt};
use unofficial_appwrite::{client::ClientBuilder, error::Error, realtime::RealTime};

#[tokio::main]
async fn main() -> Result<(), Error> {

     let  client = ClientBuilder::default()
    .set_endpoint("http://[HOSTNAME_OR_IP]/v1") // Make sure your endpoint is accessible
    .set_project("5ff3...")? // Your project ID
    .set_key("cd868c7af8bdc893b4...93b7535db89")?
    //.set_self_signed(false)? // Use only on dev mode with a self-signed SSL cert
    .build()?;

    // subscribe to realtime
 let stream = RealTime::subscribe(
        &client,
        vec!["databases.6618eec286a4ef198076.collections.6618ef06d269bf4110d4.documents"],
    )
    .await;
    pin_mut!(stream);
    while let Some(data) = stream.next().await {
        println!("=====>{:?}<=====", data);
    }
}

工具

查询
    use unofficial_appwrite::query::Query;
    Query::equal(r"$id", json!(vec!["6618ef06d269bf4110d4"]))
ID
    use unofficial_appwrite::id::ID;
    ID::unique();
权限
    use unofficial_appwrite::permission::Permission;
    Permission::read("any"),
    Permission::create("user:22222346"),
角色
    use unofficial_appwrite::role::Role;
    Role::any()

注意:对于其他示例,请查看官方文档或 SDK 的官方文档作为使用此 SDK 的指南。

了解更多信息


您可以使用以下资源了解更多信息并获得帮助

接下来做什么


  • 清理一些多余的代码

贡献


依赖项

~7–21MB
~335K SLoC