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> {
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)
}