use arcature_db::Db;
use arcature_db::sea_orm;
use arcature_db::sea_orm::sea_query::Order;
use arcature_db::sea_orm::{QueryFilter, QueryOrder, QuerySelect};
use crate::error::DataError;
use super::paginate::Paginated;
pub struct Query<'db, E>
where
E: sea_orm::EntityTrait,
{
pub(crate) db: &'db Db,
pub(crate) select: sea_orm::Select<E>,
}
impl<'db, E> Query<'db, E>
where
E: sea_orm::EntityTrait,
{
#[must_use]
pub fn new(db: &'db Db) -> Self {
Self {
db,
select: E::find(),
}
}
#[must_use]
pub fn filter<C>(mut self, condition: C) -> Self
where
C: sea_orm::sea_query::IntoCondition,
{
self.select = self.select.filter(condition);
self
}
#[must_use]
pub fn order_by<C>(mut self, column: C, order: Order) -> Self
where
C: sea_orm::IntoSimpleExpr,
{
self.select = self.select.order_by(column, order);
self
}
#[must_use]
pub fn order_by_asc<C>(mut self, column: C) -> Self
where
C: sea_orm::IntoSimpleExpr,
{
self.select = self.select.order_by_asc(column);
self
}
#[must_use]
pub fn order_by_desc<C>(mut self, column: C) -> Self
where
C: sea_orm::IntoSimpleExpr,
{
self.select = self.select.order_by_desc(column);
self
}
#[must_use]
pub fn limit(mut self, n: u64) -> Self {
self.select = self.select.limit(n);
self
}
#[must_use]
pub fn offset(mut self, n: u64) -> Self {
self.select = self.select.offset(n);
self
}
#[must_use]
pub fn paginate(self, per_page: u64) -> Paginated<'db, E> {
Paginated::new(self.db, self.select, per_page)
}
pub async fn all(self) -> Result<Vec<E::Model>, DataError> {
self.select
.all(self.db.orm())
.await
.map_err(DataError::from)
}
pub async fn one(self) -> Result<Option<E::Model>, DataError> {
self.select
.one(self.db.orm())
.await
.map_err(DataError::from)
}
}
pub trait QueryModel: sea_orm::EntityTrait {
#[must_use]
fn query(db: &Db) -> Query<'_, Self> {
Query::new(db)
}
}
impl<E> QueryModel for E where E: sea_orm::EntityTrait {}