import { GraphQLError } from 'graphql' import { withClause, intervalClause, timeUnit } from './growth' export default { Query: { referrals: async (parent, { when }, { models, me }) => { if (!me) { throw new GraphQLError('you must be logged in', { extensions: { code: 'UNAUTHENTICATED' } }) } const [{ totalSats }] = await models.$queryRawUnsafe(` SELECT COALESCE(FLOOR(sum(msats) / 1000), 0) as "totalSats" FROM "ReferralAct" WHERE ${intervalClause(when, 'ReferralAct', true)} "ReferralAct"."referrerId" = $1 `, Number(me.id)) const [{ totalReferrals }] = await models.$queryRawUnsafe(` SELECT count(*)::INTEGER as "totalReferrals" FROM users WHERE ${intervalClause(when, 'users', true)} "referrerId" = $1 `, Number(me.id)) const stats = await models.$queryRawUnsafe( `${withClause(when)} SELECT time, json_build_array( json_build_object('name', 'referrals', 'value', count(*) FILTER (WHERE act = 'REFERREE')), json_build_object('name', 'sats', 'value', FLOOR(COALESCE(sum(msats) FILTER (WHERE act IN ('BOOST', 'STREAM', 'FEE')), 0))) ) AS data FROM times LEFT JOIN ((SELECT "ReferralAct".created_at, "ReferralAct".msats / 1000.0 as msats, "ItemAct".act::text as act FROM "ReferralAct" JOIN "ItemAct" ON "ItemAct".id = "ReferralAct"."itemActId" WHERE ${intervalClause(when, 'ReferralAct', true)} "ReferralAct"."referrerId" = $1) UNION ALL (SELECT created_at, 0.0 as sats, 'REFERREE' as act FROM users WHERE ${intervalClause(when, 'users', true)} "referrerId" = $1)) u ON time = date_trunc('${timeUnit(when)}', u.created_at) GROUP BY time ORDER BY time ASC`, Number(me.id)) return { totalSats, totalReferrals, stats } } } }