AppFlowy-Cloud/libs/database/src/quick_note.rs

105 lines
2.7 KiB
Rust

use app_error::AppError;
use database_entity::dto::QuickNote;
use sqlx::{Executor, Postgres, QueryBuilder};
use uuid::Uuid;
use crate::pg_row::AFQuickNoteRow;
pub async fn insert_new_quick_note<'a, E: Executor<'a, Database = Postgres>>(
executor: E,
workspace_id: Uuid,
uid: i64,
data: &serde_json::Value,
) -> Result<QuickNote, AppError> {
let quick_note = sqlx::query_as!(
QuickNote,
r#"
INSERT INTO af_quick_note (workspace_id, uid, data) VALUES ($1, $2, $3)
RETURNING quick_note_id AS id, data, created_at AS "created_at!", updated_at AS "last_updated_at!"
"#,
workspace_id,
uid,
data
)
.fetch_one(executor)
.await?;
Ok(quick_note)
}
pub async fn select_quick_notes_with_one_more_than_limit<
'a,
E: Executor<'a, Database = Postgres>,
>(
executor: E,
workspace_id: Uuid,
uid: i64,
search_term: Option<String>,
offset: Option<i32>,
limit: Option<i32>,
) -> Result<Vec<QuickNote>, AppError> {
let mut query_builder: QueryBuilder<Postgres> = QueryBuilder::new(
r#"
SELECT
quick_note_id,
data,
created_at,
updated_at
FROM af_quick_note WHERE workspace_id =
"#,
);
query_builder.push_bind(workspace_id);
query_builder.push(" AND uid = ");
query_builder.push_bind(uid);
if let Some(search_term) = search_term.filter(|term| !term.is_empty()) {
query_builder.push(" AND data @? ");
let json_path_query = format!("'$.**.insert ? (@ like_regex \".*{}.*\")'", search_term);
query_builder.push(json_path_query);
}
query_builder.push(" ORDER BY updated_at DESC");
if let Some(limit) = limit {
query_builder.push(" LIMIT ");
query_builder.push_bind(limit);
query_builder.push(" + 1 ");
}
if let Some(offset) = offset {
query_builder.push(" OFFSET ");
query_builder.push_bind(offset);
}
let query = query_builder.build_query_as::<AFQuickNoteRow>();
let quick_notes_with_one_more_than_limit = query
.fetch_all(executor)
.await?
.into_iter()
.map(Into::into)
.collect();
Ok(quick_notes_with_one_more_than_limit)
}
pub async fn update_quick_note_by_id<'a, E: Executor<'a, Database = Postgres>>(
executor: E,
quick_note_id: Uuid,
data: &serde_json::Value,
) -> Result<(), AppError> {
sqlx::query!(
"UPDATE af_quick_note SET data = $1, updated_at = NOW() WHERE quick_note_id = $2",
data,
quick_note_id
)
.execute(executor)
.await?;
Ok(())
}
pub async fn delete_quick_note_by_id<'a, E: Executor<'a, Database = Postgres>>(
executor: E,
quick_note_id: Uuid,
) -> Result<(), AppError> {
sqlx::query!(
"DELETE FROM af_quick_note WHERE quick_note_id = $1",
quick_note_id
)
.execute(executor)
.await?;
Ok(())
}