Allow filtering on session fields.

This commit is contained in:
Mike Cao 2022-04-10 03:51:43 -07:00
parent edd1645bab
commit fb2dc9f5ab
19 changed files with 275 additions and 211 deletions

View file

@ -37,7 +37,7 @@ export default function App({ Component, pageProps }) {
<link rel="mask-icon" href={`${basePath}/safari-pinned-tab.svg`} color="#5bbad5" />
<link
rel="preload"
href={`https://i.umami.is/umami.png?v=${version}`}
href={`https://i.umami.is/icon.png?v=${version}`}
as="image"
type="image/png"
/>

View file

@ -14,8 +14,9 @@ export default async (req, res) => {
return ok(res);
}
if (process.env.IGNORE_IP) {
const ips = process.env.IGNORE_IP.split(',').map(n => n.trim());
const ignoreIps = process.env.IGNORE_IP;
if (ignoreIps) {
const ips = ignoreIps.split(',').map(n => n.trim());
const ip = getIpAddress(req);
const blocked = ips.find(i => {
if (i === ip) return true;

View file

@ -33,22 +33,31 @@ export default async (req, res) => {
return unauthorized(res);
}
const { id, type, start_at, end_at, url, referrer } = req.query;
const { id, type, start_at, end_at, url, referrer, os, browser, device, country } = req.query;
const websiteId = +id;
const startDate = new Date(+start_at);
const endDate = new Date(+end_at);
if (sessionColumns.includes(type)) {
let data = await getSessionMetrics(websiteId, startDate, endDate, type, { url, referrer });
let data = await getSessionMetrics(websiteId, startDate, endDate, type, {
os,
browser,
device,
country,
});
if (type === 'language') {
let combined = {};
for (let { x, y } of data) {
x = String(x).toLowerCase().split('-')[0];
if (!combined[x]) combined[x] = { x, y };
else combined[x].y += y;
if (!combined[x]) {
combined[x] = { x, y };
} else {
combined[x].y += y;
}
}
data = Object.values(combined);
@ -77,8 +86,12 @@ export default async (req, res) => {
getTable(type),
{
domain,
url: type !== 'url' && url,
referrer,
url: type !== 'url' ? url : undefined,
referrer: type !== 'referrer' ? referrer : undefined,
os: type !== 'os' ? os : undefined,
browser: type !== 'browser' ? browser : undefined,
device: type !== 'device' ? device : undefined,
country: type !== 'country' ? country : undefined,
},
);

View file

@ -14,7 +14,8 @@ export default async (req, res) => {
return unauthorized(res);
}
const { id, start_at, end_at, unit, tz, url, referrer } = req.query;
const { id, start_at, end_at, unit, tz, url, referrer, os, browser, device, country } =
req.query;
const websiteId = +id;
const startDate = new Date(+start_at);
@ -25,10 +26,20 @@ export default async (req, res) => {
}
const [pageviews, sessions] = await Promise.all([
getPageviewStats(websiteId, startDate, endDate, tz, unit, '*', { url, referrer }),
getPageviewStats(websiteId, startDate, endDate, tz, unit, 'distinct session_id', {
getPageviewStats(websiteId, startDate, endDate, tz, unit, '*', {
url,
referrer,
os,
browser,
device,
country,
}),
getPageviewStats(websiteId, startDate, endDate, tz, unit, 'distinct pageview.session_id', {
url,
os,
browser,
device,
country,
}),
]);

View file

@ -11,7 +11,7 @@ export default async (req, res) => {
return unauthorized(res);
}
const { id, start_at, end_at, url, referrer } = req.query;
const { id, start_at, end_at, url, referrer, os, browser, device, country } = req.query;
const websiteId = +id;
const startDate = new Date(+start_at);
@ -21,10 +21,21 @@ export default async (req, res) => {
const prevStartDate = new Date(+start_at - distance);
const prevEndDate = new Date(+end_at - distance);
const metrics = await getWebsiteStats(websiteId, startDate, endDate, { url, referrer });
const metrics = await getWebsiteStats(websiteId, startDate, endDate, {
url,
referrer,
os,
browser,
device,
country,
});
const prevPeriod = await getWebsiteStats(websiteId, prevStartDate, prevEndDate, {
url,
referrer,
os,
browser,
device,
country,
});
const stats = Object.keys(metrics[0]).reduce((obj, key) => {