dialtone_sqlx 0.1.0

Dialtone SQLx Back-End
Documentation
use crate::db::actor::insert::{insert_actor, InsertActor};
use crate::db::actor::{ActorDbType, ActorVisibilityType};
use crate::db::actor_owner::insert::insert_actor_owner;
use crate::db::ap_object::fetch_random::fetch_random_ap_object_by_actor;
use crate::logic::actor::new_actor::{
    banner_from_ap_object, icon_from_ap_object, new_actor, new_actor_with_images, NewActor,
};
use dialtone_common::ap::ap_object::ApObjectType;
use dialtone_common::containers::credentialed_actor::CredentialedActor;
use dialtone_common::media::{system_banners_actor_id, system_icons_actor_id};
use sqlx::PgPool;

pub async fn create_credentialed_actor(
    pool: &PgPool,
    new_actor_info: NewActor<'_>,
    default_actor: bool,
    host_name: &str,
) -> anyhow::Result<CredentialedActor> {
    // begin transaction
    let mut tx = pool.begin().await?;

    let banner_ap_object = fetch_random_ap_object_by_actor(
        &mut tx,
        &ApObjectType::Image,
        &system_banners_actor_id(host_name),
    )
    .await?;
    let banner = banner_from_ap_object(banner_ap_object);

    let icon_ap_object = fetch_random_ap_object_by_actor(
        &mut tx,
        &ApObjectType::Image,
        &system_icons_actor_id(host_name),
    )
    .await?;
    let icon = icon_from_ap_object(icon_ap_object);

    let new_actor_info = new_actor_with_images(&new_actor_info, &icon, &banner);

    let credentialed_actor = new_actor(host_name, &new_actor_info);
    let webfinger_jrd = credentialed_actor.owned_actor.jrd.as_ref();
    let actor_acct = Option::from(webfinger_jrd.unwrap().subject.as_str());
    let insert_actor_data = InsertActor {
        actor_id: &credentialed_actor.owned_actor.ap.id,
        actor_type: &ActorDbType::from(&credentialed_actor.owned_actor.ap.ap_type),
        actor_acct,
        webfinger_jrd,
        activity_pub: &credentialed_actor.owned_actor.ap,
        private_key_pem: Option::from(credentialed_actor.private_key_pem.as_str()),
        visibility: &ActorVisibilityType::Visible,
        system_data: None,
        owner_data: None,
    };

    insert_actor(&mut tx, insert_actor_data).await?;
    insert_actor_owner(
        &mut tx,
        &credentialed_actor.owned_actor.ap.id,
        new_actor_info.owner,
        default_actor,
    )
    .await?;
    tx.commit().await?;
    Ok(credentialed_actor)
}