Dashboard: Nuggets attention line counts uploads still open in the workflow and clears when finished; v2.21.0
Publish Container / build (push) Successful in 16m6s
Publish Container / build (push) Successful in 16m6s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
35d3c9ca33
commit
e6bef529e6
5 files changed
+19
-8
No files matched your search
@@ -2,6 +2,7 @@ import { Resend } from 'resend'
|
||||
import { readdir } from 'node:fs/promises'
|
||||
import { requireAdminAuth } from '../auth.js'
|
||||
import { buildSeasonCheck } from '../season-check.js'
|
||||
import { countPendingUploads } from './nuggets-workflow.js'
|
||||
import { state } from '../state.js'
|
||||
import { getStorageStatus, loadUserProgress } from '../data.js'
|
||||
import { getStudyCatalog } from '../study-helpers.js'
|
||||
@@ -152,6 +153,7 @@ async function buildNuggets() {
|
||||
const weekAgo = Date.now() - 7 * DAY_MS
|
||||
return {
|
||||
uploadsThisWeek: entries.filter(e => new Date(e.uploadedAt).getTime() >= weekAgo).length,
|
||||
pending: await countPendingUploads(),
|
||||
latest: entries.slice(0, 3).map(e => ({ hostName: e.hostName, episodeName: e.episodeName, uploadedAt: e.uploadedAt })),
|
||||
entries: entries.slice(0, 10),
|
||||
}
|
||||
@@ -236,7 +238,7 @@ export function register(app) {
|
||||
reengagement: buildReengagement(),
|
||||
studyProgress,
|
||||
latestEpisode,
|
||||
nuggets: { uploadsThisWeek: nuggets.uploadsThisWeek, latest: nuggets.latest },
|
||||
nuggets: { uploadsThisWeek: nuggets.uploadsThisWeek, pending: nuggets.pending, latest: nuggets.latest },
|
||||
health,
|
||||
lastBroadcast,
|
||||
comments: {
|
||||
|
||||
@@ -26,7 +26,7 @@ const AUDIO_TYPES = {
|
||||
|
||||
export const WORKFLOW_STEPS = ['listen', 'coldOpen', 'recordColdOpen', 'edit', 'spotify']
|
||||
|
||||
async function loadWorkflow() {
|
||||
export async function loadWorkflow() {
|
||||
try {
|
||||
return JSON.parse(await readFile(WORKFLOW_FILE, 'utf8'))
|
||||
} catch {
|
||||
@@ -34,7 +34,7 @@ async function loadWorkflow() {
|
||||
}
|
||||
}
|
||||
|
||||
function entryId(entry) {
|
||||
export function entryId(entry) {
|
||||
return createHash('sha1').update(`${entry.uploadedAt}|${entry.filename}`).digest('hex').slice(0, 16)
|
||||
}
|
||||
|
||||
@@ -51,6 +51,15 @@ function seafileConfigured() {
|
||||
return Boolean(SEAFILE_URL && SEAFILE_TOKEN && SEAFILE_NUGGETS_REPO_ID)
|
||||
}
|
||||
|
||||
// Portal uploads whose workflow still has steps left to do (any age, so an old one keeps showing).
|
||||
export async function countPendingUploads() {
|
||||
const [history, wf] = await Promise.all([loadHistory(), loadWorkflow()])
|
||||
return history.entries.filter(entry => {
|
||||
const steps = wf.items[entryId(entry)]?.steps ?? {}
|
||||
return !WORKFLOW_STEPS.every(step => steps[step])
|
||||
}).length
|
||||
}
|
||||
|
||||
export function register(app) {
|
||||
app.get('/api/admin/nuggets-workflow', requireAdminAuth, async (_req, res) => {
|
||||
const [history, wf] = await Promise.all([loadHistory(), loadWorkflow()])
|
||||
|
||||
Reference in new issue
Block a user