use crate::core::non_blocking::AkitaAsync;
use crate::ext::Request;
use crate::mapper::non_blocking::AsyncAkitaMapper;
use crate::mapper::IPage;
use crate::prelude::AkitaError;
use akita_core::{FromAkitaValue, GetFields, GetTableName, IntoAkitaValue, Wrapper};
use serde::de::DeserializeOwned;
use serde::Serialize;
use std::sync::Arc;
#[async_trait::async_trait]
pub trait AsyncMapper<Entity, Dto, Params>: Sync + Send
where
Entity: GetTableName
+ GetFields
+ FromAkitaValue
+ IntoAkitaValue
+ DeserializeOwned
+ Clone
+ Sync
+ Send,
Dto: From<Entity> + Send + Sync + Serialize,
Params: Request + Sync + Send,
{
fn get_akita(&self) -> Result<Arc<AkitaAsync>, AkitaError>;
async fn page(&self, arg: &Params) -> Result<IPage<Dto>, AkitaError> {
let ak = self.get_akita()?;
let mut wrapper = arg.get_wrapper();
if let Some(sort_field) = arg.desc_fields() {
if !sort_field.is_empty() {
wrapper = wrapper.order_by_desc(sort_field.split(",").collect())
}
}
if let Some(sort_field) = arg.asc_fields() {
if !sort_field.is_empty() {
wrapper = wrapper.order_by_asc(sort_field.split(",").collect())
}
}
let page_no = arg.get_page_no();
let page_size = arg.get_page_size();
let data_page = ak.page::<Entity>(page_no, page_size, wrapper).await?;
let vos = data_page
.records
.into_iter()
.map(|e| Dto::from(e.clone()))
.collect::<Vec<Dto>>();
Ok(IPage::<Dto> {
records: vos,
total: data_page.total,
size: data_page.size,
current: data_page.current,
})
}
async fn count(&self, arg: &Params) -> Result<u64, AkitaError> {
let ak = self.get_akita()?;
let wrapper = arg.get_wrapper();
let count = ak.count::<Entity>(wrapper).await?;
Ok(count)
}
async fn list(&self, arg: &Params) -> Result<Vec<Dto>, AkitaError> {
let ak = self.get_akita()?;
let wrapper = arg.get_wrapper();
let list: Vec<Entity> = ak.list(wrapper).await?;
let result = list
.into_iter()
.map(|e| Dto::from(e.clone()))
.collect::<Vec<Dto>>();
Ok(result)
}
async fn update_by_id(&self, data: &Entity) -> Result<bool, AkitaError> {
let ak = self.get_akita()?;
if let Ok(res) = ak.update_by_id(data).await {
Ok(res > 0)
} else {
Ok(false)
}
}
async fn select_by_id(&self, id: String) -> Result<Option<Dto>, AkitaError> {
let ak = self.get_akita()?;
let detail: Option<Entity> = ak.select_by_id(&id).await?;
let vo = detail.map(Dto::from);
return Ok(vo);
}
async fn select_one(&self, arg: &Params) -> Result<Option<Dto>, AkitaError> {
let ak = self.get_akita()?;
let wrapper = arg.get_wrapper();
let detail: Option<Entity> = ak.select_one(wrapper).await?;
let vo = detail.map(Dto::from);
return Ok(vo);
}
async fn save(&self, data: &Entity) -> Result<i64, AkitaError> {
let ak = self.get_akita()?;
let last_insert_id = ak.save_or_update::<_, i64>(data).await?;
return Ok(last_insert_id.unwrap_or_default());
}
async fn save_batch(&self, list: &Vec<Entity>) -> Result<(), AkitaError> {
let ak = self.get_akita()?;
let _ = ak.save_batch::<Entity, _>(list.clone()).await.ok();
Ok(())
}
async fn remove_by_id(&self, id: &String) -> Result<bool, AkitaError> {
let ak = self.get_akita()?;
let res = ak.remove_by_id::<Entity, _>(id).await.ok();
Ok(res.unwrap_or_default() > 0)
}
async fn remove_batch(&self, ids: Vec<u64>) -> Result<(), AkitaError> {
let ak = self.get_akita()?;
let _ = ak.remove_by_ids::<Entity, u64>(ids).await.ok();
Ok(())
}
}
#[async_trait::async_trait]
pub trait AsyncService<Entity, Dto, Params, M: AsyncMapper<Entity, Dto, Params>>
where
Entity: GetTableName
+ GetFields
+ FromAkitaValue
+ IntoAkitaValue
+ DeserializeOwned
+ Clone
+ Sync
+ Send,
Dto: From<Entity> + Send + Sync + Serialize,
Params: Request + Sync + Send,
{
fn get_mapper(&self) -> &M;
fn get_akita(&self) -> Result<Arc<AkitaAsync>, AkitaError> {
self.get_mapper().get_akita()
}
async fn page(&self, arg: &Params) -> Result<IPage<Dto>, AkitaError> {
self.get_mapper().page(arg).await
}
async fn count(&self, arg: &Params) -> Result<u64, AkitaError> {
self.get_mapper().count(arg).await
}
async fn list(&self, arg: &Params) -> Result<Vec<Dto>, AkitaError> {
self.get_mapper().list(arg).await
}
async fn update_by_id(&self, data: &Entity) -> Result<bool, AkitaError> {
self.get_mapper().update_by_id(data).await
}
async fn select_by_id(&self, id: String) -> Result<Option<Dto>, AkitaError> {
self.get_mapper().select_by_id(id).await
}
async fn select_one(&self, arg: &Params) -> Result<Option<Dto>, AkitaError> {
self.get_mapper().select_one(arg).await
}
async fn save(&self, data: &Entity) -> Result<i64, AkitaError> {
self.get_mapper().save(data).await
}
async fn save_batch(&self, list: &Vec<Entity>) -> Result<(), AkitaError> {
self.get_mapper().save_batch(list).await
}
async fn remove_by_id(&self, id: &String) -> Result<bool, AkitaError> {
self.get_mapper().remove_by_id(id).await
}
async fn remove_batch(&self, ids: Vec<u64>) -> Result<(), AkitaError> {
self.get_mapper().remove_batch(ids).await
}
}