postcrate-core 0.1.1

Embeddable SMTP capture engine: server, multi-mailbox lifecycle, chaos simulation, SQLite persistence, HTTP API.
Documentation
use axum::extract::{Path, State};
use axum::routing::{delete, get};
use axum::{Json, Router};

use crate::db::bounce_rules::BounceRule;
use crate::error::Result;
use crate::service::ServiceHandle;

pub fn router() -> Router<ServiceHandle> {
    Router::new()
        .route("/mailboxes/{id}/bounces", get(list).post(upsert))
        .route("/bounces/{id}", delete(delete_one))
}

async fn list(
    State(h): State<ServiceHandle>,
    Path(id): Path<String>,
) -> Result<Json<Vec<BounceRule>>> {
    Ok(Json(h.as_service().list_bounce_rules(&id).await?))
}

async fn upsert(
    State(h): State<ServiceHandle>,
    Path(mailbox_id): Path<String>,
    Json(mut rule): Json<BounceRule>,
) -> Result<Json<BounceRule>> {
    rule.mailbox_id = mailbox_id;
    Ok(Json(h.as_service().upsert_bounce_rule(rule).await?))
}

async fn delete_one(
    State(h): State<ServiceHandle>,
    Path(id): Path<String>,
) -> Result<Json<serde_json::Value>> {
    h.as_service().delete_bounce_rule(&id).await?;
    Ok(Json(serde_json::json!({"deleted": true})))
}