* @param {object} ctx
*/
async getHistorySVG(res, ctx) {
- const _scope = _fileScope('getHist');
+ const _scope = _fileScope('getHistorySVG');
this.logger.debug(_scope, 'called', { ctx });
const days = Math.min(parseInt(ctx.queryParams.days) || this.options.manager.publishHistoryDays, 365);
const _scope = _fileScope('getTopicDetails');
this.logger.debug(_scope, 'called', { ctx });
-
- ctx.publishSpan = 60;
+ ctx.publishSpan = 60; // FIXME: configurable
const topicId = ctx.params.topicId;
let publishHistory;
await this.db.context(async (dbCtx) => {
publishHistory = await this.db.topicPublishHistory(dbCtx, topicId, ctx.publishSpan);
});
ctx.publishCount = publishHistory.reduce((a, b) => a + b, 0);
+ ctx.subscriptionsDelivered = ctx.subscriptions.filter((subscription) => {
+ return subscription.latestContentDelivered >= ctx.topic.contentUpdated;
+ }).length;
this.logger.debug(_scope, 'got topic details', { topic: ctx.topic, subscriptions: ctx.subscriptions, updates: ctx.publishCount });
// Profile users can only see related topics.
<img title="Topic Publish History" src="${ctx.params.topicId}/history.svg">
</section>`,
` <section class="subscriptions">
- <p>${ctx.subscriptions.length ? ctx.subscriptions.length : 'no'} subscription${(ctx.subscriptions.length === 1) ? '' : 's'}</p>
- <table>
+ <p>${ctx.subscriptions.length ? ctx.subscriptions.length : 'no'} subscription${(ctx.subscriptions.length === 1) ? '' : 's'}</p>`,
+ ...(ctx.subscriptions.length && [`
+ <label for="subscriptions-delivered">
+ Successful Deliveries of Latest Content
+ </label>
+ <progress id="subscriptions-delivered" max="${ctx.subscriptions.length}" value="${ctx.subscriptionsDelivered}">
+ ${ctx.subscriptionsDelivered} of ${ctx.subscriptions.length} (${Math.ceil(100 * ctx.subscriptions.length / ctx.subscriptionsDelivered)}%)
+ </progress>`] || []),
+ ` <table>
<thead>`,
th.renderSubscriptionRowHeader(),
` </thead>