raisfast 0.2.23

The last backend you'll ever need. Rust-powered headless CMS with built-in blog, ecommerce, wallet, payment and 4 plugin engines.
use crate::dto::ecommerce::{
    CreateUserAddressRequest, UpdateUserAddressRequest, UserAddressResponse,
};
use crate::errors::app_error::AppResult;
use crate::errors::response::ApiResponse;
use crate::errors::validation;
use crate::middleware::auth::AuthUser;

use axum::Json;
use axum::extract::{Path, State};

pub fn routes(
    registry: &mut crate::server::RouteRegistry,
    config: &crate::config::app::AppConfig,
) -> axum::Router<crate::AppState> {
    let restful = config.api_restful;
    let r = axum::Router::new();
    let r = reg_route!(
        r,
        registry,
        restful,
        "/user/addresses",
        get,
        list_addresses,
        "system authed",
        "user_addresses"
    );
    let r = reg_route!(
        r,
        registry,
        restful,
        "/user/addresses",
        create,
        create_address,
        "system authed",
        "user_addresses"
    );
    let r = reg_route!(
        r,
        registry,
        restful,
        "/user/addresses/{id}",
        put,
        update_address,
        "system authed",
        "user_addresses"
    );
    reg_route!(
        r,
        registry,
        restful,
        "/user/addresses/{id}",
        delete,
        delete_address,
        "system authed",
        "user_addresses"
    )
}

pub async fn list_addresses(
    auth: AuthUser,
    State(state): State<crate::AppState>,
) -> AppResult<ApiResponse<Vec<UserAddressResponse>>> {
    let user_id = auth.ensure_snowflake_user_id()?;
    let addrs = state.user_address_service.list(&auth, user_id).await?;
    let resp: Vec<UserAddressResponse> = addrs.into_iter().map(Into::into).collect();
    Ok(ApiResponse::success(resp))
}

pub async fn create_address(
    auth: AuthUser,
    State(state): State<crate::AppState>,
    Json(req): Json<CreateUserAddressRequest>,
) -> AppResult<ApiResponse<UserAddressResponse>> {
    let user_id = auth.ensure_snowflake_user_id()?;
    validation::validate(&req)?;
    let addr = state
        .user_address_service
        .create(&auth, user_id, req)
        .await?;
    Ok(ApiResponse::success(UserAddressResponse::from(addr)))
}

pub async fn update_address(
    auth: AuthUser,
    State(state): State<crate::AppState>,
    Path(id): Path<String>,
    Json(req): Json<UpdateUserAddressRequest>,
) -> AppResult<ApiResponse<UserAddressResponse>> {
    let user_id = auth.ensure_snowflake_user_id()?;
    validation::validate(&req)?;
    let id = crate::types::snowflake_id::parse_id(&id)?;
    let addr = state
        .user_address_service
        .update(&auth, user_id, id, req)
        .await?;
    Ok(ApiResponse::success(UserAddressResponse::from(addr)))
}

pub async fn delete_address(
    auth: AuthUser,
    State(state): State<crate::AppState>,
    Path(id): Path<String>,
) -> AppResult<ApiResponse<()>> {
    let user_id = auth.ensure_snowflake_user_id()?;
    let id = crate::types::snowflake_id::parse_id(&id)?;
    state
        .user_address_service
        .delete(&auth, user_id, id)
        .await?;
    Ok(ApiResponse::success(()))
}