junobuild-cdn 0.7.1

CDN logic for serving assets in Juno, backed by a request-based storage process.
Documentation
use crate::proposals::errors::{
    JUNO_CDN_PROPOSALS_ERROR_CANNOT_DELETE_ASSETS,
    JUNO_CDN_PROPOSALS_ERROR_CANNOT_DELETE_ASSETS_INVALID_STATUS,
};
use crate::proposals::get_proposal;
use crate::proposals::workflows::assert::assert_known_proposal_type;
use crate::proposals::{Proposal, ProposalId, ProposalStatus};
use crate::storage::stable::{delete_asset, delete_content_chunks, get_assets};
use crate::strategies::CdnStableStrategy;

pub fn delete_proposal_assets(
    cdn_stable: &impl CdnStableStrategy,
    proposal_ids: &Vec<ProposalId>,
) -> Result<(), String> {
    for proposal_id in proposal_ids {
        let proposal = get_proposal(cdn_stable, proposal_id);

        match proposal {
            None => {
                return Err(JUNO_CDN_PROPOSALS_ERROR_CANNOT_DELETE_ASSETS.to_string());
            }
            Some(proposal) => secure_delete_proposal_assets(cdn_stable, proposal_id, &proposal)?,
        }
    }

    Ok(())
}

pub fn secure_delete_proposal_assets(
    cdn_stable: &impl CdnStableStrategy,
    proposal_id: &ProposalId,
    proposal: &Proposal,
) -> Result<(), String> {
    if proposal.status == ProposalStatus::Open {
        return Err(format!(
            "{} ({:?})",
            JUNO_CDN_PROPOSALS_ERROR_CANNOT_DELETE_ASSETS_INVALID_STATUS, proposal.status
        ));
    }

    assert_known_proposal_type(proposal)?;

    let assets = get_assets(cdn_stable, proposal_id);

    for (key, asset) in assets {
        for (_, encoding) in asset.encodings.iter() {
            delete_content_chunks(cdn_stable, &encoding.content_chunks);
        }

        delete_asset(cdn_stable, &key);
    }

    Ok(())
}