zero4rs 2.0.0

zero4rs is a powerful, pragmatic, and extremely fast web framework for Rust
Documentation
use bson::doc;

// use crate::core::error2::Error;
use crate::core::error2::Result;

use crate::{core::auth0::Requestor, prelude2::*};

use crate::services::location_service;

// app locations
// 查询最后上传的坐标
pub async fn query_last_locaiton(
    form: actix_web::web::Form<HashMap<String, String>>,
    request: HttpRequest,
    context: web::Data<AppContext>,
    _requestor: actix_web::web::ReqData<Requestor>,
) -> Result<HttpResponse> {
    let _device_id = form.0.get("device_id");

    let pagation = (0, 1);
    let mut filter = doc! {};

    if let Some(device_id) = _device_id {
        filter.insert("device_id", device_id);
    }

    let result = location_service::filter_locaitons(context.mongo(), filter, pagation).await?;

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

// 上传设备位置坐标
pub async fn upload_locaitons(
    body: web::Bytes,
    request: HttpRequest,
    context: web::Data<AppContext>,
    requestor: actix_web::web::ReqData<Requestor>,
) -> impl Responder {
    let locations = match crate::commons::bytes_to_string(body.to_vec()) {
        Ok(val) => val,
        Err(e) => return request.json(200, R::failed(500, e.to_string())),
    };

    let _count =
        location_service::save_locations(context.mongo(), requestor.get_user(), &locations).await?;

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

// 查询坐标
pub async fn filter_locaitons(
    form: actix_web::web::Form<HashMap<String, String>>,
    request: HttpRequest,
    context: web::Data<AppContext>,
    _requestor: actix_web::web::ReqData<Requestor>,
) -> Result<HttpResponse> {
    let _device_id = form.0.get("device_id");
    let _tag = form.0.get("tag");

    let skip = form
        .0
        .get("skip")
        .map(|f| crate::commons::string_to_number::<u32>(f))
        .unwrap_or(Ok(0))?;

    let limit = form
        .0
        .get("limit")
        .map(|f| crate::commons::string_to_number::<u32>(f))
        .unwrap_or(Ok(1))?;

    let pagation = (skip, limit);
    let mut filter = doc! {};

    if let Some(tag) = _tag {
        filter.insert("tag", tag);
    }

    if let Some(device_id) = _device_id {
        filter.insert("device_id", device_id);
    }

    // filter.insert("tag", doc! {"$not": { "$eq": "_direct"}});

    let result = location_service::filter_locaitons(context.mongo(), filter, pagation).await?;

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