ap-relay 0.3.129

A simple activitypub relay
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,
        })))
    }
}