Re-add events. Fix event_type queries.

pull/1733/head
Brian Cao 2023-01-04 13:06:24 -08:00
parent 10dabc60b6
commit 45cbc6a1af
6 changed files with 52 additions and 23 deletions

View File

@ -1,26 +1,29 @@
import { useState } from 'react'; import Arrow from 'assets/arrow-right.svg';
import { Column, Loading } from 'react-basics';
import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
import classNames from 'classnames'; import classNames from 'classnames';
import WebsiteChart from 'components/metrics/WebsiteChart'; import Link from 'components/common/Link';
import WorldMap from 'components/common/WorldMap'; import WorldMap from 'components/common/WorldMap';
import Page from 'components/layout/Page';
import GridRow from 'components/layout/GridRow'; import GridRow from 'components/layout/GridRow';
import MenuLayout from 'components/layout/MenuLayout'; import MenuLayout from 'components/layout/MenuLayout';
import Link from 'components/common/Link'; import Page from 'components/layout/Page';
import PagesTable from 'components/metrics/PagesTable';
import ReferrersTable from 'components/metrics/ReferrersTable';
import BrowsersTable from 'components/metrics/BrowsersTable'; import BrowsersTable from 'components/metrics/BrowsersTable';
import OSTable from 'components/metrics/OSTable';
import DevicesTable from 'components/metrics/DevicesTable';
import CountriesTable from 'components/metrics/CountriesTable'; import CountriesTable from 'components/metrics/CountriesTable';
import DevicesTable from 'components/metrics/DevicesTable';
import LanguagesTable from 'components/metrics/LanguagesTable'; import LanguagesTable from 'components/metrics/LanguagesTable';
import ScreenTable from 'components/metrics/ScreenTable'; import OSTable from 'components/metrics/OSTable';
import PagesTable from 'components/metrics/PagesTable';
import QueryParametersTable from 'components/metrics/QueryParametersTable'; import QueryParametersTable from 'components/metrics/QueryParametersTable';
import usePageQuery from 'hooks/usePageQuery'; import ReferrersTable from 'components/metrics/ReferrersTable';
import ScreenTable from 'components/metrics/ScreenTable';
import WebsiteChart from 'components/metrics/WebsiteChart';
import useApi from 'hooks/useApi'; import useApi from 'hooks/useApi';
import usePageQuery from 'hooks/usePageQuery';
import { DEFAULT_ANIMATION_DURATION } from 'lib/constants'; import { DEFAULT_ANIMATION_DURATION } from 'lib/constants';
import Arrow from 'assets/arrow-right.svg'; import { useState } from 'react';
import { Column, Loading } from 'react-basics';
import { FormattedMessage, defineMessages, useIntl } from 'react-intl';
import EventDataButton from './../common/EventDataButton';
import EventsChart from './../metrics/EventsChart';
import EventsTable from './../metrics/EventsTable';
import styles from './WebsiteDetails.module.css'; import styles from './WebsiteDetails.module.css';
const messages = defineMessages({ const messages = defineMessages({
@ -32,6 +35,7 @@ const messages = defineMessages({
devices: { id: 'metrics.devices', defaultMessage: 'Devices' }, devices: { id: 'metrics.devices', defaultMessage: 'Devices' },
countries: { id: 'metrics.countries', defaultMessage: 'Countries' }, countries: { id: 'metrics.countries', defaultMessage: 'Countries' },
languages: { id: 'metrics.languages', defaultMessage: 'Languages' }, languages: { id: 'metrics.languages', defaultMessage: 'Languages' },
events: { id: 'metrics.events', defaultMessage: 'Events' },
query: { id: 'metrics.query-parameters', defaultMessage: 'Query parameters' }, query: { id: 'metrics.query-parameters', defaultMessage: 'Query parameters' },
}); });
@ -44,6 +48,7 @@ const views = {
screen: ScreenTable, screen: ScreenTable,
country: CountriesTable, country: CountriesTable,
language: LanguagesTable, language: LanguagesTable,
event: EventsTable,
query: QueryParametersTable, query: QueryParametersTable,
}; };
@ -54,6 +59,7 @@ export default function WebsiteDetails({ websiteId }) {
); );
const [chartLoaded, setChartLoaded] = useState(false); const [chartLoaded, setChartLoaded] = useState(false);
const [countryData, setCountryData] = useState(); const [countryData, setCountryData] = useState();
const [eventsData, setEventsData] = useState();
const { const {
resolve, resolve,
query: { view }, query: { view },
@ -104,6 +110,10 @@ export default function WebsiteDetails({ websiteId }) {
label: formatMessage(messages.screens), label: formatMessage(messages.screens),
value: resolve({ view: 'screen' }), value: resolve({ view: 'screen' }),
}, },
{
label: formatMessage(messages.events),
value: resolve({ view: 'event' }),
},
{ {
label: formatMessage(messages.query), label: formatMessage(messages.query),
value: resolve({ view: 'query' }), value: resolve({ view: 'query' }),
@ -172,6 +182,15 @@ export default function WebsiteDetails({ websiteId }) {
<CountriesTable {...tableProps} onDataLoad={setCountryData} /> <CountriesTable {...tableProps} onDataLoad={setCountryData} />
</Column> </Column>
</GridRow> </GridRow>
<GridRow className={classNames({ [styles.hidden]: !eventsData?.length > 0 })}>
<Column xs={12} md={12} lg={4} defaultSize={4}>
<EventsTable {...tableProps} onDataLoad={setEventsData} />
</Column>
<Column xs={12} md={12} lg={8} defaultSize={8}>
<EventDataButton websiteId={websiteId} />
<EventsChart className={styles.eventschart} websiteId={websiteId} />
</Column>
</GridRow>
</> </>
)} )}
{view && chartLoaded && ( {view && chartLoaded && (

View File

@ -139,8 +139,8 @@ export default async (
startDate, startDate,
endDate, endDate,
column, column,
table,
filters, filters,
type,
}); });
return ok(res, data); return ok(res, data);

View File

@ -12,8 +12,8 @@ export async function getPageviewMetrics(
startDate: Date; startDate: Date;
endDate: Date; endDate: Date;
column: Prisma.WebsiteEventScalarFieldEnum | Prisma.SessionScalarFieldEnum; column: Prisma.WebsiteEventScalarFieldEnum | Prisma.SessionScalarFieldEnum;
table: string;
filters: object; filters: object;
type: string;
}, },
] ]
) { ) {
@ -30,11 +30,16 @@ async function relationalQuery(
endDate: Date; endDate: Date;
column: Prisma.WebsiteEventScalarFieldEnum | Prisma.SessionScalarFieldEnum; column: Prisma.WebsiteEventScalarFieldEnum | Prisma.SessionScalarFieldEnum;
filters: object; filters: object;
type: string;
}, },
) { ) {
const { startDate, endDate, column, filters = {} } = data; const { startDate, endDate, column, filters = {}, type } = data;
const { rawQuery, parseFilters } = prisma; const { rawQuery, parseFilters } = prisma;
const params = [startDate, endDate]; const params: any = [
startDate,
endDate,
type === 'event' ? EVENT_TYPE.customEvent : EVENT_TYPE.pageView,
];
const { filterQuery, joinSession } = parseFilters(filters, params); const { filterQuery, joinSession } = parseFilters(filters, params);
return rawQuery( return rawQuery(
@ -43,7 +48,7 @@ async function relationalQuery(
${joinSession} ${joinSession}
where website_id='${websiteId}' where website_id='${websiteId}'
and website_event.created_at between $1 and $2 and website_event.created_at between $1 and $2
and event_type = ${EVENT_TYPE.pageView} and event_type = $3
${filterQuery} ${filterQuery}
group by 1 group by 1
order by 2 desc`, order by 2 desc`,
@ -58,12 +63,17 @@ async function clickhouseQuery(
endDate: Date; endDate: Date;
column: Prisma.WebsiteEventScalarFieldEnum | Prisma.SessionScalarFieldEnum; column: Prisma.WebsiteEventScalarFieldEnum | Prisma.SessionScalarFieldEnum;
filters: object; filters: object;
type: string;
}, },
) { ) {
const { startDate, endDate, column, filters = {} } = data; const { startDate, endDate, column, filters = {}, type } = data;
const { rawQuery, parseFilters, getBetweenDates } = clickhouse; const { rawQuery, parseFilters, getBetweenDates } = clickhouse;
const website = await cache.fetchWebsite(websiteId); const website = await cache.fetchWebsite(websiteId);
const params = [websiteId, website?.revId || 0, EVENT_TYPE.pageView]; const params = [
websiteId,
website?.revId || 0,
type === 'event' ? EVENT_TYPE.customEvent : EVENT_TYPE.pageView,
];
const { filterQuery } = parseFilters(filters, params); const { filterQuery } = parseFilters(filters, params);
return rawQuery( return rawQuery(

View File

@ -32,7 +32,7 @@ async function clickhouseQuery(websites, startAt) {
created_at, created_at,
url url
from event from event
where event_name = '' where event_type = 1
and ${ and ${
websites && websites.length > 0 websites && websites.length > 0
? `website_id in (${getCommaSeparatedStringFormat(websites)})` ? `website_id in (${getCommaSeparatedStringFormat(websites)})`

View File

@ -58,7 +58,7 @@ async function clickhouseQuery(
from event as x from event as x
where website_id = $1 where website_id = $1
and rev_id = $2 and rev_id = $2
and event_name = '' and event_type = 1
and ${getBetweenDates('created_at', startDate, endDate)} and ${getBetweenDates('created_at', startDate, endDate)}
${filterQuery} ${filterQuery}
group by x group by x

View File

@ -67,7 +67,7 @@ async function clickhouseQuery(
min(created_at) min_time, min(created_at) min_time,
max(created_at) max_time max(created_at) max_time
from event from event
where event_name = '' where event_type = 1
and website_id = $1 and website_id = $1
and rev_id = $2 and rev_id = $2
and ${getBetweenDates('created_at', startDate, endDate)} and ${getBetweenDates('created_at', startDate, endDate)}