diff --git a/dashboard/pages/test.vue b/dashboard/pages/test.vue index 9a6c7d1..8fbbc74 100644 --- a/dashboard/pages/test.vue +++ b/dashboard/pages/test.vue @@ -19,27 +19,48 @@ watch(selectedEventName, () => { getMetadataFields(); }); +watch(selectedMetadataField, () => { + getMetadataFieldGrouped(); +}); + async function getMetadataFields() { metadataFields.value = await $fetch(`/api/metrics/${activeProject.value?._id.toString()}/events/metadata_fields?name=${selectedEventName.value}`, signHeaders()); selectedMetadataField.value = undefined; + currentSearchText.value = ""; } async function getMetadataFieldGrouped() { + if (!selectedMetadataField.value) return; metadataFieldGrouped.value = await $fetch(`/api/metrics/${activeProject.value?._id.toString()}/events/metadata_field_group?name=${selectedEventName.value}&field=${selectedMetadataField.value}`, signHeaders()); } +const metadataFieldGroupedFiltered = computed(() => { + if (currentSearchText.value.length == 0) return metadataFieldGrouped.value; + return metadataFieldGrouped.value.filter(e => { + const currentId: string = e._id || ''; + const idToMatch = currentId.toLowerCase(); + return idToMatch.includes(currentSearchText.value.toLowerCase()); + }); +}); + +const currentSearchText = ref(""); + +const canSearch = computed(() => { + return selectedMetadataField.value != undefined; +}); + \ No newline at end of file diff --git a/dashboard/pages/test2.vue b/dashboard/pages/test2.vue new file mode 100644 index 0000000..dd70ce7 --- /dev/null +++ b/dashboard/pages/test2.vue @@ -0,0 +1,43 @@ + + + + \ No newline at end of file diff --git a/dashboard/server/api/metrics/[project_id]/events/flow_from_name.ts b/dashboard/server/api/metrics/[project_id]/events/flow_from_name.ts new file mode 100644 index 0000000..0a5cc0a --- /dev/null +++ b/dashboard/server/api/metrics/[project_id]/events/flow_from_name.ts @@ -0,0 +1,45 @@ + + +import { getUserProjectFromId } from "~/server/LIVE_DEMO_DATA"; +import { EventModel } from "@schema/metrics/EventSchema"; +import { EVENT_METADATA_FIELDS_EXPIRE_TIME, Redis } from "~/server/services/CacheService"; +import { PipelineStage } from "mongoose"; + + +export default defineEventHandler(async event => { + + const project_id = getRequestProjectId(event); + if (!project_id) return; + + const user = getRequestUser(event); + + const project = await getUserProjectFromId(project_id, user); + if (!project) return; + + const { name: eventName } = getQuery(event); + if (!eventName) return []; + + const aggregation: PipelineStage[] = [ + { $match: { project_id: project._id, name: eventName } }, + { $group: { _id: "$flowHash", count: { $sum: 1 } } }, + { $match: { _id: { $ne: null } } }, + { + $lookup: { + from: "visits", + let: { flowHash: "$_id" }, + pipeline: [ + { $match: { $expr: { $eq: ["$flowHash", "$$flowHash"] } } }, + { $group: { _id: "referrers", list: { $addToSet: "$referrer" } } }, + { $limit: 1 } + ], + as: "referrers" + } + } + ]; + + const flow: { _id: string, count: number, referrers: [{ list: string[] }] }[] = await EventModel.aggregate(aggregation); + + return flow; + + +}); diff --git a/dashboard/server/api/metrics/[project_id]/events/metadata_field_group.ts b/dashboard/server/api/metrics/[project_id]/events/metadata_field_group.ts index b511252..2b00366 100644 --- a/dashboard/server/api/metrics/[project_id]/events/metadata_field_group.ts +++ b/dashboard/server/api/metrics/[project_id]/events/metadata_field_group.ts @@ -2,6 +2,7 @@ import { getUserProjectFromId } from "~/server/LIVE_DEMO_DATA"; import { EventModel } from "@schema/metrics/EventSchema"; import { EVENT_METADATA_FIELDS_EXPIRE_TIME, Redis } from "~/server/services/CacheService"; +import { PipelineStage } from "mongoose"; export default defineEventHandler(async event => { @@ -17,14 +18,14 @@ export default defineEventHandler(async event => { const { name: eventName, field } = getQuery(event); if (!eventName || !field) return []; - const aggregation = [ + const aggregation: PipelineStage[] = [ { $match: { project_id: project._id, name: eventName } }, - { $group: { _id: `$metadata.${field}`, count: { $sum: 1 } } } + { $group: { _id: `$metadata.${field}`, count: { $sum: 1 } } }, + { $sort: { count: -1 } } ] const metadataGrouped = await EventModel.aggregate(aggregation); - console.log(metadataGrouped); return metadataGrouped;