feat: edit approval
This commit is contained in:
parent
c13e172938
commit
0c3ea546fd
9 changed files with 750 additions and 185 deletions
156
src/server.rs
156
src/server.rs
|
|
@ -119,7 +119,7 @@ async fn serve_edit_comment<'a>(
|
|||
return serve_comments(req, config, templates, dbs, client_langs, context, 400).await;
|
||||
};
|
||||
|
||||
let Some(comment) = dbs.comment.get(&comment_id).unwrap() else {
|
||||
let Some((comment, _edited_comment)) = dbs.comment.get(&comment_id).unwrap() else {
|
||||
context.insert("log", &["not found comment"]);
|
||||
return serve_comments(req, config, templates, dbs, client_langs, context, 404).await;
|
||||
};
|
||||
|
|
@ -189,6 +189,13 @@ async fn serve_comments<'a>(
|
|||
.ok();
|
||||
}
|
||||
}
|
||||
if let Ok(query) = req.query::<ApproveEditQuery>() {
|
||||
if let Ok(comment_id) = CommentId::from_base64(&query.approve_edit) {
|
||||
helpers::approve_edit(comment_id, &dbs)
|
||||
.map_err(|e| error!("Approving edit: {:?}", e))
|
||||
.ok();
|
||||
}
|
||||
}
|
||||
if let Ok(query) = req.query::<RemoveQuery>() {
|
||||
if let Ok(comment_id) = CommentId::from_base64(&query.remove) {
|
||||
helpers::remove_comment(comment_id, &dbs)
|
||||
|
|
@ -196,9 +203,16 @@ async fn serve_comments<'a>(
|
|||
.ok();
|
||||
}
|
||||
}
|
||||
if let Ok(query) = req.query::<RemoveEditQuery>() {
|
||||
if let Ok(comment_id) = CommentId::from_base64(&query.remove_edit) {
|
||||
helpers::remove_edit(comment_id, &dbs)
|
||||
.map_err(|e| error!("Removing edit: {:?}", e))
|
||||
.ok();
|
||||
}
|
||||
}
|
||||
if let Ok(query) = req.query::<EditQuery>() {
|
||||
if let Ok(comment_id) = CommentId::from_base64(&query.edit) {
|
||||
if let Some(comment) = dbs.comment.get(&comment_id).unwrap() {
|
||||
if let Some((comment, _comment_status)) = dbs.comment.get(&comment_id).unwrap() {
|
||||
context.insert("edit_comment", &comment_id.to_base64());
|
||||
context.insert("edit_comment_author", &comment.author);
|
||||
context.insert("edit_comment_email", &comment.email);
|
||||
|
|
@ -210,14 +224,38 @@ async fn serve_comments<'a>(
|
|||
context.insert(
|
||||
"comments_pending",
|
||||
&helpers::iter_pending_comments_by_topic(topic_hash.clone(), &dbs)
|
||||
.map(|(comment_id, comment, addr)| CommentWithId {
|
||||
addr: addr.map(|addr| addr.to_string()),
|
||||
author: comment.author,
|
||||
editable: admin,
|
||||
id: comment_id.to_base64(),
|
||||
needs_approval: true,
|
||||
post_time: comment.post_time,
|
||||
text: comment.text,
|
||||
.map(|(comment_id, comment, addr, comment_status)| {
|
||||
if let CommentStatus::ApprovedEdited(edited_comment) = comment_status {
|
||||
CommentWithId {
|
||||
addr: addr.map(|addr| addr.to_string()),
|
||||
author: edited_comment.author,
|
||||
editable: true,
|
||||
id: comment_id.to_base64(),
|
||||
last_edit_time: edited_comment.last_edit_time,
|
||||
needs_approval: true,
|
||||
original: Some(OriginalComment {
|
||||
author: comment.author,
|
||||
editable: true,
|
||||
last_edit_time: comment.last_edit_time,
|
||||
post_time: comment.post_time,
|
||||
text: comment.text,
|
||||
}),
|
||||
post_time: edited_comment.post_time,
|
||||
text: edited_comment.text,
|
||||
}
|
||||
} else {
|
||||
CommentWithId {
|
||||
addr: addr.map(|addr| addr.to_string()),
|
||||
author: comment.author,
|
||||
editable: true,
|
||||
id: comment_id.to_base64(),
|
||||
last_edit_time: comment.last_edit_time,
|
||||
needs_approval: true,
|
||||
original: None,
|
||||
post_time: comment.post_time,
|
||||
text: comment.text,
|
||||
}
|
||||
}
|
||||
})
|
||||
.collect::<Vec<CommentWithId>>(),
|
||||
);
|
||||
|
|
@ -226,12 +264,14 @@ async fn serve_comments<'a>(
|
|||
context.insert(
|
||||
"comments",
|
||||
&helpers::iter_approved_comments_by_topic(topic_hash, &dbs)
|
||||
.map(|(comment_id, comment)| CommentWithId {
|
||||
.map(|(comment_id, comment, _comment_status)| CommentWithId {
|
||||
addr: None,
|
||||
author: comment.author,
|
||||
editable: admin,
|
||||
id: comment_id.to_base64(),
|
||||
last_edit_time: comment.last_edit_time,
|
||||
needs_approval: false,
|
||||
original: None,
|
||||
post_time: comment.post_time,
|
||||
text: comment.text,
|
||||
})
|
||||
|
|
@ -272,10 +312,10 @@ async fn serve_admin<'a>(
|
|||
&dbs.comment_pending
|
||||
.iter()
|
||||
.filter_map(|entry| {
|
||||
let ((_topic_hash, _time, comment_id), addr) = entry
|
||||
let ((_topic_hash, _time, comment_id), (addr, _is_edit)) = entry
|
||||
.map_err(|e| error!("Reading comment_pending: {:?}", e))
|
||||
.ok()?;
|
||||
let comment = dbs
|
||||
let (comment, comment_status) = dbs
|
||||
.comment
|
||||
.get(&comment_id)
|
||||
.map_err(|e| error!("Reading comment: {:?}", e))
|
||||
|
|
@ -284,15 +324,37 @@ async fn serve_admin<'a>(
|
|||
error!("Comment not found");
|
||||
None
|
||||
})?;
|
||||
Some(CommentWithId {
|
||||
addr: addr.map(|addr| addr.to_string()),
|
||||
author: comment.author,
|
||||
editable: true,
|
||||
id: comment_id.to_base64(),
|
||||
needs_approval: true,
|
||||
post_time: comment.post_time,
|
||||
text: comment.text,
|
||||
})
|
||||
if let CommentStatus::ApprovedEdited(edited_comment) = comment_status {
|
||||
Some(CommentWithId {
|
||||
addr: addr.map(|addr| addr.to_string()),
|
||||
author: edited_comment.author,
|
||||
editable: true,
|
||||
id: comment_id.to_base64(),
|
||||
last_edit_time: edited_comment.last_edit_time,
|
||||
needs_approval: true,
|
||||
original: Some(OriginalComment {
|
||||
author: comment.author,
|
||||
editable: true,
|
||||
last_edit_time: comment.last_edit_time,
|
||||
post_time: comment.post_time,
|
||||
text: comment.text,
|
||||
}),
|
||||
post_time: edited_comment.post_time,
|
||||
text: edited_comment.text,
|
||||
})
|
||||
} else {
|
||||
Some(CommentWithId {
|
||||
addr: addr.map(|addr| addr.to_string()),
|
||||
author: comment.author,
|
||||
editable: true,
|
||||
id: comment_id.to_base64(),
|
||||
last_edit_time: comment.last_edit_time,
|
||||
needs_approval: true,
|
||||
original: None,
|
||||
post_time: comment.post_time,
|
||||
text: comment.text,
|
||||
})
|
||||
}
|
||||
})
|
||||
.collect::<Vec<CommentWithId>>(),
|
||||
);
|
||||
|
|
@ -456,6 +518,7 @@ async fn handle_post_comments(
|
|||
.unwrap()],
|
||||
);
|
||||
}
|
||||
// TODO add message to client log and change http code
|
||||
Err(e) => error!("Adding pending comment: {:?}", e),
|
||||
}
|
||||
} else {
|
||||
|
|
@ -466,16 +529,20 @@ async fn handle_post_comments(
|
|||
context.insert("new_comment_errors", &errors);
|
||||
}
|
||||
CommentQuery::EditComment(query) => {
|
||||
helpers::check_comment(config, locales, &client_langs, &query.comment, &mut errors);
|
||||
let Ok(topic) = req.param("topic") else {
|
||||
return Err(tide::Error::from_str(404, "No topic"))
|
||||
};
|
||||
|
||||
let Ok(comment_id) = CommentId::from_base64(&query.id) else {
|
||||
return Err(tide::Error::from_str(400, "Invalid comment id"));
|
||||
};
|
||||
|
||||
let Some(mut comment) = dbs.comment.get(&comment_id).unwrap() else {
|
||||
let Some((old_comment, old_edited_comment)) = dbs.comment.get(&comment_id).unwrap() else {
|
||||
return Err(tide::Error::from_str(404, "Not found"));
|
||||
};
|
||||
|
||||
helpers::check_comment(config, locales, &client_langs, &query.comment, &mut errors);
|
||||
|
||||
let mutation_token = if admin {
|
||||
None
|
||||
} else {
|
||||
|
|
@ -491,7 +558,7 @@ async fn handle_post_comments(
|
|||
};
|
||||
|
||||
if let Err(e) =
|
||||
helpers::check_can_edit_comment(config, &comment, &mutation_token)
|
||||
helpers::check_can_edit_comment(config, &old_comment, &mutation_token)
|
||||
{
|
||||
errors.push(e.to_string());
|
||||
}
|
||||
|
|
@ -535,6 +602,8 @@ async fn handle_post_comments(
|
|||
.unwrap()
|
||||
.as_secs();
|
||||
|
||||
let mut comment = old_comment.clone();
|
||||
|
||||
comment.author = if query.comment.author.is_empty() {
|
||||
petname::Petnames::large().generate_one(2, " ")
|
||||
} else {
|
||||
|
|
@ -548,7 +617,42 @@ async fn handle_post_comments(
|
|||
comment.text = query.comment.text;
|
||||
comment.last_edit_time = Some(time);
|
||||
|
||||
dbs.comment.insert(&comment_id, &comment).unwrap();
|
||||
match helpers::edit_comment(
|
||||
comment_id.clone(),
|
||||
old_comment,
|
||||
old_edited_comment,
|
||||
comment.clone(),
|
||||
client_addr,
|
||||
&dbs,
|
||||
) {
|
||||
Ok(()) => {
|
||||
context.insert(
|
||||
"log",
|
||||
&[locales
|
||||
.tr(
|
||||
&client_langs,
|
||||
if config.comment_approve {
|
||||
"edit_comment-success_pending"
|
||||
} else {
|
||||
"edit_comment-success"
|
||||
},
|
||||
Some(&FluentArgs::from_iter([(
|
||||
"edit_link",
|
||||
format!(
|
||||
"{}t/{}/edit/{}/{}",
|
||||
&config.root_url,
|
||||
topic,
|
||||
comment_id.to_base64(),
|
||||
comment.mutation_token.to_base64(),
|
||||
),
|
||||
)])),
|
||||
)
|
||||
.unwrap()],
|
||||
);
|
||||
}
|
||||
// TODO add message to client log and change http code
|
||||
Err(e) => error!("Editing comment: {:?}", e),
|
||||
}
|
||||
} else {
|
||||
context.insert("edit_comment", &comment_id.to_base64());
|
||||
if let Some(mutation_token) = &mutation_token {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue