diff --git a/backend/src/helpers/integration.ts b/backend/src/helpers/integration.ts index a9d62f92f..d0e775bfc 100644 --- a/backend/src/helpers/integration.ts +++ b/backend/src/helpers/integration.ts @@ -84,7 +84,6 @@ const handleOAuthExchangeHelper = async ({ }).save(); } catch (err) { - console.error('in', err); Sentry.setUser(null); Sentry.captureException(err); throw new Error('Failed to handle OAuth2 code-token exchange') @@ -184,7 +183,7 @@ const getIntegrationAuthAccessHelper = async ({ integrationAuthId }: { integrati try { const integrationAuth = await IntegrationAuth .findById(integrationAuthId) - .select('+accessCiphertext +accessIV +accessTag'); + .select('workspace integration +accessCiphertext +accessIV +accessTag +accessExpiresAt + refreshCiphertext'); if (!integrationAuth) throw new Error('Failed to find integration auth'); diff --git a/frontend/components/integrations/CloudIntegration.tsx b/frontend/components/integrations/CloudIntegration.tsx index 4fb53d145..bafb28b20 100644 --- a/frontend/components/integrations/CloudIntegration.tsx +++ b/frontend/components/integrations/CloudIntegration.tsx @@ -5,77 +5,76 @@ import { faCheck, faX, } from "@fortawesome/free-solid-svg-icons"; +import deleteIntegrationAuth from "../../pages/api/integrations/DeleteIntegrationAuth"; -interface Props { - integration: IntegrationOption; - setSelectedIntegrationOption: () => void; - integrationOptionPress: () => void; - deleteIntegrationAuth: () => void; - authorizations: any; -} - -interface IntegrationOption { +interface CloudIntegrationOption { name: string; type: string; clientId: string; docsLink: string; } +interface Props { + cloudIntegrationOption: CloudIntegrationOption; + setSelectedIntegrationOption: () => void; + integrationOptionPress: () => void; + integrationAuths: any; +} + const CloudIntegration = ({ - integration, + cloudIntegrationOption, setSelectedIntegrationOption, integrationOptionPress, - deleteIntegrationAuth, - authorizations + integrationAuths }: Props) => { - return authorizations ? ( + return integrationAuths ? (
{ - if (!["Heroku"].includes(integration.name)) return; - setSelectedIntegrationOption(integration); + if (!["Heroku"].includes(cloudIntegrationOption.name)) return; + setSelectedIntegrationOption(cloudIntegrationOption); integrationOptionPress({ - integrationOption: integration + integrationOption: cloudIntegrationOption }); }} - key={integration.name} + key={cloudIntegrationOption.name} > integration logo - {integration.name.split(" ").length > 2 ? ( + {cloudIntegrationOption.name.split(" ").length > 2 ? (
-
{integration.name.split(" ")[0]}
+
{cloudIntegrationOption.name.split(" ")[0]}
- {integration.name.split(" ")[1]}{" "} - {integration.name.split(" ")[2]} + {cloudIntegrationOption.name.split(" ")[1]}{" "} + {cloudIntegrationOption.name.split(" ")[2]}
) : (
- {integration.name} + {cloudIntegrationOption.name}
)} - {["Heroku"].includes(integration.name) && - authorizations + {["Heroku"].includes(cloudIntegrationOption.name) && + integrationAuths .map((authorization) => authorization.integration) - .includes(integration.name.toLowerCase()) && ( + .includes(cloudIntegrationOption.name.toLowerCase()) && (
{ deleteIntegrationAuth({ - integrationAuthId: authorizations + integrationAuthId: integrationAuths .filter( (authorization) => authorization.integration == - integration.name.toLowerCase() + cloudIntegrationOption.name.toLowerCase() ) .map((authorization) => authorization._id)[0], }); @@ -98,7 +97,7 @@ const CloudIntegration = ({
)} - {!["Heroku"].includes(integration.name) && ( + {!["Heroku"].includes(cloudIntegrationOption.name) && (
Coming Soon diff --git a/frontend/components/integrations/CloudIntegrationSection.tsx b/frontend/components/integrations/CloudIntegrationSection.tsx index 75391275f..87ff74df1 100644 --- a/frontend/components/integrations/CloudIntegrationSection.tsx +++ b/frontend/components/integrations/CloudIntegrationSection.tsx @@ -1,7 +1,7 @@ import React from "react"; import CloudIntegration from "./CloudIntegration"; -interface IntegrationOption { +interface CloudIntegrationOption { name: string; type: string; clientId: string; @@ -9,39 +9,34 @@ interface IntegrationOption { } interface Props { - projectIntegrations: any; - integrations: IntegrationOption[]; + cloudIntegrationOptions: CloudIntegrationOption[]; setSelectedIntegrationOption: () => void; integrationOptionPress: () => void; - deleteIntegrationAuth: () => void; - authorizations: any; + integrationAuths: any; } const CloudIntegrationSection = ({ - projectIntegrations, - integrations, + cloudIntegrationOptions, setSelectedIntegrationOption, integrationOptionPress, - deleteIntegrationAuth, - authorizations + integrationAuths }: Props) => { return ( <> -
0 ? 'mt-12' : 'mt-6'} text-xl max-w-5xl px-2`}> +

Cloud Integrations

Click on an integration to begin syncing secrets to it.

- {integrations.map((integration) => ( + {cloudIntegrationOptions.map((cloudIntegrationOption) => ( ))}
diff --git a/frontend/components/integrations/Integration.tsx b/frontend/components/integrations/Integration.tsx index 6fd31ef2d..fa203b9bd 100644 --- a/frontend/components/integrations/Integration.tsx +++ b/frontend/components/integrations/Integration.tsx @@ -15,7 +15,7 @@ import getIntegrationApps from "../../pages/api/integrations/GetIntegrationApps" import Button from "~/components/basic/buttons/Button"; import ListBox from "~/components/basic/Listbox"; -interface ProjectIntegration { +interface Integration { app?: string; environment: string; integration: string; @@ -24,28 +24,29 @@ interface ProjectIntegration { } const Integration = ({ - projectIntegration + integration }: { - projectIntegration: ProjectIntegration; + integration: Integration; }) => { const [integrationEnvironment, setIntegrationEnvironment] = useState( - reverseEnvMapping[projectIntegration.environment] + reverseEnvMapping[integration.environment] ); const [fileState, setFileState] = useState([]); const router = useRouter(); const [apps, setApps] = useState([]); const [integrationApp, setIntegrationApp] = useState( - projectIntegration.app ? projectIntegration.app : apps[0] + integration.app ? integration.app : apps[0] ); useEffect(async () => { const tempHerokuApps = await getIntegrationApps({ - integrationAuthId: projectIntegration.integrationAuth, + integrationAuthId: integration.integrationAuth, }); + const tempHerokuAppNames = tempHerokuApps.map((app) => app.name); setApps(tempHerokuAppNames); setIntegrationApp( - projectIntegration.app ? projectIntegration.app : tempHerokuAppNames[0] + integration.app ? integration.app : tempHerokuAppNames[0] ); }, []); @@ -59,7 +60,7 @@ const Integration = ({
- {projectIntegration.integration.charAt(0).toUpperCase() + - projectIntegration.integration.slice(1)} + {integration.integration.charAt(0).toUpperCase() + + integration.integration.slice(1)}
@@ -87,14 +88,14 @@ const Integration = ({ HEROKU APP
- {projectIntegration.isActive ? ( + {integration.isActive ? (
{ const result = await updateIntegration({ - integrationId: projectIntegration._id, + integrationId: integration._id, environment: envMapping[integrationEnvironment], app: integrationApp, isActive: true @@ -122,7 +123,7 @@ const Integration = ({