forked from alemi/upub
feat: handle announces
This commit is contained in:
parent
f3dcbffeca
commit
6c3aead68b
3 changed files with 35 additions and 3 deletions
|
@ -21,6 +21,7 @@ pub trait Inbox {
|
||||||
async fn create(&self, activity: Self::Activity) -> Result<(), Self::Error>;
|
async fn create(&self, activity: Self::Activity) -> Result<(), Self::Error>;
|
||||||
async fn like(&self, activity: Self::Activity) -> Result<(), Self::Error>;
|
async fn like(&self, activity: Self::Activity) -> Result<(), Self::Error>;
|
||||||
async fn follow(&self, activity: Self::Activity) -> Result<(), Self::Error>;
|
async fn follow(&self, activity: Self::Activity) -> Result<(), Self::Error>;
|
||||||
|
async fn announce(&self, activity: Self::Activity) -> Result<(), Self::Error>;
|
||||||
async fn accept(&self, activity: Self::Activity) -> Result<(), Self::Error>;
|
async fn accept(&self, activity: Self::Activity) -> Result<(), Self::Error>;
|
||||||
async fn reject(&self, activity: Self::Activity) -> Result<(), Self::Error>;
|
async fn reject(&self, activity: Self::Activity) -> Result<(), Self::Error>;
|
||||||
async fn undo(&self, activity: Self::Activity) -> Result<(), Self::Error>;
|
async fn undo(&self, activity: Self::Activity) -> Result<(), Self::Error>;
|
||||||
|
|
|
@ -78,7 +78,7 @@ pub async fn post(
|
||||||
ActivityType::Create => Ok(ctx.create(activity).await?),
|
ActivityType::Create => Ok(ctx.create(activity).await?),
|
||||||
ActivityType::Update => Ok(ctx.update(activity).await?),
|
ActivityType::Update => Ok(ctx.update(activity).await?),
|
||||||
ActivityType::Undo => Ok(ctx.undo(activity).await?),
|
ActivityType::Undo => Ok(ctx.undo(activity).await?),
|
||||||
// ActivityType::Announce => Ok(ctx.announce(activity).await?),
|
ActivityType::Announce => Ok(ctx.announce(activity).await?),
|
||||||
|
|
||||||
_x => {
|
_x => {
|
||||||
tracing::info!("received unimplemented activity on inbox: {}", pretty_json!(activity));
|
tracing::info!("received unimplemented activity on inbox: {}", pretty_json!(activity));
|
||||||
|
|
|
@ -2,7 +2,7 @@ use apb::{target::Addressed, Activity, Base, Object};
|
||||||
use reqwest::StatusCode;
|
use reqwest::StatusCode;
|
||||||
use sea_orm::{sea_query::Expr, ColumnTrait, Condition, EntityTrait, IntoActiveModel, QueryFilter, Set};
|
use sea_orm::{sea_query::Expr, ColumnTrait, Condition, EntityTrait, IntoActiveModel, QueryFilter, Set};
|
||||||
|
|
||||||
use crate::{errors::{LoggableError, UpubError}, model};
|
use crate::{errors::{LoggableError, UpubError}, model::{self, object, FieldError}};
|
||||||
|
|
||||||
use super::{fetcher::Fetcher, Context};
|
use super::{fetcher::Fetcher, Context};
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ impl apb::server::Inbox for Context {
|
||||||
id: sea_orm::ActiveValue::NotSet,
|
id: sea_orm::ActiveValue::NotSet,
|
||||||
actor: sea_orm::Set(uid.clone()),
|
actor: sea_orm::Set(uid.clone()),
|
||||||
likes: sea_orm::Set(oid.clone()),
|
likes: sea_orm::Set(oid.clone()),
|
||||||
date: sea_orm::Set(chrono::Utc::now()),
|
date: sea_orm::Set(activity.published().unwrap_or(chrono::Utc::now())),
|
||||||
};
|
};
|
||||||
match model::like::Entity::insert(like).exec(self.db()).await {
|
match model::like::Entity::insert(like).exec(self.db()).await {
|
||||||
Err(sea_orm::DbErr::RecordNotInserted) => Err(UpubError::not_modified()),
|
Err(sea_orm::DbErr::RecordNotInserted) => Err(UpubError::not_modified()),
|
||||||
|
@ -246,5 +246,36 @@ impl apb::server::Inbox for Context {
|
||||||
model::activity::Entity::delete_by_id(undone_aid).exec(self.db()).await?;
|
model::activity::Entity::delete_by_id(undone_aid).exec(self.db()).await?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn announce(&self, activity: serde_json::Value) -> crate::Result<()> {
|
||||||
|
let activity_model = model::activity::Model::new(&activity)?;
|
||||||
|
let Some(oid) = &activity_model.object else {
|
||||||
|
return Err(FieldError("object").into());
|
||||||
|
};
|
||||||
|
self.fetch_object(oid).await?;
|
||||||
|
let share = model::share::ActiveModel {
|
||||||
|
id: sea_orm::ActiveValue::NotSet,
|
||||||
|
actor: sea_orm::Set(activity_model.actor.clone()),
|
||||||
|
shares: sea_orm::Set(oid.clone()),
|
||||||
|
date: sea_orm::Set(activity.published().unwrap_or(chrono::Utc::now())),
|
||||||
|
};
|
||||||
|
|
||||||
|
let expanded_addressing = self.expand_addressing(activity.addressed()).await?;
|
||||||
|
self.address_to(&activity_model.id, None, &expanded_addressing).await?;
|
||||||
|
model::share::Entity::insert(share)
|
||||||
|
.exec(self.db()).await?;
|
||||||
|
model::activity::Entity::insert(activity_model.clone().into_active_model())
|
||||||
|
.exec(self.db())
|
||||||
|
.await?;
|
||||||
|
model::object::Entity::update_many()
|
||||||
|
.col_expr(model::object::Column::Shares, Expr::col(model::object::Column::Shares).add(1))
|
||||||
|
.filter(model::object::Column::Id.eq(oid.clone()))
|
||||||
|
.exec(self.db())
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
tracing::info!("{} shared {}", activity_model.actor, oid);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue