mirror of
https://github.com/storytold/artcraft.git
synced 2026-11-12 12:53:04 +00:00
list comments endpoint
This commit is contained in:
1 parent
df2444ddc0
commit
ebf48e20be
5 files changed
+167
-18
No files matched your search
@@ -44,6 +44,8 @@ CREATE TABLE comments (
|
||||
|
||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
|
||||
-- Technically, this conveys *user* edits, not things that update the record itself.
|
||||
edited_at TIMESTAMP NULL,
|
||||
|
||||
-- If this is removed by a mod.
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
use enums::by_table::comments::comment_entity_type::CommentEntityType;
|
||||
use tokens::tokens::tts_models::TtsModelToken;
|
||||
use tokens::tokens::w2l_templates::W2lTemplateToken;
|
||||
use tokens::users::user::UserToken;
|
||||
|
||||
pub enum CommentEntityToken {
|
||||
User(UserToken),
|
||||
TtsModel(TtsModelToken),
|
||||
TtsResult(String), // TODO: Strong type
|
||||
W2lTemplate(W2lTemplateToken),
|
||||
W2lResult(String), // TODO: Strong type
|
||||
}
|
||||
|
||||
impl CommentEntityToken {
|
||||
pub fn get_composite_keys(&self) -> (CommentEntityType, &str) {
|
||||
let (entity_type, entity_token) = match self {
|
||||
CommentEntityToken::User(user_token) => (CommentEntityType::User, user_token.as_str()),
|
||||
CommentEntityToken::TtsModel(tts_model_token) => (CommentEntityType::TtsModel, tts_model_token.as_str()),
|
||||
CommentEntityToken::TtsResult(tts_result_token) => (CommentEntityType::TtsResult, tts_result_token.as_str()),
|
||||
CommentEntityToken::W2lTemplate(w2l_template_token) => (CommentEntityType::W2lTemplate, w2l_template_token.as_str()),
|
||||
CommentEntityToken::W2lResult(w2l_result_token) => (CommentEntityType::W2lResult, w2l_result_token.as_str()),
|
||||
};
|
||||
(entity_type, entity_token)
|
||||
}
|
||||
}
|
||||
@@ -1,24 +1,17 @@
|
||||
use anyhow::anyhow;
|
||||
use chrono::Utc;
|
||||
use crate::queries::comments::comment_entity_token::CommentEntityToken;
|
||||
use enums::by_table::comments::comment_entity_type::CommentEntityType;
|
||||
use enums::common::visibility::Visibility;
|
||||
use errors::AnyhowResult;
|
||||
use sqlx::MySqlPool;
|
||||
use std::path::Path;
|
||||
use enums::by_table::comments::comment_entity_type::CommentEntityType;
|
||||
use tokens::tokens::comments::CommentToken;
|
||||
use tokens::tokens::tts_models::TtsModelToken;
|
||||
use tokens::tokens::w2l_templates::W2lTemplateToken;
|
||||
use tokens::users::user::UserToken;
|
||||
use tokens::voice_conversion::model::VoiceConversionModelToken;
|
||||
|
||||
pub enum CommentEntityToken {
|
||||
User(UserToken),
|
||||
TtsModel(TtsModelToken),
|
||||
TtsResult(String), // TODO: Strong type
|
||||
W2lTemplate(W2lTemplateToken),
|
||||
W2lResult(String), // TODO: Strong type
|
||||
}
|
||||
|
||||
pub struct Args<'a> {
|
||||
pub entity_token: &'a CommentEntityToken,
|
||||
|
||||
@@ -40,14 +33,7 @@ pub async fn insert_comment(
|
||||
) -> AnyhowResult<CommentToken> {
|
||||
|
||||
let comment_token = CommentToken::generate();
|
||||
|
||||
let (entity_type, entity_token) = match args.entity_token {
|
||||
CommentEntityToken::User(user_token) => (CommentEntityType::User, user_token.as_str()),
|
||||
CommentEntityToken::TtsModel(tts_model_token) => (CommentEntityType::TtsModel, tts_model_token.as_str()),
|
||||
CommentEntityToken::TtsResult(tts_result_token) => (CommentEntityType::TtsResult, tts_result_token.as_str()),
|
||||
CommentEntityToken::W2lTemplate(w2l_template_token) => (CommentEntityType::W2lTemplate, w2l_template_token.as_str()),
|
||||
CommentEntityToken::W2lResult(w2l_result_token) => (CommentEntityType::W2lResult, w2l_result_token.as_str()),
|
||||
};
|
||||
let (entity_type, entity_token) = args.entity_token.get_composite_keys();
|
||||
|
||||
let query_result = sqlx::query!(
|
||||
r#"
|
||||
|
||||
@@ -0,0 +1,134 @@
|
||||
use anyhow::anyhow;
|
||||
use chrono::{DateTime, Utc};
|
||||
use crate::queries::comments::comment_entity_token::CommentEntityToken;
|
||||
use enums::by_table::comments::comment_entity_type::CommentEntityType;
|
||||
use errors::AnyhowResult;
|
||||
use log::warn;
|
||||
use sqlx::MySqlPool;
|
||||
use tokens::tokens::comments::CommentToken;
|
||||
use tokens::users::user::UserToken;
|
||||
|
||||
pub struct CommentForList {
|
||||
pub token: CommentToken,
|
||||
|
||||
pub user_token: UserToken,
|
||||
pub username: String,
|
||||
pub user_display_name: String,
|
||||
|
||||
pub comment_markdown: String,
|
||||
pub comment_rendered_html: String,
|
||||
|
||||
pub mod_fields: CommentForListModFields,
|
||||
|
||||
pub created_at: DateTime<Utc>,
|
||||
pub updated_at: DateTime<Utc>,
|
||||
pub maybe_edited_at: Option<DateTime<Utc>>,
|
||||
}
|
||||
|
||||
pub struct CommentForListModFields {
|
||||
pub creator_ip_address: String,
|
||||
pub editor_ip_address: String,
|
||||
pub maybe_user_deleted_at: Option<DateTime<Utc>>,
|
||||
pub maybe_mod_deleted_at: Option<DateTime<Utc>>,
|
||||
pub maybe_object_owner_deleted_at: Option<DateTime<Utc>>,
|
||||
}
|
||||
|
||||
pub async fn list_comments_for_entity(
|
||||
comment_entity_token: CommentEntityToken,
|
||||
mysql_pool: &MySqlPool
|
||||
) -> AnyhowResult<Vec<CommentForList>> {
|
||||
|
||||
let (entity_type, entity_token) = comment_entity_token.get_composite_keys();
|
||||
|
||||
let maybe_results= sqlx::query_as!(
|
||||
RawCommentForList,
|
||||
r#"
|
||||
SELECT
|
||||
c.token as `token: tokens::tokens::comments::CommentToken`,
|
||||
c.user_token as `user_token: tokens::users::user::UserToken`,
|
||||
u.username,
|
||||
u.display_name as user_display_name,
|
||||
|
||||
c.comment_markdown,
|
||||
c.comment_rendered_html,
|
||||
|
||||
c.creator_ip_address,
|
||||
c.editor_ip_address,
|
||||
|
||||
c.created_at,
|
||||
c.updated_at,
|
||||
c.edited_at,
|
||||
c.user_deleted_at,
|
||||
c.mod_deleted_at,
|
||||
c.object_owner_deleted_at
|
||||
|
||||
FROM
|
||||
comments AS c
|
||||
JOIN users AS u
|
||||
ON c.user_token = u.token
|
||||
WHERE
|
||||
c.entity_type = ?
|
||||
AND c.entity_token = ?
|
||||
AND c.user_deleted_at IS NULL
|
||||
AND c.mod_deleted_at IS NULL
|
||||
AND c.object_owner_deleted_at IS NULL
|
||||
ORDER BY c.id DESC
|
||||
LIMIT 50
|
||||
"#,
|
||||
entity_type,
|
||||
entity_token
|
||||
)
|
||||
.fetch_all(mysql_pool)
|
||||
.await;
|
||||
|
||||
match maybe_results {
|
||||
Err(err) => match err {
|
||||
sqlx::Error::RowNotFound => Ok(Vec::new()),
|
||||
_ => {
|
||||
warn!("list ip bans db error: {:?}", err);
|
||||
Err(anyhow!("error with query: {:?}", err))
|
||||
}
|
||||
},
|
||||
Ok(results) => Ok(results.into_iter()
|
||||
.map(|comment| CommentForList {
|
||||
token: comment.token,
|
||||
user_token: comment.user_token,
|
||||
username: comment.username,
|
||||
user_display_name: comment.user_display_name,
|
||||
comment_markdown: comment.comment_markdown,
|
||||
comment_rendered_html: comment.comment_rendered_html,
|
||||
mod_fields: CommentForListModFields {
|
||||
creator_ip_address: comment.creator_ip_address,
|
||||
editor_ip_address: comment.editor_ip_address,
|
||||
maybe_user_deleted_at: comment.user_deleted_at,
|
||||
maybe_mod_deleted_at: comment.mod_deleted_at,
|
||||
maybe_object_owner_deleted_at: comment.object_owner_deleted_at,
|
||||
},
|
||||
created_at: comment.created_at,
|
||||
updated_at: comment.updated_at,
|
||||
maybe_edited_at: None,
|
||||
})
|
||||
.collect()),
|
||||
}
|
||||
}
|
||||
|
||||
pub struct RawCommentForList {
|
||||
pub token: CommentToken,
|
||||
|
||||
pub user_token: UserToken,
|
||||
pub username: String,
|
||||
pub user_display_name: String,
|
||||
|
||||
pub comment_markdown: String,
|
||||
pub comment_rendered_html: String,
|
||||
|
||||
pub creator_ip_address: String,
|
||||
pub editor_ip_address: String,
|
||||
|
||||
pub created_at: DateTime<Utc>,
|
||||
pub updated_at: DateTime<Utc>,
|
||||
pub edited_at: Option<DateTime<Utc>>,
|
||||
pub user_deleted_at: Option<DateTime<Utc>>,
|
||||
pub mod_deleted_at: Option<DateTime<Utc>>,
|
||||
pub object_owner_deleted_at: Option<DateTime<Utc>>,
|
||||
}
|
||||
@@ -1 +1,3 @@
|
||||
pub mod insert_comment;
|
||||
pub mod comment_entity_token;
|
||||
pub mod insert_comment;
|
||||
pub mod list_comments_for_entity;
|
||||
Reference in new issue
Block a user