From 62c72b3ff93a5d291d74c4bc137c773e433d3e87 Mon Sep 17 00:00:00 2001 From: Emily Date: Tue, 8 Oct 2024 15:24:23 +0200 Subject: [PATCH] fix csv endpoint --- TODO | 8 +- dashboard/pages/dashboard/events.vue | 10 ++- dashboard/pages/dashboard/settings.vue | 74 ------------------- dashboard/pages/dashboard/visits.vue | 14 ++-- dashboard/pages/index.vue | 3 +- dashboard/server/api/project/generate_csv.ts | 18 ++--- dashboard/server/api/user/active_project.ts | 19 ----- .../server/api/user/set_active_project.ts | 24 ------ 8 files changed, 24 insertions(+), 146 deletions(-) delete mode 100644 dashboard/pages/dashboard/settings.vue delete mode 100644 dashboard/server/api/user/active_project.ts delete mode 100644 dashboard/server/api/user/set_active_project.ts diff --git a/TODO b/TODO index 2dadcf7..32c4a06 100644 --- a/TODO +++ b/TODO @@ -1,10 +1,8 @@ -- Fix devices Dashboard card, replace empty with "unkwnwn" -- Component first interaction must make the request inside -- Reactivity on project delete (update dropdown) -- Fix CSV Endpoint -- Devices remove empty +- Reactivity on project delete (update dropdown) + test guest + +- Devices remove empty (Fix devices Dashboard card, replace empty with "unkwnwn") - docs vertical navigation not wfull - project creation - Event funnel / metadata analyzer / user flow diff --git a/dashboard/pages/dashboard/events.vue b/dashboard/pages/dashboard/events.vue index 1dc3c78..341cb27 100644 --- a/dashboard/pages/dashboard/events.vue +++ b/dashboard/pages/dashboard/events.vue @@ -4,7 +4,7 @@ import type { MetricsCounts } from '~/server/api/metrics/[project_id]/counts'; definePageMeta({ layout: 'dashboard' }); -const {project} = useProject(); +const { project } = useProject(); const isPremium = computed(() => (project.value?.premium_type || 0) > 0); @@ -28,9 +28,9 @@ const itemsPerPage = 50; const totalItems = computed(() => metricsInfo.value); -const { data: tableData, pending: loadingData } = await useLazyFetch(() => +const { data: tableData, pending: loadingData } = await useFetch(() => `/api/metrics/${project.value?._id}/query?type=1&orderBy=${sort.value.column}&order=${sort.value.direction}&page=${page.value}&limit=${itemsPerPage}`, { - ...signHeaders(), + ...signHeaders(), lazy: true }) onMounted(async () => { @@ -42,7 +42,9 @@ const creatingCsv = ref(false); async function downloadCSV() { creatingCsv.value = true; - const result = await $fetch(`/api/project/generate_csv?mode=events&slice=${options.indexOf(selectedTimeFrom.value)}`, signHeaders()); + const result = await $fetch(`/api/project/generate_csv?mode=events&slice=${options.indexOf(selectedTimeFrom.value)}`, { + headers: useComputedHeaders({ useSnapshotDates: false }).value + }); const blob = new Blob([result as any], { type: 'text/csv' }); const url = window.URL.createObjectURL(blob); const a = document.createElement('a'); diff --git a/dashboard/pages/dashboard/settings.vue b/dashboard/pages/dashboard/settings.vue deleted file mode 100644 index e36b7f2..0000000 --- a/dashboard/pages/dashboard/settings.vue +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/dashboard/pages/dashboard/visits.vue b/dashboard/pages/dashboard/visits.vue index 5fb80e4..96e6be2 100644 --- a/dashboard/pages/dashboard/visits.vue +++ b/dashboard/pages/dashboard/visits.vue @@ -4,7 +4,7 @@ import type { MetricsCounts } from '~/server/api/metrics/[project_id]/counts'; definePageMeta({ layout: 'dashboard' }); -const {project} = useProject(); +const { project } = useProject(); const isPremium = computed(() => (project.value?.premium_type || 0) > 0); @@ -34,9 +34,9 @@ const itemsPerPage = 50; const totalItems = computed(() => metricsInfo.value); -const { data: tableData, pending: loadingData } = await useLazyFetch(() => +const { data: tableData, pending: loadingData } = await useFetch(() => `/api/metrics/${project.value?._id}/query?type=0&orderBy=${sort.value.column}&order=${sort.value.direction}&page=${page.value}&limit=${itemsPerPage}`, { - ...signHeaders(), + ...signHeaders(), lazy: true }) onMounted(async () => { @@ -49,7 +49,9 @@ const creatingCsv = ref(false); async function downloadCSV() { creatingCsv.value = true; - const result = await $fetch(`/api/project/generate_csv?mode=visits&slice=${options.indexOf(selectedTimeFrom.value)}`, signHeaders()); + const result = await $fetch(`/api/project/generate_csv?mode=visits&slice=${options.indexOf(selectedTimeFrom.value)}`, { + headers: useComputedHeaders({ useSnapshotDates: false }).value + }); const blob = new Blob([result as any], { type: 'text/csv' }); const url = window.URL.createObjectURL(blob); const a = document.createElement('a'); @@ -105,12 +107,12 @@ function goToUpgrade() { class="bg-[#57c78fc0] hover:bg-[#57c78fab] cursor-pointer text-text poppins font-semibold px-8 py-2 rounded-lg"> Download CSV - +
Upgrade plan for CSV -
+ diff --git a/dashboard/pages/index.vue b/dashboard/pages/index.vue index 70d3501..01d06a2 100644 --- a/dashboard/pages/index.vue +++ b/dashboard/pages/index.vue @@ -85,7 +85,8 @@ const showDashboard = computed(() => project.value && firstInteraction.data.valu -
+
Create your first project...
diff --git a/dashboard/server/api/project/generate_csv.ts b/dashboard/server/api/project/generate_csv.ts index 3ec6f30..09f2af9 100644 --- a/dashboard/server/api/project/generate_csv.ts +++ b/dashboard/server/api/project/generate_csv.ts @@ -1,8 +1,6 @@ -import { ProjectModel } from "@schema/ProjectSchema"; + import { UserModel } from "@schema/UserSchema"; -import { UserSettingsModel } from "@schema/UserSettings"; -import { EventModel } from '@schema/metrics/EventSchema'; import { VisitModel } from "@schema/metrics/VisitSchema"; import { google } from 'googleapis'; @@ -60,16 +58,10 @@ async function exportToGoogle(data: string, user_id: string) { export default defineEventHandler(async event => { - const userData = getRequestUser(event); - if (!userData?.logged) return setResponseStatus(event, 400, 'NotLogged'); + const data = await getRequestData(event, { requireSchema: false }); + if (!data) return; - const currentActiveProject = await UserSettingsModel.findOne({ user_id: userData.id }); - if (!currentActiveProject) return setResponseStatus(event, 400, 'You need to select a project'); - - const project_id = currentActiveProject.active_project_id; - - const project = await ProjectModel.findById(project_id); - if (!project) return setResponseStatus(event, 400, 'Project not found'); + const { project, project_id, user } = data; const PREMIUM_TYPE = project.premium_type; @@ -127,7 +119,7 @@ export default defineEventHandler(async event => { const isGoogle = getHeader(event, 'x-google-export'); if (isGoogle === 'true') { - const data = await exportToGoogle(result, userData.id); + const data = await exportToGoogle(result, user.id); return data; } diff --git a/dashboard/server/api/user/active_project.ts b/dashboard/server/api/user/active_project.ts deleted file mode 100644 index fe1b548..0000000 --- a/dashboard/server/api/user/active_project.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { AuthContext, AuthContextLogged } from "~/server/middleware/01-authorization"; -import { ProjectModel } from "@schema/ProjectSchema"; -import { UserSettingsModel } from "@schema/UserSettings"; - -export default defineEventHandler(async event => { - - const userData = getRequestUser(event); - if (!userData?.logged) return; - - const userSettings = await UserSettingsModel.findOne({ user_id: userData.id }, { - active_project_id: 1 - }); - - if (!userSettings) { - const projectOwned = await ProjectModel.findOne({ owner: userData.id }, { _id: 1 }); - return projectOwned?._id.toString(); - } - return userSettings?.active_project_id.toString(); -}); \ No newline at end of file diff --git a/dashboard/server/api/user/set_active_project.ts b/dashboard/server/api/user/set_active_project.ts deleted file mode 100644 index 6d6e9ae..0000000 --- a/dashboard/server/api/user/set_active_project.ts +++ /dev/null @@ -1,24 +0,0 @@ - -import { ProjectModel } from "@schema/ProjectSchema"; - -import { UserSettingsModel } from "@schema/UserSettings"; -import { hasAccessToProject } from "~/server/utils/hasAccessToProject"; - -export default defineEventHandler(async event => { - - if (!event.context) return; - - const userData = getRequestUser(event); - if (!userData?.logged) return; - - const { project_id } = getQuery(event); - - const [hasAccess] = await hasAccessToProject(userData.id, project_id as string); - - if (!hasAccess) return setResponseStatus(event, 400, 'No access to project'); - - await UserSettingsModel.updateOne({ user_id: userData.id }, { active_project_id: project_id }, { upsert: true }); - - return; - -}); \ No newline at end of file