Accept Image objects in attachments (#2394)

This commit is contained in:
vpzomtrrfrt 2022-08-16 03:12:43 -07:00 committed by GitHub
parent 2f9d8776ac
commit 08a797c986
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 51 additions and 6 deletions

View file

@ -0,0 +1,26 @@
{
"actor": "http://ltthostname.local:3334/apub/users/3",
"object": {
"@context": "https://www.w3.org/ns/activitystreams",
"id": "http://ltthostname.local:3334/apub/posts/46",
"type": "Note",
"name": "image",
"to": "http://localhost:8536/c/elsewhere",
"cc": "https://www.w3.org/ns/activitystreams#Public",
"attributedTo": "http://ltthostname.local:3334/apub/users/3",
"attachment": [
{
"type": "Image",
"url": "http://ltthostname.local:3334/api/stable/posts/46/href"
}
],
"sensitive": false,
"published": "2022-08-06T18:35:01.043072+00:00",
"summary": "image"
},
"to": "http://localhost:8536/c/elsewhere",
"cc": "https://www.w3.org/ns/activitystreams#Public",
"@context": "https://www.w3.org/ns/activitystreams",
"id": "http://ltthostname.local:3334/apub/posts/46/create",
"type": "Create"
}

View file

@ -158,8 +158,11 @@ impl ApubObject for ApubPost {
let form = if !page.is_mod_action(context).await? { let form = if !page.is_mod_action(context).await? {
let url = if let Some(attachment) = page.attachment.first() { let url = if let Some(attachment) = page.attachment.first() {
Some(match attachment {
// url as sent by Lemmy (new) // url as sent by Lemmy (new)
Some(attachment.href.clone()) Attachment::Link(link) => link.href.clone(),
Attachment::Image(image) => image.url.clone(),
})
} else if page.kind == PageType::Video { } else if page.kind == PageType::Video {
// we cant display videos directly, so insert a link to external video page // we cant display videos directly, so insert a link to external video page
Some(page.id.inner().clone()) Some(page.id.inner().clone())

View file

@ -52,6 +52,7 @@ mod tests {
#[test] #[test]
fn test_parse_lotide_activities() { fn test_parse_lotide_activities() {
test_json::<CreateOrUpdatePost>("assets/lotide/activities/create_page.json").unwrap(); test_json::<CreateOrUpdatePost>("assets/lotide/activities/create_page.json").unwrap();
test_json::<CreateOrUpdatePost>("assets/lotide/activities/create_page_image.json").unwrap();
test_json::<CreateOrUpdateComment>("assets/lotide/activities/create_note_reply.json").unwrap(); test_json::<CreateOrUpdateComment>("assets/lotide/activities/create_note_reply.json").unwrap();
} }

View file

@ -13,7 +13,7 @@ use activitypub_federation::{
}, },
traits::{ActivityHandler, ApubObject}, traits::{ActivityHandler, ApubObject},
}; };
use activitystreams_kinds::link::LinkType; use activitystreams_kinds::{link::LinkType, object::ImageType};
use chrono::{DateTime, FixedOffset}; use chrono::{DateTime, FixedOffset};
use itertools::Itertools; use itertools::Itertools;
use lemmy_db_schema::newtypes::DbUrl; use lemmy_db_schema::newtypes::DbUrl;
@ -66,11 +66,26 @@ pub struct Page {
#[derive(Clone, Debug, Deserialize, Serialize)] #[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub(crate) struct Attachment { pub(crate) struct Link {
pub(crate) href: Url, pub(crate) href: Url,
pub(crate) r#type: LinkType, pub(crate) r#type: LinkType,
} }
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct Image {
#[serde(rename = "type")]
pub(crate) kind: ImageType,
pub(crate) url: Url,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(untagged)]
pub(crate) enum Attachment {
Link(Link),
Image(Image),
}
#[derive(Clone, Debug, Deserialize, Serialize)] #[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(untagged)] #[serde(untagged)]
pub(crate) enum AttributedTo { pub(crate) enum AttributedTo {
@ -174,10 +189,10 @@ impl Page {
impl Attachment { impl Attachment {
pub(crate) fn new(url: DbUrl) -> Attachment { pub(crate) fn new(url: DbUrl) -> Attachment {
Attachment { Attachment::Link(Link {
href: url.into(), href: url.into(),
r#type: Default::default(), r#type: Default::default(),
} })
} }
} }