diff --git a/apps/web/app/(app)/environments/[environmentId]/integrations/google-sheets/actions.ts b/apps/web/app/(app)/environments/[environmentId]/integrations/google-sheets/actions.ts index a95358353e..9871377253 100644 --- a/apps/web/app/(app)/environments/[environmentId]/integrations/google-sheets/actions.ts +++ b/apps/web/app/(app)/environments/[environmentId]/integrations/google-sheets/actions.ts @@ -1,25 +1,41 @@ "use server"; -import { authOptions } from "@/modules/auth/lib/authOptions"; -import { getServerSession } from "next-auth"; -import { hasUserEnvironmentAccess } from "@formbricks/lib/environment/auth"; +import { authenticatedActionClient } from "@/lib/utils/action-client"; +import { checkAuthorizationUpdated } from "@/lib/utils/action-client-middleware"; +import { getOrganizationIdFromEnvironmentId, getProjectIdFromEnvironmentId } from "@/lib/utils/helper"; +import { z } from "zod"; import { getSpreadsheetNameById } from "@formbricks/lib/googleSheet/service"; -import { AuthorizationError } from "@formbricks/types/errors"; -import { TIntegrationGoogleSheets } from "@formbricks/types/integration/google-sheet"; +import { ZIntegrationGoogleSheets } from "@formbricks/types/integration/google-sheet"; -export async function getSpreadsheetNameByIdAction( - googleSheetIntegration: TIntegrationGoogleSheets, - environmentId: string, - spreadsheetId: string -) { - const session = await getServerSession(authOptions); - if (!session) throw new AuthorizationError("Not authorized"); +const ZGetSpreadsheetNameByIdAction = z.object({ + googleSheetIntegration: ZIntegrationGoogleSheets, + environmentId: z.string(), + spreadsheetId: z.string(), +}); - const isAuthorized = await hasUserEnvironmentAccess(session.user.id, environmentId); - if (!isAuthorized) throw new AuthorizationError("Not authorized"); - const integrationData = structuredClone(googleSheetIntegration); - integrationData.config.data.forEach((data) => { - data.createdAt = new Date(data.createdAt); +export const getSpreadsheetNameByIdAction = authenticatedActionClient + .schema(ZGetSpreadsheetNameByIdAction) + .action(async ({ ctx, parsedInput }) => { + await checkAuthorizationUpdated({ + userId: ctx.user.id, + organizationId: await getOrganizationIdFromEnvironmentId(parsedInput.environmentId), + access: [ + { + type: "organization", + roles: ["owner", "manager"], + }, + { + type: "projectTeam", + projectId: await getProjectIdFromEnvironmentId(parsedInput.environmentId), + minPermission: "readWrite", + }, + ], + }); + + const integrationData = structuredClone(parsedInput.googleSheetIntegration); + integrationData.config.data.forEach((data) => { + data.createdAt = new Date(data.createdAt); + }); + + return await getSpreadsheetNameById(integrationData, parsedInput.spreadsheetId); }); - return await getSpreadsheetNameById(integrationData, spreadsheetId); -} diff --git a/apps/web/app/(app)/environments/[environmentId]/integrations/google-sheets/components/AddIntegrationModal.tsx b/apps/web/app/(app)/environments/[environmentId]/integrations/google-sheets/components/AddIntegrationModal.tsx index 5fe5dc54e4..3c1a01314c 100644 --- a/apps/web/app/(app)/environments/[environmentId]/integrations/google-sheets/components/AddIntegrationModal.tsx +++ b/apps/web/app/(app)/environments/[environmentId]/integrations/google-sheets/components/AddIntegrationModal.tsx @@ -8,6 +8,7 @@ import { isValidGoogleSheetsUrl, } from "@/app/(app)/environments/[environmentId]/integrations/google-sheets/lib/util"; import GoogleSheetLogo from "@/images/googleSheetsLogo.png"; +import { getFormattedErrorMessage } from "@/lib/utils/helper"; import { AdditionalIntegrationSettings } from "@/modules/ui/components/additional-integration-settings"; import { Button } from "@/modules/ui/components/button"; import { Checkbox } from "@/modules/ui/components/checkbox"; @@ -115,11 +116,18 @@ export const AddIntegrationModal = ({ throw new Error(t("environments.integrations.select_at_least_one_question_error")); } const spreadsheetId = extractSpreadsheetIdFromUrl(spreadsheetUrl); - const spreadsheetName = await getSpreadsheetNameByIdAction( + const spreadsheetNameResponse = await getSpreadsheetNameByIdAction({ googleSheetIntegration, environmentId, - spreadsheetId - ); + spreadsheetId, + }); + + if (!spreadsheetNameResponse?.data) { + const errorMessage = getFormattedErrorMessage(spreadsheetNameResponse); + throw new Error(errorMessage); + } + + const spreadsheetName = spreadsheetNameResponse.data; setIsLinkingSheet(true); integrationData.spreadsheetId = spreadsheetId;