Füge Unterstützung für QTTR-Listenaktualisierungen hinzu: Implementiere Push-Benachrichtigung für aktualisierte QTTR-Listen und verbessere die Importlogik.
This commit is contained in:
@@ -81,6 +81,7 @@ object HarheimerNotifications {
|
|||||||
"news", "news_expiring" -> Destinations.MemberNews.route
|
"news", "news_expiring" -> Destinations.MemberNews.route
|
||||||
"event", "events_today", "events_tomorrow" -> Destinations.Termine.route
|
"event", "events_today", "events_tomorrow" -> Destinations.Termine.route
|
||||||
"team_matches" -> Destinations.Spielplan.route
|
"team_matches" -> Destinations.Spielplan.route
|
||||||
|
"qttr_list_updated", "ttr_change" -> Destinations.Qttr.route
|
||||||
"birthdays" -> Destinations.MemberArea.route
|
"birthdays" -> Destinations.MemberArea.route
|
||||||
"contact_request" -> Destinations.CmsContactRequests.route
|
"contact_request" -> Destinations.CmsContactRequests.route
|
||||||
"user_registration" -> Destinations.CmsBenutzer.route
|
"user_registration" -> Destinations.CmsBenutzer.route
|
||||||
|
|||||||
@@ -334,6 +334,19 @@ export async function sendOwnTtrChangePush(changes = []) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function sendQttrListUpdatedPush({ importedAt, rowCount }) {
|
||||||
|
return sendPushToUsers({
|
||||||
|
title: 'QTTR-Liste aktualisiert',
|
||||||
|
body: `Die aktuelle TTR- und QTTR-Liste wurde aktualisiert (${rowCount} Einträge).`,
|
||||||
|
data: {
|
||||||
|
type: 'qttr_list_updated',
|
||||||
|
importedAt: importedAt || '',
|
||||||
|
notificationId: notificationIdFor(`qttr-list:${importedAt || Date.now()}`)
|
||||||
|
},
|
||||||
|
failureLabel: 'FCM QTTR-Listen-Push'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export async function sendTestPushToUser(userId) {
|
export async function sendTestPushToUser(userId) {
|
||||||
return sendPushToUsers({
|
return sendPushToUsers({
|
||||||
title: 'Harheimer TC: Push-Test',
|
title: 'Harheimer TC: Push-Test',
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { promises as fs } from 'fs'
|
import { promises as fs } from 'fs'
|
||||||
import { getServerDataPath } from './paths.js'
|
import { getServerDataPath } from './paths.js'
|
||||||
import { sendOwnTtrChangePush } from './push-notifications.js'
|
import { sendOwnTtrChangePush, sendQttrListUpdatedPush } from './push-notifications.js'
|
||||||
import { fetchClubRankings } from './mytischtennis-client.js'
|
import { fetchClubRankings } from './mytischtennis-client.js'
|
||||||
import { readMyTischtennisConnection, saveMyTischtennisConnection } from './mytischtennis-connection.js'
|
import { readMyTischtennisConnection, saveMyTischtennisConnection } from './mytischtennis-connection.js'
|
||||||
|
|
||||||
@@ -244,6 +244,8 @@ async function importAuthenticatedTtrValues(connection) {
|
|||||||
}).filter(row => row.playerName && (row.currentTtr != null || row.currentQttr != null))
|
}).filter(row => row.playerName && (row.currentTtr != null || row.currentQttr != null))
|
||||||
|
|
||||||
if (!rows.length) throw new Error('Keine verwertbaren TTR-Werte in der myTischtennis-Rangliste gefunden.')
|
if (!rows.length) throw new Error('Keine verwertbaren TTR-Werte in der myTischtennis-Rangliste gefunden.')
|
||||||
|
const previousQttrSignature = qttrListSignature(previousPayload.rows)
|
||||||
|
const nextQttrSignature = qttrListSignature(rows)
|
||||||
const importedAt = new Date().toISOString()
|
const importedAt = new Date().toISOString()
|
||||||
const payload = {
|
const payload = {
|
||||||
format: 'harheimertc.qttr.v2', importedAt,
|
format: 'harheimertc.qttr.v2', importedAt,
|
||||||
@@ -262,6 +264,21 @@ async function importAuthenticatedTtrValues(connection) {
|
|||||||
: []
|
: []
|
||||||
})
|
})
|
||||||
await sendOwnTtrChangePush(changes)
|
await sendOwnTtrChangePush(changes)
|
||||||
|
if (previousQttrSignature && previousQttrSignature !== nextQttrSignature) {
|
||||||
|
await sendQttrListUpdatedPush({ importedAt, rowCount: rows.length })
|
||||||
|
}
|
||||||
await saveMyTischtennisConnection({ ...connection, lastSuccessfulImportAt: importedAt, lastImportError: null })
|
await saveMyTischtennisConnection({ ...connection, lastSuccessfulImportAt: importedAt, lastImportError: null })
|
||||||
return { outputFile: OUTPUT_FILE, tableCount: 1, ...payload }
|
return { outputFile: OUTPUT_FILE, tableCount: 1, ...payload }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function qttrListSignature(rows) {
|
||||||
|
if (!Array.isArray(rows) || rows.length === 0) return ''
|
||||||
|
return rows
|
||||||
|
.map(row => [
|
||||||
|
String(row?.playerName || '').trim().toLocaleLowerCase('de-DE'),
|
||||||
|
row?.rank ?? '',
|
||||||
|
row?.currentQttr ?? ''
|
||||||
|
].join('|'))
|
||||||
|
.sort()
|
||||||
|
.join('\n')
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user