Closer/functions/src/index.ts

65 lines
3.4 KiB
TypeScript

// Global v2 options (region pin, instance cap) — MUST be imported before any function module so
// setGlobalOptions runs before the functions below are defined.
import './options'
import * as admin from 'firebase-admin'
// Initialize the Admin SDK once for every function in this codebase.
// Handlers call admin.firestore()/messaging() lazily at invocation time, so a
// single idempotent init here is sufficient and avoids "already exists" errors.
if (admin.apps.length === 0) {
admin.initializeApp()
}
// RevenueCat entitlement webhook. Auth = HMAC-SHA256 over the raw body (see revenueCatWebhook.ts).
// Binds defineSecret('REVENUECAT_WEBHOOK_SECRET') — the integration's signing secret from the
// RevenueCat dashboard — which is validated for the whole codebase at deploy time, so the secret
// must exist before any deploy. Seed it with:
// firebase functions:secrets:set REVENUECAT_WEBHOOK_SECRET
export { revenueCatWebhook } from './billing/revenueCatWebhook'
export { syncEntitlement } from './billing/syncEntitlement'
export { onEntitlementChanged } from './billing/onEntitlementChanged'
export { sendGentleReminderCallable } from './notifications/sendGentleReminderCallable'
export { sendThinkingOfYouCallable } from './notifications/sendThinkingOfYouCallable'
export {
sendChallengeDayReminders,
unlockDueMemoryCapsules,
} from './notifications/gameRetention'
export { sendDailyQuestionProactiveReminder } from './notifications/dailyQuestionReminder'
export { sendStreakReminder } from './notifications/streakReminder'
export { sendReengagementReminder } from './notifications/reengagement'
export { checkDeviceIntegrity } from './security/checkDeviceIntegrity'
export { notifyOnDateMatch } from './dates/createDateMatch'
export { onDateReflectionWritten } from './dates/onDateReflectionWritten'
export { onDateReflectionRevealed } from './dates/onDateReflectionRevealed'
export { onDateHistoryCreated } from './dates/onDateHistoryCreated'
export { onRestoreRequested, onRestoreFulfilled } from './backup/onRestoreRequested'
export {
assignDailyQuestion,
assignDailyQuestionCallable,
} from './questions/assignDailyQuestion'
export { onAnswerWritten } from './questions/onAnswerWritten'
export { onAnswerRevealed } from './questions/onAnswerRevealed'
export { onMessageWritten } from './questions/onMessageWritten'
export { onCoupleLeave } from './couples/onCoupleLeave'
export { leaveCoupleCallable } from './couples/leaveCoupleCallable'
export { acceptInviteCallable } from './couples/acceptInviteCallable'
export { createInviteCallable } from './couples/createInviteCallable'
export { submitOutcomeCallable } from './couples/submitOutcomeCallable'
export { aggregateOutcomeStats } from './couples/aggregateOutcomes'
export { scheduledOutcomesReminder } from './couples/scheduledOutcomesReminder'
export { onUserDelete } from './users/onUserDelete'
export {
onGameSessionUpdate,
onThisOrThatPartFinished,
onWheelPartFinished,
onHowWellPartFinished,
onDesireSyncPartFinished,
} from './games/onGameSessionUpdate'
export { wrapReleaseKeyCallable } from './releaseKey/wrapReleaseKeyCallable'
// NOTE (security review Batch 2): the unauthenticated public `health` HTTP endpoint
// was removed to shrink attack surface. Deployment can be verified via
// `firebase functions:list`. If an uptime probe is ever needed, re-add it behind
// auth / a shared secret rather than as an open endpoint.