From 9ae64204ce49a1caecda16f838cfea22ffaf5f3b Mon Sep 17 00:00:00 2001 From: Emily Date: Mon, 10 Jun 2024 23:00:40 +0200 Subject: [PATCH] add csv for visits --- dashboard/pages/dashboard/visits.vue | 31 +++++++++++-- dashboard/server/api/project/generate_csv.ts | 48 +++++++++++++++----- 2 files changed, 65 insertions(+), 14 deletions(-) diff --git a/dashboard/pages/dashboard/visits.vue b/dashboard/pages/dashboard/visits.vue index 50e317c..e29c0d8 100644 --- a/dashboard/pages/dashboard/visits.vue +++ b/dashboard/pages/dashboard/visits.vue @@ -12,10 +12,11 @@ const columns = [ { key: 'website', label: 'Website', sortable: true }, { key: 'page', label: 'Page', sortable: true }, { key: 'referrer', label: 'Referrer', sortable: true }, - { key: 'session', label: 'Session', sortable: true }, { key: 'browser', label: 'Browser', sortable: true }, { key: 'os', label: 'OS', sortable: true }, - { key: 'screen', label: 'Screen', sortable: true }, + { key: 'continent', label: 'Continent', sortable: true }, + { key: 'country', label: 'Country', sortable: true }, + { key: 'device', label: 'Device', sortable: true }, { key: 'created_at', label: 'Date', sortable: true } ] @@ -42,6 +43,23 @@ onMounted(async () => { }); +const creatingCsv = ref(false); + +async function downloadCSV() { + creatingCsv.value = true; + const result = await $fetch(`/api/project/generate_csv?mode=visits`, signHeaders()); + const blob = new Blob([result], { type: 'text/csv' }); + const url = window.URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = 'ReportVisits.csv'; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + window.URL.revokeObjectURL(url); + creatingCsv.value = false; +} + @@ -50,8 +68,15 @@ onMounted(async () => {
+
+
+ Creating csv... +
+
+
-
Download CSV
diff --git a/dashboard/server/api/project/generate_csv.ts b/dashboard/server/api/project/generate_csv.ts index a737fa0..027b5f7 100644 --- a/dashboard/server/api/project/generate_csv.ts +++ b/dashboard/server/api/project/generate_csv.ts @@ -2,6 +2,7 @@ import { ProjectModel } from "@schema/ProjectSchema"; import { UserSettingsModel } from "@schema/UserSettings"; import { EventModel } from '@schema/metrics/EventSchema'; +import { VisitModel } from "@schema/metrics/VisitSchema"; export default defineEventHandler(async event => { @@ -17,20 +18,45 @@ export default defineEventHandler(async event => { const project = await ProjectModel.findById(project_id); if (!project) return setResponseStatus(event, 400, 'Project not found'); + const { mode } = getQuery(event); - const eventsReportData = await EventModel.find({ - project_id: project._id, - created_at: { $gt: Date.now() - 1000 * 60 * 60 * 24 * 7 + 30 } - }); + if (mode === 'visits') { - const csvLines: string[][] = [['name']]; - eventsReportData.forEach(e => { - csvLines.push([e.name]) - }); + const visistsReportData = await VisitModel.find({ + project_id, + created_at: { + $gt: Date.now() - 1000 * 60 * 60 * 24 * 7 + } + }); - return csvLines.map(row => { - return row.join(','); - }).join('\n'); + const csvHeader = [ + "browser", + "os", + "continent", + "country", + "device", + "website", + "page", + "referrer", + "created_at", + ]; + + + const lines: any[] = []; + visistsReportData.forEach(line => lines.push(line.toJSON())); + + const result = csvHeader.join(',') + '\n' + lines.map(element => { + const content: string[] = []; + for (const key of csvHeader) { + content.push(element[key]); + } + return content.join(','); + }).join('\n'); + + return result; + } else { + return ''; + } }); \ No newline at end of file