use axum::extract::{Path, Query, State}; use sea_orm::{ColumnTrait, Condition, PaginatorTrait, QueryFilter}; use crate::{model, routes::activitypub::{JsonLD, Pagination, TryFetch}, server::{auth::AuthIdentity, fetcher::Fetcher, Context}, url}; pub async fn get( State(ctx): State<Context>, Path(id): Path<String>, AuthIdentity(auth): AuthIdentity, Query(q): Query<TryFetch>, ) -> crate::Result<JsonLD<serde_json::Value>> { let replies_id = url!(ctx, "/objects/{id}/replies"); let oid = ctx.oid(&id); if auth.is_local() && q.fetch { ctx.fetch_thread(&oid).await?; } let count = model::addressing::Entity::find_addressed(auth.my_id()) .filter(auth.filter_condition()) .filter(model::object::Column::InReplyTo.eq(oid)) .count(ctx.db()) .await?; crate::server::builders::collection(&replies_id, Some(count)) } pub async fn page( State(ctx): State<Context>, Path(id): Path<String>, Query(page): Query<Pagination>, AuthIdentity(auth): AuthIdentity, ) -> crate::Result<JsonLD<serde_json::Value>> { let page_id = url!(ctx, "/objects/{id}/replies/page"); let oid = ctx.oid(&id); crate::server::builders::paginate( page_id, Condition::all() .add(auth.filter_condition()) .add(model::object::Column::InReplyTo.eq(oid)), ctx.db(), page, auth.my_id(), false, ) .await }