Move Post::object_id function to activitypub::identifiers
This commit is contained in:
parent
f27b2e13eb
commit
a515af1111
9 changed files with 45 additions and 29 deletions
|
@ -7,7 +7,12 @@ use crate::activitypub::{
|
||||||
actors::types::Actor,
|
actors::types::Actor,
|
||||||
constants::AP_PUBLIC,
|
constants::AP_PUBLIC,
|
||||||
deliverer::OutgoingActivity,
|
deliverer::OutgoingActivity,
|
||||||
identifiers::{local_actor_followers, local_actor_id, local_object_id},
|
identifiers::{
|
||||||
|
local_actor_followers,
|
||||||
|
local_actor_id,
|
||||||
|
local_object_id,
|
||||||
|
post_object_id,
|
||||||
|
},
|
||||||
types::{build_default_context, Context},
|
types::{build_default_context, Context},
|
||||||
vocabulary::ANNOUNCE,
|
vocabulary::ANNOUNCE,
|
||||||
};
|
};
|
||||||
|
@ -41,8 +46,9 @@ fn build_announce(
|
||||||
repost: &Post,
|
repost: &Post,
|
||||||
) -> Announce {
|
) -> Announce {
|
||||||
let actor_id = local_actor_id(instance_url, sender_username);
|
let actor_id = local_actor_id(instance_url, sender_username);
|
||||||
let post = repost.repost_of.as_ref().unwrap();
|
let post = repost.repost_of.as_ref()
|
||||||
let object_id = post.object_id(instance_url);
|
.expect("repost_of field should be populated");
|
||||||
|
let object_id = post_object_id(instance_url, post);
|
||||||
let activity_id = local_object_id(instance_url, &repost.id);
|
let activity_id = local_object_id(instance_url, &repost.id);
|
||||||
let recipient_id = post.author.actor_id(instance_url);
|
let recipient_id = post.author.actor_id(instance_url);
|
||||||
let followers = local_actor_followers(instance_url, sender_username);
|
let followers = local_actor_followers(instance_url, sender_username);
|
||||||
|
|
|
@ -14,6 +14,7 @@ use crate::activitypub::{
|
||||||
local_emoji_id,
|
local_emoji_id,
|
||||||
local_object_id,
|
local_object_id,
|
||||||
local_tag_collection,
|
local_tag_collection,
|
||||||
|
post_object_id,
|
||||||
},
|
},
|
||||||
types::{
|
types::{
|
||||||
build_default_context,
|
build_default_context,
|
||||||
|
@ -158,7 +159,7 @@ pub fn build_note(
|
||||||
for linked in &post.linked {
|
for linked in &post.linked {
|
||||||
// Build FEP-e232 object link
|
// Build FEP-e232 object link
|
||||||
// https://codeberg.org/fediverse/fep/src/branch/main/feps/fep-e232.md
|
// https://codeberg.org/fediverse/fep/src/branch/main/feps/fep-e232.md
|
||||||
let link_href = linked.object_id(instance_url);
|
let link_href = post_object_id(instance_url, linked);
|
||||||
let tag = LinkTag {
|
let tag = LinkTag {
|
||||||
name: None, // no microsyntax
|
name: None, // no microsyntax
|
||||||
tag_type: LINK.to_string(),
|
tag_type: LINK.to_string(),
|
||||||
|
@ -170,7 +171,7 @@ pub fn build_note(
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
let maybe_quote_url = post.linked.get(0)
|
let maybe_quote_url = post.linked.get(0)
|
||||||
.map(|linked| linked.object_id(instance_url));
|
.map(|linked| post_object_id(instance_url, linked));
|
||||||
|
|
||||||
for emoji in &post.emojis {
|
for emoji in &post.emojis {
|
||||||
let tag = build_emoji_tag(instance_url, emoji);
|
let tag = build_emoji_tag(instance_url, emoji);
|
||||||
|
@ -186,7 +187,7 @@ pub fn build_note(
|
||||||
if !primary_audience.contains(&in_reply_to_actor_id) {
|
if !primary_audience.contains(&in_reply_to_actor_id) {
|
||||||
primary_audience.push(in_reply_to_actor_id);
|
primary_audience.push(in_reply_to_actor_id);
|
||||||
};
|
};
|
||||||
Some(in_reply_to.object_id(instance_url))
|
Some(post_object_id(instance_url, in_reply_to))
|
||||||
},
|
},
|
||||||
None => None,
|
None => None,
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,7 +4,7 @@ use mitra_config::Instance;
|
||||||
|
|
||||||
use crate::activitypub::{
|
use crate::activitypub::{
|
||||||
deliverer::OutgoingActivity,
|
deliverer::OutgoingActivity,
|
||||||
identifiers::local_actor_id,
|
identifiers::{local_actor_id, local_object_id},
|
||||||
types::{build_default_context, Context},
|
types::{build_default_context, Context},
|
||||||
vocabulary::{DELETE, NOTE, TOMBSTONE},
|
vocabulary::{DELETE, NOTE, TOMBSTONE},
|
||||||
};
|
};
|
||||||
|
@ -52,7 +52,8 @@ fn build_delete_note(
|
||||||
instance_url: &str,
|
instance_url: &str,
|
||||||
post: &Post,
|
post: &Post,
|
||||||
) -> DeleteNote {
|
) -> DeleteNote {
|
||||||
let object_id = post.object_id(instance_url);
|
assert!(post.is_local());
|
||||||
|
let object_id = local_object_id(instance_url, &post.id);
|
||||||
let activity_id = format!("{}/delete", object_id);
|
let activity_id = format!("{}/delete", object_id);
|
||||||
let actor_id = local_actor_id(instance_url, &post.author.username);
|
let actor_id = local_actor_id(instance_url, &post.author.username);
|
||||||
let Note { to, cc, .. } = build_note(
|
let Note { to, cc, .. } = build_note(
|
||||||
|
|
|
@ -7,7 +7,7 @@ use crate::activitypub::{
|
||||||
actors::types::Actor,
|
actors::types::Actor,
|
||||||
constants::AP_PUBLIC,
|
constants::AP_PUBLIC,
|
||||||
deliverer::OutgoingActivity,
|
deliverer::OutgoingActivity,
|
||||||
identifiers::{local_actor_id, local_object_id},
|
identifiers::{local_actor_id, local_object_id, post_object_id},
|
||||||
types::{build_default_context, Context},
|
types::{build_default_context, Context},
|
||||||
vocabulary::LIKE,
|
vocabulary::LIKE,
|
||||||
};
|
};
|
||||||
|
@ -93,7 +93,7 @@ pub async fn prepare_like(
|
||||||
&instance.url(),
|
&instance.url(),
|
||||||
post,
|
post,
|
||||||
).await?;
|
).await?;
|
||||||
let object_id = post.object_id(&instance.url());
|
let object_id = post_object_id(&instance.url(), post);
|
||||||
let post_author_id = post.author.actor_id(&instance.url());
|
let post_author_id = post.author.actor_id(&instance.url());
|
||||||
let activity = build_like(
|
let activity = build_like(
|
||||||
&instance.url(),
|
&instance.url(),
|
||||||
|
|
|
@ -2,6 +2,7 @@ use regex::Regex;
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
use crate::errors::ValidationError;
|
use crate::errors::ValidationError;
|
||||||
|
use crate::models::posts::types::Post;
|
||||||
|
|
||||||
const ACTOR_KEY_SUFFIX: &str = "#main-key";
|
const ACTOR_KEY_SUFFIX: &str = "#main-key";
|
||||||
|
|
||||||
|
@ -114,6 +115,13 @@ pub fn parse_local_object_id(
|
||||||
Ok(internal_object_id)
|
Ok(internal_object_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn post_object_id(instance_url: &str, post: &Post) -> String {
|
||||||
|
match post.object_id {
|
||||||
|
Some(ref object_id) => object_id.to_string(),
|
||||||
|
None => local_object_id(instance_url, &post.id),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use mitra_utils::id::generate_ulid;
|
use mitra_utils::id::generate_ulid;
|
||||||
|
|
|
@ -2,7 +2,10 @@ use chrono::{DateTime, Utc};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
use crate::activitypub::identifiers::local_tag_collection;
|
use crate::activitypub::identifiers::{
|
||||||
|
local_tag_collection,
|
||||||
|
post_object_id,
|
||||||
|
};
|
||||||
use crate::mastodon_api::{
|
use crate::mastodon_api::{
|
||||||
accounts::types::Account,
|
accounts::types::Account,
|
||||||
custom_emojis::types::CustomEmoji,
|
custom_emojis::types::CustomEmoji,
|
||||||
|
@ -90,7 +93,7 @@ impl Status {
|
||||||
instance_url: &str,
|
instance_url: &str,
|
||||||
post: Post,
|
post: Post,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let object_id = post.object_id(instance_url);
|
let object_id = post_object_id(instance_url, &post);
|
||||||
let attachments: Vec<Attachment> = post.attachments.into_iter()
|
let attachments: Vec<Attachment> = post.attachments.into_iter()
|
||||||
.map(|item| Attachment::from_db(base_url, item))
|
.map(|item| Attachment::from_db(base_url, item))
|
||||||
.collect();
|
.collect();
|
||||||
|
|
|
@ -15,13 +15,16 @@ use uuid::Uuid;
|
||||||
use mitra_config::Config;
|
use mitra_config::Config;
|
||||||
use mitra_utils::markdown::markdown_lite_to_html;
|
use mitra_utils::markdown::markdown_lite_to_html;
|
||||||
|
|
||||||
use crate::activitypub::builders::{
|
use crate::activitypub::{
|
||||||
announce::prepare_announce,
|
builders::{
|
||||||
create_note::prepare_create_note,
|
announce::prepare_announce,
|
||||||
delete_note::prepare_delete_note,
|
create_note::prepare_create_note,
|
||||||
like::prepare_like,
|
delete_note::prepare_delete_note,
|
||||||
undo_announce::prepare_undo_announce,
|
like::prepare_like,
|
||||||
undo_like::prepare_undo_like,
|
undo_announce::prepare_undo_announce,
|
||||||
|
undo_like::prepare_undo_like,
|
||||||
|
},
|
||||||
|
identifiers::local_object_id,
|
||||||
};
|
};
|
||||||
use crate::database::{get_database_client, DatabaseError, DbPool};
|
use crate::database::{get_database_client, DatabaseError, DbPool};
|
||||||
use crate::errors::ValidationError;
|
use crate::errors::ValidationError;
|
||||||
|
@ -565,7 +568,8 @@ async fn make_permanent(
|
||||||
attachment.ipfs_cid = Some(image_cid.clone());
|
attachment.ipfs_cid = Some(image_cid.clone());
|
||||||
attachments.push((attachment.id, image_cid));
|
attachments.push((attachment.id, image_cid));
|
||||||
};
|
};
|
||||||
let post_url = post.object_id(&config.instance_url());
|
assert!(post.is_local());
|
||||||
|
let post_url = local_object_id(&config.instance_url(), &post.id);
|
||||||
let maybe_post_image_cid = post.attachments.first()
|
let maybe_post_image_cid = post.attachments.first()
|
||||||
.and_then(|attachment| attachment.ipfs_cid.as_deref());
|
.and_then(|attachment| attachment.ipfs_cid.as_deref());
|
||||||
let post_metadata = PostMetadata::new(
|
let post_metadata = PostMetadata::new(
|
||||||
|
|
|
@ -3,7 +3,6 @@ use postgres_types::FromSql;
|
||||||
use tokio_postgres::Row;
|
use tokio_postgres::Row;
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
use crate::activitypub::identifiers::local_object_id;
|
|
||||||
use crate::database::{
|
use crate::database::{
|
||||||
int_enum::{int_enum_from_sql, int_enum_to_sql},
|
int_enum::{int_enum_from_sql, int_enum_to_sql},
|
||||||
DatabaseError,
|
DatabaseError,
|
||||||
|
@ -181,13 +180,6 @@ impl Post {
|
||||||
pub fn is_public(&self) -> bool {
|
pub fn is_public(&self) -> bool {
|
||||||
matches!(self.visibility, Visibility::Public)
|
matches!(self.visibility, Visibility::Public)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn object_id(&self, instance_url: &str) -> String {
|
|
||||||
match &self.object_id {
|
|
||||||
Some(object_id) => object_id.to_string(),
|
|
||||||
None => local_object_id(instance_url, &self.id),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
|
@ -14,6 +14,7 @@ use uuid::Uuid;
|
||||||
use mitra_config::Config;
|
use mitra_config::Config;
|
||||||
|
|
||||||
use crate::activitypub::{
|
use crate::activitypub::{
|
||||||
|
identifiers::post_object_id,
|
||||||
views::is_activitypub_request,
|
views::is_activitypub_request,
|
||||||
};
|
};
|
||||||
use crate::database::{get_database_client, DbPool};
|
use crate::database::{get_database_client, DbPool};
|
||||||
|
@ -96,7 +97,7 @@ async fn post_page_redirect_view(
|
||||||
) -> Result<HttpResponse, HttpError> {
|
) -> Result<HttpResponse, HttpError> {
|
||||||
let db_client = &**get_database_client(&db_pool).await?;
|
let db_client = &**get_database_client(&db_pool).await?;
|
||||||
let post = get_post_by_id(db_client, &post_id).await?;
|
let post = get_post_by_id(db_client, &post_id).await?;
|
||||||
let object_id = post.object_id(&config.instance_url());
|
let object_id = post_object_id(&config.instance_url(), &post);
|
||||||
let response = HttpResponse::Found()
|
let response = HttpResponse::Found()
|
||||||
.append_header(("Location", object_id))
|
.append_header(("Location", object_id))
|
||||||
.finish();
|
.finish();
|
||||||
|
|
Loading…
Reference in a new issue