From f9a6f5f6378b30e0b471eccdc012ea28f3ca8617 Mon Sep 17 00:00:00 2001 From: Mike Cao Date: Wed, 29 Jul 2020 00:16:02 -0700 Subject: [PATCH] Added summary stats query. --- components/WebsiteStats.js | 2 +- components/WebsiteSummary.js | 28 +++++++++++++++++++++------- lib/db.js | 30 ++++++++++++++++++++++++++++++ pages/api/website/[id]/summary.js | 12 ++++++++---- pages/index.js | 2 +- 5 files changed, 61 insertions(+), 13 deletions(-) diff --git a/components/WebsiteStats.js b/components/WebsiteStats.js index 0f3314a8..7896168a 100644 --- a/components/WebsiteStats.js +++ b/components/WebsiteStats.js @@ -33,7 +33,7 @@ export default function WebsiteStats({ websiteId, startDate, endDate, unit }) { return (
- +
); diff --git a/components/WebsiteSummary.js b/components/WebsiteSummary.js index fb8eb244..42e2c384 100644 --- a/components/WebsiteSummary.js +++ b/components/WebsiteSummary.js @@ -1,16 +1,30 @@ -import React from 'react'; +import React, { useState, useEffect } from 'react'; import MetricCard from './MetricCard'; +import { get } from '../lib/web'; import styles from './WebsiteSummary.module.css'; -function getTotal(data) { - return data.reduce((n, v) => n + v.y, 0); -} +export default function WebsiteSummary({ websiteId, startDate, endDate }) { + const [data, setData] = useState({}); + const { pageviews, uniques, bounces } = data; + + async function loadData() { + setData( + await get(`/api/website/${websiteId}/summary`, { + start_at: +startDate, + end_at: +endDate, + }), + ); + } + + useEffect(() => { + loadData(); + }, [startDate, endDate]); -export default function WebsiteSummary({ data }) { return (
- - + + +
); } diff --git a/lib/db.js b/lib/db.js index 198c52e2..b829c101 100644 --- a/lib/db.js +++ b/lib/db.js @@ -179,3 +179,33 @@ export async function getPageviewData( ), ); } + +export async function getSummary(website_id, start_at, end_at) { + return runQuery( + prisma.queryRaw( + ` + select + (select count(*) + from pageview + where website_id=${website_id} + and created_at between '${start_at}' and '${end_at}' + ) as "pageviews", + (select + count(distinct session_id) + from pageview + where website_id=${website_id} + and created_at between '${start_at}' and '${end_at}' + ) as "uniques", + (select sum(t.c) from + (select count(*) c + from pageview + where website_id=${website_id} + and created_at between '${start_at}' and '${end_at}' + group by session_id + having count(*) = 1 + ) t + ) as "bounces" + `, + ), + ); +} diff --git a/pages/api/website/[id]/summary.js b/pages/api/website/[id]/summary.js index b6d35dc3..a440b793 100644 --- a/pages/api/website/[id]/summary.js +++ b/pages/api/website/[id]/summary.js @@ -1,13 +1,17 @@ -import { getPageviews } from 'lib/db'; +import { getSummary } from 'lib/db'; import { useAuth } from 'lib/middleware'; +import { format } from 'date-fns'; export default async (req, res) => { await useAuth(req, res); - console.log(req.query); const { id, start_at, end_at } = req.query; - const pageviews = await getPageviews(+id, new Date(+start_at), new Date(+end_at)); + const summary = await getSummary( + +id, + format(new Date(+start_at), 'yyyy-MM-dd hh:mm:ss'), + format(new Date(+end_at), 'yyyy-MM-dd hh:mm:ss'), + ); - return res.status(200).json({ pageviews }); + return res.status(200).json(summary[0]); }; diff --git a/pages/index.js b/pages/index.js index 5804baa9..f99854d0 100644 --- a/pages/index.js +++ b/pages/index.js @@ -29,7 +29,7 @@ export default function HomePage({ username }) { } export async function getServerSideProps({ req, res }) { - const token = parse(req.headers.cookie)['umami.auth']; + const token = parse(req.headers.cookie || '')['umami.auth']; try { const payload = await verifySecureToken(token);