Skip to content
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion db/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,4 @@
"mocha"
]
}
}
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
}
}

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ping @Goddhi

37 changes: 27 additions & 10 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion stats/bin/migrate.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@ import {

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please undo this change to keep the diff clean

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alright, noted

const pgPools = await getPgPools()
await migrateStatsDB(pgPools.stats)
await migrateEvaluateDB(pgPools.evaluate)
await migrateEvaluateDB(pgPools.evaluate)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
await migrateEvaluateDB(pgPools.evaluate)
await migrateEvaluateDB(pgPools.evaluate)

11 changes: 7 additions & 4 deletions stats/bin/spark-stats.js
Original file line number Diff line number Diff line change
@@ -1,23 +1,26 @@
import '../lib/instrument.js'
import { createApp } from '../lib/app.js'
import { getPgPools } from '@filecoin-station/spark-stats-db'

const {
PORT = '8080',
HOST = '127.0.0.1',
SPARK_API_BASE_URL = 'https://api.filspark.com/',
REQUEST_LOGGING = 'true'
REQUEST_LOGGING = 'true',
DATABASE_URL,
EVALUATE_DB_URL
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's add default values for both env variables:

Suggested change
DATABASE_URL,
EVALUATE_DB_URL
DATABASE_URL = 'postgres://localhost:5432/spark_stats',
EVALUATE_DB_URL = 'postgres://localhost:5432/spark_evaluate'

} = process.env

const pgPools = await getPgPools()

const app = await createApp({
SPARK_API_BASE_URL,
pgPools,
DATABASE_URL,
EVALUATE_DB_URL,
logger: {
level: ['1', 'true'].includes(REQUEST_LOGGING) ? 'info' : 'error'
}
})

console.log('Starting the http server on host %j port %s', HOST, PORT)
const baseUrl = app.listen({ port: Number(PORT), host: HOST })
console.log(baseUrl)

30 changes: 22 additions & 8 deletions stats/lib/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,41 @@ import * as Sentry from '@sentry/node'
import Fastify from 'fastify'
import cors from '@fastify/cors'
import urlData from '@fastify/url-data'
import fastifyPostgres from '@fastify/postgres'

import { addRoutes } from './routes.js'
import { addPlatformRoutes } from './platform-routes.js'

/** @typedef {import('@filecoin-station/spark-stats-db').PgPools} PgPools */
/** @typedef {import('./typings.js').DateRangeFilter} DateRangeFilter */

/**
* @param {object} args
* @param {string} args.SPARK_API_BASE_URL
* @param {import('@filecoin-station/spark-stats-db').PgPools} args.pgPools
* @param {Fastify.FastifyLoggerOptions} args.logger
* @returns
* @param {string} args.DATABASE_URL - Connection string for stats database
* @param {string} args.EVALUATE_DB_URL - Connection string for evaluate database
* @param {import('fastify').FastifyLoggerOptions} args.logger
* @returns {Promise<import('fastify').FastifyInstance>}
*/
export const createApp = ({

export const createApp = async ({
SPARK_API_BASE_URL,
pgPools,
DATABASE_URL,
EVALUATE_DB_URL,
logger
}) => {
const app = Fastify({ logger })
Sentry.setupFastifyErrorHandler(app)

await app.register(fastifyPostgres, {
connectionString: DATABASE_URL,
name: 'stats'
})

await app.register(fastifyPostgres, {
connectionString: EVALUATE_DB_URL,
name: 'evaluate',
})

app.register(cors, {
origin: [
'http://localhost:3000',
Expand All @@ -38,11 +51,12 @@ export const createApp = ({
]
})
app.register(urlData)
addRoutes(app, pgPools, SPARK_API_BASE_URL)
addPlatformRoutes(app, pgPools)
addRoutes(app, SPARK_API_BASE_URL)
addPlatformRoutes(app)
app.get('/', (request, reply) => {
reply.send('OK')
})

return app
}

22 changes: 11 additions & 11 deletions stats/lib/platform-routes.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,39 +14,39 @@ import { filterPreHandlerHook, filterOnSendHook } from './request-helpers.js'

/** @typedef {import('./typings.js').RequestWithFilter} RequestWithFilter */

export const addPlatformRoutes = (app, pgPools) => {

export const addPlatformRoutes = (app) => {
app.register(async app => {
app.addHook('preHandler', filterPreHandlerHook)
app.addHook('onSend', filterOnSendHook)

app.get('/stations/daily', async (/** @type {RequestWithFilter} */ request, reply) => {
reply.send(await fetchDailyStationCount(pgPools.evaluate, request.filter))
})
app.get('/stations/monthly', async (/** @type {RequestWithFilter} */ request, reply) => {
reply.send(await fetchMonthlyStationCount(pgPools.evaluate, request.filter))
reply.send(await fetchMonthlyStationCount(request.server.pg, request.filter))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
reply.send(await fetchMonthlyStationCount(request.server.pg, request.filter))
reply.send(await fetchMonthlyStationCount(request.server.pg.evaluate, request.filter))

We could also pass correct instance of the database instead of passing the pg object. In that case we don't need to change fetchers.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This throws an error reason why went with only the pg object, besides the fetcher functions expects full pg object and uses pg.stats or pg.evaluate interally.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What error does it throw?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ping @Goddhi

})
app.get('/stations/desktop/daily', async (/** @type {RequestWithFilter} */ request, reply) => {
reply.send(await fetchDailyDesktopUsers(pgPools.stats, request.filter))
reply.send(await fetchDailyDesktopUsers(request.server.pg, request.filter))
})
app.get('/measurements/daily', async (/** @type {RequestWithFilter} */ request, reply) => {
reply.send(await fetchDailyStationMeasurementCounts(pgPools.evaluate, request.filter))
reply.send(await fetchDailyStationMeasurementCounts(request.server.pg, request.filter))
})
app.get('/participants/top-measurements', async (/** @type {RequestWithFilter} */ request, reply) => {
reply.send(await fetchParticipantsWithTopMeasurements(pgPools.evaluate, request.filter))
reply.send(await fetchParticipantsWithTopMeasurements(request.server.pg, request.filter))
})
app.get('/participants/top-earning', async (/** @type {RequestWithFilter} */ request, reply) => {
reply.send(await fetchTopEarningParticipants(pgPools.stats, request.filter))
})
reply.send(await fetchTopEarningParticipants(request.server.pg, request.filter)) })

app.get('/participants/accumulative/daily', async (/** @type {RequestWithFilter} */ request, reply) => {
reply.send(await fetchAccumulativeDailyParticipantCount(pgPools.evaluate, request.filter))
reply.send(await fetchAccumulativeDailyParticipantCount(request.server.pg, request.filter))
})
app.get('/transfers/daily', async (/** @type {RequestWithFilter} */ request, reply) => {
reply.send(await fetchDailyRewardTransfers(pgPools.stats, request.filter))
reply.send(await fetchDailyRewardTransfers(request.server.pg, request.filter))
})
})

app.get('/participants/summary', async (request, reply) => {
reply.header('cache-control', `public, max-age=${24 * 3600 /* one day */}`)
reply.send(await fetchParticipantsSummary(pgPools.evaluate))
reply.send(await fetchParticipantsSummary(request.server.pg.evaluate))
})
}
Loading
Loading