zero4rs 2.0.0

zero4rs is a powerful, pragmatic, and extremely fast web framework for Rust
Documentation
use crate::prelude2::*;

use crate::commons::validatorr::validation_flatten;
use crate::core::serde::date_format_opt;
use chrono::{DateTime, Utc};
use mongodb::bson::doc;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

// https://crates.io/crates/validator
#[derive(Debug, Serialize, Deserialize, validator::Validate)]
pub struct SimpleDataParams {
    title: Option<String>,
    #[validate(required)]
    html_content: Option<String>,

    #[serde(default = "date_format_opt::default_time", with = "date_format_opt")]
    created_at: Option<DateTime<Utc>>,
}

pub async fn mongodb_save(
    params: web::Json<SimpleDataParams>,
    request: HttpRequest,
    app_state: web::Data<AppContext>,
) -> impl Responder {
    if let Some(err) = validation_flatten(&params.0) {
        return request.json(200, R::invalid(err));
    }

    let m = &app_state.mongo();

    request.json(
        200,
        R::ok(m.insert_one("first_db", "simple_message", params.0).await?),
    )
}

pub async fn find_one(
    query: web::Query<HashMap<String, String>>,
    request: HttpRequest,
    app_state: web::Data<AppContext>,
) -> impl Responder {
    let id = query
        .get("id")
        .ok_or_else(|| Error::invalid_request("Missing query string parameter: id"))?;

    let m = &app_state.mongo();

    let result = m
        .find_one::<SimpleDataParams>("first_db", "simple_message", id)
        .await?;

    request.json(200, R::ok(result))
}

pub async fn query_list(request: HttpRequest, app_state: web::Data<AppContext>) -> impl Responder {
    let m = &app_state.mongo();

    let result = m
        .find::<SimpleDataParams>("first_db", "simple_message", doc! {})
        .await?;

    request.json(200, R::ok(result))
}