URL filter functionality.

This commit is contained in:
Mike Cao 2020-09-25 22:31:18 -07:00
parent 6bc371352c
commit 4fded49b03
27 changed files with 251 additions and 117 deletions

View file

@ -13,7 +13,7 @@ export const urlFilter = (data, { raw }) => {
const cleanUrl = url => {
try {
const { pathname, search } = new URL(url);
const { pathname, search } = new URL(url, location.origin);
if (search.startsWith('?/')) {
return `${pathname}${search}`;
@ -30,7 +30,7 @@ export const urlFilter = (data, { raw }) => {
return obj;
}
const url = cleanUrl(`http://x${x}`);
const url = cleanUrl(x);
if (url) {
if (!obj[url]) {

View file

@ -21,7 +21,7 @@ export async function runQuery(query) {
});
}
export async function rawQuery(query, ...params) {
export async function rawQuery(query, params) {
const db = getDatabase();
if (db !== POSTGRESQL && db !== MYSQL) {
@ -285,7 +285,15 @@ export async function createAccount(data) {
);
}
export function getMetrics(website_id, start_at, end_at) {
export function getMetrics(website_id, start_at, end_at, url) {
const params = [website_id, start_at, end_at];
let urlFilter = '';
if (url) {
urlFilter = `and url=$${params.length + 1}`;
params.push(decodeURIComponent(url));
}
return rawQuery(
`
select sum(t.c) as "pageviews",
@ -300,12 +308,11 @@ export function getMetrics(website_id, start_at, end_at) {
from pageview
where website_id=$1
and created_at between $2 and $3
${urlFilter}
group by 1, 2
) t
`,
website_id,
start_at,
end_at,
params,
);
}
@ -316,7 +323,16 @@ export function getPageviews(
timezone = 'utc',
unit = 'day',
count = '*',
url,
) {
const params = [website_id, start_at, end_at];
let urlFilter = '';
if (url) {
urlFilter = `and url=$${params.length + 1}`;
params.push(decodeURIComponent(url));
}
return rawQuery(
`
select ${getDateQuery('created_at', unit, timezone)} t,
@ -324,16 +340,23 @@ export function getPageviews(
from pageview
where website_id=$1
and created_at between $2 and $3
${urlFilter}
group by 1
order by 1
`,
website_id,
start_at,
end_at,
params,
);
}
export function getSessionMetrics(website_id, start_at, end_at, field) {
export function getSessionMetrics(website_id, start_at, end_at, field, url) {
const params = [website_id, start_at, end_at];
let urlFilter = '';
if (url) {
urlFilter = `and url=$${params.length + 1}`;
params.push(decodeURIComponent(url));
}
return rawQuery(
`
select ${field} x, count(*) y
@ -343,18 +366,29 @@ export function getSessionMetrics(website_id, start_at, end_at, field) {
from pageview
where website_id=$1
and created_at between $2 and $3
${urlFilter}
)
group by 1
order by 2 desc
`,
website_id,
start_at,
end_at,
params,
);
}
export function getPageviewMetrics(website_id, start_at, end_at, field, table, domain) {
const filter = domain ? `and ${field} not like '%${domain}%'` : '';
export function getPageviewMetrics(website_id, start_at, end_at, field, table, domain, url) {
const params = [website_id, start_at, end_at];
let domainFilter = '';
let urlFilter = '';
if (domain) {
domainFilter = `and referrer not like $${params.length + 1}`;
params.push(`%${domain}%`);
}
if (url) {
urlFilter = `and url=$${params.length + 1}`;
params.push(decodeURIComponent(url));
}
return rawQuery(
`
@ -362,18 +396,18 @@ export function getPageviewMetrics(website_id, start_at, end_at, field, table, d
from ${table}
where website_id=$1
and created_at between $2 and $3
${filter}
${domainFilter}
${urlFilter}
group by 1
order by 2 desc
`,
website_id,
start_at,
end_at,
params,
);
}
export function getActiveVisitors(website_id) {
const date = subMinutes(new Date(), 5);
const params = [website_id, date];
return rawQuery(
`
@ -382,12 +416,19 @@ export function getActiveVisitors(website_id) {
where website_id=$1
and created_at >= $2
`,
website_id,
date,
params,
);
}
export function getEvents(website_id, start_at, end_at, timezone = 'utc', unit = 'day') {
export function getEvents(website_id, start_at, end_at, timezone = 'utc', unit = 'day', url) {
const params = [website_id, start_at, end_at];
let urlFilter = '';
if (url) {
urlFilter = `and url=$${params.length + 1}`;
params.push(decodeURIComponent(url));
}
return rawQuery(
`
select
@ -397,11 +438,10 @@ export function getEvents(website_id, start_at, end_at, timezone = 'utc', unit =
from event
where website_id=$1
and created_at between $2 and $3
${urlFilter}
group by 1, 2
order by 2
`,
website_id,
start_at,
end_at,
params,
);
}

View file

@ -13,3 +13,18 @@ export function getDomainName(str) {
return str;
}
}
export function getQueryString(params) {
const map = Object.keys(params).reduce((arr, key) => {
if (params[key] !== undefined) {
return arr.concat(`${key}=${encodeURIComponent(params[key])}`);
}
return arr;
}, []);
if (map.length) {
return `?${map.join('&')}`;
}
return '';
}

View file

@ -1,3 +1,5 @@
import { getQueryString } from './url';
export const apiRequest = (method, url, body) =>
fetch(url, {
method,
@ -20,19 +22,9 @@ export const apiRequest = (method, url, body) =>
return null;
});
const parseQuery = (url, params = {}) => {
const query = Object.keys(params).reduce((values, key) => {
if (params[key] !== undefined) {
return values.concat(`${key}=${encodeURIComponent(params[key])}`);
}
return values;
}, []);
return query.length ? `${url}?${query.join('&')}` : url;
};
export const get = (url, params) => apiRequest('get', `${url}${getQueryString(params)}`);
export const get = (url, params) => apiRequest('get', parseQuery(url, params));
export const del = (url, params) => apiRequest('delete', parseQuery(url, params));
export const del = (url, params) => apiRequest('delete', `${url}${getQueryString(params)}`);
export const post = (url, params) => apiRequest('post', url, JSON.stringify(params));