Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 53 additions & 2 deletions crates/buzz-db/src/git_repo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
///
Expand Down Expand Up @@ -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<Option<String>> {
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<ReserveOutcome> {
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<i64> {
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<u64> {
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")
Expand Down
48 changes: 0 additions & 48 deletions crates/buzz-db/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<Option<String>> {
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::ReserveOutcome> {
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<i64> {
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<u64> {
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<bool> {
Expand Down
Loading