f50b4775a1
* Allow to follow/unfollow markets, backfill as well * remove yarn script edit * add decrement comment * Lint * Decrement follow count on unfollow * Follow/unfollow button logic * Unfollow/follow => heart * Add user to followers in place-bet and sell-shares * Add tracking * Show contract follow modal for first time following * Increment follower count as well * Remove add follow from bet trigger * restore on-create-bet * Add pubsub to dev.sh, show heart on FR, remove from answer trigger
76 lines
2.3 KiB
TypeScript
76 lines
2.3 KiB
TypeScript
import * as admin from 'firebase-admin'
|
|
|
|
import { initAdmin } from './script-init'
|
|
initAdmin()
|
|
|
|
import { getValues } from '../utils'
|
|
import { Contract } from 'common/lib/contract'
|
|
import { Comment } from 'common/lib/comment'
|
|
import { uniq } from 'lodash'
|
|
import { Bet } from 'common/lib/bet'
|
|
import {
|
|
DEV_HOUSE_LIQUIDITY_PROVIDER_ID,
|
|
HOUSE_LIQUIDITY_PROVIDER_ID,
|
|
} from 'common/lib/antes'
|
|
|
|
const firestore = admin.firestore()
|
|
|
|
async function backfillContractFollowers() {
|
|
console.log('Backfilling contract followers')
|
|
const contracts = await getValues<Contract>(
|
|
firestore.collection('contracts').where('isResolved', '==', false)
|
|
)
|
|
let count = 0
|
|
for (const contract of contracts) {
|
|
const comments = await getValues<Comment>(
|
|
firestore.collection('contracts').doc(contract.id).collection('comments')
|
|
)
|
|
const commenterIds = uniq(comments.map((comment) => comment.userId))
|
|
const betsSnap = await firestore
|
|
.collection(`contracts/${contract.id}/bets`)
|
|
.get()
|
|
const bets = betsSnap.docs.map((doc) => doc.data() as Bet)
|
|
// filter bets for only users that have an amount invested still
|
|
const bettorIds = uniq(bets.map((bet) => bet.userId))
|
|
const liquidityProviders = await firestore
|
|
.collection(`contracts/${contract.id}/liquidity`)
|
|
.get()
|
|
const liquidityProvidersIds = uniq(
|
|
liquidityProviders.docs.map((doc) => doc.data().userId)
|
|
// exclude free market liquidity provider
|
|
).filter(
|
|
(id) =>
|
|
id !== HOUSE_LIQUIDITY_PROVIDER_ID ||
|
|
id !== DEV_HOUSE_LIQUIDITY_PROVIDER_ID
|
|
)
|
|
const followerIds = uniq([
|
|
...commenterIds,
|
|
...bettorIds,
|
|
...liquidityProvidersIds,
|
|
contract.creatorId,
|
|
])
|
|
for (const followerId of followerIds) {
|
|
await firestore
|
|
.collection(`contracts/${contract.id}/follows`)
|
|
.doc(followerId)
|
|
.set({ id: followerId, createdTime: Date.now() })
|
|
}
|
|
// Perhaps handled by the trigger?
|
|
// const followerCount = followerIds.length
|
|
// await firestore
|
|
// .collection(`contracts`)
|
|
// .doc(contract.id)
|
|
// .update({ followerCount: followerCount })
|
|
count += 1
|
|
if (count % 100 === 0) {
|
|
console.log(`${count} contracts processed`)
|
|
}
|
|
}
|
|
}
|
|
|
|
if (require.main === module) {
|
|
backfillContractFollowers()
|
|
.then(() => process.exit())
|
|
.catch(console.log)
|
|
}
|