flagrant-api 0.0.2

CLI powered feature-flagging
Documentation
use axum::{
    extract::{Path, Query, State},
    Json,
};
use flagrant::models::{environment, project};
use flagrant_types::{Environment, EnvRequestPayload};
use serde::Deserialize;
use sqlx::SqlitePool;

use crate::errors::ServiceError;

#[derive(Debug, Deserialize)]
pub struct EnvQueryParams {
    prefix: Option<String>,
    name: Option<String>,
}

pub async fn create(
    State(pool): State<SqlitePool>,
    Path(project_id): Path<u16>,
    Json(env): Json<EnvRequestPayload>,
) -> Result<Json<Environment>, ServiceError> {
    let project = project::fetch(&pool, project_id).await?;
    let env = environment::create(&pool, &project, env.name, env.description).await?;

    Ok(Json(env))
}

pub async fn fetch(
    State(pool): State<SqlitePool>,
    Path((_project_id, env_id)): Path<(u16, u16)>,
) -> Result<Json<Environment>, ServiceError> {
    let env = environment::fetch(&pool, env_id).await?;

    Ok(Json(env))
}

pub async fn list(
    State(pool): State<SqlitePool>,
    Query(params): Query<EnvQueryParams>,
    Path(project_id): Path<u16>,
) -> Result<Json<Vec<Environment>>, ServiceError> {
    let project = project::fetch(&pool, project_id).await?;
    let envs = match (params.prefix, params.name) {
        (Some(prefix), _) => environment::fetch_by_prefix(&pool, &project, prefix).await?,
        (_, Some(name)) => vec![environment::fetch_by_name(&pool, &project, name).await?],
        _ => environment::fetch_for_project(&pool, &project).await?
    };

    Ok(Json(envs))
}