Update queries to calculate correct metrics.

This commit is contained in:
Mike Cao 2020-09-25 00:15:58 -07:00
parent 1dfa6d8b16
commit a24bee815c
2 changed files with 43 additions and 21 deletions

View File

@ -333,12 +333,32 @@ export function getPageviews(
); );
} }
export function getRankings(website_id, start_at, end_at, type, table, domain) { export function getSessionMetrics(website_id, start_at, end_at, field) {
const filter = domain ? `and ${type} not like '%${domain}%'` : ''; return rawQuery(
`
select ${field} x, count(*) y
from session
where session_id in (
select session_id
from pageview
where website_id=$1
and created_at between $2 and $3
)
group by 1
order by 2 desc
`,
website_id,
start_at,
end_at,
);
}
export function getPageviewMetrics(website_id, start_at, end_at, field, table, domain) {
const filter = domain ? `and ${field} not like '%${domain}%'` : '';
return rawQuery( return rawQuery(
` `
select distinct ${type} x, count(*) y select ${field} x, count(*) y
from ${table} from ${table}
where website_id=$1 where website_id=$1
and created_at between $2 and $3 and created_at between $2 and $3

View File

@ -1,4 +1,4 @@
import { getRankings } from 'lib/queries'; import { getPageviewMetrics, getSessionMetrics } from 'lib/queries';
import { ok, badRequest, methodNotAllowed, unauthorized } from 'lib/response'; import { ok, badRequest, methodNotAllowed, unauthorized } from 'lib/response';
import { DOMAIN_REGEX } from 'lib/constants'; import { DOMAIN_REGEX } from 'lib/constants';
import { allowQuery } from 'lib/auth'; import { allowQuery } from 'lib/auth';
@ -33,21 +33,22 @@ export default async (req, res) => {
const { id, type, start_at, end_at, domain } = req.query; const { id, type, start_at, end_at, domain } = req.query;
if (domain && !DOMAIN_REGEX.test(domain)) {
return badRequest(res);
}
const websiteId = +id; const websiteId = +id;
const startDate = new Date(+start_at); const startDate = new Date(+start_at);
const endDate = new Date(+end_at); const endDate = new Date(+end_at);
if ( if (sessionColumns.includes(type)) {
type !== 'event' && const data = await getSessionMetrics(websiteId, startDate, endDate, type);
!sessionColumns.includes(type) &&
!pageviewColumns.includes(type) && return ok(res, data);
domain &&
DOMAIN_REGEX.test(domain)
) {
return badRequest(res);
} }
const rankings = await getRankings( if (type === 'event' || pageviewColumns.includes(type)) {
const data = await getPageviewMetrics(
websiteId, websiteId,
startDate, startDate,
endDate, endDate,
@ -56,7 +57,8 @@ export default async (req, res) => {
domain, domain,
); );
return ok(res, rankings); return ok(res, data);
}
} }
return methodNotAllowed(res); return methodNotAllowed(res);