dialtone_sqlx 0.1.0

Dialtone SQLx Back-End
Documentation
use sqlx::types::Json;
use sqlx::{Executor, Postgres};

use dialtone_common::ap::Actor;
use dialtone_common::rest::actors::actor_model::{OwnerActorData, SystemActorData};
use dialtone_common::webfinger::Jrd;

use crate::db::actor::{ActorDbType, ActorVisibilityType};

pub struct InsertActor<'a> {
    pub(crate) actor_id: &'a str,
    pub(crate) actor_type: &'a ActorDbType,
    pub(crate) actor_acct: Option<&'a str>,
    pub(crate) webfinger_jrd: Option<&'a Jrd>,
    pub(crate) activity_pub: &'a Actor,
    pub(crate) private_key_pem: Option<&'a str>,
    pub(crate) visibility: &'a ActorVisibilityType,
    pub(crate) system_data: Option<&'a SystemActorData>,
    pub(crate) owner_data: Option<&'a OwnerActorData>,
}

pub async fn insert_actor(
    exec: impl Executor<'_, Database = Postgres>,
    insert_data: InsertActor<'_>,
) -> Result<(), sqlx::Error> {
    sqlx::query(
        r#"
        insert into actor
          (id, type, acct, webfinger_json, activity_pub_json, private_key_pem, visibility, system_data, owner_data)
        values
          ($1, $2,   $3,   $4,             $5,                $6,              $7,         $8,          $9)
        returning id
        "#,
    )
        .bind(insert_data.actor_id)
        .bind(insert_data.actor_type)
        .bind(insert_data.actor_acct)
        .bind(Json(insert_data.webfinger_jrd))
        .bind(Json(insert_data.activity_pub))
        .bind(insert_data.private_key_pem)
        .bind(insert_data.visibility)
        .bind(Json(insert_data.system_data))
        .bind(Json(insert_data.owner_data))
        .fetch_one(exec)
        .await?;

    Ok(())
}