chore: remove attributes from identify call (#4012)

Co-authored-by: pandeymangg <anshuman.pandey9999@gmail.com>
This commit is contained in:
Matti Nannt
2024-10-24 19:16:56 +02:00
committed by GitHub
parent 0d11c08be7
commit 5daeab6554
7 changed files with 34 additions and 78 deletions

View File

@@ -1,6 +1,5 @@
import { prisma } from "@formbricks/database";
import { attributeCache } from "@formbricks/lib/attribute/cache";
import { getAttributesByUserId } from "@formbricks/lib/attribute/service";
import { cache } from "@formbricks/lib/cache";
import { IS_FORMBRICKS_CLOUD } from "@formbricks/lib/constants";
import { displayCache } from "@formbricks/lib/display/cache";
@@ -71,7 +70,6 @@ export const getPersonState = async ({
const personResponses = await getResponsesByUserId(environmentId, userId);
const personDisplays = await getDisplaysByUserId(environmentId, userId);
const segments = await getPersonSegmentIds(environmentId, person, device);
const attributes = await getAttributesByUserId(environmentId, userId);
// If the person exists, return the persons's state
const userState: TJsPersonState["data"] = {
@@ -81,7 +79,6 @@ export const getPersonState = async ({
personDisplays?.map((display) => ({ surveyId: display.surveyId, createdAt: display.createdAt })) ??
[],
responses: personResponses?.map((response) => response.surveyId) ?? [],
attributes,
lastDisplayAt:
personDisplays.length > 0
? personDisplays.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime())[0].createdAt

View File

@@ -55,8 +55,7 @@ export const updateAttribute = async (
}
return err({
code: "network_error",
// @ts-expect-error
status: res.error.status ?? 500,
status: 500,
message: res.error.message ?? `Error updating person with userId ${userId}`,
url: `${config.get().apiHost}/api/v1/client/${environmentId}/people/${userId}/attributes`,
responseMessage: res.error.message,
@@ -92,19 +91,6 @@ export const updateAttributes = async (
// clean attributes and remove existing attributes if config already exists
const updatedAttributes = { ...attributes };
try {
const existingAttributes = config.get().personState.data.attributes;
if (existingAttributes) {
for (const [key, value] of Object.entries(existingAttributes)) {
if (updatedAttributes[key] === value) {
delete updatedAttributes[key];
}
}
}
} catch (e) {
logger.debug("config not set; sending all attributes to backend");
}
// send to backend if updatedAttributes is not empty
if (Object.keys(updatedAttributes).length === 0) {
logger.debug("No attributes to update. Skipping update.");
@@ -139,14 +125,6 @@ export const updateAttributes = async (
}
};
export const isExistingAttribute = (key: string, value: string): boolean => {
if (config.get().personState.data.attributes[key] === value) {
return true;
}
return false;
};
export const setAttributeInApp = async (
key: string,
value: any
@@ -159,11 +137,6 @@ export const setAttributeInApp = async (
const userId = config.get().personState.data.userId;
logger.debug("Setting attribute: " + key + " to value: " + value);
// check if attribute already exists with this value
if (isExistingAttribute(key, value.toString())) {
logger.debug("Attribute already set to this value. Skipping update.");
return okVoid();
}
if (!userId) {
logger.error(
@@ -191,6 +164,10 @@ export const setAttributeInApp = async (
...config.get(),
personState,
filteredSurveys,
attributes: {
...config.get().attributes,
[key]: value.toString(),
},
});
}

View File

@@ -162,24 +162,6 @@ export const initialize = async (
logger.debug("Adding widget container to DOM");
addWidgetContainer();
let updatedAttributes: TAttributes | null = null;
if (configInput.attributes) {
if (configInput.userId) {
const res = await updateAttributes(
configInput.apiHost,
configInput.environmentId,
configInput.userId,
configInput.attributes
);
if (res.ok !== true) {
return err(res.error);
}
updatedAttributes = res.value;
} else {
updatedAttributes = { ...configInput.attributes };
}
}
if (
existingConfig &&
existingConfig.environmentState &&
@@ -195,13 +177,12 @@ export const initialize = async (
isEnvironmentStateExpired = true;
}
// if the config has a userId and the person state has expired, we need to sync the person state
if (
configInput.userId &&
existingConfig.personState.expiresAt &&
new Date(existingConfig.personState.expiresAt) < new Date()
(existingConfig.personState === null ||
(existingConfig.personState.expiresAt && new Date(existingConfig.personState.expiresAt) < new Date()))
) {
logger.debug("Person state expired. Syncing.");
logger.debug("Person state needs syncing - either null or expired");
isPersonStateExpired = true;
}
@@ -239,6 +220,7 @@ export const initialize = async (
environmentState,
personState,
filteredSurveys,
attributes: configInput.attributes ?? {},
});
const surveyNames = filteredSurveys.map((s) => s.name);
@@ -247,12 +229,30 @@ export const initialize = async (
putFormbricksInErrorState(config);
}
} else {
logger.debug(
"No valid configuration found or it has been expired. Resetting config and creating new one."
);
logger.debug("No valid configuration found. Resetting config and creating new one.");
config.resetConfig();
logger.debug("Syncing.");
let updatedAttributes: TAttributes | null = null;
if (configInput.attributes) {
if (configInput.userId) {
const res = await updateAttributes(
configInput.apiHost,
configInput.environmentId,
configInput.userId,
configInput.attributes
);
if (res.ok !== true) {
return err(res.error);
}
updatedAttributes = res.value;
} else {
updatedAttributes = { ...configInput.attributes };
}
}
try {
const environmentState = await fetchEnvironmentState(
{
@@ -280,6 +280,7 @@ export const initialize = async (
personState,
environmentState,
filteredSurveys,
attributes: updatedAttributes ?? {},
});
} catch (e) {
handleErrorOnFirstInit();
@@ -289,23 +290,6 @@ export const initialize = async (
await trackNoCodeAction("New Session");
}
// update attributes in config
if (updatedAttributes && Object.keys(updatedAttributes).length > 0) {
config.update({
...config.get(),
personState: {
...config.get().personState,
data: {
...config.get().personState.data,
attributes: {
...config.get().personState.data.attributes,
...updatedAttributes,
},
},
},
});
}
logger.debug("Adding event listeners");
addEventListeners();
addCleanupEventListeners();

View File

@@ -22,7 +22,7 @@ export const resetPerson = async (): Promise<Result<void, NetworkError>> => {
environmentId: config.get().environmentId,
apiHost: config.get().apiHost,
...(userId && { userId }),
attributes: config.get().personState.data.attributes,
attributes: config.get().attributes,
};
await logoutPerson();
try {

View File

@@ -15,7 +15,6 @@ export const DEFAULT_PERSON_STATE_NO_USER_ID: TJsPersonState = {
segments: [],
displays: [],
responses: [],
attributes: {},
lastDisplayAt: null,
},
} as const;
@@ -68,7 +67,6 @@ export const fetchPersonState = async (
segments: [],
displays: [],
responses: [],
attributes: {},
lastDisplayAt: null,
},
};

View File

@@ -65,7 +65,7 @@ const renderWidget = async (
}
const { product } = config.get().environmentState.data ?? {};
const { attributes } = config.get().personState.data ?? {};
const { attributes } = config.get() ?? {};
const isMultiLanguageSurvey = survey.languages.length > 1;
let languageCode = "default";

View File

@@ -126,7 +126,6 @@ export const ZJsPersonState = z.object({
})
),
responses: z.array(ZId), // responded survey ids
attributes: ZAttributes,
lastDisplayAt: z.date().nullable(),
}),
});
@@ -146,6 +145,7 @@ export const ZJsConfig = z.object({
environmentState: ZJsEnvironmentState,
personState: ZJsPersonState,
filteredSurveys: z.array(ZSurvey).default([]),
attributes: z.record(z.string()),
status: z.object({
value: z.enum(["success", "error"]),
expiresAt: z.date().nullable(),