rustploy 0.1.14

Rustploy PaaS daemon — lightweight self-hosted deployment platform
//! Tabela de tokens de webhook de deploy, um por serviço.

use anyhow::Result;
use chrono::Utc;

use super::Db;

pub async fn get(db: &Db, service_id: &str) -> Result<Option<String>> {
    let row =
        sqlx::query_scalar::<_, String>("SELECT token FROM webhook_token WHERE service_id = ?")
            .bind(service_id)
            .fetch_optional(db)
            .await?;
    Ok(row)
}

pub async fn upsert(db: &Db, service_id: &str, token: &str) -> Result<()> {
    sqlx::query(
        "INSERT INTO webhook_token (service_id, token, created_at)
         VALUES (?, ?, ?)
         ON CONFLICT(service_id) DO UPDATE SET token = excluded.token, created_at = excluded.created_at",
    )
    .bind(service_id)
    .bind(token)
    .bind(Utc::now().to_rfc3339())
    .execute(db)
    .await?;
    Ok(())
}

pub async fn _delete(db: &Db, service_id: &str) -> Result<()> {
    sqlx::query("DELETE FROM webhook_token WHERE service_id = ?")
        .bind(service_id)
        .execute(db)
        .await?;
    Ok(())
}

pub fn generate_token() -> String {
    use std::io::Read;
    let mut bytes = [0u8; 24];
    std::fs::File::open("/dev/urandom")
        .and_then(|mut f| f.read_exact(&mut bytes).map(|_| ()))
        .unwrap_or_default();
    hex::encode(bytes)
}