use crate::{
config::{Config, UrlKind},
data::State,
error::Error,
};
use super::{
CollectionResponse, Either, OrderedCollectionPageResponse, OrderedCollectionResponse, PageQuery,
};
use activitystreams::iri;
use actix_web::web::{Data, Json, Query};
pub(crate) async fn route(
config: Data<Config>,
state: Data<State>,
page_query: Option<Query<PageQuery>>,
) -> Result<Json<CollectionResponse>, Error> {
let following = config.generate_url(UrlKind::Following);
if let Some(Query(PageQuery { page })) = page_query {
let following_page = iri!(format!("{following}?page={page}"));
let ordered_items = state.db.connected_ids().await?;
Ok(Json(Either::Right(OrderedCollectionPageResponse {
context: Default::default(),
id: following_page,
_type: Default::default(),
total_items: ordered_items.len(),
part_of: following,
ordered_items,
})))
} else {
let following_page = iri!(format!("{following}?page=1"));
let total_items = state.db.connected_ids_length().await?;
Ok(Json(Either::Left(OrderedCollectionResponse {
context: Default::default(),
id: following,
_type: Default::default(),
total_items,
first: following_page,
})))
}
}