diff --git a/apps/docs/content/guides/database/connection-management.mdx b/apps/docs/content/guides/database/connection-management.mdx index 8029bf3411d83..e3055e0337fba 100644 --- a/apps/docs/content/guides/database/connection-management.mdx +++ b/apps/docs/content/guides/database/connection-management.mdx @@ -15,7 +15,7 @@ You can change how many database connections Supavisor can manage by altering th ![Connection Info and Certificate.](/docs/img/database/pool-size.png) -The general rule is that if you are heavily using the PostgREST database API, you should be conscientious about raising your pool size past 40%. Otherwise, you can commit 80% to the pool. This leaves adequate room for the Authentication server and other utilities. +The general rule is that if you are heavily using the PostgREST database API, you should be conscientious about raising your pool size past 40% of the Database Max Connections. Otherwise, you can commit 80% to the pool. This leaves adequate room for the Authentication server and other utilities. These numbers are generalizations and depends on other Supabase products that you use and the extent of their usage. The actual values depend on your concurrent peak connection usage. For instance, if you were only using 80 connections in a week period and your database max connections is set to 500, then realistically you could allocate the difference of 420 (minus a reasonable buffer) to service more demand. diff --git a/apps/docs/content/guides/storage/management/copy-move-objects.mdx b/apps/docs/content/guides/storage/management/copy-move-objects.mdx index be357fce7e011..9103fdbed7d59 100644 --- a/apps/docs/content/guides/storage/management/copy-move-objects.mdx +++ b/apps/docs/content/guides/storage/management/copy-move-objects.mdx @@ -74,7 +74,11 @@ await supabase.storage.from('avatars').move('public/avatar1.png', 'private/avata ## Permissions -For a user to move and copy objects, they need `select` permission on the source object and `insert` permission on the destination object. For example: +To **copy** objects, users need `select` permission on the source object and `insert` permission on the destination object. If the user also has `update` permission, the copy can be performed as an upsert, which will overwrite the destination object if it already exists. + +To **move** objects, users need `select` and `update` permissions on the object. + +For example: ```sql create policy "User can select their own objects (in any buckets)" @@ -85,11 +89,19 @@ using ( owner_id = (select auth.uid()) ); -create policy "User can upload in their own folders (in any buckets)" +create policy "User can insert in their own folders (in any buckets)" on storage.objects for insert to authenticated with check ( (storage.folder(name))[1] = (select auth.uid()) ); + +create policy "User can update their own objects (in any buckets)" +on storage.objects +for update +to authenticated +using ( + owner_id = (select auth.uid()) +); ``` diff --git a/apps/docs/public/humans.txt b/apps/docs/public/humans.txt index af7e845bb06d0..00f287daabcf7 100644 --- a/apps/docs/public/humans.txt +++ b/apps/docs/public/humans.txt @@ -94,6 +94,7 @@ Ignacio Dobronich Illia Basalaiev Inian P Ivan Vasilov +Jamie Boyd Jason Farber Jean-Paul Argudo Jeezy diff --git a/apps/studio/components/grid/components/grid/Grid.tsx b/apps/studio/components/grid/components/grid/Grid.tsx index 0ee375115afdf..0b589f5451fb0 100644 --- a/apps/studio/components/grid/components/grid/Grid.tsx +++ b/apps/studio/components/grid/components/grid/Grid.tsx @@ -250,7 +250,11 @@ export const Grid = memo( )} - {isError && } + {isError && ( +
+ +
+ )} {isSuccess && ( <> diff --git a/apps/studio/components/interfaces/Auth/Users/UsersV2.tsx b/apps/studio/components/interfaces/Auth/Users/UsersV2.tsx index 5156ed1590016..ae210967cf430 100644 --- a/apps/studio/components/interfaces/Auth/Users/UsersV2.tsx +++ b/apps/studio/components/interfaces/Auth/Users/UsersV2.tsx @@ -4,8 +4,8 @@ import { keepPreviousData, useQueryClient } from '@tanstack/react-query' import AwesomeDebouncePromise from 'awesome-debounce-promise' import { LOCAL_STORAGE_KEYS, useFlag, useParams } from 'common' import { useIsAPIDocsSidePanelEnabled } from 'components/interfaces/App/FeaturePreview/FeaturePreviewContext' -import { APIDocsButton } from 'components/ui/APIDocsButton' import { AlertError } from 'components/ui/AlertError' +import { APIDocsButton } from 'components/ui/APIDocsButton' import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { FilterPopover } from 'components/ui/FilterPopover' import { FormHeader } from 'components/ui/Forms/FormHeader' @@ -39,23 +39,23 @@ import { UIEvent, useEffect, useMemo, useRef, useState } from 'react' import DataGrid, { Column, DataGridHandle, Row } from 'react-data-grid' import { toast } from 'sonner' import { + Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, - Alert_Shadcn_, Button, + cn, LoadingLine, ResizablePanel, ResizablePanelGroup, + Select_Shadcn_, SelectContent_Shadcn_, SelectGroup_Shadcn_, SelectItem_Shadcn_, SelectTrigger_Shadcn_, SelectValue_Shadcn_, - Select_Shadcn_, Tooltip, TooltipContent, TooltipTrigger, - cn, } from 'ui' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' @@ -482,10 +482,10 @@ export const UsersV2 = () => { return ( <>
- + {showImprovedSearchOptIn && ( - + setImprovedSearchDismissed(true)} @@ -535,7 +535,7 @@ export const UsersV2 = () => { )} -
+
{selectedUsers.size > 0 ? (