From 0a39902b98afd17c5a26d73f2e1e00ace6fdfbc7 Mon Sep 17 00:00:00 2001 From: Dhruwang Jariwala <67850763+Dhruwang@users.noreply.github.com> Date: Wed, 29 Jul 2026 14:43:01 +0530 Subject: [PATCH 1/5] feat: soft-delete (archive) surveys (ENG-1042) (#8609) --- .../integrations/lib/surveys.test.ts | 1 + .../workspace/integrations/lib/surveys.ts | 2 + .../[surveyId]/(analysis)/summary/actions.ts | 16 ++ .../summary/components/SurveyAnalysisCTA.tsx | 27 +- .../components/SurveyStatusDropdown.tsx | 32 ++- .../[workspaceId]/environment/lib/data.ts | 4 + .../v3/surveys/[surveyId]/archive/route.ts | 28 ++ .../v3/surveys/[surveyId]/restore/route.ts | 28 ++ .../app/api/v3/surveys/lib/operations.test.ts | 162 +++++++++++- apps/web/app/api/v3/surveys/lib/operations.ts | 249 +++++++++++++----- .../parse-v3-surveys-list-query.test.ts | 21 ++ .../v3/surveys/parse-v3-surveys-list-query.ts | 12 +- apps/web/app/api/v3/surveys/serializers.ts | 3 + apps/web/i18n.lock | 14 + apps/web/instrumentation-jobs.test.ts | 38 +++ apps/web/instrumentation-jobs.ts | 39 +++ apps/web/lib/survey/__mock__/survey.mock.ts | 1 + apps/web/lib/survey/service.test.ts | 36 +++ apps/web/lib/survey/service.ts | 17 ++ apps/web/locales/de-DE.json | 14 + apps/web/locales/en-US.json | 14 + apps/web/locales/es-ES.json | 14 + apps/web/locales/fr-FR.json | 14 + apps/web/locales/hu-HU.json | 14 + apps/web/locales/ja-JP.json | 14 + apps/web/locales/nl-NL.json | 14 + apps/web/locales/pt-BR.json | 14 + apps/web/locales/pt-PT.json | 14 + apps/web/locales/ro-RO.json | 14 + apps/web/locales/ru-RU.json | 14 + apps/web/locales/sv-SE.json | 14 + apps/web/locales/tr-TR.json | 14 + apps/web/locales/zh-Hans-CN.json | 14 + apps/web/locales/zh-Hant-TW.json | 14 + .../modules/ee/audit-logs/types/audit-log.ts | 2 + .../modules/ee/contacts/lib/surveys.test.ts | 2 +- apps/web/modules/ee/contacts/lib/surveys.ts | 2 +- .../modules/survey/archive/lib/constants.ts | 12 + .../process-survey-archive-purge-job.test.ts | 135 ++++++++++ .../lib/process-survey-archive-purge-job.ts | 152 +++++++++++ apps/web/modules/survey/lib/surveys.test.ts | 170 +++++++++++- apps/web/modules/survey/lib/surveys.ts | 106 +++++++- apps/web/modules/survey/lib/utils.test.ts | 27 +- apps/web/modules/survey/lib/utils.ts | 72 +++-- .../link/components/survey-renderer.tsx | 4 +- apps/web/modules/survey/link/lib/data.ts | 1 + .../survey/list/components/survey-card.tsx | 52 +++- .../list/components/survey-dropdown-menu.tsx | 113 +++++++- .../survey/list/components/survey-filters.tsx | 22 +- .../survey/list/components/survey-list.tsx | 38 ++- .../list/hooks/use-archive-survey.test.ts | 137 ++++++++++ .../survey/list/hooks/use-archive-survey.ts | 10 + .../list/hooks/use-delete-survey.test.ts | 2 + .../survey/list/hooks/use-delete-survey.ts | 36 +-- .../list/hooks/use-restore-survey.test.ts | 138 ++++++++++ .../survey/list/hooks/use-restore-survey.ts | 10 + .../list/hooks/use-survey-removal-mutation.ts | 44 ++++ .../modules/survey/list/hooks/use-surveys.ts | 2 + .../modules/survey/list/lib/survey-record.ts | 1 + .../modules/survey/list/lib/survey.test.ts | 38 +++ apps/web/modules/survey/list/lib/survey.ts | 20 ++ apps/web/modules/survey/list/lib/utils.ts | 2 +- .../survey/list/lib/v3-surveys-client.ts | 50 +++- .../survey/list/types/survey-overview.ts | 8 +- apps/web/modules/survey/list/types/surveys.ts | 1 + .../lib/process-survey-scheduling-job.test.ts | 2 + .../scheduling/lib/survey-scheduling.ts | 3 + .../components/confirmation-modal/index.tsx | 4 +- apps/web/playwright/survey-archive.spec.ts | 149 +++++++++++ docs/api-v3-reference/openapi.yml | 216 ++++++++++++++- .../src/components/schemas/SurveyListItem.yml | 8 + .../src/components/schemas/SurveyResource.yml | 8 + docs/api-v3-reference/src/openapi.yml | 4 + .../src/paths/api_v3_surveys.yml | 15 ++ .../src/paths/api_v3_surveys_{surveyId}.yml | 37 ++- .../api_v3_surveys_{surveyId}_archive.yml | 84 ++++++ .../api_v3_surveys_{surveyId}_restore.yml | 84 ++++++ .../migration.sql | 5 + packages/database/schema.prisma | 2 + packages/jobs/src/constants.ts | 1 + packages/jobs/src/definitions.ts | 13 +- packages/jobs/src/index.ts | 5 + .../src/processors/survey-archive-purge.ts | 20 ++ packages/jobs/src/queue.ts | 42 +++ packages/jobs/src/types.ts | 6 + packages/types/surveys/types.ts | 13 + 86 files changed, 2886 insertions(+), 184 deletions(-) create mode 100644 apps/web/app/api/v3/surveys/[surveyId]/archive/route.ts create mode 100644 apps/web/app/api/v3/surveys/[surveyId]/restore/route.ts create mode 100644 apps/web/modules/survey/archive/lib/constants.ts create mode 100644 apps/web/modules/survey/archive/lib/process-survey-archive-purge-job.test.ts create mode 100644 apps/web/modules/survey/archive/lib/process-survey-archive-purge-job.ts create mode 100644 apps/web/modules/survey/list/hooks/use-archive-survey.test.ts create mode 100644 apps/web/modules/survey/list/hooks/use-archive-survey.ts create mode 100644 apps/web/modules/survey/list/hooks/use-restore-survey.test.ts create mode 100644 apps/web/modules/survey/list/hooks/use-restore-survey.ts create mode 100644 apps/web/modules/survey/list/hooks/use-survey-removal-mutation.ts create mode 100644 apps/web/playwright/survey-archive.spec.ts create mode 100644 docs/api-v3-reference/src/paths/api_v3_surveys_{surveyId}_archive.yml create mode 100644 docs/api-v3-reference/src/paths/api_v3_surveys_{surveyId}_restore.yml create mode 100644 packages/database/migration/20260722000000_add_survey_archived_at/migration.sql create mode 100644 packages/jobs/src/processors/survey-archive-purge.ts diff --git a/apps/web/app/(app)/workspaces/[workspaceId]/settings/workspace/integrations/lib/surveys.test.ts b/apps/web/app/(app)/workspaces/[workspaceId]/settings/workspace/integrations/lib/surveys.test.ts index 78b3885b63b0..2df66e79a124 100644 --- a/apps/web/app/(app)/workspaces/[workspaceId]/settings/workspace/integrations/lib/surveys.test.ts +++ b/apps/web/app/(app)/workspaces/[workspaceId]/settings/workspace/integrations/lib/surveys.test.ts @@ -109,6 +109,7 @@ describe("getSurveys", () => { status: { not: "completed", }, + archivedAt: null, }, select: selectSurvey, orderBy: { diff --git a/apps/web/app/(app)/workspaces/[workspaceId]/settings/workspace/integrations/lib/surveys.ts b/apps/web/app/(app)/workspaces/[workspaceId]/settings/workspace/integrations/lib/surveys.ts index 959e8913100d..f667daccc970 100644 --- a/apps/web/app/(app)/workspaces/[workspaceId]/settings/workspace/integrations/lib/surveys.ts +++ b/apps/web/app/(app)/workspaces/[workspaceId]/settings/workspace/integrations/lib/surveys.ts @@ -20,6 +20,8 @@ export const getSurveys = reactCache(async (workspaceId: string): Promise