chore: replace .get/.extract (and use shortcuts)
This commit is contained in:
parent
7a78b07467
commit
298f0a3774
5 changed files with 21 additions and 25 deletions
|
@ -34,7 +34,7 @@ pub async fn fetch(ctx: upub::Context, uri: String, save: bool, actor: Option<St
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
let obj = node.extract().expect("node still empty after fetch?");
|
let obj = node.into_inner().expect("node still empty after fetch?");
|
||||||
|
|
||||||
println!("{}", serde_json::to_string_pretty(&obj).unwrap());
|
println!("{}", serde_json::to_string_pretty(&obj).unwrap());
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ use apb::{Activity, Actor, ActorMut, Base, Collection, CollectionPage, Object};
|
||||||
use reqwest::{header::{ACCEPT, CONTENT_TYPE, USER_AGENT}, Method, Response};
|
use reqwest::{header::{ACCEPT, CONTENT_TYPE, USER_AGENT}, Method, Response};
|
||||||
use sea_orm::{ActiveValue::Set, ColumnTrait, ConnectionTrait, DbErr, EntityTrait, IntoActiveModel, NotSet, QueryFilter};
|
use sea_orm::{ActiveValue::Set, ColumnTrait, ConnectionTrait, DbErr, EntityTrait, IntoActiveModel, NotSet, QueryFilter};
|
||||||
|
|
||||||
use crate::traits::normalize::AP;
|
use crate::{ext::Shortcuts, traits::normalize::AP};
|
||||||
|
|
||||||
use super::{Addresser, Cloaker, Normalizer};
|
use super::{Addresser, Cloaker, Normalizer};
|
||||||
use httpsign::HttpSignature;
|
use httpsign::HttpSignature;
|
||||||
|
@ -414,7 +414,7 @@ impl Fetcher for crate::Context {
|
||||||
// fix for mastodon: at some point it introduces ?only_other_accounts=true and then returns a
|
// fix for mastodon: at some point it introduces ?only_other_accounts=true and then returns a
|
||||||
// collection, not a page anymore ???
|
// collection, not a page anymore ???
|
||||||
if matches!(page.object_type()?, apb::ObjectType::Collection(apb::CollectionType::Collection)) {
|
if matches!(page.object_type()?, apb::ObjectType::Collection(apb::CollectionType::Collection)) {
|
||||||
page = page.first().extract().ok_or(RequestError::Tombstone)?;
|
page = page.first().into_inner()?;
|
||||||
}
|
}
|
||||||
|
|
||||||
for obj in page.items().flat() {
|
for obj in page.items().flat() {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
use apb::{field::OptionalString, Collection, Document, Endpoints, Node, Object, PublicKey};
|
use apb::{field::OptionalString, Document, Endpoints, Node, Object, PublicKey};
|
||||||
use sea_orm::{sea_query::Expr, ActiveModelTrait, ActiveValue::{Unchanged, NotSet, Set}, ColumnTrait, ConnectionTrait, DbErr, EntityTrait, IntoActiveModel, QueryFilter};
|
use sea_orm::{sea_query::Expr, ActiveModelTrait, ActiveValue::{Unchanged, NotSet, Set}, ColumnTrait, ConnectionTrait, DbErr, EntityTrait, IntoActiveModel, QueryFilter};
|
||||||
|
use crate::ext::Shortcuts;
|
||||||
|
|
||||||
use super::{Cloaker, Fetcher};
|
use super::{Cloaker, Fetcher};
|
||||||
|
|
||||||
|
@ -310,19 +311,16 @@ impl AP {
|
||||||
name: object.name().str(),
|
name: object.name().str(),
|
||||||
summary: object.summary().str(),
|
summary: object.summary().str(),
|
||||||
content: object.content().str(),
|
content: object.content().str(),
|
||||||
image: object.image().get().and_then(|x| x.url().id().str()),
|
image: object.image_url().ok(),
|
||||||
context: object.context().id().str(),
|
context: object.context().id().str(),
|
||||||
in_reply_to: object.in_reply_to().id().str(),
|
in_reply_to: object.in_reply_to().id().str(),
|
||||||
quote: object.quote_url().id().str(),
|
quote: object.quote_url().id().str(),
|
||||||
published: object.published().unwrap_or_else(|_| chrono::Utc::now()),
|
published: object.published().unwrap_or_else(|_| chrono::Utc::now()),
|
||||||
updated: object.updated().unwrap_or_else(|_| chrono::Utc::now()),
|
updated: object.updated().unwrap_or_else(|_| chrono::Utc::now()),
|
||||||
url: object.url().id().str(),
|
url: object.url().id().str(),
|
||||||
replies: object.replies().get()
|
replies: object.replies_count().unwrap_or_default(),
|
||||||
.map_or(0, |x| x.total_items().unwrap_or(0)) as i32,
|
likes: object.likes_count().unwrap_or_default(),
|
||||||
likes: object.likes().get()
|
announces: object.shares_count().unwrap_or_default(),
|
||||||
.map_or(0, |x| x.total_items().unwrap_or(0)) as i32,
|
|
||||||
announces: object.shares().get()
|
|
||||||
.map_or(0, |x| x.total_items().unwrap_or(0)) as i32,
|
|
||||||
audience: object.audience().id().str(),
|
audience: object.audience().id().str(),
|
||||||
to: object.to().all_ids().into(),
|
to: object.to().all_ids().into(),
|
||||||
bto: object.bto().all_ids().into(),
|
bto: object.bto().all_ids().into(),
|
||||||
|
@ -368,11 +366,11 @@ impl AP {
|
||||||
actor_type: actor.actor_type()?,
|
actor_type: actor.actor_type()?,
|
||||||
name: actor.name().str(),
|
name: actor.name().str(),
|
||||||
summary: actor.summary().str(),
|
summary: actor.summary().str(),
|
||||||
icon: actor.icon().get().and_then(|x| x.url().id().str()),
|
icon: actor.icon_url().ok(),
|
||||||
image: actor.image().get().and_then(|x| x.url().id().str()),
|
image: actor.image_url().ok(),
|
||||||
inbox: actor.inbox().id().str(),
|
inbox: actor.inbox().id().str(),
|
||||||
outbox: actor.outbox().id().str(),
|
outbox: actor.outbox().id().str(),
|
||||||
shared_inbox: actor.endpoints().get().and_then(|x| x.shared_inbox().str()),
|
shared_inbox: actor.endpoints().inner().and_then(|x| x.shared_inbox()).map(|x| x.to_string()).ok(),
|
||||||
followers: actor.followers().id().str(),
|
followers: actor.followers().id().str(),
|
||||||
following: actor.following().id().str(),
|
following: actor.following().id().str(),
|
||||||
also_known_as: actor.also_known_as().flat().into_iter().filter_map(|x| x.id().str()).collect::<Vec<String>>().into(),
|
also_known_as: actor.also_known_as().flat().into_iter().filter_map(|x| x.id().str()).collect::<Vec<String>>().into(),
|
||||||
|
@ -382,12 +380,12 @@ impl AP {
|
||||||
following_count: actor.following_count().unwrap_or(0) as i32,
|
following_count: actor.following_count().unwrap_or(0) as i32,
|
||||||
followers_count: actor.followers_count().unwrap_or(0) as i32,
|
followers_count: actor.followers_count().unwrap_or(0) as i32,
|
||||||
statuses_count: actor.statuses_count().unwrap_or(0) as i32,
|
statuses_count: actor.statuses_count().unwrap_or(0) as i32,
|
||||||
public_key: actor.public_key().get().ok_or(apb::FieldErr("publicKey"))?.public_key_pem().to_string(),
|
public_key: actor.public_key().inner()?.public_key_pem().to_string(),
|
||||||
private_key: None, // there's no way to transport privkey over AP json, must come from DB
|
private_key: None, // there's no way to transport privkey over AP json, must come from DB
|
||||||
fields: actor.attachment()
|
fields: actor.attachment()
|
||||||
.flat()
|
.flat()
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.filter_map(|x| Some(crate::model::actor::Field::from(x.extract()?)))
|
.filter_map(|x| Some(crate::model::actor::Field::from(x.into_inner().ok()?)))
|
||||||
.collect::<Vec<crate::model::actor::Field>>()
|
.collect::<Vec<crate::model::actor::Field>>()
|
||||||
.into(),
|
.into(),
|
||||||
})
|
})
|
||||||
|
|
|
@ -55,7 +55,7 @@ impl Processor for crate::Context {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn create(ctx: &crate::Context, activity: impl apb::Activity, tx: &DatabaseTransaction) -> Result<(), ProcessorError> {
|
pub async fn create(ctx: &crate::Context, activity: impl apb::Activity, tx: &DatabaseTransaction) -> Result<(), ProcessorError> {
|
||||||
let Some(object_node) = activity.object().extract() else {
|
let Ok(object_node) = activity.object().into_inner() else {
|
||||||
// TODO we could process non-embedded activities or arrays but im lazy rn
|
// TODO we could process non-embedded activities or arrays but im lazy rn
|
||||||
tracing::error!("refusing to process activity without embedded object");
|
tracing::error!("refusing to process activity without embedded object");
|
||||||
return Err(ProcessorError::Unprocessable(activity.id()?.to_string()));
|
return Err(ProcessorError::Unprocessable(activity.id()?.to_string()));
|
||||||
|
@ -356,7 +356,7 @@ pub async fn delete(ctx: &crate::Context, activity: impl apb::Activity, tx: &Dat
|
||||||
|
|
||||||
pub async fn update(ctx: &crate::Context, activity: impl apb::Activity, tx: &DatabaseTransaction) -> Result<(), ProcessorError> {
|
pub async fn update(ctx: &crate::Context, activity: impl apb::Activity, tx: &DatabaseTransaction) -> Result<(), ProcessorError> {
|
||||||
// TODO when attachments get updated we do nothing!!!!!!!!!!
|
// TODO when attachments get updated we do nothing!!!!!!!!!!
|
||||||
let Some(object_node) = activity.object().extract() else {
|
let Ok(object_node) = activity.object().into_inner() else {
|
||||||
tracing::error!("refusing to process activity without embedded object");
|
tracing::error!("refusing to process activity without embedded object");
|
||||||
return Err(ProcessorError::Unprocessable(activity.id()?.to_string()));
|
return Err(ProcessorError::Unprocessable(activity.id()?.to_string()));
|
||||||
};
|
};
|
||||||
|
@ -415,9 +415,7 @@ pub async fn update(ctx: &crate::Context, activity: impl apb::Activity, tx: &Dat
|
||||||
|
|
||||||
pub async fn undo(ctx: &crate::Context, activity: impl apb::Activity, tx: &DatabaseTransaction) -> Result<(), ProcessorError> {
|
pub async fn undo(ctx: &crate::Context, activity: impl apb::Activity, tx: &DatabaseTransaction) -> Result<(), ProcessorError> {
|
||||||
// TODO in theory we could work with just object_id but right now only accept embedded
|
// TODO in theory we could work with just object_id but right now only accept embedded
|
||||||
let undone_activity = activity.object()
|
let undone_activity = activity.object().into_inner()?;
|
||||||
.extract()
|
|
||||||
.ok_or(apb::FieldErr("object"))?;
|
|
||||||
|
|
||||||
let uid = activity.actor().id()?.to_string();
|
let uid = activity.actor().id()?.to_string();
|
||||||
let internal_uid = crate::model::actor::Entity::ap_to_internal(&uid, tx)
|
let internal_uid = crate::model::actor::Entity::ap_to_internal(&uid, tx)
|
||||||
|
|
|
@ -46,7 +46,7 @@ pub async fn process(ctx: Context, job: &model::job::Model) -> crate::JobResult<
|
||||||
.set_published(Some(now));
|
.set_published(Some(now));
|
||||||
|
|
||||||
if matches!(t, apb::ObjectType::Activity(apb::ActivityType::Undo)) {
|
if matches!(t, apb::ObjectType::Activity(apb::ActivityType::Undo)) {
|
||||||
let mut undone = activity.object().extract().ok_or(crate::JobError::MissingPayload)?;
|
let mut undone = activity.object().into_inner()?;
|
||||||
if undone.id().is_err() {
|
if undone.id().is_err() {
|
||||||
let undone_target = undone.object().id().str().ok_or(crate::JobError::MissingPayload)?;
|
let undone_target = undone.object().id().str().ok_or(crate::JobError::MissingPayload)?;
|
||||||
let undone_type = undone.activity_type().map_err(|_| crate::JobError::MissingPayload)?;
|
let undone_type = undone.activity_type().map_err(|_| crate::JobError::MissingPayload)?;
|
||||||
|
@ -74,7 +74,7 @@ pub async fn process(ctx: Context, job: &model::job::Model) -> crate::JobResult<
|
||||||
}
|
}
|
||||||
|
|
||||||
if matches!(t, apb::ObjectType::Activity(apb::ActivityType::Update)) {
|
if matches!(t, apb::ObjectType::Activity(apb::ActivityType::Update)) {
|
||||||
let mut updated = activity.object().extract().ok_or(crate::JobError::MissingPayload)?;
|
let mut updated = activity.object().into_inner()?;
|
||||||
match updated.object_type()? {
|
match updated.object_type()? {
|
||||||
apb::ObjectType::Actor(_) => {
|
apb::ObjectType::Actor(_) => {
|
||||||
let mut prev = model::actor::Entity::find_by_ap_id(updated.id()?)
|
let mut prev = model::actor::Entity::find_by_ap_id(updated.id()?)
|
||||||
|
@ -95,7 +95,7 @@ pub async fn process(ctx: Context, job: &model::job::Model) -> crate::JobResult<
|
||||||
prev.fields = updated.attachment()
|
prev.fields = updated.attachment()
|
||||||
.flat()
|
.flat()
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.filter_map(|x| x.extract())
|
.filter_map(|x| x.into_inner().ok())
|
||||||
.map(Field::from)
|
.map(Field::from)
|
||||||
.collect::<Vec<Field>>()
|
.collect::<Vec<Field>>()
|
||||||
.into();
|
.into();
|
||||||
|
@ -133,7 +133,7 @@ pub async fn process(ctx: Context, job: &model::job::Model) -> crate::JobResult<
|
||||||
let raw_oid = Context::new_id();
|
let raw_oid = Context::new_id();
|
||||||
let oid = ctx.oid(&raw_oid);
|
let oid = ctx.oid(&raw_oid);
|
||||||
// object must be embedded, wont dereference here
|
// object must be embedded, wont dereference here
|
||||||
let object = activity.object().extract().ok_or(apb::FieldErr("object"))?;
|
let object = activity.object().into_inner()?;
|
||||||
// TODO regex hell here i come...
|
// TODO regex hell here i come...
|
||||||
let re = regex::Regex::new(r"@(.+)@([^ ]+)").expect("failed compiling regex pattern");
|
let re = regex::Regex::new(r"@(.+)@([^ ]+)").expect("failed compiling regex pattern");
|
||||||
let mut content = object.content().map(|x| x.to_string()).ok();
|
let mut content = object.content().map(|x| x.to_string()).ok();
|
||||||
|
|
Loading…
Reference in a new issue