mirror of
https://github.com/umami-software/umami.git
synced 2026-02-09 07:07:17 +01:00
URL filter functionality.
This commit is contained in:
parent
6bc371352c
commit
4fded49b03
27 changed files with 251 additions and 117 deletions
|
|
@ -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]) {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
);
|
||||
}
|
||||
|
|
|
|||
15
lib/url.js
15
lib/url.js
|
|
@ -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 '';
|
||||
}
|
||||
|
|
|
|||
16
lib/web.js
16
lib/web.js
|
|
@ -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));
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue