use crate::registry::types::*; use sqlx::PgPool; // ===== Local Admin Services ===== pub async fn create_local_admin( pool: &PgPool, req: CreateLocalAdminRequest, ) -> Result { let result = sqlx::query_as::<_, LocalAdmin>( r#" INSERT INTO local_admins ( local_admin_pubkey, admin_pubkey, state_name, registry_pubkey, is_active, companies_managed ) VALUES ($1, $2, $3, $4, true, 0) RETURNING * "#, ) .bind(&req.local_admin_pubkey) .bind(&req.admin_pubkey) .bind(&req.state_name) .bind(&req.registry_pubkey) .fetch_one(pool) .await?; Ok(result) } pub async fn update_local_admin_status( pool: &PgPool, req: UpdateLocalAdminStatusRequest, ) -> Result { let result = sqlx::query_as::<_, LocalAdmin>( r#" UPDATE local_admins SET is_active = $2, updated_at = NOW() WHERE local_admin_pubkey = $1 RETURNING * "#, ) .bind(&req.local_admin_pubkey) .bind(req.is_active) .fetch_one(pool) .await?; Ok(result) } pub async fn get_local_admin( pool: &PgPool, local_admin_pubkey: &str, ) -> Result { sqlx::query_as::<_, LocalAdmin>("SELECT * FROM local_admins WHERE local_admin_pubkey = $1") .bind(local_admin_pubkey) .fetch_one(pool) .await } pub async fn list_local_admins(pool: &PgPool) -> Result, sqlx::Error> { sqlx::query_as::<_, LocalAdmin>("SELECT * FROM local_admins ORDER BY created_at DESC") .fetch_all(pool) .await }