Skip to content

Commit

Permalink
调整代码结构,拆分 with 相关查询,合并可重用查询
Browse files Browse the repository at this point in the history
  • Loading branch information
veoco committed Jan 7, 2023
1 parent f69c872 commit 6c6a3ea
Show file tree
Hide file tree
Showing 30 changed files with 1,080 additions and 1,279 deletions.
50 changes: 0 additions & 50 deletions src/attachments/db.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,56 +29,6 @@ pub async fn create_attachment_with_params(
}
}

pub async fn get_attachment_by_cid(state: &AppState, cid: u32) -> Option<Attachment> {
let sql = format!(
r#"
SELECT *
FROM {contents_table}
WHERE {contents_table}."cid" == ?1
"#,
contents_table = &state.contents_table,
);
match sqlx::query_as::<_, Attachment>(&sql)
.bind(cid)
.fetch_one(&state.pool)
.await
{
Ok(comment) => Some(comment),
Err(_) => None,
}
}

pub async fn delete_attachment_by_cid(state: &AppState, cid: u32) -> Result<i64, FieldError> {
let sql = format!(
r#"
DELETE FROM {contents_table}
WHERE {contents_table}."cid" == ?1
"#,
contents_table = &state.contents_table,
);
match sqlx::query(&sql).bind(cid).execute(&state.pool).await {
Ok(r) => Ok(r.last_insert_rowid()),
Err(e) => return Err(FieldError::DatabaseFailed(e.to_string())),
}
}

pub async fn get_attachments_count_with_private(state: &AppState, private_sql: &str) -> i32 {
let all_sql = format!(
r#"
SELECT COUNT(*)
FROM {contents_table}
WHERE {contents_table}."type" == 'attachment'{}
"#,
private_sql,
contents_table = &state.contents_table,
);
let all_count = sqlx::query_scalar::<_, i32>(&all_sql)
.fetch_one(&state.pool)
.await
.unwrap_or(0);
all_count
}

pub async fn get_attachments_count_by_list_query(
state: &AppState,
private_sql: &str,
Expand Down
9 changes: 5 additions & 4 deletions src/attachments/views.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ use super::de::from_str;
use super::models::{AttachmentInfo, AttachmentText, AttachmentsQuery};
use super::ser::to_string;
use super::utils::{delete_file, stream_to_file};
use crate::common::db as common_db;
use crate::common::errors::FieldError;
use crate::common::extractors::{PMContributor, ValidatedQuery};
use crate::AppState;
Expand Down Expand Up @@ -82,7 +83,7 @@ pub async fn delete_attachment_by_cid(
PMContributor(user): PMContributor,
Path(cid): Path<u32>,
) -> Result<Json<Value>, FieldError> {
let attachment = db::get_attachment_by_cid(&state, cid).await;
let attachment = common_db::get_content_by_cid(&state, cid).await;
if attachment.is_none() {
return Err(FieldError::InvalidParams("cid".to_string()));
}
Expand All @@ -99,8 +100,8 @@ pub async fn delete_attachment_by_cid(
let filepath = text.path;
let _ = delete_file(base_dir.to_path_buf(), &filepath).await;

let row_id = db::delete_attachment_by_cid(&state, cid).await?;
Ok(Json(json!({ "id": row_id })))
let _ = common_db::delete_content_by_cid(&state, cid).await?;
Ok(Json(json!({ "msg": "ok" })))
}

pub async fn list_attachments(
Expand All @@ -121,7 +122,7 @@ pub async fn list_attachments(
)
};

let all_count = db::get_attachments_count_with_private(&state, &private_sql).await;
let all_count = common_db::get_contents_count_with_private(&state, &private_sql, "attachment").await;

let page = q.page.unwrap_or(1);
let page_size = q.page_size.unwrap_or(10);
Expand Down
234 changes: 4 additions & 230 deletions src/categories/db.rs
Original file line number Diff line number Diff line change
@@ -1,55 +1,14 @@
use super::models::{Category, CategoryCreate};
use super::forms::CategoryCreate;
use crate::common::db as common_db;
use crate::common::errors::FieldError;
use crate::posts::db as post_db;
use crate::posts::models::PostWithMeta;
use crate::AppState;

pub async fn get_category_by_mid(state: &AppState, mid: u32) -> Option<Category> {
let select_sql = format!(
r#"
SELECT *
FROM {metas_table}
WHERE {metas_table}."type" == 'category' AND {metas_table}."mid" == ?1
"#,
metas_table = &state.metas_table,
);
if let Ok(category) = sqlx::query_as::<_, Category>(&select_sql)
.bind(mid)
.fetch_one(&state.pool)
.await
{
Some(category)
} else {
None
}
}

pub async fn get_category_by_slug(state: &AppState, slug: &str) -> Option<Category> {
let select_sql = format!(
r#"
SELECT *
FROM {metas_table}
WHERE {metas_table}."type" == 'category' AND {metas_table}."slug" == ?1
"#,
metas_table = &state.metas_table,
);
if let Ok(category) = sqlx::query_as::<_, Category>(&select_sql)
.bind(slug)
.fetch_one(&state.pool)
.await
{
Some(category)
} else {
None
}
}

pub async fn create_category_by_category_create(
state: &AppState,
category_create: &CategoryCreate,
) -> Result<i64, FieldError> {
let category_parent = match category_create.parent {
Some(mid) => match get_category_by_mid(&state, mid).await {
Some(mid) => match common_db::get_meta_by_mid(&state, mid).await {
Some(_) => mid,
None => return Err(FieldError::InvalidParams("parent".to_string())),
},
Expand Down Expand Up @@ -82,7 +41,7 @@ pub async fn modify_category_by_mid_and_category_modify(
category_modify: &CategoryCreate,
) -> Result<i64, FieldError> {
let category_parent = match category_modify.parent {
Some(mid) => match get_category_by_mid(&state, mid).await {
Some(mid) => match common_db::get_meta_by_mid(&state, mid).await {
Some(_) => mid,
None => return Err(FieldError::InvalidParams("parent".to_string())),
},
Expand Down Expand Up @@ -110,188 +69,3 @@ pub async fn modify_category_by_mid_and_category_modify(
Err(e) => Err(FieldError::DatabaseFailed(e.to_string())),
}
}

pub async fn delete_relationships_by_mid(state: &AppState, mid: u32) -> Result<u64, FieldError> {
let delete_sql = format!(
r#"
DELETE FROM {relationships_table}
WHERE {relationships_table}."mid" == ?1
"#,
relationships_table = &state.relationships_table
);
match sqlx::query(&delete_sql)
.bind(mid)
.execute(&state.pool)
.await
{
Ok(r) => Ok(r.rows_affected()),
Err(e) => Err(FieldError::DatabaseFailed(e.to_string())),
}
}

pub async fn delete_meta_by_mid(state: &AppState, mid: u32) -> Result<u64, FieldError> {
let update_sql = format!(
r#"
DELETE FROM {metas_table}
WHERE {metas_table}."mid" == ?1
"#,
metas_table = &state.metas_table
);
match sqlx::query(&update_sql)
.bind(mid)
.execute(&state.pool)
.await
{
Ok(r) => Ok(r.rows_affected()),
Err(e) => Err(FieldError::DatabaseFailed(e.to_string())),
}
}

pub async fn get_categories_count(state: &AppState) -> i32 {
let all_sql = format!(
r#"
SELECT COUNT(*)
FROM {metas_table}
WHERE {metas_table}."type" == 'category'
"#,
metas_table = &state.metas_table,
);
let all_count = sqlx::query_scalar::<_, i32>(&all_sql)
.fetch_one(&state.pool)
.await
.unwrap_or(0);
all_count
}

pub async fn get_categories_by_list_query(
state: &AppState,
page_size: u32,
offset: u32,
order_by: &str,
) -> Result<Vec<Category>, FieldError> {
let sql = format!(
r#"
SELECT *
FROM {metas_table}
WHERE {metas_table}."type" == 'category'
ORDER BY {}
LIMIT ?1 OFFSET ?2
"#,
order_by,
metas_table = &state.metas_table,
);
match sqlx::query_as::<_, Category>(&sql)
.bind(page_size)
.bind(offset)
.fetch_all(&state.pool)
.await
{
Ok(categories) => Ok(categories),
Err(e) => Err(FieldError::DatabaseFailed(e.to_string())),
}
}

pub async fn update_meta_by_mid_for_increase_count(
state: &AppState,
mid: u32,
) -> Result<u64, FieldError> {
let update_sql = format!(
r#"
UPDATE {metas_table}
SET count=count+1
WHERE {metas_table}."mid" == ?1
"#,
metas_table = &state.metas_table,
);
match sqlx::query(&update_sql)
.bind(mid)
.execute(&state.pool)
.await
{
Ok(r) => Ok(r.rows_affected()),
Err(e) => Err(FieldError::DatabaseFailed(e.to_string())),
}
}

pub async fn update_meta_by_mid_for_decrease_count(
state: &AppState,
mid: u32,
) -> Result<u64, FieldError> {
let update_sql = format!(
r#"
UPDATE {metas_table}
SET count=count-1
WHERE {metas_table}."mid" == ?1
"#,
metas_table = &state.metas_table,
);
match sqlx::query(&update_sql)
.bind(mid)
.execute(&state.pool)
.await
{
Ok(r) => Ok(r.rows_affected()),
Err(e) => Err(FieldError::DatabaseFailed(e.to_string())),
}
}

pub async fn get_category_posts_count_by_mid(state: &AppState, mid: u32, private_sql: &str) -> i32 {
let all_sql = format!(
r#"
SELECT COUNT(*)
FROM {contents_table}
JOIN {relationships_table} ON {contents_table}."cid" == {relationships_table}."cid"
WHERE {contents_table}."type" == 'post' AND {relationships_table}."mid" == ?1{}
"#,
private_sql,
contents_table = &state.contents_table,
relationships_table = &state.relationships_table
);
let all_count = sqlx::query_scalar::<_, i32>(&all_sql)
.bind(mid)
.fetch_one(&state.pool)
.await
.unwrap_or(0);
all_count
}

pub async fn get_category_posts_with_meta_by_mid_and_list_query(
state: &AppState,
mid: u32,
private_sql: &str,
page_size: u32,
offset: u32,
order_by: &str,
) -> Result<Vec<PostWithMeta>, FieldError> {
let with_sql = post_db::get_with_sql(state);
let sql = format!(
r#"
{with_sql}
SELECT *
FROM {contents_table}
LEFT OUTER JOIN categories_json ON {contents_table}."cid" == categories_json."cid"
LEFT OUTER JOIN tags_json ON {contents_table}."cid" == tags_json."cid"
LEFT OUTER JOIN fields_json ON {contents_table}."cid" == fields_json."cid"
LEFT OUTER JOIN {users_table} ON {contents_table}.authorId == {users_table}."uid"
JOIN {relationships_table} ON {contents_table}.cid == {relationships_table}."cid"
WHERE {contents_table}."type" == 'post' AND mid == ?1{}
GROUP BY {contents_table}."cid"
ORDER BY {contents_table}.{}
LIMIT ?2 OFFSET ?3"#,
private_sql,
order_by,
contents_table = &state.contents_table,
relationships_table = &state.relationships_table,
users_table = &state.users_table
);
match sqlx::query_as::<_, PostWithMeta>(&sql)
.bind(mid)
.bind(page_size)
.bind(offset)
.fetch_all(&state.pool)
.await
{
Ok(posts) => Ok(posts),
Err(e) => return Err(FieldError::DatabaseFailed(e.to_string())),
}
}
22 changes: 0 additions & 22 deletions src/categories/models.rs → src/categories/forms.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,6 @@
use serde::{Deserialize, Serialize};
use validator::Validate;

#[derive(Serialize, Deserialize, sqlx::FromRow)]
pub struct Category {
pub mid: u32,
pub name: Option<String>,
pub slug: Option<String>,
pub r#type: String,
pub description: Option<String>,
pub count: u32,
pub order: u32,
pub parent: u32,
}

#[derive(Serialize, Deserialize, Validate)]
pub struct CategoriesQuery {
#[validate(range(min = 1, message = "page must greater than 1"))]
pub page: Option<u32>,
#[validate(range(min = 1, message = "page_size must greater than 1"))]
pub page_size: Option<u32>,
#[validate(length(min = 1, max = 13, message = "order_by length must greater than 1"))]
pub order_by: Option<String>,
}

#[derive(Serialize, Deserialize, Validate)]
pub struct CategoryCreate {
#[validate(length(min = 1, max = 150, message = "name can not be longer than 150"))]
Expand Down
2 changes: 1 addition & 1 deletion src/categories/mod.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
pub mod db;
pub mod models;
pub mod forms;
mod urls;
mod views;

Expand Down
Loading

0 comments on commit 6c6a3ea

Please sign in to comment.