From 01888f2c520685b008b4cc3f6bea71e07c7ff3c3 Mon Sep 17 00:00:00 2001 From: Leon Date: Tue, 13 Jan 2026 12:23:58 +0100 Subject: [PATCH] feat: reset views & monthViews --- functions/index.js | 1 + functions/package-lock.json | 6 +++--- functions/src/cron.js | 40 +++++++++++++++++++++++++++++++++++++ functions/src/project.js | 4 ++++ 4 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 functions/src/cron.js diff --git a/functions/index.js b/functions/index.js index 253a26f..9e47734 100644 --- a/functions/index.js +++ b/functions/index.js @@ -50,3 +50,4 @@ exports.payouts = require('./src/payouts') exports.subscription = require('./src/subscription') exports.youtube = require('./src/youtube') exports.orders = require('./src/orders') +exports.cron = require('./src/cron') diff --git a/functions/package-lock.json b/functions/package-lock.json index 0b889e5..0e72c73 100644 --- a/functions/package-lock.json +++ b/functions/package-lock.json @@ -69,9 +69,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.0.tgz", - "integrity": "sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", "license": "MIT", "optional": true, "dependencies": { diff --git a/functions/src/cron.js b/functions/src/cron.js new file mode 100644 index 0000000..f3abda7 --- /dev/null +++ b/functions/src/cron.js @@ -0,0 +1,40 @@ +const { onSchedule } = require('firebase-functions/v2/scheduler') +const { db } = require('../index') + + +exports.resetMonthViews = onSchedule( + { + schedule: '0 0 1 * *', + timeZone: 'Europe/Paris', + timeoutSeconds: 540, + memory: '512MiB', + }, + async (event) => { + console.log('Starting monthly reset of project views...') + + const projectsRef = db.collection('projects') + const bulkWriter = db.bulkWriter() + + bulkWriter.onWriteError((error) => { + console.error('Failed to write document:', error.documentRef.path, error.error) + return false // Do not retry indefinitely for this use case + }) + + try { + const stream = projectsRef.stream() + + let count = 0 + for await (const doc of stream) { + const docRef = db.collection('projects').doc(doc.id) + + bulkWriter.update(docRef, { monthViews: 0 }) + count++ + } + + await bulkWriter.close() + console.log(`Successfully scheduled reset for ${count} projects.`) + } catch (error) { + console.error('Error in resetMonthViews:', error) + } + } +) diff --git a/functions/src/project.js b/functions/src/project.js index 0e63730..1a0e646 100644 --- a/functions/src/project.js +++ b/functions/src/project.js @@ -57,6 +57,9 @@ exports.onProjectWritten = onDocumentWritten('projects/{projectId}', async (proj .doc(projectId) .collection('monthlyListens') .doc(monthKey) + const projectsRef = refList.projects.doc(projectId) + + const totalsDocRef = refList.projectStreamStatsMonthlyTotals.doc(monthKey) await db.runTransaction(async (transaction) => { @@ -78,6 +81,7 @@ exports.onProjectWritten = onDocumentWritten('projects/{projectId}', async (proj } transaction.set(statsDocRef, updatePayload, { merge: true }) + transaction.set(projectsRef, { monthViews: FieldValue.increment(delta) }, { merge: true }) const totalsUpdatePayload = { monthKey,