fix: replies and context dont wrap obj with View
This commit is contained in:
parent
3baa8ed839
commit
35776558f1
2 changed files with 28 additions and 58 deletions
|
@ -1,10 +1,10 @@
|
||||||
pub mod replies;
|
pub mod replies;
|
||||||
pub mod context;
|
pub mod context;
|
||||||
|
|
||||||
use apb::{BaseMut, Object, ObjectMut, LD};
|
use apb::LD;
|
||||||
use axum::extract::{Path, Query, State};
|
use axum::extract::{Path, Query, State};
|
||||||
use sea_orm::{ColumnTrait, QueryFilter, TransactionTrait};
|
use sea_orm::{ColumnTrait, QueryFilter, TransactionTrait};
|
||||||
use upub::{model, selector::{BatchFillable, RichActivity}, traits::Fetcher, Context};
|
use upub::{model, selector::{BatchFillable, RichObject}, traits::Fetcher, Context};
|
||||||
|
|
||||||
use crate::{builders::JsonLD, AuthIdentity};
|
use crate::{builders::JsonLD, AuthIdentity};
|
||||||
|
|
||||||
|
@ -27,12 +27,10 @@ pub async fn view(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let replies_url = upub::url!(ctx, "/objects/{id}/replies");
|
let item = upub::Query::objects(auth.my_id())
|
||||||
|
|
||||||
let item_model = upub::Query::objects(auth.my_id())
|
|
||||||
.filter(auth.filter_objects())
|
.filter(auth.filter_objects())
|
||||||
.filter(model::object::Column::Id.eq(&oid))
|
.filter(model::object::Column::Id.eq(&oid))
|
||||||
.into_model::<RichActivity>()
|
.into_model::<RichObject>()
|
||||||
.one(ctx.db())
|
.one(ctx.db())
|
||||||
.await?
|
.await?
|
||||||
.ok_or_else(crate::ApiError::not_found)?
|
.ok_or_else(crate::ApiError::not_found)?
|
||||||
|
@ -43,17 +41,5 @@ pub async fn view(
|
||||||
.with_batched::<upub::model::hashtag::Entity>(ctx.db())
|
.with_batched::<upub::model::hashtag::Entity>(ctx.db())
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
let mut item = ctx.ap(item_model);
|
Ok(JsonLD(ctx.ap(item).ld_context()))
|
||||||
|
|
||||||
let replies_patched =
|
|
||||||
apb::Node::object(
|
|
||||||
item.replies()
|
|
||||||
.into_inner()
|
|
||||||
.unwrap()
|
|
||||||
.set_id(Some(replies_url))
|
|
||||||
);
|
|
||||||
|
|
||||||
item = item.set_replies(replies_patched);
|
|
||||||
|
|
||||||
Ok(JsonLD(item.ld_context()))
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
use apb::{BaseMut, CollectionMut, CollectionPageMut, LD};
|
use apb::{BaseMut, CollectionMut, LD};
|
||||||
use axum::extract::{Path, Query, State};
|
use axum::extract::{Path, Query, State};
|
||||||
use sea_orm::{ColumnTrait, ConnectionTrait, PaginatorTrait, QueryFilter, QuerySelect, SelectColumns};
|
use sea_orm::{ColumnTrait, PaginatorTrait, QueryFilter, QuerySelect};
|
||||||
use upub::{model, traits::Fetcher, Context};
|
use upub::{model, selector::RichObject, traits::Fetcher, Context};
|
||||||
|
|
||||||
use crate::{activitypub::{Pagination, TryFetch}, builders::JsonLD, ApiResult, AuthIdentity, Identity};
|
use crate::{activitypub::{Pagination, TryFetch}, builders::JsonLD, AuthIdentity};
|
||||||
|
|
||||||
pub async fn get(
|
pub async fn get(
|
||||||
State(ctx): State<Context>,
|
State(ctx): State<Context>,
|
||||||
|
@ -21,21 +21,18 @@ pub async fn get(
|
||||||
ctx.fetch_thread(&oid, ctx.db()).await?;
|
ctx.fetch_thread(&oid, ctx.db()).await?;
|
||||||
}
|
}
|
||||||
|
|
||||||
let replies_count = total_replies(&oid, &auth, ctx.db()).await?;
|
let total_replies = upub::Query::objects(None)
|
||||||
let replies_ids = replies_ids(&oid, &auth, ctx.db(), 20, 0).await?;
|
.filter(auth.filter_objects())
|
||||||
|
.filter(model::object::Column::InReplyTo.eq(&oid))
|
||||||
let first = apb::new()
|
.count(ctx.db())
|
||||||
.set_id(Some(upub::url!(ctx, "/objects/{id}/replies/page")))
|
.await?;
|
||||||
.set_collection_type(Some(apb::CollectionType::OrderedCollectionPage))
|
|
||||||
.set_next(apb::Node::link(upub::url!(ctx, "/objects/{id}/replies/page?offset=20")))
|
|
||||||
.set_ordered_items(apb::Node::links(replies_ids));
|
|
||||||
|
|
||||||
Ok(JsonLD(
|
Ok(JsonLD(
|
||||||
apb::new()
|
apb::new()
|
||||||
.set_id(Some(upub::url!(ctx, "/objects/{id}/replies")))
|
.set_id(Some(upub::url!(ctx, "/objects/{id}/replies")))
|
||||||
.set_collection_type(Some(apb::CollectionType::Collection))
|
.set_collection_type(Some(apb::CollectionType::Collection))
|
||||||
.set_total_items(Some(replies_count))
|
.set_total_items(Some(total_replies))
|
||||||
.set_first(apb::Node::object(first))
|
.set_first(apb::Node::link(upub::url!(ctx, "/objects/{id}/replies/page")))
|
||||||
.ld_context()
|
.ld_context()
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
@ -53,35 +50,22 @@ pub async fn page(
|
||||||
// TODO kinda weird ignoring this but its weirder to exclude replies from replies view...
|
// TODO kinda weird ignoring this but its weirder to exclude replies from replies view...
|
||||||
page.replies = Some(true);
|
page.replies = Some(true);
|
||||||
|
|
||||||
let replies_ids = replies_ids(&oid, &auth, ctx.db(), limit, offset).await?;
|
|
||||||
|
|
||||||
crate::builders::collection_page(
|
|
||||||
&page_id,
|
|
||||||
offset,
|
|
||||||
limit,
|
|
||||||
apb::Node::links(replies_ids)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
async fn replies_ids(oid: &str, auth: &Identity, db: &impl ConnectionTrait, limit: u64, offset: u64) -> ApiResult<Vec<String>> {
|
|
||||||
let res = upub::Query::objects(auth.my_id())
|
let res = upub::Query::objects(auth.my_id())
|
||||||
.limit(limit)
|
.limit(limit)
|
||||||
.offset(offset)
|
.offset(offset)
|
||||||
.filter(auth.filter_objects())
|
.filter(auth.filter_objects())
|
||||||
.filter(model::object::Column::InReplyTo.eq(oid))
|
.filter(model::object::Column::InReplyTo.eq(oid))
|
||||||
.select_only()
|
.into_model::<RichObject>()
|
||||||
.select_column(model::object::Column::Id)
|
.all(ctx.db())
|
||||||
.into_tuple::<String>()
|
.await?
|
||||||
.all(db)
|
.into_iter()
|
||||||
.await?;
|
.map(|x| ctx.ap(x))
|
||||||
Ok(res)
|
.collect();
|
||||||
}
|
|
||||||
|
|
||||||
async fn total_replies(oid: &str, auth: &Identity, db: &impl ConnectionTrait) -> ApiResult<u64> {
|
crate::builders::collection_page(
|
||||||
let count = upub::Query::objects(None)
|
&page_id,
|
||||||
.filter(auth.filter_objects())
|
offset,
|
||||||
.filter(model::object::Column::InReplyTo.eq(oid))
|
limit,
|
||||||
.count(db)
|
apb::Node::array(res)
|
||||||
.await?;
|
)
|
||||||
Ok(count)
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue