From ad9296a00c6d09c7b238bfc69cdd0c9f673e80cc Mon Sep 17 00:00:00 2001
From: Anshuman Pandey <54475686+pandeymangg@users.noreply.github.com>
Date: Tue, 13 Feb 2024 12:14:46 +0530
Subject: [PATCH] fix: getSyncSurveys (#2062)
---
.../[surveyId]/edit/components/TargetingCard.tsx | 7 ++++++-
.../components/AdvancedTargetingCard.tsx | 7 ++++++-
packages/lib/survey/service.ts | 13 +++++++++----
3 files changed, 21 insertions(+), 6 deletions(-)
diff --git a/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/edit/components/TargetingCard.tsx b/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/edit/components/TargetingCard.tsx
index cdc8ccdf3b..7de902a80d 100644
--- a/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/edit/components/TargetingCard.tsx
+++ b/apps/web/app/(app)/environments/[environmentId]/surveys/[surveyId]/edit/components/TargetingCard.tsx
@@ -7,6 +7,7 @@ import Link from "next/link";
import { useEffect, useMemo, useState } from "react";
import { toast } from "react-hot-toast";
+import { cn } from "@formbricks/lib/cn";
import { isAdvancedSegment } from "@formbricks/lib/segment/utils";
import { TAttributeClass } from "@formbricks/types/attributeClasses";
import { TBaseFilter, TSegment, TSegmentCreateInput, TSegmentUpdateInput } from "@formbricks/types/segment";
@@ -209,7 +210,11 @@ export default function TargetingCard({
)}
-
+
diff --git a/packages/ee/advancedTargeting/components/AdvancedTargetingCard.tsx b/packages/ee/advancedTargeting/components/AdvancedTargetingCard.tsx
index d2ffbda6ff..cf62669b3f 100644
--- a/packages/ee/advancedTargeting/components/AdvancedTargetingCard.tsx
+++ b/packages/ee/advancedTargeting/components/AdvancedTargetingCard.tsx
@@ -7,6 +7,7 @@ import Link from "next/link";
import React, { useEffect, useMemo, useState } from "react";
import toast from "react-hot-toast";
+import { cn } from "@formbricks/lib/cn";
import { TActionClass } from "@formbricks/types/actionClasses";
import { TAttributeClass } from "@formbricks/types/attributeClasses";
import { TBaseFilter, TSegment, TSegmentCreateInput, TSegmentUpdateInput } from "@formbricks/types/segment";
@@ -223,7 +224,11 @@ export function AdvancedTargetingCard({
)}
-
+
diff --git a/packages/lib/survey/service.ts b/packages/lib/survey/service.ts
index ea127e0c3f..29c22cdb42 100644
--- a/packages/lib/survey/service.ts
+++ b/packages/lib/survey/service.ts
@@ -8,6 +8,7 @@ import { TActionClass } from "@formbricks/types/actionClasses";
import { ZOptionalNumber } from "@formbricks/types/common";
import { ZId } from "@formbricks/types/environment";
import { DatabaseError, InvalidInputError, ResourceNotFoundError } from "@formbricks/types/errors";
+import { TPerson } from "@formbricks/types/people";
import { TSegment, ZSegment, ZSegmentFilters } from "@formbricks/types/segment";
import { TSurvey, TSurveyInput, ZSurvey } from "@formbricks/types/surveys";
@@ -564,7 +565,7 @@ export const getSyncSurveys = async (
const surveys = await unstable_cache(
async () => {
const product = await getProductByEnvironmentId(environmentId);
- const person = await getPerson(personId);
+ const person = personId === "legacy" ? ({ id: "legacy" } as TPerson) : await getPerson(personId);
if (!product) {
throw new Error("Product not found");
@@ -625,7 +626,7 @@ export const getSyncSurveys = async (
const personActionClassIds = Array.from(
new Set(personActions?.map((action) => action.actionClass?.id ?? ""))
);
- const personUserId = person.userId ?? person.attributes.userId ?? "";
+ const personUserId = person.userId ?? person.attributes?.userId ?? "";
// the surveys now have segment filters, so we need to evaluate them
const surveyPromises = surveys.map(async (survey) => {
@@ -652,7 +653,11 @@ export const getSyncSurveys = async (
// we check if the person meets the attribute filters for all the attribute filters
const isEligible = attributeFilters.every((attributeFilter) => {
- const personAttributeValue = person.attributes[attributeFilter.attributeClassName];
+ const personAttributeValue = person?.attributes?.[attributeFilter.attributeClassName];
+ if (!personAttributeValue) {
+ return false;
+ }
+
if (attributeFilter.operator === "equals") {
return personAttributeValue === attributeFilter.value;
} else if (attributeFilter.operator === "notEquals") {
@@ -669,7 +674,7 @@ export const getSyncSurveys = async (
// Evaluate the segment filters
const result = await evaluateSegment(
{
- attributes: person.attributes,
+ attributes: person.attributes ?? {},
actionIds: personActionClassIds,
deviceType,
environmentId,