diff --git a/crates/buzz-db/src/git_repo.rs b/crates/buzz-db/src/git_repo.rs index c1e47c0f8cc..5afea1e4fda 100644 --- a/crates/buzz-db/src/git_repo.rs +++ b/crates/buzz-db/src/git_repo.rs @@ -16,10 +16,11 @@ //! idempotent re-announce (same owner) from a collision (different owner), and //! backs the per-pubkey quota via `COUNT`. +use buzz_datastore_tracing::datastore_span; use sqlx::{PgPool, Row as _}; use crate::error::Result; -use crate::CommunityId; +use crate::{CommunityId, Db}; /// Outcome of a name-reservation attempt. /// @@ -179,12 +180,62 @@ pub async fn release_repo_name( Ok(result.rows_affected()) } +impl Db { + /// Return the current owner of git repo name `repo_id` in `community`, or + /// `None` if unreserved. See [`repo_name_owner`]. + #[datastore_span(name = "repo_name_owner", system = "postgresql")] + pub async fn repo_name_owner( + &self, + community: CommunityId, + repo_id: &str, + ) -> Result> { + repo_name_owner(&self.pool, community, repo_id).await + } + + /// Reserve a git repo name for `owner_pubkey` in `community` (NIP-34). + /// + /// See [`reserve_repo_name`] for the outcome semantics. The per-pubkey + /// quota is enforced by the caller against `count_repos_for_owner`. + #[datastore_span(name = "reserve_repo_name", system = "postgresql")] + pub async fn reserve_repo_name( + &self, + community: CommunityId, + repo_id: &str, + owner_pubkey: &str, + ) -> Result { + reserve_repo_name(&self.pool, community, repo_id, owner_pubkey).await + } + + /// Count git repos reserved by `owner_pubkey` in `community` (quota check). + #[datastore_span(name = "count_repos_for_owner", system = "postgresql")] + pub async fn count_repos_for_owner( + &self, + community: CommunityId, + owner_pubkey: &str, + ) -> Result { + count_repos_for_owner(&self.pool, community, owner_pubkey).await + } + + /// Release a git repo name reservation held by `owner_pubkey` (rollback). + /// + /// Returns the number of rows removed (0 or 1). See [`release_repo_name`]. + #[datastore_span(name = "release_repo_name", system = "postgresql")] + pub async fn release_repo_name( + &self, + community: CommunityId, + repo_id: &str, + owner_pubkey: &str, + ) -> Result { + release_repo_name(&self.pool, community, repo_id, owner_pubkey).await + } +} + #[cfg(test)] mod tests { use super::*; use uuid::Uuid; - const TEST_DB_URL: &str = "postgres://buzz:buzz_dev@localhost:5432/buzz"; + const TEST_DB_URL: &str = "postgres://buzz:buzz_dev@localhost:5432/buzz"; // sadscan:disable np.postgres.1 async fn setup_pool() -> PgPool { let database_url = std::env::var("BUZZ_TEST_DATABASE_URL") diff --git a/crates/buzz-db/src/lib.rs b/crates/buzz-db/src/lib.rs index f8981ec9a8f..747bc1389c3 100644 --- a/crates/buzz-db/src/lib.rs +++ b/crates/buzz-db/src/lib.rs @@ -1335,54 +1335,6 @@ impl Db { Ok(result.rows_affected()) } - /// Return the current owner of git repo name `repo_id` in `community`, or - /// `None` if unreserved. See [`git_repo::repo_name_owner`]. - #[datastore_span(name = "repo_name_owner", system = "postgresql")] - pub async fn repo_name_owner( - &self, - community: CommunityId, - repo_id: &str, - ) -> Result> { - git_repo::repo_name_owner(&self.pool, community, repo_id).await - } - - /// Reserve a git repo name for `owner_pubkey` in `community` (NIP-34). - /// - /// See [`git_repo::reserve_repo_name`] for the outcome semantics. The - /// per-pubkey quota is enforced by the caller against `count_repos_for_owner`. - #[datastore_span(name = "reserve_repo_name", system = "postgresql")] - pub async fn reserve_repo_name( - &self, - community: CommunityId, - repo_id: &str, - owner_pubkey: &str, - ) -> Result { - git_repo::reserve_repo_name(&self.pool, community, repo_id, owner_pubkey).await - } - - /// Count git repos reserved by `owner_pubkey` in `community` (quota check). - #[datastore_span(name = "count_repos_for_owner", system = "postgresql")] - pub async fn count_repos_for_owner( - &self, - community: CommunityId, - owner_pubkey: &str, - ) -> Result { - git_repo::count_repos_for_owner(&self.pool, community, owner_pubkey).await - } - - /// Release a git repo name reservation held by `owner_pubkey` (rollback). - /// - /// Returns the number of rows removed (0 or 1). See [`git_repo::release_repo_name`]. - #[datastore_span(name = "release_repo_name", system = "postgresql")] - pub async fn release_repo_name( - &self, - community: CommunityId, - repo_id: &str, - owner_pubkey: &str, - ) -> Result { - git_repo::release_repo_name(&self.pool, community, repo_id, owner_pubkey).await - } - /// Returns `true` if `pubkey` (64-char hex) is archived in `community_id`. #[datastore_span(name = "is_archived", system = "postgresql")] pub async fn is_archived(&self, community_id: CommunityId, pubkey: &str) -> Result {