From b48f3a63a3c9e39d5b9b4b25d97d1d22a0666855 Mon Sep 17 00:00:00 2001 From: Harald Eilertsen Date: Wed, 30 Oct 2024 09:35:21 +0100 Subject: Rename stream::streamitem to stream::activity --- src/stream.rs | 4 +- src/stream/activity.rs | 186 +++++++++++++++++++++++++++++++++++++++++++++++ src/stream/streamitem.rs | 186 ----------------------------------------------- 3 files changed, 188 insertions(+), 188 deletions(-) create mode 100644 src/stream/activity.rs delete mode 100644 src/stream/streamitem.rs diff --git a/src/stream.rs b/src/stream.rs index c717a17..9575675 100644 --- a/src/stream.rs +++ b/src/stream.rs @@ -11,15 +11,15 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ +mod activity; mod actor; mod datetime; -mod streamitem; mod tag; mod verb; pub use actor::Actor; pub use datetime::DateTime; -pub use streamitem::{ +pub use activity::{ StreamItem, StreamItemEncoding, StreamItemType, diff --git a/src/stream/activity.rs b/src/stream/activity.rs new file mode 100644 index 0000000..dd311d7 --- /dev/null +++ b/src/stream/activity.rs @@ -0,0 +1,186 @@ +/** + * Representation of a stream item, as received from the zot api streams. + * + * SPDX-FileCopyrightText: 2023 Eilertsens Kodeknekkeri + * SPDX-FileCopyrightText: 2023 Harald Eilertsen + * + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +use super::actor::Actor; +use super::datetime::DateTime; +use super::Tag; +use super::verb::Verb; + +use serde::Deserialize; +use url::Url; +use uuid::Uuid; + +#[derive(Debug, Deserialize, PartialEq)] +#[serde(rename_all="snake_case")] +pub enum StreamItemType { + Activity, +} + +#[derive(Debug, Deserialize, PartialEq)] +#[serde(rename_all="snake_case")] +pub enum StreamItemEncoding { + Zot, +} + +#[derive(Debug, Deserialize, PartialEq)] +#[serde(rename_all="snake_case")] +pub enum StreamItemFlag { + Direct, + Notshown, + Private, + ThreadParent, +} + +/** + * Represents an item as returned by the stream API's. + */ +#[derive(Debug, Deserialize, PartialEq)] +pub struct StreamItem { + #[serde(rename="type")] + pub item_type: StreamItemType, + pub encoding: StreamItemEncoding, + + pub uuid: Uuid, + pub message_id: Url, + pub message_top: Url, + pub message_parent: Url, + pub permalink: Url, + + /* + * Date and time fields for when the item was + * created, last edited or commented, as well as + * when/if it expires. + */ + pub created: DateTime, + pub edited: DateTime, + pub expires: DateTime, + pub commented: DateTime, + + pub verb: Verb, + + pub title: String, + pub summary: String, + pub body: String, + + pub owner: Actor, + pub author: Actor, + + pub signature: String, + pub flags: Option>, + pub tags: Option>, +} + +impl StreamItem { + pub fn is_post(&self) -> bool { + self.verb == Verb::Post + } +} + +#[cfg(test)] +mod test { + + use super::*; + + #[test] + fn parse_stream_item_from_json() { + let json = r#" + { + "type": "activity", + "encoding": "zot", + "uuid": "2c102ec3-676b-4d84-b2b4-9141467a254f", + "message_id": "https://example.com/item/2c102ec3-676b-4d84-b2b4-9141467a254f", + "message_top": "https://example.com/item/2c102ec3-676b-4d84-b2b4-9141467a254f", + "message_parent": "https://example.com/item/2c102ec3-676b-4d84-b2b4-9141467a254f", + "created": "2023-12-12 17:00:42", + "edited": "2023-12-12 17:00:42", + "expires": "0000-00-00 00:00:00", + "commented": "2023-12-19 09:01:15", + "mimetype": "text/bbcode", + "title": "The item title", + "summary": "The summary of the post", + "body": "The body of the post", + "app": "", + "verb": "Create", + "object_type": "Note", + "target_type": "", + "permalink": "https://example.com/item/2c102ec3-676b-4d84-b2b4-9141467a254f", + "location": "", + "longlat": "", + "signature": "sha256.ADzsjr5uFUpcwVkUT9liHimr1n2TJmGpTtm0SGSody_6vTbfYhHK3OJJhGknImHYwMradSwVcA9dNAAXzhSoAY5hCmSbnThLun30HVIA3E0ZSDBbt1RyKNomqBCvCBmyyFKhxYoPk34UQisCH6gIQ3eZL-m5PxE9t2oMO_CnpPvLWESoezY3CAZaEIIRj3KKozwC8DxibQmsnCeA32C-2Ejzv8PdZCX1skbIdc5d8Jj_ykyUTqc2DZKMSl9osua3esEMwYZLbxlRQruDfgyjJExdvz57zpeqf1WKzqdIZ5kmguZxch6NLVMiRitooT-sIZOvo9JzgP1ogBQW34W-kG1hHzuGJQkDZKOAA1rLD8qrfwugbbg9wDpjtZY-WHv265KMMsFhctIIupNPVVkuSgs0jMKQmjJTeDE0IxBKx2dCsxiqMWlJll_LSu7b6BtTa7jcuhfMPaKqdMOCRRnGNwehj6qeOXPV7zEZsc4Mzym6N_jRTV556OmUwaCHouEFqTG1ARE5EquYTMk2wXIteC5lT2d0WpEGTnlL1WpqWLx9DCp76Z2JsxMBxjZicKvJSm1gX3ng2ENG2cvECww0IF_zPy2DmHcWOqm795-11uLBNt_60bpP9-sgjrNSj0q6MHgAsFGnpW42M4sFe-6gb-W-HjyHwY2B2yjErYC9KDo", + "route": "", + "owner": { + "name": "Benjamin Franklin", + "address": "ben@example.com", + "url": "https://example.com/channel/ben", + "network": "zot6", + "photo": { + "mimetype": "image/jpeg", + "src": "https://example.com/photo/profile/m/2" + }, + "id": "rUpgk2qbvnWLoKIXOlZlwlqI5vk8C4NgudFNjbcmnOBjFSXU34TObkZEClaPSfKnpFZpg87tANtko7WGs7QRvA", + "id_sig": "sha256.ZD8uwYmUEG_d02Y...", + "key": "-----BEGIN PUBLIC KEY-----\n....\n-----END PUBLIC KEY-----\n" + }, + "author": { + "name": "Benjamin Franklin", + "address": "ben@example.com", + "url": "https://example.com/channel/ben", + "network": "zot6", + "photo": { + "mimetype": "image/jpeg", + "src": "https://example.com/photo/profile/m/2" + }, + "id": "rUpgk2qbvnWLoKIXOlZlwlqI5vk8C4NgudFNjbcmnOBjFSXU34TObkZEClaPSfKnpFZpg87tANtko7WGs7QRvA", + "id_sig": "sha256.ZD8uwYmUEG_d02Y...", + "key": "-----BEGIN PUBLIC KEY-----\n....\n-----END PUBLIC KEY-----\n" + }, + "flags": [ + "thread_parent" + ], + "public_scope": "", + "comment_scope": "contacts", + "tags": [ + { + "tag": "a-tag", + "url": "https://example.com/search?tag=a-tag", + "type": "hashtag" + }, + { + "tag": "fediverse", + "url": "https://example.com/search?tag=fediverse", + "type": "hashtag" + }, + { + "tag": "hubzilla", + "url": "https://example.com/search?tag=hubzilla", + "type": "hashtag" + } + ] + }"#; + + let item: StreamItem = serde_json::from_str(&json).unwrap(); + + assert_eq!(StreamItemType::Activity, item.item_type); + assert_eq!(StreamItemEncoding::Zot, item.encoding); + assert_eq!("2c102ec3-676b-4d84-b2b4-9141467a254f", item.uuid.to_string()); + assert_eq!("https://example.com/item/2c102ec3-676b-4d84-b2b4-9141467a254f", item.message_id.to_string()); + assert_eq!("https://example.com/item/2c102ec3-676b-4d84-b2b4-9141467a254f", item.message_top.to_string()); + assert_eq!("https://example.com/item/2c102ec3-676b-4d84-b2b4-9141467a254f", item.message_parent.to_string()); + assert_eq!("https://example.com/item/2c102ec3-676b-4d84-b2b4-9141467a254f", item.permalink.to_string()); + assert_eq!(Verb::Create, item.verb); + assert_eq!("The item title", &item.title); + assert_eq!("The summary of the post", &item.summary); + assert_eq!("The body of the post", &item.body); + assert_eq!("2023-12-12 17:00:42", &item.created.to_string()); + assert_eq!("2023-12-12 17:00:42", &item.edited.to_string()); + assert_eq!("0000-00-00 00:00:00", &item.expires.to_string()); + assert_eq!("2023-12-19 09:01:15", &item.commented.to_string()); + assert_eq!(StreamItemFlag::ThreadParent, item.flags.as_ref().unwrap()[0]); + } +} diff --git a/src/stream/streamitem.rs b/src/stream/streamitem.rs deleted file mode 100644 index dd311d7..0000000 --- a/src/stream/streamitem.rs +++ /dev/null @@ -1,186 +0,0 @@ -/** - * Representation of a stream item, as received from the zot api streams. - * - * SPDX-FileCopyrightText: 2023 Eilertsens Kodeknekkeri - * SPDX-FileCopyrightText: 2023 Harald Eilertsen - * - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -use super::actor::Actor; -use super::datetime::DateTime; -use super::Tag; -use super::verb::Verb; - -use serde::Deserialize; -use url::Url; -use uuid::Uuid; - -#[derive(Debug, Deserialize, PartialEq)] -#[serde(rename_all="snake_case")] -pub enum StreamItemType { - Activity, -} - -#[derive(Debug, Deserialize, PartialEq)] -#[serde(rename_all="snake_case")] -pub enum StreamItemEncoding { - Zot, -} - -#[derive(Debug, Deserialize, PartialEq)] -#[serde(rename_all="snake_case")] -pub enum StreamItemFlag { - Direct, - Notshown, - Private, - ThreadParent, -} - -/** - * Represents an item as returned by the stream API's. - */ -#[derive(Debug, Deserialize, PartialEq)] -pub struct StreamItem { - #[serde(rename="type")] - pub item_type: StreamItemType, - pub encoding: StreamItemEncoding, - - pub uuid: Uuid, - pub message_id: Url, - pub message_top: Url, - pub message_parent: Url, - pub permalink: Url, - - /* - * Date and time fields for when the item was - * created, last edited or commented, as well as - * when/if it expires. - */ - pub created: DateTime, - pub edited: DateTime, - pub expires: DateTime, - pub commented: DateTime, - - pub verb: Verb, - - pub title: String, - pub summary: String, - pub body: String, - - pub owner: Actor, - pub author: Actor, - - pub signature: String, - pub flags: Option>, - pub tags: Option>, -} - -impl StreamItem { - pub fn is_post(&self) -> bool { - self.verb == Verb::Post - } -} - -#[cfg(test)] -mod test { - - use super::*; - - #[test] - fn parse_stream_item_from_json() { - let json = r#" - { - "type": "activity", - "encoding": "zot", - "uuid": "2c102ec3-676b-4d84-b2b4-9141467a254f", - "message_id": "https://example.com/item/2c102ec3-676b-4d84-b2b4-9141467a254f", - "message_top": "https://example.com/item/2c102ec3-676b-4d84-b2b4-9141467a254f", - "message_parent": "https://example.com/item/2c102ec3-676b-4d84-b2b4-9141467a254f", - "created": "2023-12-12 17:00:42", - "edited": "2023-12-12 17:00:42", - "expires": "0000-00-00 00:00:00", - "commented": "2023-12-19 09:01:15", - "mimetype": "text/bbcode", - "title": "The item title", - "summary": "The summary of the post", - "body": "The body of the post", - "app": "", - "verb": "Create", - "object_type": "Note", - "target_type": "", - "permalink": "https://example.com/item/2c102ec3-676b-4d84-b2b4-9141467a254f", - "location": "", - "longlat": "", - "signature": "sha256.ADzsjr5uFUpcwVkUT9liHimr1n2TJmGpTtm0SGSody_6vTbfYhHK3OJJhGknImHYwMradSwVcA9dNAAXzhSoAY5hCmSbnThLun30HVIA3E0ZSDBbt1RyKNomqBCvCBmyyFKhxYoPk34UQisCH6gIQ3eZL-m5PxE9t2oMO_CnpPvLWESoezY3CAZaEIIRj3KKozwC8DxibQmsnCeA32C-2Ejzv8PdZCX1skbIdc5d8Jj_ykyUTqc2DZKMSl9osua3esEMwYZLbxlRQruDfgyjJExdvz57zpeqf1WKzqdIZ5kmguZxch6NLVMiRitooT-sIZOvo9JzgP1ogBQW34W-kG1hHzuGJQkDZKOAA1rLD8qrfwugbbg9wDpjtZY-WHv265KMMsFhctIIupNPVVkuSgs0jMKQmjJTeDE0IxBKx2dCsxiqMWlJll_LSu7b6BtTa7jcuhfMPaKqdMOCRRnGNwehj6qeOXPV7zEZsc4Mzym6N_jRTV556OmUwaCHouEFqTG1ARE5EquYTMk2wXIteC5lT2d0WpEGTnlL1WpqWLx9DCp76Z2JsxMBxjZicKvJSm1gX3ng2ENG2cvECww0IF_zPy2DmHcWOqm795-11uLBNt_60bpP9-sgjrNSj0q6MHgAsFGnpW42M4sFe-6gb-W-HjyHwY2B2yjErYC9KDo", - "route": "", - "owner": { - "name": "Benjamin Franklin", - "address": "ben@example.com", - "url": "https://example.com/channel/ben", - "network": "zot6", - "photo": { - "mimetype": "image/jpeg", - "src": "https://example.com/photo/profile/m/2" - }, - "id": "rUpgk2qbvnWLoKIXOlZlwlqI5vk8C4NgudFNjbcmnOBjFSXU34TObkZEClaPSfKnpFZpg87tANtko7WGs7QRvA", - "id_sig": "sha256.ZD8uwYmUEG_d02Y...", - "key": "-----BEGIN PUBLIC KEY-----\n....\n-----END PUBLIC KEY-----\n" - }, - "author": { - "name": "Benjamin Franklin", - "address": "ben@example.com", - "url": "https://example.com/channel/ben", - "network": "zot6", - "photo": { - "mimetype": "image/jpeg", - "src": "https://example.com/photo/profile/m/2" - }, - "id": "rUpgk2qbvnWLoKIXOlZlwlqI5vk8C4NgudFNjbcmnOBjFSXU34TObkZEClaPSfKnpFZpg87tANtko7WGs7QRvA", - "id_sig": "sha256.ZD8uwYmUEG_d02Y...", - "key": "-----BEGIN PUBLIC KEY-----\n....\n-----END PUBLIC KEY-----\n" - }, - "flags": [ - "thread_parent" - ], - "public_scope": "", - "comment_scope": "contacts", - "tags": [ - { - "tag": "a-tag", - "url": "https://example.com/search?tag=a-tag", - "type": "hashtag" - }, - { - "tag": "fediverse", - "url": "https://example.com/search?tag=fediverse", - "type": "hashtag" - }, - { - "tag": "hubzilla", - "url": "https://example.com/search?tag=hubzilla", - "type": "hashtag" - } - ] - }"#; - - let item: StreamItem = serde_json::from_str(&json).unwrap(); - - assert_eq!(StreamItemType::Activity, item.item_type); - assert_eq!(StreamItemEncoding::Zot, item.encoding); - assert_eq!("2c102ec3-676b-4d84-b2b4-9141467a254f", item.uuid.to_string()); - assert_eq!("https://example.com/item/2c102ec3-676b-4d84-b2b4-9141467a254f", item.message_id.to_string()); - assert_eq!("https://example.com/item/2c102ec3-676b-4d84-b2b4-9141467a254f", item.message_top.to_string()); - assert_eq!("https://example.com/item/2c102ec3-676b-4d84-b2b4-9141467a254f", item.message_parent.to_string()); - assert_eq!("https://example.com/item/2c102ec3-676b-4d84-b2b4-9141467a254f", item.permalink.to_string()); - assert_eq!(Verb::Create, item.verb); - assert_eq!("The item title", &item.title); - assert_eq!("The summary of the post", &item.summary); - assert_eq!("The body of the post", &item.body); - assert_eq!("2023-12-12 17:00:42", &item.created.to_string()); - assert_eq!("2023-12-12 17:00:42", &item.edited.to_string()); - assert_eq!("0000-00-00 00:00:00", &item.expires.to_string()); - assert_eq!("2023-12-19 09:01:15", &item.commented.to_string()); - assert_eq!(StreamItemFlag::ThreadParent, item.flags.as_ref().unwrap()[0]); - } -} -- cgit v1.2.3