diff --git a/apps/nextjs/src/app/[locale]/manage/integrations/new/_integration-new-form.tsx b/apps/nextjs/src/app/[locale]/manage/integrations/new/_integration-new-form.tsx index 6d4ed97274..8957abece5 100644 --- a/apps/nextjs/src/app/[locale]/manage/integrations/new/_integration-new-form.tsx +++ b/apps/nextjs/src/app/[locale]/manage/integrations/new/_integration-new-form.tsx @@ -1,24 +1,24 @@ "use client"; -import { useCallback } from "react"; +import {useCallback} from "react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { Alert, Button, Fieldset, Group, SegmentedControl, Stack, Text, TextInput } from "@mantine/core"; import { IconInfoCircle } from "@tabler/icons-react"; -import { clientApi } from "@homarr/api/client"; -import type { IntegrationKind, IntegrationSecretKind } from "@homarr/definitions"; -import { getAllSecretKindOptions } from "@homarr/definitions"; -import type { UseFormReturnType } from "@homarr/form"; -import { useZodForm } from "@homarr/form"; -import { convertIntegrationTestConnectionError } from "@homarr/integrations/client"; -import { showErrorNotification, showSuccessNotification } from "@homarr/notifications"; -import { useI18n, useScopedI18n } from "@homarr/translation/client"; -import type { z } from "@homarr/validation"; -import { validation } from "@homarr/validation"; +import {clientApi} from "@homarr/api/client"; +import type {IntegrationKind, IntegrationSecretKind} from "@homarr/definitions"; +import {getAllSecretKindOptions} from "@homarr/definitions"; +import type {UseFormReturnType} from "@homarr/form"; +import {useZodForm} from "@homarr/form"; +import {convertIntegrationTestConnectionError} from "@homarr/integrations/client"; +import {showErrorNotification, showSuccessNotification} from "@homarr/notifications"; +import {useI18n, useScopedI18n} from "@homarr/translation/client"; +import type {z} from "@homarr/validation"; +import {validation} from "@homarr/validation"; -import { IntegrationSecretInput } from "../_components/secrets/integration-secret-inputs"; -import { revalidatePathActionAsync } from "../../../../revalidatePathAction"; +import {IntegrationSecretInput} from "../_components/secrets/integration-secret-inputs"; +import {revalidatePathActionAsync} from "../../../../revalidatePathAction"; interface NewIntegrationFormProps { searchParams: Partial> & { @@ -26,21 +26,21 @@ interface NewIntegrationFormProps { }; } -export const NewIntegrationForm = ({ searchParams }: NewIntegrationFormProps) => { +export const NewIntegrationForm = ({searchParams}: NewIntegrationFormProps) => { const t = useI18n(); const secretKinds = getAllSecretKindOptions(searchParams.kind); const router = useRouter(); - const form = useZodForm(validation.integration.create.omit({ kind: true }), { + const form = useZodForm(validation.integration.create.omit({kind: true}), { initialValues: { name: searchParams.name ?? "", url: searchParams.url ?? "", - secrets: secretKinds[0].map((kind) => ({ + secrets: secretKinds[0]?.map((kind) => ({ kind, value: "", })), }, }); - const { mutateAsync, isPending } = clientApi.integration.create.useMutation(); + const {mutateAsync, isPending} = clientApi.integration.create.useMutation(); const handleSubmitAsync = async (values: FormType) => { await mutateAsync( @@ -122,7 +122,7 @@ interface SecretKindsSegmentedControlProps { form: UseFormReturnType FormType>; } -const SecretKindsSegmentedControl = ({ secretKinds, form }: SecretKindsSegmentedControlProps) => { +const SecretKindsSegmentedControl = ({secretKinds, form}: SecretKindsSegmentedControlProps) => { const t = useScopedI18n("integration.secrets"); const secretKindGroups = secretKinds.map((kinds) => ({ diff --git a/packages/api/src/router/integration/integration-router.ts b/packages/api/src/router/integration/integration-router.ts index 60040f4575..bcf74845a0 100644 --- a/packages/api/src/router/integration/integration-router.ts +++ b/packages/api/src/router/integration/integration-router.ts @@ -77,7 +77,7 @@ export const integrationRouter = createTRPCRouter({ name: input.name, url: input.url, kind: input.kind, - secrets: input.secrets, + secrets: !input.secrets ? null : input.secrets, }); const integrationId = createId(); @@ -88,7 +88,7 @@ export const integrationRouter = createTRPCRouter({ kind: input.kind, }); - if (input.secrets.length >= 1) { + if (input.secrets && input.secrets.length >= 1) { await ctx.db.insert(integrationSecrets).values( input.secrets.map((secret) => ({ kind: secret.kind, diff --git a/packages/api/src/router/integration/integration-test-connection.ts b/packages/api/src/router/integration/integration-test-connection.ts index ba8ffa2dd0..2875cb8426 100644 --- a/packages/api/src/router/integration/integration-test-connection.ts +++ b/packages/api/src/router/integration/integration-test-connection.ts @@ -18,7 +18,7 @@ export const testConnectionAsync = async ( value: `${string}.${string}`; }[] = [], ) => { - const formSecrets = integration.secrets + const formSecrets = integration.secrets !== null ? integration.secrets .filter((secret) => secret.value !== null) .map((secret) => ({ ...secret, @@ -26,7 +26,7 @@ export const testConnectionAsync = async ( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion value: secret.value!, source: "form" as const, - })); + })) : []; const decryptedDbSecrets = dbSecrets.map((secret) => ({ ...secret, @@ -35,10 +35,13 @@ export const testConnectionAsync = async ( })); const sourcedSecrets = [...formSecrets, ...decryptedDbSecrets]; + console.log('sourcedSecrets' + JSON.stringify(sourcedSecrets)); const secretKinds = getSecretKindOption(integration.kind, sourcedSecrets); + console.log('secretKinds' + JSON.stringify(secretKinds)); const filteredSecrets = secretKinds.map((kind) => { const secrets = sourcedSecrets.filter((secret) => secret.kind === kind); + // Will never be undefined because of the check before // eslint-disable-next-line @typescript-eslint/no-non-null-assertion if (secrets.length === 1) return secrets[0]!; diff --git a/packages/validation/src/integration.ts b/packages/validation/src/integration.ts index 1a75290877..d2ad70f746 100644 --- a/packages/validation/src/integration.ts +++ b/packages/validation/src/integration.ts @@ -14,7 +14,7 @@ const integrationCreateSchema = z.object({ kind: zodEnumFromArray(integrationSecretKinds), value: z.string().nonempty(), }), - ), + ).optional(), }); const integrationUpdateSchema = z.object({