From 0b9ebf4cdb5dceb0f584fdc33c435df7a1ec4466 Mon Sep 17 00:00:00 2001 From: James Grugett Date: Sun, 28 Aug 2022 17:36:26 -0500 Subject: [PATCH] Script to back fill unique bettors in all contracts --- .../src/scripts/backfill-unique-bettors.ts | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 functions/src/scripts/backfill-unique-bettors.ts diff --git a/functions/src/scripts/backfill-unique-bettors.ts b/functions/src/scripts/backfill-unique-bettors.ts new file mode 100644 index 00000000..35faa54a --- /dev/null +++ b/functions/src/scripts/backfill-unique-bettors.ts @@ -0,0 +1,39 @@ +import * as admin from 'firebase-admin' +import { initAdmin } from './script-init' +import { getValues, log, writeAsync } from '../utils' +import { Bet } from '../../../common/bet' +import { groupBy, mapValues, sortBy, uniq } from 'lodash' + +initAdmin() +const firestore = admin.firestore() + +const getBettorsByContractId = async () => { + const bets = await getValues(firestore.collectionGroup('bets')) + log(`Loaded ${bets.length} bets.`) + const betsByContractId = groupBy(bets, 'contractId') + return mapValues(betsByContractId, (bets) => + uniq(sortBy(bets, 'createdTime').map((bet) => bet.userId)) + ) +} + +const updateUniqueBettors = async () => { + const bettorsByContractId = await getBettorsByContractId() + + const updates = Object.entries(bettorsByContractId).map( + ([contractId, userIds]) => { + const update = { + uniqueBettorIds: userIds, + uniqueBettorCount: userIds.length, + } + const docRef = firestore.collection('contracts').doc(contractId) + return { doc: docRef, fields: update } + } + ) + log(`Updating ${updates.length} contracts.`) + await writeAsync(firestore, updates) + log(`Updated all contracts.`) +} + +if (require.main === module) { + updateUniqueBettors() +}