From e1dfc5fa1c55bf2ad91e5154896f360b9c5d74c0 Mon Sep 17 00:00:00 2001 From: Emily Date: Tue, 11 Jun 2024 18:17:22 +0200 Subject: [PATCH] add limit banner --- dashboard/pages/index.vue | 21 +++++++++++++ dashboard/server/api/project/create.post.ts | 7 ++++- dashboard/server/api/project/limits_info.ts | 34 +++++++++++++++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 dashboard/server/api/project/limits_info.ts diff --git a/dashboard/pages/index.vue b/dashboard/pages/index.vue index 489466c..0bd4dde 100644 --- a/dashboard/pages/index.vue +++ b/dashboard/pages/index.vue @@ -11,8 +11,19 @@ const eventsStackedSelectIndex = ref(0); const route = useRoute(); + +const limitsInfo = ref<{ + limited: boolean, + maxLimit: number, + limit: number, + total: number, + percent: number +}>(); + + onMounted(async () => { if (route.query.just_logged) return location.href = '/'; + limitsInfo.value = await $fetch("/api/project/limits_info", signHeaders()); }); @@ -69,6 +80,16 @@ const selectLabelsEvents = [
+
+
+
Limit reached
+ + Upgrade project + +
+
+ diff --git a/dashboard/server/api/project/create.post.ts b/dashboard/server/api/project/create.post.ts index 60a6802..a558805 100644 --- a/dashboard/server/api/project/create.post.ts +++ b/dashboard/server/api/project/create.post.ts @@ -1,5 +1,6 @@ import { ProjectModel, TProject } from "@schema/ProjectSchema"; import { ProjectCountModel } from "@schema/ProjectsCounts"; +import { UserSettingsModel } from "@schema/UserSettings"; import StripeService from '~/server/services/StripeService'; export default defineEventHandler(async event => { @@ -14,8 +15,12 @@ export default defineEventHandler(async event => { const userData = getRequestUser(event); if (!userData?.logged) return setResponseStatus(event, 400, 'NotLogged'); + const userSettings = await UserSettingsModel.findOne({ user_id: userData.id }, { max_projects: true }); + + const maxProjects = userSettings?.max_projects || 3; + const existingUserProjects = await ProjectModel.countDocuments({ owner: userData.id }); - if (existingUserProjects == 3) return setResponseStatus(event, 400, 'Already have 3 projects'); + if (existingUserProjects >= maxProjects) return setResponseStatus(event, 400, 'Already have max number of projects'); const customer = await StripeService.createCustomer(userData.user.email); if (!customer) return setResponseStatus(event, 400, 'Error creating customer'); diff --git a/dashboard/server/api/project/limits_info.ts b/dashboard/server/api/project/limits_info.ts new file mode 100644 index 0000000..33dd2f7 --- /dev/null +++ b/dashboard/server/api/project/limits_info.ts @@ -0,0 +1,34 @@ +import { ProjectModel, TProject } from "@schema/ProjectSchema"; +import { ProjectLimitModel } from "@schema/ProjectsLimits"; +import { UserSettingsModel } from "@schema/UserSettings"; +import { EVENT_LOG_LIMIT_PERCENT } from '@data/broker/Limits'; + +export default defineEventHandler(async event => { + + const userData = getRequestUser(event); + if (!userData?.logged) return setResponseStatus(event, 400, 'NotLogged'); + + 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 projectLimits = await ProjectLimitModel.findOne({ project_id }); + if (!projectLimits) return; + + const TOTAL_COUNT = projectLimits.events + projectLimits.visits; + const COUNT_LIMIT = projectLimits.limit; + + return { + total: TOTAL_COUNT, + limit: COUNT_LIMIT, + maxLimit: Math.round(COUNT_LIMIT * EVENT_LOG_LIMIT_PERCENT), + limited: TOTAL_COUNT > COUNT_LIMIT * EVENT_LOG_LIMIT_PERCENT, + percent: Math.round(100 / COUNT_LIMIT * TOTAL_COUNT) + } + + +}); \ No newline at end of file