fix: replies and context dont wrap obj with View

This commit is contained in:
əlemi 2024-12-26 17:15:29 +01:00
parent 3baa8ed839
commit 35776558f1
Signed by: alemi
GPG key ID: A4895B84D311642C
2 changed files with 28 additions and 58 deletions

View file

@ -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()))
} }

View file

@ -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)
} }