use crate::{ get_app_from_key, routes::api::v1::{InsertAppData, QueryAppData, UpdateAppDataValue}, State, }; use axum::{Extension, Json, extract::Path, response::IntoResponse}; use axum_extra::extract::CookieJar; use tetratto_core::model::{ apps::{AppData, AppDataQuery}, ApiReturn, Error, }; pub async fn query_request( jar: CookieJar, Extension(data): Extension, Json(req): Json, ) -> impl IntoResponse { let data = &(data.read().await).0; let app = match get_app_from_key!(data, jar) { Some(x) => x, None => return Json(Error::NotAllowed.into()), }; match data .query_app_data(AppDataQuery { app: app.id, query: req.query, mode: req.mode, }) .await { Ok(x) => Json(ApiReturn { ok: true, message: "Success".to_string(), payload: Some(x), }), Err(e) => Json(e.into()), } } pub async fn create_request( jar: CookieJar, Extension(data): Extension, Json(req): Json, ) -> impl IntoResponse { let data = &(data.read().await).0; let app = match get_app_from_key!(data, jar) { Some(x) => x, None => return Json(Error::NotAllowed.into()), }; let owner = match data.get_user_by_id(app.owner).await { Ok(x) => x, Err(e) => return Json(e.into()), }; // check size let new_size = app.data_used + req.value.len(); if new_size > AppData::user_limit(&owner) { return Json(Error::AppHitStorageLimit.into()); } // ... if let Err(e) = data.update_app_data_used(app.id, new_size as i32).await { return Json(e.into()); } match data .create_app_data(AppData::new(app.id, req.key, req.value)) .await { Ok(s) => Json(ApiReturn { ok: true, message: "App created".to_string(), payload: s.id.to_string(), }), Err(e) => Json(e.into()), } } pub async fn update_value_request( jar: CookieJar, Extension(data): Extension, Path(id): Path, Json(req): Json, ) -> impl IntoResponse { let data = &(data.read().await).0; let app = match get_app_from_key!(data, jar) { Some(x) => x, None => return Json(Error::NotAllowed.into()), }; let owner = match data.get_user_by_id(app.owner).await { Ok(x) => x, Err(e) => return Json(e.into()), }; let app_data = match data.get_app_data_by_id(id).await { Ok(x) => x, Err(e) => return Json(e.into()), }; // check size let size_without = app.data_used - app_data.value.len(); let new_size = size_without + req.value.len(); if new_size > AppData::user_limit(&owner) { return Json(Error::AppHitStorageLimit.into()); } // ... if let Err(e) = data.update_app_data_used(app.id, new_size as i32).await { return Json(e.into()); } match data.update_app_data_value(id, &req.value).await { Ok(_) => Json(ApiReturn { ok: true, message: "Data updated".to_string(), payload: (), }), Err(e) => Json(e.into()), } } pub async fn delete_request( jar: CookieJar, Extension(data): Extension, Path(id): Path, ) -> impl IntoResponse { let data = &(data.read().await).0; let app = match get_app_from_key!(data, jar) { Some(x) => x, None => return Json(Error::NotAllowed.into()), }; let app_data = match data.get_app_data_by_id(id).await { Ok(x) => x, Err(e) => return Json(e.into()), }; // ... if let Err(e) = data .update_app_data_used(app.id, (app.data_used - app_data.value.len()) as i32) .await { return Json(e.into()); } match data.delete_app_data(id).await { Ok(_) => Json(ApiReturn { ok: true, message: "Data deleted".to_string(), payload: (), }), Err(e) => Json(e.into()), } }