mirror of
https://github.com/LemmyNet/lemmy.git
synced 2024-09-25 04:50:02 +00:00
1d38aad9d3
* a lot * merge * Fix stuff broken by merge * Get rid of repetitive `&mut *context.conn().await?` * Add blank lines under each line with `conn =` * Fix style mistakes (partial) * Revert "Fix style mistakes (partial)" This reverts commit48a033b87f
. * Revert "Add blank lines under each line with `conn =`" This reverts commit773a6d3beb
. * Revert "Get rid of repetitive `&mut *context.conn().await?`" This reverts commitd2c6263ea1
. * Use DbConn for CaptchaAnswer methods * DbConn trait * Remove more `&mut *` * Fix stuff * Re-run CI * try to make ci start * fix * fix * Fix api_common::utils * Fix apub::activities::block * Fix apub::api::resolve_object * Fix some things * Revert "Fix some things" This reverts commit2bf8574bc8
. * Revert "Fix apub::api::resolve_object" This reverts commit3e4059aabb
. * Revert "Fix apub::activities::block" This reverts commit3b02389abd
. * Revert "Fix api_common::utils" This reverts commit7dc73de613
. * Revert "Revert "Fix api_common::utils"" This reverts commitf740f115e5
. * Revert "Revert "Fix apub::activities::block"" This reverts commit2ee206af7c
. * Revert "Revert "Fix apub::api::resolve_object"" This reverts commit96ed8bf2e9
. * Fix fetch_local_site_data * Fix get_comment_parent_creator * Remove unused perma deleted text * Fix routes::feeds * Fix lib.rs * Update lib.rs * rerun ci * Attempt to create custom GetConn and RunQueryDsl traits * Start over * Add GetConn trait * aaaa * Revert "aaaa" This reverts commitacc9ca1aed
. * Revert "Revert "aaaa"" This reverts commit443a2a00a5
. * still aaaaaaaaaaaaa * Return to earlier thing Revert "Add GetConn trait" This reverts commitab4e94aea5
. * Try to use DbPool enum * Revert "Try to use DbPool enum" This reverts commite4d1712646
. * DbConn and DbPool enums (db_schema only fails to compile for tests) * fmt * Make functions take `&mut DbPool<'_>` and make db_schema tests compile * Add try_join_with_pool macro and run fix-clippy on more crates * Fix some errors * I did it * Remove function variants that take connection * rerun ci * rerun ci * rerun ci
169 lines
4.6 KiB
Rust
169 lines
4.6 KiB
Rust
use crate::{
|
|
activities::community::send_activity_in_community,
|
|
activity_lists::AnnouncableActivities,
|
|
fetcher::post_or_comment::PostOrComment,
|
|
objects::{comment::ApubComment, person::ApubPerson, post::ApubPost},
|
|
protocol::activities::voting::{
|
|
undo_vote::UndoVote,
|
|
vote::{Vote, VoteType},
|
|
},
|
|
SendActivity,
|
|
};
|
|
use activitypub_federation::{config::Data, fetch::object_id::ObjectId};
|
|
use lemmy_api_common::{
|
|
comment::{CommentResponse, CreateCommentLike},
|
|
context::LemmyContext,
|
|
post::{CreatePostLike, PostResponse},
|
|
sensitive::Sensitive,
|
|
utils::local_user_view_from_jwt,
|
|
};
|
|
use lemmy_db_schema::{
|
|
newtypes::CommunityId,
|
|
source::{
|
|
comment::{CommentLike, CommentLikeForm},
|
|
community::Community,
|
|
person::Person,
|
|
post::{PostLike, PostLikeForm},
|
|
},
|
|
traits::{Crud, Likeable},
|
|
};
|
|
use lemmy_utils::error::LemmyError;
|
|
|
|
pub mod undo_vote;
|
|
pub mod vote;
|
|
|
|
#[async_trait::async_trait]
|
|
impl SendActivity for CreatePostLike {
|
|
type Response = PostResponse;
|
|
|
|
async fn send_activity(
|
|
request: &Self,
|
|
response: &Self::Response,
|
|
context: &Data<LemmyContext>,
|
|
) -> Result<(), LemmyError> {
|
|
let object_id = ObjectId::from(response.post_view.post.ap_id.clone());
|
|
let community_id = response.post_view.community.id;
|
|
send_activity(
|
|
object_id,
|
|
community_id,
|
|
request.score,
|
|
&request.auth,
|
|
context,
|
|
)
|
|
.await
|
|
}
|
|
}
|
|
|
|
#[async_trait::async_trait]
|
|
impl SendActivity for CreateCommentLike {
|
|
type Response = CommentResponse;
|
|
|
|
async fn send_activity(
|
|
request: &Self,
|
|
response: &Self::Response,
|
|
context: &Data<LemmyContext>,
|
|
) -> Result<(), LemmyError> {
|
|
let object_id = ObjectId::from(response.comment_view.comment.ap_id.clone());
|
|
let community_id = response.comment_view.community.id;
|
|
send_activity(
|
|
object_id,
|
|
community_id,
|
|
request.score,
|
|
&request.auth,
|
|
context,
|
|
)
|
|
.await
|
|
}
|
|
}
|
|
|
|
async fn send_activity(
|
|
object_id: ObjectId<PostOrComment>,
|
|
community_id: CommunityId,
|
|
score: i16,
|
|
jwt: &Sensitive<String>,
|
|
context: &Data<LemmyContext>,
|
|
) -> Result<(), LemmyError> {
|
|
let community = Community::read(&mut context.pool(), community_id)
|
|
.await?
|
|
.into();
|
|
let local_user_view = local_user_view_from_jwt(jwt, context).await?;
|
|
let actor = Person::read(&mut context.pool(), local_user_view.person.id)
|
|
.await?
|
|
.into();
|
|
|
|
// score of 1 means upvote, -1 downvote, 0 undo a previous vote
|
|
if score != 0 {
|
|
let vote = Vote::new(object_id, &actor, &community, score.try_into()?, context)?;
|
|
let activity = AnnouncableActivities::Vote(vote);
|
|
send_activity_in_community(activity, &actor, &community, vec![], false, context).await
|
|
} else {
|
|
// Lemmy API doesnt distinguish between Undo/Like and Undo/Dislike, so we hardcode it here.
|
|
let vote = Vote::new(object_id, &actor, &community, VoteType::Like, context)?;
|
|
let undo_vote = UndoVote::new(vote, &actor, &community, context)?;
|
|
let activity = AnnouncableActivities::UndoVote(undo_vote);
|
|
send_activity_in_community(activity, &actor, &community, vec![], false, context).await
|
|
}
|
|
}
|
|
|
|
#[tracing::instrument(skip_all)]
|
|
async fn vote_comment(
|
|
vote_type: &VoteType,
|
|
actor: ApubPerson,
|
|
comment: &ApubComment,
|
|
context: &Data<LemmyContext>,
|
|
) -> Result<(), LemmyError> {
|
|
let comment_id = comment.id;
|
|
let like_form = CommentLikeForm {
|
|
comment_id,
|
|
post_id: comment.post_id,
|
|
person_id: actor.id,
|
|
score: vote_type.into(),
|
|
};
|
|
let person_id = actor.id;
|
|
CommentLike::remove(&mut context.pool(), person_id, comment_id).await?;
|
|
CommentLike::like(&mut context.pool(), &like_form).await?;
|
|
Ok(())
|
|
}
|
|
|
|
#[tracing::instrument(skip_all)]
|
|
async fn vote_post(
|
|
vote_type: &VoteType,
|
|
actor: ApubPerson,
|
|
post: &ApubPost,
|
|
context: &Data<LemmyContext>,
|
|
) -> Result<(), LemmyError> {
|
|
let post_id = post.id;
|
|
let like_form = PostLikeForm {
|
|
post_id: post.id,
|
|
person_id: actor.id,
|
|
score: vote_type.into(),
|
|
};
|
|
let person_id = actor.id;
|
|
PostLike::remove(&mut context.pool(), person_id, post_id).await?;
|
|
PostLike::like(&mut context.pool(), &like_form).await?;
|
|
Ok(())
|
|
}
|
|
|
|
#[tracing::instrument(skip_all)]
|
|
async fn undo_vote_comment(
|
|
actor: ApubPerson,
|
|
comment: &ApubComment,
|
|
context: &Data<LemmyContext>,
|
|
) -> Result<(), LemmyError> {
|
|
let comment_id = comment.id;
|
|
let person_id = actor.id;
|
|
CommentLike::remove(&mut context.pool(), person_id, comment_id).await?;
|
|
Ok(())
|
|
}
|
|
|
|
#[tracing::instrument(skip_all)]
|
|
async fn undo_vote_post(
|
|
actor: ApubPerson,
|
|
post: &ApubPost,
|
|
context: &Data<LemmyContext>,
|
|
) -> Result<(), LemmyError> {
|
|
let post_id = post.id;
|
|
let person_id = actor.id;
|
|
PostLike::remove(&mut context.pool(), person_id, post_id).await?;
|
|
Ok(())
|
|
}
|