junobuild-cdn 0.7.2

CDN logic for serving assets in Juno, backed by a request-based storage process.
Documentation
use crate::proposals::state::stable::list_proposals as list_proposals_stable;
use crate::proposals::{count_proposals, ListProposalResults, ListProposalsParams};
use crate::strategies::CdnStableStrategy;
use std::cmp::Reverse;

const FIRST_PROPOSAL_ID: u128 = 1;

const DEFAULT_MAX_PROPOSALS: u128 = 100;

pub fn list_proposals(
    cdn_stable: &impl CdnStableStrategy,
    ListProposalsParams { paginate, order }: &ListProposalsParams,
) -> ListProposalResults {
    let desc = order.as_ref().map(|order| order.desc).unwrap_or(false);
    let limit = paginate
        .as_ref()
        .and_then(|p| p.limit)
        .unwrap_or(DEFAULT_MAX_PROPOSALS);

    let filters = match (paginate, desc) {
        (None, false) => {
            let start = FIRST_PROPOSAL_ID;
            let end = start.saturating_add(DEFAULT_MAX_PROPOSALS);
            (start, end)
        }

        (None, true) => {
            let end = u128::try_from(count_proposals(cdn_stable))
                .unwrap_or(u128::MAX)
                .saturating_add(1);
            let start = end.saturating_sub(DEFAULT_MAX_PROPOSALS);
            (start, end)
        }

        (Some(paginate), false) => {
            let start = paginate
                .start_after
                .as_ref()
                .map(|proposal_id| proposal_id.saturating_add(1))
                .unwrap_or(FIRST_PROPOSAL_ID);
            let end = start.saturating_add(limit);
            (start, end)
        }

        (Some(paginate), true) => {
            let end = paginate.start_after.unwrap_or(
                u128::try_from(count_proposals(cdn_stable))
                    .unwrap_or(u128::MAX)
                    .saturating_add(1),
            );
            let start = end.saturating_sub(limit);
            (start, end)
        }
    };

    let mut proposals = list_proposals_stable(cdn_stable, &filters);

    if desc {
        proposals.items.sort_by_key(|b| Reverse(b.0.proposal_id));
    }

    proposals
}