use crate::{
QueryProgress,
progress::IgnoreQueryProgress,
sns::report::{
SnsHostError, SnsSnapshotRefreshReport, SnsSnapshotRefreshRequest,
cache_refresh::{publish_complete_sns_snapshot, run_resolved_sns_snapshot_refresh},
live::LiveSnsSource,
proposals_cache::{
collection::fetch_complete_sns_proposals, paths::SnsProposalsCacheCollection,
},
source::SnsProposalsSource,
},
};
pub const DEFAULT_SNS_PROPOSALS_REFRESH_LOCK_STALE_SECONDS: u64 = 30 * 60;
pub async fn refresh_sns_proposals_cache(
request: &SnsSnapshotRefreshRequest,
) -> Result<SnsSnapshotRefreshReport, SnsHostError> {
refresh_sns_proposals_cache_with_source(request, &LiveSnsSource::default()).await
}
pub async fn refresh_sns_proposals_cache_with_progress(
request: &SnsSnapshotRefreshRequest,
progress: &mut dyn QueryProgress,
) -> Result<SnsSnapshotRefreshReport, SnsHostError> {
refresh_sns_proposals_cache_with_source_and_progress(
request,
&LiveSnsSource::default(),
progress,
)
.await
}
pub async fn refresh_sns_proposals_cache_with_source(
request: &SnsSnapshotRefreshRequest,
source: &dyn SnsProposalsSource,
) -> Result<SnsSnapshotRefreshReport, SnsHostError> {
let mut progress = IgnoreQueryProgress;
refresh_sns_proposals_cache_with_source_and_progress(request, source, &mut progress).await
}
pub(in crate::sns::report) async fn refresh_sns_proposals_cache_with_source_and_progress(
request: &SnsSnapshotRefreshRequest,
source: &dyn SnsProposalsSource,
progress: &mut dyn QueryProgress,
) -> Result<SnsSnapshotRefreshReport, SnsHostError> {
run_resolved_sns_snapshot_refresh::<SnsProposalsCacheCollection, _>(
request,
source,
DEFAULT_SNS_PROPOSALS_REFRESH_LOCK_STALE_SECONDS,
async |context| {
let complete =
fetch_complete_sns_proposals(context.refresh_context(), source, progress).await?;
publish_complete_sns_snapshot(
context,
crate::sns::report::proposals_cache::SNS_PROPOSALS_CACHE_SCHEMA_VERSION,
complete.page_count,
complete.rows.len(),
complete.last_cursor,
crate::sns::report::proposals_cache::model::SnsProposalsCacheRows {
proposals: complete.rows,
},
)
},
)
.await
}