From 225d4613814dc828d6431ec4646525e1acbd8e55 Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Fri, 8 Nov 2024 18:03:30 +0800 Subject: [PATCH] Hook up RLS to new assistant if feature flag is enabled (#30357) * Hook up RLS to new assistant if feature flag is enabled * Reset conversation if opening a different entity * Add prompt to use alter policy if policy definition is provided * Remove console log --- .../AIPolicyEditorPanel.utils.ts | 3 +- .../LockedQuerySection.tsx | 47 -------------- .../Policies/AIPolicyEditorPanel/index.tsx | 2 - .../Policies/PolicyTableRow/PolicyRow.tsx | 26 +++++++- .../PolicyTableRow/PolicyTableRowHeader.tsx | 61 +++++++++-------- .../Functions/FunctionsList/FunctionList.tsx | 28 +++++--- .../ui/AIAssistantPanel/AIAssistant.tsx | 65 ++++++++++++++----- .../ui/AIAssistantPanel/AIAssistant.utils.ts | 34 +++++++++- .../ui/AIAssistantPanel/AIAssistantPanel.tsx | 13 ++-- .../AIAssistantPanel/EntitiesDropdownMenu.tsx | 10 +-- .../data/database/entity-definition-query.ts | 59 +++++++++++++++-- apps/studio/pages/api/ai/sql/generate-v2.ts | 36 ++++++---- apps/studio/pages/api/ai/sql/suggest.ts | 2 +- apps/studio/state/app-state.ts | 5 +- packages/ai-commands/src/sql/chat.ts | 2 + packages/ai-commands/src/sql/rls.ts | 2 + 16 files changed, 254 insertions(+), 141 deletions(-) diff --git a/apps/studio/components/interfaces/Auth/Policies/AIPolicyEditorPanel/AIPolicyEditorPanel.utils.ts b/apps/studio/components/interfaces/Auth/Policies/AIPolicyEditorPanel/AIPolicyEditorPanel.utils.ts index e68356d2d98..937eaaa4f1d 100644 --- a/apps/studio/components/interfaces/Auth/Policies/AIPolicyEditorPanel/AIPolicyEditorPanel.utils.ts +++ b/apps/studio/components/interfaces/Auth/Policies/AIPolicyEditorPanel/AIPolicyEditorPanel.utils.ts @@ -1,7 +1,8 @@ import type { PostgresPolicy } from '@supabase/postgres-meta' +import { isEqual } from 'lodash' + import type { Message } from 'ai/react' import { uuidv4 } from 'lib/helpers' -import { isEqual } from 'lodash' export type MessageWithDebug = Message & { isDebug: boolean } diff --git a/apps/studio/components/interfaces/Auth/Policies/AIPolicyEditorPanel/LockedQuerySection.tsx b/apps/studio/components/interfaces/Auth/Policies/AIPolicyEditorPanel/LockedQuerySection.tsx index 429de771a3e..5f4e045b7d1 100644 --- a/apps/studio/components/interfaces/Auth/Policies/AIPolicyEditorPanel/LockedQuerySection.tsx +++ b/apps/studio/components/interfaces/Auth/Policies/AIPolicyEditorPanel/LockedQuerySection.tsx @@ -1,29 +1,17 @@ import { PostgresPolicy } from '@supabase/postgres-meta' import { Lock } from 'lucide-react' -import { useRouter } from 'next/router' - -import { useParams } from 'common' -import { Button } from 'ui' -import { generateAlterPolicyQuery, generateCreatePolicyQuery } from './AIPolicyEditorPanel.utils' interface LockedCreateQuerySection { schema: string selectedPolicy?: PostgresPolicy formFields: { name: string; table: string; behavior: string; command: string; roles: string } - editorOneRef: any - editorTwoRef: any } export const LockedCreateQuerySection = ({ schema, selectedPolicy, formFields, - editorOneRef, - editorTwoRef, }: LockedCreateQuerySection) => { - const router = useRouter() - const { ref } = useParams() - const isEditing = selectedPolicy !== undefined const { name, table, behavior, command, roles } = formFields @@ -38,41 +26,6 @@ export const LockedCreateQuerySection = ({ Use options above to edit

- {/* */}

1

diff --git a/apps/studio/components/interfaces/Auth/Policies/AIPolicyEditorPanel/index.tsx b/apps/studio/components/interfaces/Auth/Policies/AIPolicyEditorPanel/index.tsx index ba6aa9ab2ae..62dfc833efb 100644 --- a/apps/studio/components/interfaces/Auth/Policies/AIPolicyEditorPanel/index.tsx +++ b/apps/studio/components/interfaces/Auth/Policies/AIPolicyEditorPanel/index.tsx @@ -595,8 +595,6 @@ export const AIPolicyEditorPanel = memo(function ({ diff --git a/apps/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx b/apps/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx index d6607237fea..a00bc79cba1 100644 --- a/apps/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx +++ b/apps/studio/components/interfaces/Auth/Policies/PolicyTableRow/PolicyRow.tsx @@ -21,6 +21,8 @@ import { TooltipContent_Shadcn_, TooltipTrigger_Shadcn_, } from 'ui' +import { useIsDatabaseFunctionsAssistantEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' +import { useAppStateSnapshot } from 'state/app-state' interface PolicyRowProps { policy: PostgresPolicy @@ -33,6 +35,8 @@ const PolicyRow = ({ onSelectEditPolicy = noop, onSelectDeletePolicy = noop, }: PolicyRowProps) => { + const { setAiAssistantPanel } = useAppStateSnapshot() + const enableAssistantV2 = useIsDatabaseFunctionsAssistantEnabled() const canUpdatePolicies = useCheckPermissions(PermissionAction.TENANT_SQL_ADMIN_WRITE, 'policies') const { project } = useProjectContext() @@ -88,11 +92,31 @@ const PolicyRow = ({ - - - {!canToggleRLS - ? 'You need additional permissions to create RLS policies' - : 'Create with Supabase Assistant'} - - + { + if (enableAssistantV2) { + setAiAssistantPanel({ + open: true, + editor: 'rls-policies', + entity: undefined, + tables: [{ schema: table.schema, name: table.name }], + }) + } else { + onSelectCreatePolicy() + setEditView('conversation') + } + }} + tooltip={{ + content: { + side: 'bottom', + text: !canToggleRLS + ? 'You need additional permissions to create RLS policies' + : 'Create with Supabase Assistant', + }, + }} + > + +
)} diff --git a/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionList.tsx b/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionList.tsx index b5f5bc8021d..263da4ab55b 100644 --- a/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionList.tsx +++ b/apps/studio/components/interfaces/Database/Functions/FunctionsList/FunctionList.tsx @@ -11,12 +11,14 @@ import { useCheckPermissions } from 'hooks/misc/useCheckPermissions' import { useAppStateSnapshot } from 'state/app-state' import { Button, + cn, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from 'ui' +import { useIsDatabaseFunctionsAssistantEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' interface FunctionListProps { schema: string @@ -35,6 +37,7 @@ const FunctionList = ({ }: FunctionListProps) => { const router = useRouter() const { project: selectedProject } = useProjectContext() + const enableAssistantV2 = useIsDatabaseFunctionsAssistantEnabled() const { setAiAssistantPanel } = useAppStateSnapshot() const { data: functions } = useDatabaseFunctionsQuery({ @@ -108,7 +111,10 @@ const FunctionList = ({