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