use quokka::{
helper::database::{execute, query_all, query_one, BaseRepository},
state::{Database, FromState},
};
#[derive(Clone, Debug, serde::Deserialize, serde::Serialize, sqlx::FromRow)]
pub struct Test {
pub id: i32,
pub name: String,
pub age: i32,
pub created_at: time::OffsetDateTime,
pub updated_at: time::OffsetDateTime,
}
#[derive(Clone, FromState)]
pub struct TestRepository {
database: Database,
}
impl BaseRepository for TestRepository {
type Entity = Test;
type PkType = i32;
#[query_all(
query = "SELECT * FROM test ORDER BY {#order_by} {#direction.to_string()} LIMIT {#page_size} OFFSET + {#page_size * page}"
)]
async fn get_entities(
&self,
page: i32,
page_size: i32,
order_by: &'static str,
direction: quokka::helper::database::PaginationOrder,
) -> quokka::Result<Vec<Self::Entity>>;
#[query_one(query = "SELECT * FROM test WHERE id = {pk}")]
async fn get_entity(&self, pk: Self::PkType) -> quokka::Result<Self::Entity>;
#[execute(
query = "UPDATE test SET updated_at = NOW(), name = {entity.name}, age = {entity.age} WHERE id = {entity.id}",
write
)]
async fn update_entity(&self, entity: Self::Entity) -> quokka::Result<u64>;
#[query_one(
query = "INSERT INTO test (name, age) VALUES ({entity.name}, {entity.age}) RETURNING *",
write
)]
async fn create_entity(&self, entity: Self::Entity) -> quokka::Result<Self::Entity>;
#[execute(query = "DELETE FROM test WHERE id = {pk}", write)]
async fn delete_entity(&self, pk: Self::PkType) -> quokka::Result<u64>;
}