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,