diff --git a/apps/web/app/(app)/environments/[environmentId]/components/WidgetStatusIndicator.tsx b/apps/web/app/(app)/environments/[environmentId]/components/WidgetStatusIndicator.tsx index 3f3288d807..79eb46d1ce 100644 --- a/apps/web/app/(app)/environments/[environmentId]/components/WidgetStatusIndicator.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/components/WidgetStatusIndicator.tsx @@ -9,7 +9,11 @@ interface WidgetStatusIndicatorProps { } export default async function WidgetStatusIndicator({ environmentId, type }: WidgetStatusIndicatorProps) { - const [environment] = await Promise.all([getEnvironment(environmentId)]); + const environment = await getEnvironment(environmentId); + + if (!environment) { + throw new Error("Environment not found"); + } const stati = { notImplemented: { diff --git a/apps/web/app/api/v1/(legacy)/js/people/[personId]/set-user-id/route.ts b/apps/web/app/api/v1/(legacy)/js/people/[personId]/set-user-id/route.ts index f34ee12ac4..a5381a3cb2 100644 --- a/apps/web/app/api/v1/(legacy)/js/people/[personId]/set-user-id/route.ts +++ b/apps/web/app/api/v1/(legacy)/js/people/[personId]/set-user-id/route.ts @@ -1,7 +1,7 @@ import { getUpdatedState } from "@/app/api/v1/(legacy)/js/sync/lib/sync"; import { responses } from "@/app/lib/api/response"; import { transformErrorToDetails } from "@/app/lib/api/validator"; -import { getOrCreatePersonByUserId } from "@formbricks/lib/person/service"; +import { createPerson, getPersonByUserId } from "@formbricks/lib/person/service"; import { ZJsPeopleUserIdInput } from "@formbricks/types/js"; import { NextResponse } from "next/server"; @@ -26,9 +26,12 @@ export async function POST(req: Request): Promise { const { environmentId, userId } = inputValidation.data; - const personWithUserId = await getOrCreatePersonByUserId(userId, environmentId); + let person = await getPersonByUserId(environmentId, userId); + if (!person) { + person = await createPerson(environmentId, userId); + } - const state = await getUpdatedState(environmentId, personWithUserId.id); + const state = await getUpdatedState(environmentId, person.id); return responses.successResponse({ ...state }, true); } catch (error) { console.error(error); diff --git a/apps/web/app/api/v1/client/[environmentId]/in-app/sync/[userId]/route.ts b/apps/web/app/api/v1/client/[environmentId]/in-app/sync/[userId]/route.ts index b10894fca4..bbee6e8836 100644 --- a/apps/web/app/api/v1/client/[environmentId]/in-app/sync/[userId]/route.ts +++ b/apps/web/app/api/v1/client/[environmentId]/in-app/sync/[userId]/route.ts @@ -4,13 +4,12 @@ import { getLatestActionByPersonId } from "@formbricks/lib/action/service"; import { getActionClasses } from "@formbricks/lib/actionClass/service"; import { IS_FORMBRICKS_CLOUD, PRICING_USERTARGETING_FREE_MTU } from "@formbricks/lib/constants"; import { getEnvironment, updateEnvironment } from "@formbricks/lib/environment/service"; -import { getOrCreatePersonByUserId, getPersonByUserId } from "@formbricks/lib/person/service"; +import { createPerson, getPersonByUserId } from "@formbricks/lib/person/service"; import { getProductByEnvironmentId } from "@formbricks/lib/product/service"; import { getSyncSurveys } from "@formbricks/lib/survey/service"; import { getMonthlyActiveTeamPeopleCount, getTeamByEnvironmentId } from "@formbricks/lib/team/service"; import { TEnvironment } from "@formbricks/types/environment"; import { TJsState, ZJsPeopleUserIdInput } from "@formbricks/types/js"; -import { TPerson } from "@formbricks/types/people"; import { NextResponse } from "next/server"; export async function OPTIONS(): Promise { @@ -72,13 +71,15 @@ export async function GET( isMauLimitReached = !hasUserTargetingSubscription && currentMau >= PRICING_USERTARGETING_FREE_MTU; } - let person: TPerson | null; + let person = await getPersonByUserId(environmentId, userId); if (!isMauLimitReached) { - person = await getOrCreatePersonByUserId(userId, environmentId); + if (!person) { + person = await createPerson(environmentId, userId); + } } else { - person = await getPersonByUserId(userId, environmentId); const errorMessage = `Monthly Active Users limit in the current plan is reached in ${environmentId}`; if (!person) { + // if it's a new person and MAU limit is reached, throw an error throw new Error(errorMessage); } else { // check if person has been active this month diff --git a/apps/web/app/api/v1/client/[environmentId]/people/[userId]/route.ts b/apps/web/app/api/v1/client/[environmentId]/people/[userId]/route.ts index 9c696e6565..fd99c5a244 100644 --- a/apps/web/app/api/v1/client/[environmentId]/people/[userId]/route.ts +++ b/apps/web/app/api/v1/client/[environmentId]/people/[userId]/route.ts @@ -1,6 +1,6 @@ import { responses } from "@/app/lib/api/response"; import { transformErrorToDetails } from "@/app/lib/api/validator"; -import { getOrCreatePersonByUserId, updatePerson } from "@formbricks/lib/person/service"; +import { getPersonByUserId, updatePerson } from "@formbricks/lib/person/service"; import { ZPersonUpdateInput } from "@formbricks/types/people"; import { NextResponse } from "next/server"; @@ -31,7 +31,7 @@ export async function POST(req: Request, context: Context): Promise => { actionType = "automatic"; } - const person = await getPersonByUserId(userId, environmentId); + const person = await getPersonByUserId(environmentId, userId); if (!person) { throw new Error("Person not found"); diff --git a/packages/lib/display/service.ts b/packages/lib/display/service.ts index 2bb8f03281..676f0bcf3b 100644 --- a/packages/lib/display/service.ts +++ b/packages/lib/display/service.ts @@ -70,7 +70,7 @@ export const updateDisplay = async ( let person: TPerson | null = null; if (displayInput.userId) { - person = await getPersonByUserId(displayInput.userId, displayInput.environmentId); + person = await getPersonByUserId(displayInput.environmentId, displayInput.userId); if (!person) { throw new ResourceNotFoundError("Person", displayInput.userId); } @@ -160,7 +160,7 @@ export const createDisplay = async (displayInput: TDisplayCreateInput): Promise< try { let person; if (displayInput.userId) { - person = await getPersonByUserId(displayInput.userId, displayInput.environmentId); + person = await getPersonByUserId(displayInput.environmentId, displayInput.userId); } const display = await prisma.display.create({ data: { diff --git a/packages/lib/environment/service.ts b/packages/lib/environment/service.ts index ea3b313dee..e3304fe0d7 100644 --- a/packages/lib/environment/service.ts +++ b/packages/lib/environment/service.ts @@ -22,14 +22,13 @@ import { validateInputs } from "../utils/validate"; import { environmentCache } from "./cache"; import { formatEnvironmentDateFields } from "./util"; -export const getEnvironment = (environmentId: string) => +export const getEnvironment = (environmentId: string): Promise => unstable_cache( - async (): Promise => { + async () => { validateInputs([environmentId, ZId]); - let environmentPrisma; try { - environmentPrisma = await prisma.environment.findUnique({ + return await prisma.environment.findUnique({ where: { id: environmentId, }, @@ -42,16 +41,6 @@ export const getEnvironment = (environmentId: string) => throw error; } - - try { - const environment = ZEnvironment.parse(environmentPrisma); - return environment; - } catch (error) { - if (error instanceof z.ZodError) { - console.error(JSON.stringify(error.errors, null, 2)); - } - throw new ValidationError("Data validation of environment failed"); - } }, [`getEnvironment-${environmentId}`], { diff --git a/packages/lib/person/service.ts b/packages/lib/person/service.ts index 178f8031d7..9f23ada0b6 100644 --- a/packages/lib/person/service.ts +++ b/packages/lib/person/service.ts @@ -291,7 +291,7 @@ export const updatePerson = async (personId: string, personInput: TPersonUpdateI } }; -export const getPersonByUserId = async (userId: string, environmentId: string): Promise => { +export const getPersonByUserId = async (environmentId: string, userId: string): Promise => { const personPrisma = await unstable_cache( async () => { validateInputs([userId, ZString], [environmentId, ZId]); @@ -370,45 +370,6 @@ export const getPersonByUserId = async (userId: string, environmentId: string): return transformPrismaPerson(personPrisma); }; -export const getOrCreatePersonByUserId = async (userId: string, environmentId: string): Promise => - await unstable_cache( - async () => { - validateInputs([userId, ZString], [environmentId, ZId]); - - let person = await getPersonByUserId(userId, environmentId); - - if (person) { - return person; - } - - // create a new person - const personPrisma = await prisma.person.create({ - data: { - environment: { - connect: { - id: environmentId, - }, - }, - userId, - }, - select: selectPerson, - }); - - personCache.revalidate({ - id: personPrisma.id, - environmentId, - userId, - }); - - return transformPrismaPerson(personPrisma); - }, - [`getOrCreatePersonByUserId-${userId}-${environmentId}`], - { - tags: [personCache.tag.byEnvironmentIdAndUserId(environmentId, userId)], - revalidate: SERVICES_REVALIDATION_INTERVAL, - } - )(); - export const updatePersonAttribute = async ( personId: string, attributeClassId: string, diff --git a/packages/lib/response/service.ts b/packages/lib/response/service.ts index ae236d0217..2710feb09b 100644 --- a/packages/lib/response/service.ts +++ b/packages/lib/response/service.ts @@ -201,7 +201,7 @@ export const createResponse = async (responseInput: TResponseInput): Promise e.id !== environment.id)?.id || "";