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>,
|
Path(id): Path<String>,
|
||||||
AuthIdentity(auth): AuthIdentity,
|
AuthIdentity(auth): AuthIdentity,
|
||||||
) -> Result<JsonLD<serde_json::Value>, StatusCode> {
|
) -> 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()
|
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())
|
.filter(auth.filter_condition())
|
||||||
.into_model::<EmbeddedActivity>()
|
.into_model::<EmbeddedActivity>()
|
||||||
.one(ctx.db())
|
.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)]
|
#[derive(Debug, serde::Deserialize)]
|
||||||
// TODO i don't really like how pleroma/mastodon do it actually, maybe change this?
|
// TODO i don't really like how pleroma/mastodon do it actually, maybe change this?
|
||||||
pub struct Pagination {
|
pub struct Pagination {
|
||||||
|
|
|
@ -28,8 +28,13 @@ pub async fn view(
|
||||||
Path(id): Path<String>,
|
Path(id): Path<String>,
|
||||||
AuthIdentity(auth): AuthIdentity,
|
AuthIdentity(auth): AuthIdentity,
|
||||||
) -> Result<JsonLD<serde_json::Value>, StatusCode> {
|
) -> 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()
|
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())
|
.filter(auth.filter_condition())
|
||||||
.into_model::<EmbeddedActivity>()
|
.into_model::<EmbeddedActivity>()
|
||||||
.one(ctx.db())
|
.one(ctx.db())
|
||||||
|
|
|
@ -4,13 +4,13 @@ pub mod outbox;
|
||||||
|
|
||||||
pub mod following;
|
pub mod following;
|
||||||
|
|
||||||
use axum::extract::{Path, Query, State};
|
use axum::extract::{Path, State};
|
||||||
use sea_orm::EntityTrait;
|
use sea_orm::EntityTrait;
|
||||||
|
|
||||||
use apb::{PublicKeyMut, ActorMut, DocumentMut, DocumentType, ObjectMut, BaseMut, Node};
|
use apb::{PublicKeyMut, ActorMut, DocumentMut, DocumentType, ObjectMut, BaseMut, Node};
|
||||||
use crate::{errors::UpubError, model::{self, user}, server::Context, url};
|
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 {
|
pub fn ap_user(user: model::user::Model) -> serde_json::Value {
|
||||||
serde_json::Value::new_object()
|
serde_json::Value::new_object()
|
||||||
|
@ -47,15 +47,9 @@ pub fn ap_user(user: model::user::Model) -> serde_json::Value {
|
||||||
pub async fn view(
|
pub async fn view(
|
||||||
State(ctx) : State<Context>,
|
State(ctx) : State<Context>,
|
||||||
Path(id): Path<String>,
|
Path(id): Path<String>,
|
||||||
Query(rid): Query<RemoteId>,
|
|
||||||
) -> crate::Result<JsonLD<serde_json::Value>> {
|
) -> crate::Result<JsonLD<serde_json::Value>> {
|
||||||
// TODO can this be made less convoluted???
|
let uid = if id.starts_with('+') {
|
||||||
let uid = if id == "+" {
|
format!("https://{}", id.replacen('+', "", 1).replace('@', "/"))
|
||||||
if let Some(rid) = rid.id {
|
|
||||||
rid
|
|
||||||
} else {
|
|
||||||
return Err(UpubError::bad_request());
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
ctx.uid(id.clone())
|
ctx.uid(id.clone())
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue