This commit is contained in:
Emily
2024-06-22 15:08:16 +02:00
parent 3e36e23b37
commit 67c027d720
4 changed files with 19 additions and 56 deletions

View File

@@ -1,34 +1,19 @@
<script lang="ts" setup>
import { onMounted } from 'vue';
import dayjs from 'dayjs';
import DateService, { type Slice } from '@services/DateService';
const data = ref<number[]>([]);
const labels = ref<string[]>([]);
const ready = ref<boolean>(false);
const props = defineProps<{ slice: SliceName, referrer: string }>();
const activeProject = useActiveProject();
const props = defineProps<{ slice: Slice, referrer: string }>();
async function loadData() {
const response = await $fetch(`/api/metrics/${activeProject.value?._id.toString()}/timeline/referrers`, {
method: 'POST',
...signHeaders({ 'Content-Type': 'application/json' }),
body: JSON.stringify({
slice: 'hour',
from: Date.now() - 1000 * 60 * 60 * 12,
to: Date.now(),
referrer: props.referrer
})
});
const response = await useReferrersTimeline(props.referrer, props.slice);
if (!response) return;
data.value = response.map(e => e.count);
labels.value = response.map(e => dayjs(e._id).locale(navigator.language));
labels.value = response.map(e => DateService.getChartLabelFromISO(e._id, navigator.language, props.slice));
ready.value = true;
}
onMounted(async () => {

View File

@@ -17,7 +17,7 @@ export function useFirstInteractionData() {
}
export async function useTimeline(endpoint: 'visits' | 'sessions' | 'referrers', slice: Slice, fromDate?: string, toDate?: string) {
export async function useTimelineAdvanced(endpoint: string, slice: Slice, fromDate?: string, toDate?: string, customBody: Object = {}) {
const { from, to } = DateService.prepareDateRange(
fromDate || DateService.getDefaultRange(slice).from,
@@ -30,7 +30,7 @@ export async function useTimeline(endpoint: 'visits' | 'sessions' | 'referrers',
`/api/metrics/${activeProject.value?._id}/timeline/${endpoint}`, {
method: 'POST',
...signHeaders({ 'Content-Type': 'application/json' }),
body: JSON.stringify({ slice, from, to })
body: JSON.stringify({ slice, from, to, ...customBody })
});
return response as { _id: string, count: number }[];
@@ -38,6 +38,15 @@ export async function useTimeline(endpoint: 'visits' | 'sessions' | 'referrers',
}
export async function useTimeline(endpoint: 'visits' | 'sessions' | 'referrers', slice: Slice, fromDate?: string, toDate?: string) {
return await useTimelineAdvanced(endpoint, slice, fromDate, toDate, {});
}
export async function useReferrersTimeline(referrer: string, slice: Slice, fromDate?: string, toDate?: string) {
return await useTimelineAdvanced('referrers', slice, fromDate, toDate, { referrer });
}
export async function useTimelineDataRaw(timelineEndpointName: string, slice: SliceName) {
const activeProject = useActiveProject();

View File

@@ -13,14 +13,14 @@ export default defineEventHandler(async event => {
const project = await getUserProjectFromId(project_id, user);
if (!project) return;
const { slice, from, to } = await readBody(event);
const { slice, from, to, referrer } = await readBody(event);
if (!from) return setResponseStatus(event, 400, 'from is required');
if (!from) return setResponseStatus(event, 400, 'to is required');
if (!from) return setResponseStatus(event, 400, 'slice is required');
return await Redis.useCache({
key: `timeline:referrers:${project_id}:${slice}:${from || 'none'}:${to || 'none'}`,
key: `timeline:referrers:${referrer}:${project_id}:${slice}:${from || 'none'}:${to || 'none'}`,
exp: TIMELINE_EXPIRE_TIME
}, async () => {
const timelineData = await executeAdvancedTimelineAggregation({
@@ -28,7 +28,7 @@ export default defineEventHandler(async event => {
model: VisitModel,
from, to, slice,
customMatch: {
referrer: '$referrer'
referrer
}
});
const timelineFilledMerged = fillAndMergeTimelineAggregation(timelineData, slice);