From c15e5d966ee9e3992683067e1ff3df1b41b2c51e Mon Sep 17 00:00:00 2001 From: Emily Date: Thu, 6 Jun 2024 15:08:55 +0200 Subject: [PATCH] fix delete account --- dashboard/pages/index.vue | 5 +- dashboard/pages/login.vue | 6 +- dashboard/pages/plans.vue | 4 +- dashboard/pages/project_creation.vue | 6 +- dashboard/pages/project_selector.vue | 57 ++++++++++--------- dashboard/server/api/admin/reset_count.ts | 7 ++- dashboard/server/api/project/delete.delete.ts | 26 ++++++--- .../server/api/user/delete_account.delete.ts | 38 +++++++++++++ 8 files changed, 97 insertions(+), 52 deletions(-) create mode 100644 dashboard/server/api/user/delete_account.delete.ts diff --git a/dashboard/pages/index.vue b/dashboard/pages/index.vue index 8159305..e92ed36 100644 --- a/dashboard/pages/index.vue +++ b/dashboard/pages/index.vue @@ -12,10 +12,7 @@ const eventsStackedSelectIndex = ref(0); const route = useRoute(); onMounted(async () => { - - if (route.query.just_logged) { - return location.href = '/'; - } + if (route.query.just_logged) return location.href = '/'; }); diff --git a/dashboard/pages/login.vue b/dashboard/pages/login.vue index 3dada9d..eb7fba3 100644 --- a/dashboard/pages/login.vue +++ b/dashboard/pages/login.vue @@ -28,14 +28,10 @@ async function handleOnSuccess(response: any) { console.log('LOGIN DONE - USER', loggedUser.value); - const { refresh } = useProjectsList(); - const isFirstTime = await $fetch('/api/user/is_first_time', { headers: { 'Authorization': 'Bearer ' + token.value } }) - await refresh(); - if (isFirstTime === true) { - router.push('/project_creation'); + router.push('/project_creation?just_logged=true'); } else { router.push('/?just_logged=true'); } diff --git a/dashboard/pages/plans.vue b/dashboard/pages/plans.vue index dc37677..722da92 100644 --- a/dashboard/pages/plans.vue +++ b/dashboard/pages/plans.vue @@ -63,7 +63,8 @@ function getPremiumName(type: number) {
- @@ -205,7 +206,6 @@ function getPremiumName(type: number) { -
diff --git a/dashboard/pages/project_creation.vue b/dashboard/pages/project_creation.vue index ff6d2fd..7e61aa6 100644 --- a/dashboard/pages/project_creation.vue +++ b/dashboard/pages/project_creation.vue @@ -13,11 +13,10 @@ const isFirstProject = computed(() => { return projects.value?.length == 0; }) import { Lit } from 'litlyx'; +const route = useRoute(); onMounted(() => { - if (projects.value?.length == 0) { - setPageLayout('none'); - } + if (route.query.just_logged) return location.href = '/project_creation'; }) @@ -43,7 +42,6 @@ async function createProject() { await setActiveProject(newActiveProjectId); } - router.push('/'); } catch (ex: any) { diff --git a/dashboard/pages/project_selector.vue b/dashboard/pages/project_selector.vue index 5106420..cef6836 100644 --- a/dashboard/pages/project_selector.vue +++ b/dashboard/pages/project_selector.vue @@ -35,11 +35,25 @@ async function deleteProject(projectId: string, projectName: string) { const router = useRouter(); +const { setToken } = useAccessToken(); + async function onProjectClick(pid: string) { await setActiveProject(pid) router.push('/') } +async function deleteAccount() { + const sure = confirm("Are you sure you want to delete this account ?"); + if (!sure) return; + await $fetch("/api/user/delete_account", { + ...signHeaders(), + method: "DELETE" + }) + + setToken(''); + location.href = "/login" +} + @@ -85,39 +99,26 @@ async function onProjectClick(pid: string) { - - +
+ + +
+
Deleting this account will also remove its projects
+
+ Delete account +
+
+ +
+
+ diff --git a/dashboard/server/api/admin/reset_count.ts b/dashboard/server/api/admin/reset_count.ts index 83a973d..f2c4da3 100644 --- a/dashboard/server/api/admin/reset_count.ts +++ b/dashboard/server/api/admin/reset_count.ts @@ -1,5 +1,7 @@ import { ProjectCountModel } from "@schema/ProjectsCounts"; +import { EventModel } from "@schema/metrics/EventSchema"; +import { VisitModel } from "@schema/metrics/VisitSchema"; export default defineEventHandler(async event => { const userData = getRequestUser(event); @@ -9,7 +11,10 @@ export default defineEventHandler(async event => { const { project_id } = getQuery(event); if (!project_id) return setResponseStatus(event, 400, 'ProjectId is required'); - await ProjectCountModel.updateOne({ project_id, events: 0, visits: 0 }, {}, { upsert: true }); + const events = await EventModel.countDocuments({ project_id }); + const visits = await VisitModel.countDocuments({ project_id }); + + await ProjectCountModel.updateOne({ project_id, events, visits }, {}, { upsert: true }); return { ok: true }; }); \ No newline at end of file diff --git a/dashboard/server/api/project/delete.delete.ts b/dashboard/server/api/project/delete.delete.ts index 1587ac9..4358fa9 100644 --- a/dashboard/server/api/project/delete.delete.ts +++ b/dashboard/server/api/project/delete.delete.ts @@ -1,18 +1,21 @@ import { ProjectModel } from "@schema/ProjectSchema"; import { ProjectCountModel } from "@schema/ProjectsCounts"; import { ProjectLimitModel } from "@schema/ProjectsLimits"; +import { SessionModel } from "@schema/metrics/SessionSchema"; +import { LimitNotifyModel } from "@schema/broker/LimitNotifySchema"; import StripeService from '~/server/services/StripeService'; +import { AiChatModel } from "@schema/ai/AiChatSchema"; export default defineEventHandler(async event => { const body = await readBody(event); - const projectId = body.project_id; + const project_id = body.project_id; const userData = getRequestUser(event); if (!userData?.logged) return setResponseStatus(event, 400, 'NotLogged'); - const project = await ProjectModel.findById(projectId); + const project = await ProjectModel.findById(project_id); if (!project) return setResponseStatus(event, 400, 'Project not exist'); const projects = await ProjectModel.countDocuments({ owner: userData.id }); @@ -22,18 +25,25 @@ export default defineEventHandler(async event => { await StripeService.deleteCustomer(project.customer_id); - const countDeletation = await ProjectCountModel.deleteOne({ owner: userData.id, _id: projectId }); - const limitdeletation = await ProjectLimitModel.deleteOne({ owner: userData.id, _id: projectId }); - const projectDeletation = await ProjectModel.deleteOne({ owner: userData.id, _id: projectId }); + const projectDeletation = await ProjectModel.deleteOne({ _id: project_id }); + const countDeletation = await ProjectCountModel.deleteMany({ project_id }); + const limitdeletation = await ProjectLimitModel.deleteMany({ project_id }); + const sessionsDeletation = await SessionModel.deleteMany({ project_id }); + const notifiesDeletation = await LimitNotifyModel.deleteMany({ project_id }); + const aiChatsDeletation = await AiChatModel.deleteMany({ project_id }); + + const ok = countDeletation.acknowledged && limitdeletation.acknowledged && + projectDeletation.acknowledged && sessionsDeletation.acknowledged && notifiesDeletation.acknowledged && aiChatsDeletation.acknowledged - const ok = countDeletation.acknowledged && limitdeletation.acknowledged && projectDeletation.acknowledged - return { ok, data: [ countDeletation.acknowledged, limitdeletation.acknowledged, - projectDeletation.acknowledged + projectDeletation.acknowledged, + sessionsDeletation.acknowledged, + notifiesDeletation.acknowledged, + aiChatsDeletation.acknowledged ] }; diff --git a/dashboard/server/api/user/delete_account.delete.ts b/dashboard/server/api/user/delete_account.delete.ts new file mode 100644 index 0000000..6371f8c --- /dev/null +++ b/dashboard/server/api/user/delete_account.delete.ts @@ -0,0 +1,38 @@ + +import { ProjectModel } from "@schema/ProjectSchema"; +import { ProjectCountModel } from "@schema/ProjectsCounts"; +import { ProjectLimitModel } from "@schema/ProjectsLimits"; +import { UserSettingsModel } from "@schema/UserSettings"; +import { AiChatModel } from "@schema/ai/AiChatSchema"; +import { LimitNotifyModel } from "@schema/broker/LimitNotifySchema"; +import { SessionModel } from "@schema/metrics/SessionSchema"; +import StripeService from "~/server/services/StripeService"; + +export default defineEventHandler(async event => { + + const userData = getRequestUser(event); + if (!userData?.logged) return; + + const projects = await ProjectModel.find({ owner: userData.id }); + + const premiumProjects = projects.filter(e => { return e.premium && e.premium_type != 0 }).length; + if (premiumProjects > 0) return setResponseStatus(event, 400, 'Cannot delete an account with a premium project'); + + for (const project of projects) { + const project_id = project._id; + await StripeService.deleteCustomer(project.customer_id); + const projectDeletation = await ProjectModel.deleteOne({ _id: project_id }); + const userSettingsDeletation = await UserSettingsModel.deleteOne({ project_id }); + + const countDeletation = await ProjectCountModel.deleteMany({ project_id }); + const limitdeletation = await ProjectLimitModel.deleteMany({ project_id }); + const sessionsDeletation = await SessionModel.deleteMany({ project_id }); + const notifiesDeletation = await LimitNotifyModel.deleteMany({ project_id }); + const aiChatsDeletation = await AiChatModel.deleteMany({ project_id }); + + } + + return { ok: true }; + + +}); \ No newline at end of file