Allow retrieval of local Note objects using /objects/ URL
This commit is contained in:
parent
7a65e34e62
commit
8c18a0ab86
4 changed files with 35 additions and 10 deletions
|
@ -126,9 +126,9 @@ pub fn create_note(
|
||||||
Some(in_reply_to_id) => {
|
Some(in_reply_to_id) => {
|
||||||
let post = in_reply_to.unwrap();
|
let post = in_reply_to.unwrap();
|
||||||
assert_eq!(post.id, in_reply_to_id);
|
assert_eq!(post.id, in_reply_to_id);
|
||||||
match post.author.actor_json {
|
match post.author.is_local() {
|
||||||
Some(_) => None, // TODO: store object ID for remote posts
|
false => None, // TODO: store object ID for remote posts
|
||||||
None => Some(get_object_url(&config.instance_url(), &post.id)),
|
true => Some(get_object_url(&config.instance_url(), &post.id)),
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
None => None,
|
None => None,
|
||||||
|
|
|
@ -9,8 +9,9 @@ use crate::config::Config;
|
||||||
use crate::database::{Pool, get_database_client};
|
use crate::database::{Pool, get_database_client};
|
||||||
use crate::errors::HttpError;
|
use crate::errors::HttpError;
|
||||||
use crate::http_signatures::verify::verify_http_signature;
|
use crate::http_signatures::verify::verify_http_signature;
|
||||||
|
use crate::models::posts::queries::get_thread;
|
||||||
use crate::models::users::queries::get_user_by_name;
|
use crate::models::users::queries::get_user_by_name;
|
||||||
use super::activity::OrderedCollection;
|
use super::activity::{create_note, OrderedCollection};
|
||||||
use super::actor::get_actor_object;
|
use super::actor::get_actor_object;
|
||||||
use super::constants::ACTIVITY_CONTENT_TYPE;
|
use super::constants::ACTIVITY_CONTENT_TYPE;
|
||||||
use super::receiver::receive_activity;
|
use super::receiver::receive_activity;
|
||||||
|
@ -122,9 +123,25 @@ pub fn activitypub_scope() -> Scope {
|
||||||
|
|
||||||
#[get("/objects/{object_id}")]
|
#[get("/objects/{object_id}")]
|
||||||
pub async fn get_object(
|
pub async fn get_object(
|
||||||
web::Path(_object_id): web::Path<String>,
|
config: web::Data<Config>,
|
||||||
|
db_pool: web::Data<Pool>,
|
||||||
|
web::Path(object_id): web::Path<Uuid>,
|
||||||
) -> Result<HttpResponse, HttpError> {
|
) -> Result<HttpResponse, HttpError> {
|
||||||
// WARNING: activities/objects are not stored
|
let db_client = &**get_database_client(&db_pool).await?;
|
||||||
let response = HttpResponse::Gone().body("");
|
// Try to find local post by ID, return 404 if not found
|
||||||
|
let thread = get_thread(db_client, &object_id).await?;
|
||||||
|
let post = thread.iter()
|
||||||
|
.find(|post| post.id == object_id && post.author.is_local())
|
||||||
|
.ok_or(HttpError::NotFoundError("post"))?;
|
||||||
|
let in_reply_to = match post.in_reply_to_id {
|
||||||
|
Some(in_reply_to_id) => {
|
||||||
|
thread.iter().find(|post| post.id == in_reply_to_id)
|
||||||
|
},
|
||||||
|
None => None,
|
||||||
|
};
|
||||||
|
let object = create_note(&config, post, in_reply_to);
|
||||||
|
let response = HttpResponse::Ok()
|
||||||
|
.content_type(ACTIVITY_CONTENT_TYPE)
|
||||||
|
.json(object);
|
||||||
Ok(response)
|
Ok(response)
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,9 +48,11 @@ pub struct Account {
|
||||||
|
|
||||||
impl Account {
|
impl Account {
|
||||||
pub fn from_profile(profile: DbActorProfile, instance_url: &str) -> Self {
|
pub fn from_profile(profile: DbActorProfile, instance_url: &str) -> Self {
|
||||||
let avatar_url = profile.avatar_file_name.map(|name| get_file_url(instance_url, &name));
|
let avatar_url = profile.avatar_file_name.as_ref()
|
||||||
let header_url = profile.banner_file_name.map(|name| get_file_url(instance_url, &name));
|
.map(|name| get_file_url(instance_url, &name));
|
||||||
let source = if profile.actor_json.is_some() {
|
let header_url = profile.banner_file_name.as_ref()
|
||||||
|
.map(|name| get_file_url(instance_url, &name));
|
||||||
|
let source = if !profile.is_local() {
|
||||||
// Remote actor
|
// Remote actor
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -68,6 +68,12 @@ pub struct DbActorProfile {
|
||||||
pub actor_json: Option<Value>,
|
pub actor_json: Option<Value>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl DbActorProfile {
|
||||||
|
pub fn is_local(&self) -> bool {
|
||||||
|
self.actor_json.is_none()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct ProfileCreateData {
|
pub struct ProfileCreateData {
|
||||||
pub username: String,
|
pub username: String,
|
||||||
pub display_name: Option<String>,
|
pub display_name: Option<String>,
|
||||||
|
|
Loading…
Reference in a new issue