Store IDs of incoming Like() activities
This commit is contained in:
parent
42624ab9a5
commit
99f32e8202
7 changed files with 34 additions and 9 deletions
1
migrations/V0015__post_reaction__add_activity_id.sql
Normal file
1
migrations/V0015__post_reaction__add_activity_id.sql
Normal file
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE post_reaction ADD COLUMN activity_id VARCHAR(250) UNIQUE;
|
|
@ -51,6 +51,7 @@ CREATE TABLE post_reaction (
|
||||||
id UUID PRIMARY KEY,
|
id UUID PRIMARY KEY,
|
||||||
author_id UUID NOT NULL REFERENCES actor_profile (id) ON DELETE CASCADE,
|
author_id UUID NOT NULL REFERENCES actor_profile (id) ON DELETE CASCADE,
|
||||||
post_id UUID NOT NULL REFERENCES post (id) ON DELETE CASCADE,
|
post_id UUID NOT NULL REFERENCES post (id) ON DELETE CASCADE,
|
||||||
|
activity_id VARCHAR(250) UNIQUE,
|
||||||
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
|
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
|
||||||
UNIQUE (author_id, post_id)
|
UNIQUE (author_id, post_id)
|
||||||
);
|
);
|
||||||
|
|
|
@ -389,7 +389,12 @@ pub async fn receive_activity(
|
||||||
post.id
|
post.id
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
create_reaction(db_client, &author.id, &post_id).await?;
|
create_reaction(
|
||||||
|
db_client,
|
||||||
|
&author.id,
|
||||||
|
&post_id,
|
||||||
|
Some(&activity.id),
|
||||||
|
).await?;
|
||||||
},
|
},
|
||||||
(FOLLOW, _) => {
|
(FOLLOW, _) => {
|
||||||
let source_profile = get_or_fetch_profile_by_actor_id(
|
let source_profile = get_or_fetch_profile_by_actor_id(
|
||||||
|
|
|
@ -233,7 +233,7 @@ async fn favourite(
|
||||||
return Err(HttpError::NotFoundError("post"));
|
return Err(HttpError::NotFoundError("post"));
|
||||||
};
|
};
|
||||||
let reaction_created = match create_reaction(
|
let reaction_created = match create_reaction(
|
||||||
db_client, ¤t_user.id, &status_id,
|
db_client, ¤t_user.id, &status_id, None,
|
||||||
).await {
|
).await {
|
||||||
Ok(_) => {
|
Ok(_) => {
|
||||||
post.reaction_count += 1;
|
post.reaction_count += 1;
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
pub mod queries;
|
pub mod queries;
|
||||||
|
mod types;
|
||||||
|
|
|
@ -9,21 +9,25 @@ use crate::models::posts::queries::{
|
||||||
get_post_author,
|
get_post_author,
|
||||||
};
|
};
|
||||||
use crate::utils::id::new_uuid;
|
use crate::utils::id::new_uuid;
|
||||||
|
use super::types::DbReaction;
|
||||||
|
|
||||||
pub async fn create_reaction(
|
pub async fn create_reaction(
|
||||||
db_client: &mut impl GenericClient,
|
db_client: &mut impl GenericClient,
|
||||||
author_id: &Uuid,
|
author_id: &Uuid,
|
||||||
post_id: &Uuid,
|
post_id: &Uuid,
|
||||||
) -> Result<(), DatabaseError> {
|
activity_id: Option<&String>,
|
||||||
|
) -> Result<DbReaction, DatabaseError> {
|
||||||
let transaction = db_client.transaction().await?;
|
let transaction = db_client.transaction().await?;
|
||||||
let reaction_id = new_uuid();
|
let reaction_id = new_uuid();
|
||||||
transaction.execute(
|
let row = transaction.query_one(
|
||||||
"
|
"
|
||||||
INSERT INTO post_reaction (id, author_id, post_id)
|
INSERT INTO post_reaction (id, author_id, post_id, activity_id)
|
||||||
VALUES ($1, $2, $3)
|
VALUES ($1, $2, $3, $4)
|
||||||
|
RETURNING post_reaction
|
||||||
",
|
",
|
||||||
&[&reaction_id, &author_id, &post_id],
|
&[&reaction_id, &author_id, &post_id, &activity_id],
|
||||||
).await.map_err(catch_unique_violation("reaction"))?;
|
).await.map_err(catch_unique_violation("reaction"))?;
|
||||||
|
let reaction: DbReaction = row.try_get("post_reaction")?;
|
||||||
update_reaction_count(&transaction, post_id, 1).await?;
|
update_reaction_count(&transaction, post_id, 1).await?;
|
||||||
let post_author = get_post_author(&transaction, post_id).await?;
|
let post_author = get_post_author(&transaction, post_id).await?;
|
||||||
if post_author.is_local() && post_author.id != *author_id {
|
if post_author.is_local() && post_author.id != *author_id {
|
||||||
|
@ -33,9 +37,9 @@ pub async fn create_reaction(
|
||||||
&post_author.id,
|
&post_author.id,
|
||||||
post_id,
|
post_id,
|
||||||
).await?;
|
).await?;
|
||||||
}
|
};
|
||||||
transaction.commit().await?;
|
transaction.commit().await?;
|
||||||
Ok(())
|
Ok(reaction)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn delete_reaction(
|
pub async fn delete_reaction(
|
||||||
|
|
13
src/models/reactions/types.rs
Normal file
13
src/models/reactions/types.rs
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
use chrono::{DateTime, Utc};
|
||||||
|
use postgres_types::FromSql;
|
||||||
|
use uuid::Uuid;
|
||||||
|
|
||||||
|
#[derive(FromSql)]
|
||||||
|
#[postgres(name = "post_reaction")]
|
||||||
|
pub struct DbReaction {
|
||||||
|
pub id: Uuid,
|
||||||
|
pub author_id: Uuid,
|
||||||
|
pub post_id: Uuid,
|
||||||
|
pub activity_id: Option<String>,
|
||||||
|
pub created_at: DateTime<Utc>,
|
||||||
|
}
|
Loading…
Reference in a new issue