60 lines
1.4 KiB
TypeScript
60 lines
1.4 KiB
TypeScript
|
import * as functions from 'firebase-functions'
|
||
|
import * as admin from 'firebase-admin'
|
||
|
import * as _ from 'lodash'
|
||
|
|
||
|
import { getValues } from './utils'
|
||
|
import { Contract } from '../../common/contract'
|
||
|
import { getProbability } from '../../common/calculate'
|
||
|
|
||
|
const cache = { lastUpdated: 0, data: '' }
|
||
|
|
||
|
export const markets = functions
|
||
|
.runWith({ minInstances: 1 })
|
||
|
.https.onRequest(async (req, res) => {
|
||
|
const contracts: Contract[] = await getValues(
|
||
|
firestore.collection('contracts').orderBy('volume24Hours', 'desc')
|
||
|
)
|
||
|
|
||
|
if (!cache.data || Date.now() - cache.lastUpdated > 120 * 1000) {
|
||
|
const contractsInfo = contracts.map(getContractInfo)
|
||
|
cache.data = JSON.stringify(contractsInfo)
|
||
|
cache.lastUpdated = Date.now()
|
||
|
}
|
||
|
|
||
|
res.status(200).send(cache.data)
|
||
|
})
|
||
|
|
||
|
const getContractInfo = ({
|
||
|
creatorUsername,
|
||
|
creatorName,
|
||
|
createdTime,
|
||
|
closeTime,
|
||
|
question,
|
||
|
description,
|
||
|
slug,
|
||
|
pool,
|
||
|
startPool,
|
||
|
volume7Days,
|
||
|
volume24Hours,
|
||
|
isResolved,
|
||
|
resolution,
|
||
|
}: Contract) => {
|
||
|
return {
|
||
|
creatorUsername,
|
||
|
creatorName,
|
||
|
createdTime,
|
||
|
closeTime,
|
||
|
question,
|
||
|
description,
|
||
|
url: `https://manifold.markets/${creatorUsername}/${slug}`,
|
||
|
pool: pool.YES + pool.NO - startPool.YES - startPool.NO,
|
||
|
probability: getProbability(pool),
|
||
|
volume7Days,
|
||
|
volume24Hours,
|
||
|
isResolved,
|
||
|
resolution,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const firestore = admin.firestore()
|