forked from alemi/upub
feat: allow to resolve local views of remote things
basically any id prefixed with + will be: * prefixed with 'https://' * have all '@' replaced with '/' * not be normalized with local domain patterns thus allowing to look up kind of any url in our db this is kinda reinventing the wheel, but i really don't want to have local-only ids and would much rather have a local-only way to display them, because at least everyone can understand it and look up anything remote easily
This commit is contained in:
parent
f1ff946245
commit
ee26596568
4 changed files with 16 additions and 17 deletions
|
@ -25,8 +25,13 @@ pub async fn view(
|
|||
Path(id): Path<String>,
|
||||
AuthIdentity(auth): AuthIdentity,
|
||||
) -> Result<JsonLD<serde_json::Value>, StatusCode> {
|
||||
let aid = if id.starts_with('+') {
|
||||
format!("https://{}", id.replacen('+', "", 1).replace('@', "/"))
|
||||
} else {
|
||||
ctx.aid(id.clone())
|
||||
};
|
||||
match model::addressing::Entity::find_activities()
|
||||
.filter(model::activity::Column::Id.eq(ctx.aid(id)))
|
||||
.filter(model::activity::Column::Id.eq(aid))
|
||||
.filter(auth.filter_condition())
|
||||
.into_model::<EmbeddedActivity>()
|
||||
.one(ctx.db())
|
||||
|
|
|
@ -65,11 +65,6 @@ impl ActivityPubRouter for Router<crate::server::Context> {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, serde::Deserialize)]
|
||||
pub struct RemoteId {
|
||||
pub id: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(Debug, serde::Deserialize)]
|
||||
// TODO i don't really like how pleroma/mastodon do it actually, maybe change this?
|
||||
pub struct Pagination {
|
||||
|
|
|
@ -28,8 +28,13 @@ pub async fn view(
|
|||
Path(id): Path<String>,
|
||||
AuthIdentity(auth): AuthIdentity,
|
||||
) -> Result<JsonLD<serde_json::Value>, StatusCode> {
|
||||
let oid = if id.starts_with('+') {
|
||||
format!("https://{}", id.replacen('+', "", 1).replace('@', "/"))
|
||||
} else {
|
||||
ctx.oid(id.clone())
|
||||
};
|
||||
match model::addressing::Entity::find_activities()
|
||||
.filter(model::object::Column::Id.eq(ctx.oid(id)))
|
||||
.filter(model::object::Column::Id.eq(oid))
|
||||
.filter(auth.filter_condition())
|
||||
.into_model::<EmbeddedActivity>()
|
||||
.one(ctx.db())
|
||||
|
|
|
@ -4,13 +4,13 @@ pub mod outbox;
|
|||
|
||||
pub mod following;
|
||||
|
||||
use axum::extract::{Path, Query, State};
|
||||
use axum::extract::{Path, State};
|
||||
use sea_orm::EntityTrait;
|
||||
|
||||
use apb::{PublicKeyMut, ActorMut, DocumentMut, DocumentType, ObjectMut, BaseMut, Node};
|
||||
use crate::{errors::UpubError, model::{self, user}, server::Context, url};
|
||||
|
||||
use super::{jsonld::LD, JsonLD, RemoteId};
|
||||
use super::{jsonld::LD, JsonLD};
|
||||
|
||||
pub fn ap_user(user: model::user::Model) -> serde_json::Value {
|
||||
serde_json::Value::new_object()
|
||||
|
@ -47,15 +47,9 @@ pub fn ap_user(user: model::user::Model) -> serde_json::Value {
|
|||
pub async fn view(
|
||||
State(ctx) : State<Context>,
|
||||
Path(id): Path<String>,
|
||||
Query(rid): Query<RemoteId>,
|
||||
) -> crate::Result<JsonLD<serde_json::Value>> {
|
||||
// TODO can this be made less convoluted???
|
||||
let uid = if id == "+" {
|
||||
if let Some(rid) = rid.id {
|
||||
rid
|
||||
} else {
|
||||
return Err(UpubError::bad_request());
|
||||
}
|
||||
let uid = if id.starts_with('+') {
|
||||
format!("https://{}", id.replacen('+', "", 1).replace('@', "/"))
|
||||
} else {
|
||||
ctx.uid(id.clone())
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue