diff --git a/apps/web/app/(marketing)/layout.tsx b/apps/web/app/(marketing)/layout.tsx index 96fcbe255..d7295d1ef 100644 --- a/apps/web/app/(marketing)/layout.tsx +++ b/apps/web/app/(marketing)/layout.tsx @@ -1,11 +1,11 @@ -import { getSupabaseServerComponentClient } from '@kit/supabase/server-component-client'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; import { SiteFooter } from '~/(marketing)/_components/site-footer'; import { SiteHeader } from '~/(marketing)/_components/site-header'; import { withI18n } from '~/lib/i18n/with-i18n'; async function SiteLayout(props: React.PropsWithChildren) { - const client = getSupabaseServerComponentClient(); + const client = getSupabaseServerClient(); const { data: { user }, diff --git a/apps/web/app/admin/accounts/[id]/page.tsx b/apps/web/app/admin/accounts/[id]/page.tsx index 93e4105f9..91b3e7c4c 100644 --- a/apps/web/app/admin/accounts/[id]/page.tsx +++ b/apps/web/app/admin/accounts/[id]/page.tsx @@ -2,7 +2,7 @@ import { cache } from 'react'; import { AdminAccountPage } from '@kit/admin/components/admin-account-page'; import { AdminGuard } from '@kit/admin/components/admin-guard'; -import { getSupabaseServerComponentClient } from '@kit/supabase/server-component-client'; +import { getSupabaseServerAdminClient } from '@kit/supabase/server-admin-client'; import { PageBody } from '@kit/ui/page'; interface Params { @@ -34,9 +34,7 @@ export default AdminGuard(AccountPage); const loadAccount = cache(accountLoader); async function accountLoader(id: string) { - const client = getSupabaseServerComponentClient({ - admin: true, - }); + const client = getSupabaseServerAdminClient(); const { data, error } = await client .from('accounts') diff --git a/apps/web/app/admin/accounts/page.tsx b/apps/web/app/admin/accounts/page.tsx index bc010582f..47bfce064 100644 --- a/apps/web/app/admin/accounts/page.tsx +++ b/apps/web/app/admin/accounts/page.tsx @@ -2,7 +2,7 @@ import { ServerDataLoader } from '@makerkit/data-loader-supabase-nextjs'; import { AdminAccountsTable } from '@kit/admin/components/admin-accounts-table'; import { AdminGuard } from '@kit/admin/components/admin-guard'; -import { getSupabaseServerComponentClient } from '@kit/supabase/server-component-client'; +import { getSupabaseServerAdminClient } from '@kit/supabase/server-admin-client'; import { PageBody, PageHeader } from '@kit/ui/page'; interface SearchParams { @@ -16,9 +16,7 @@ export const metadata = { }; function AccountsPage({ searchParams }: { searchParams: SearchParams }) { - const client = getSupabaseServerComponentClient({ - admin: true, - }); + const client = getSupabaseServerAdminClient(); const page = searchParams.page ? parseInt(searchParams.page) : 1; const filters = getFilters(searchParams); diff --git a/apps/web/app/api/billing/webhook/route.ts b/apps/web/app/api/billing/webhook/route.ts index 814cf44aa..c8a680f48 100644 --- a/apps/web/app/api/billing/webhook/route.ts +++ b/apps/web/app/api/billing/webhook/route.ts @@ -1,7 +1,7 @@ import { getBillingEventHandlerService } from '@kit/billing-gateway'; import { enhanceRouteHandler } from '@kit/next/routes'; import { getLogger } from '@kit/shared/logger'; -import { getSupabaseRouteHandlerClient } from '@kit/supabase/route-handler-client'; +import { getSupabaseServerAdminClient } from '@kit/supabase/server-admin-client'; import billingConfig from '~/config/billing.config'; @@ -20,8 +20,7 @@ export const POST = enhanceRouteHandler( logger.info(ctx, `Received billing webhook. Processing...`); - const supabaseClientProvider = () => - getSupabaseRouteHandlerClient({ admin: true }); + const supabaseClientProvider = () => getSupabaseServerAdminClient(); const service = await getBillingEventHandlerService( supabaseClientProvider, diff --git a/apps/web/app/auth/callback/route.ts b/apps/web/app/auth/callback/route.ts index 251587459..e8aa56a57 100644 --- a/apps/web/app/auth/callback/route.ts +++ b/apps/web/app/auth/callback/route.ts @@ -2,12 +2,12 @@ import { redirect } from 'next/navigation'; import type { NextRequest } from 'next/server'; import { createAuthCallbackService } from '@kit/supabase/auth'; -import { getSupabaseRouteHandlerClient } from '@kit/supabase/route-handler-client'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; import pathsConfig from '~/config/paths.config'; export async function GET(request: NextRequest) { - const service = createAuthCallbackService(getSupabaseRouteHandlerClient()); + const service = createAuthCallbackService(getSupabaseServerClient()); const { nextPath } = await service.exchangeCodeForSession(request, { joinTeamPath: pathsConfig.app.joinTeam, diff --git a/apps/web/app/auth/confirm/route.ts b/apps/web/app/auth/confirm/route.ts index 53c066ce1..ac5cc8b9e 100644 --- a/apps/web/app/auth/confirm/route.ts +++ b/apps/web/app/auth/confirm/route.ts @@ -1,12 +1,12 @@ import { NextRequest, NextResponse } from 'next/server'; import { createAuthCallbackService } from '@kit/supabase/auth'; -import { getSupabaseRouteHandlerClient } from '@kit/supabase/route-handler-client'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; import pathsConfig from '~/config/paths.config'; export async function GET(request: NextRequest) { - const service = createAuthCallbackService(getSupabaseRouteHandlerClient()); + const service = createAuthCallbackService(getSupabaseServerClient()); const url = await service.verifyTokenHash(request, { joinTeamPath: pathsConfig.app.joinTeam, diff --git a/apps/web/app/auth/verify/page.tsx b/apps/web/app/auth/verify/page.tsx index 8cf078c30..c902662b6 100644 --- a/apps/web/app/auth/verify/page.tsx +++ b/apps/web/app/auth/verify/page.tsx @@ -2,7 +2,7 @@ import { redirect } from 'next/navigation'; import { MultiFactorChallengeContainer } from '@kit/auth/mfa'; import { checkRequiresMultiFactorAuthentication } from '@kit/supabase/check-requires-mfa'; -import { getSupabaseServerComponentClient } from '@kit/supabase/server-component-client'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; import pathsConfig from '~/config/paths.config'; import { createI18nServerInstance } from '~/lib/i18n/i18n.server'; @@ -23,7 +23,7 @@ export const generateMetadata = async () => { }; async function VerifyPage(props: Props) { - const client = getSupabaseServerComponentClient(); + const client = getSupabaseServerClient(); const { data: { user }, diff --git a/apps/web/app/home/(user)/_lib/server/load-user-workspace.ts b/apps/web/app/home/(user)/_lib/server/load-user-workspace.ts index f9d0ea0ea..b48e37dfc 100644 --- a/apps/web/app/home/(user)/_lib/server/load-user-workspace.ts +++ b/apps/web/app/home/(user)/_lib/server/load-user-workspace.ts @@ -1,7 +1,7 @@ import { cache } from 'react'; import { createAccountsApi } from '@kit/accounts/api'; -import { getSupabaseServerComponentClient } from '@kit/supabase/server-component-client'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; import featureFlagsConfig from '~/config/feature-flags.config'; import { requireUserInServerComponent } from '~/lib/server/require-user-in-server-component'; @@ -19,7 +19,7 @@ export type UserWorkspace = Awaited>; export const loadUserWorkspace = cache(workspaceLoader); async function workspaceLoader() { - const client = getSupabaseServerComponentClient(); + const client = getSupabaseServerClient(); const api = createAccountsApi(client); const accountsPromise = shouldLoadAccounts diff --git a/apps/web/app/home/(user)/billing/_lib/server/personal-account-billing-page.loader.ts b/apps/web/app/home/(user)/billing/_lib/server/personal-account-billing-page.loader.ts index 7c9f1139d..ea8f2722b 100644 --- a/apps/web/app/home/(user)/billing/_lib/server/personal-account-billing-page.loader.ts +++ b/apps/web/app/home/(user)/billing/_lib/server/personal-account-billing-page.loader.ts @@ -5,7 +5,7 @@ import { cache } from 'react'; import { z } from 'zod'; import { createAccountsApi } from '@kit/accounts/api'; -import { getSupabaseServerComponentClient } from '@kit/supabase/server-component-client'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; /** * The variable BILLING_MODE represents the billing mode for a service. It can @@ -33,7 +33,7 @@ export const loadPersonalAccountBillingPageData = cache( ); function personalAccountBillingPageDataLoader(userId: string) { - const client = getSupabaseServerComponentClient(); + const client = getSupabaseServerClient(); const api = createAccountsApi(client); const data = diff --git a/apps/web/app/home/(user)/billing/_lib/server/server-actions.ts b/apps/web/app/home/(user)/billing/_lib/server/server-actions.ts index f1bc72c94..c029d1b32 100644 --- a/apps/web/app/home/(user)/billing/_lib/server/server-actions.ts +++ b/apps/web/app/home/(user)/billing/_lib/server/server-actions.ts @@ -3,7 +3,7 @@ import { redirect } from 'next/navigation'; import { enhanceAction } from '@kit/next/actions'; -import { getSupabaseServerActionClient } from '@kit/supabase/server-actions-client'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; import featureFlagsConfig from '~/config/feature-flags.config'; @@ -26,7 +26,7 @@ export const createPersonalAccountCheckoutSession = enhanceAction( throw new Error('Personal account billing is not enabled'); } - const client = getSupabaseServerActionClient(); + const client = getSupabaseServerClient(); const service = createUserBillingService(client); return await service.createCheckoutSession(data); @@ -46,7 +46,7 @@ export const createPersonalAccountBillingPortalSession = enhanceAction( throw new Error('Personal account billing is not enabled'); } - const client = getSupabaseServerActionClient(); + const client = getSupabaseServerClient(); const service = createUserBillingService(client); // get url to billing portal diff --git a/apps/web/app/home/[account]/_lib/server/team-account-billing-page.loader.ts b/apps/web/app/home/[account]/_lib/server/team-account-billing-page.loader.ts index 09ef2908a..73f400b75 100644 --- a/apps/web/app/home/[account]/_lib/server/team-account-billing-page.loader.ts +++ b/apps/web/app/home/[account]/_lib/server/team-account-billing-page.loader.ts @@ -4,7 +4,7 @@ import { cache } from 'react'; import { z } from 'zod'; -import { getSupabaseServerComponentClient } from '@kit/supabase/server-component-client'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; import { createTeamAccountsApi } from '@kit/team-accounts/api'; /** @@ -29,7 +29,7 @@ const BILLING_MODE = z export const loadTeamAccountBillingPage = cache(teamAccountBillingPageLoader); function teamAccountBillingPageLoader(accountId: string) { - const client = getSupabaseServerComponentClient(); + const client = getSupabaseServerClient(); const api = createTeamAccountsApi(client); const data = diff --git a/apps/web/app/home/[account]/_lib/server/team-account-workspace.loader.ts b/apps/web/app/home/[account]/_lib/server/team-account-workspace.loader.ts index 40a204f4d..4a389946d 100644 --- a/apps/web/app/home/[account]/_lib/server/team-account-workspace.loader.ts +++ b/apps/web/app/home/[account]/_lib/server/team-account-workspace.loader.ts @@ -4,7 +4,7 @@ import { cache } from 'react'; import { redirect } from 'next/navigation'; -import { getSupabaseServerComponentClient } from '@kit/supabase/server-component-client'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; import { createTeamAccountsApi } from '@kit/team-accounts/api'; import pathsConfig from '~/config/paths.config'; @@ -26,7 +26,7 @@ export type TeamAccountWorkspace = Awaited< export const loadTeamWorkspace = cache(workspaceLoader); async function workspaceLoader(accountSlug: string) { - const client = getSupabaseServerComponentClient(); + const client = getSupabaseServerClient(); const api = createTeamAccountsApi(client); const [workspace, user] = await Promise.all([ diff --git a/apps/web/app/home/[account]/billing/_lib/server/server-actions.ts b/apps/web/app/home/[account]/billing/_lib/server/server-actions.ts index 9ddff4216..e6ea74325 100644 --- a/apps/web/app/home/[account]/billing/_lib/server/server-actions.ts +++ b/apps/web/app/home/[account]/billing/_lib/server/server-actions.ts @@ -3,7 +3,7 @@ import { redirect } from 'next/navigation'; import { enhanceAction } from '@kit/next/actions'; -import { getSupabaseServerActionClient } from '@kit/supabase/server-actions-client'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; import featureFlagsConfig from '~/config/feature-flags.config'; @@ -30,7 +30,7 @@ export const createTeamAccountCheckoutSession = enhanceAction( throw new Error('Team account billing is not enabled'); } - const client = getSupabaseServerActionClient(); + const client = getSupabaseServerClient(); const service = createTeamBillingService(client); return service.createCheckout(data); @@ -53,7 +53,7 @@ export const createBillingPortalSession = enhanceAction( const params = TeamBillingPortalSchema.parse(Object.fromEntries(formData)); - const client = getSupabaseServerActionClient(); + const client = getSupabaseServerClient(); const service = createTeamBillingService(client); // get url to billing portal diff --git a/apps/web/app/home/[account]/billing/_lib/server/team-billing.service.ts b/apps/web/app/home/[account]/billing/_lib/server/team-billing.service.ts index 68d389bc8..d9f8937b9 100644 --- a/apps/web/app/home/[account]/billing/_lib/server/team-billing.service.ts +++ b/apps/web/app/home/[account]/billing/_lib/server/team-billing.service.ts @@ -8,7 +8,7 @@ import { LineItemSchema } from '@kit/billing'; import { getBillingGatewayProvider } from '@kit/billing-gateway'; import { getLogger } from '@kit/shared/logger'; import { requireUser } from '@kit/supabase/require-user'; -import { getSupabaseServerActionClient } from '@kit/supabase/server-actions-client'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; import { createTeamAccountsApi } from '@kit/team-accounts/api'; import appConfig from '~/config/app.config'; @@ -150,7 +150,7 @@ class TeamBillingService { accountId: string; slug: string; }) { - const client = getSupabaseServerActionClient(); + const client = getSupabaseServerClient(); const logger = await getLogger(); logger.info( diff --git a/apps/web/app/home/[account]/billing/return/page.tsx b/apps/web/app/home/[account]/billing/return/page.tsx index b6080a63c..ffb9acf44 100644 --- a/apps/web/app/home/[account]/billing/return/page.tsx +++ b/apps/web/app/home/[account]/billing/return/page.tsx @@ -4,7 +4,7 @@ import { notFound, redirect } from 'next/navigation'; import { getBillingGatewayProvider } from '@kit/billing-gateway'; import { BillingSessionStatus } from '@kit/billing-gateway/components'; -import { getSupabaseServerComponentClient } from '@kit/supabase/server-component-client'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; import billingConfig from '~/config/billing.config'; import { withI18n } from '~/lib/i18n/with-i18n'; @@ -75,7 +75,7 @@ function BlurryBackdrop() { async function loadCheckoutSession(sessionId: string) { await requireUserInServerComponent(); - const client = getSupabaseServerComponentClient(); + const client = getSupabaseServerClient(); const gateway = await getBillingGatewayProvider(client); const session = await gateway.retrieveCheckoutSession({ diff --git a/apps/web/app/home/[account]/members/page.tsx b/apps/web/app/home/[account]/members/page.tsx index cbb9cd87b..4216b9106 100644 --- a/apps/web/app/home/[account]/members/page.tsx +++ b/apps/web/app/home/[account]/members/page.tsx @@ -1,6 +1,6 @@ import { PlusCircle } from 'lucide-react'; -import { getSupabaseServerComponentClient } from '@kit/supabase/server-component-client'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; import { AccountInvitationsTable, AccountMembersTable, @@ -42,7 +42,7 @@ export const generateMetadata = async () => { }; async function TeamAccountMembersPage({ params }: Params) { - const client = getSupabaseServerComponentClient(); + const client = getSupabaseServerClient(); const [members, invitations, canAddMember, { user, account }] = await loadMembersPageData(client, params.account); diff --git a/apps/web/app/home/[account]/settings/page.tsx b/apps/web/app/home/[account]/settings/page.tsx index 2ae35dd33..e576d5426 100644 --- a/apps/web/app/home/[account]/settings/page.tsx +++ b/apps/web/app/home/[account]/settings/page.tsx @@ -1,4 +1,4 @@ -import { getSupabaseServerComponentClient } from '@kit/supabase/server-component-client'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; import { createTeamAccountsApi } from '@kit/team-accounts/api'; import { TeamAccountSettingsContainer } from '@kit/team-accounts/components'; import { AppBreadcrumbs } from '@kit/ui/app-breadcrumbs'; @@ -32,7 +32,7 @@ const paths = { }; async function TeamAccountSettingsPage(props: Props) { - const api = createTeamAccountsApi(getSupabaseServerComponentClient()); + const api = createTeamAccountsApi(getSupabaseServerClient()); const data = await api.getTeamAccount(props.params.account); const account = { diff --git a/apps/web/app/join/page.tsx b/apps/web/app/join/page.tsx index 6aeb5568a..8b7309c36 100644 --- a/apps/web/app/join/page.tsx +++ b/apps/web/app/join/page.tsx @@ -5,7 +5,8 @@ import { ArrowLeft } from 'lucide-react'; import { AuthLayoutShell } from '@kit/auth/shared'; import { requireUser } from '@kit/supabase/require-user'; -import { getSupabaseServerComponentClient } from '@kit/supabase/server-component-client'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; +import { getSupabaseServerAdminClient } from '@kit/supabase/server-admin-client'; import { createTeamAccountsApi } from '@kit/team-accounts/api'; import { AcceptInvitationContainer } from '@kit/team-accounts/components'; import { Button } from '@kit/ui/button'; @@ -40,7 +41,7 @@ async function JoinTeamAccountPage({ searchParams }: Context) { notFound(); } - const client = getSupabaseServerComponentClient(); + const client = getSupabaseServerClient(); const auth = await requireUser(client); // if the user is not logged in or there is an error @@ -59,7 +60,7 @@ async function JoinTeamAccountPage({ searchParams }: Context) { } // get api to interact with team accounts - const adminClient = getSupabaseServerComponentClient({ admin: true }); + const adminClient = getSupabaseServerAdminClient(); const api = createTeamAccountsApi(client); // the user is logged in, we can now check if the token is valid diff --git a/apps/web/app/not-found.tsx b/apps/web/app/not-found.tsx index f70ee9c31..57938013a 100644 --- a/apps/web/app/not-found.tsx +++ b/apps/web/app/not-found.tsx @@ -2,7 +2,7 @@ import Link from 'next/link'; import { ArrowLeft } from 'lucide-react'; -import { getSupabaseServerComponentClient } from '@kit/supabase/server-component-client'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; import { Button } from '@kit/ui/button'; import { Heading } from '@kit/ui/heading'; import { Trans } from '@kit/ui/trans'; @@ -21,7 +21,7 @@ export const generateMetadata = async () => { }; const NotFoundPage = async () => { - const client = getSupabaseServerComponentClient(); + const client = getSupabaseServerClient(); const { data: { user }, diff --git a/packages/features/accounts/src/server/personal-accounts-server-actions.ts b/packages/features/accounts/src/server/personal-accounts-server-actions.ts index 710883eee..b19f114a5 100644 --- a/packages/features/accounts/src/server/personal-accounts-server-actions.ts +++ b/packages/features/accounts/src/server/personal-accounts-server-actions.ts @@ -6,15 +6,15 @@ import { redirect } from 'next/navigation'; import { z } from 'zod'; import { enhanceAction } from '@kit/next/actions'; -import { getSupabaseServerActionClient } from '@kit/supabase/server-actions-client'; - +import { getSupabaseServerClient } from '@kit/supabase/server-client'; +import { getSupabaseServerAdminClient } from '@kit/supabase/server-admin-client'; import { DeletePersonalAccountSchema } from '../schema/delete-personal-account.schema'; import { createDeletePersonalAccountService } from './services/delete-personal-account.service'; const emailSettings = getEmailSettingsFromEnvironment(); export async function refreshAuthSession() { - const client = getSupabaseServerActionClient(); + const client = getSupabaseServerClient(); await client.auth.refreshSession(); @@ -32,7 +32,7 @@ export const deletePersonalAccountAction = enhanceAction( throw new Error('Invalid form data'); } - const client = getSupabaseServerActionClient(); + const client = getSupabaseServerClient(); // create a new instance of the personal accounts service const service = createDeletePersonalAccountService(); @@ -42,7 +42,7 @@ export const deletePersonalAccountAction = enhanceAction( // delete the user's account and cancel all subscriptions await service.deletePersonalAccount({ - adminClient: getSupabaseServerActionClient({ admin: true }), + adminClient: getSupabaseServerAdminClient(), userId: user.id, userEmail: user.email ?? null, emailSettings, diff --git a/packages/features/admin/src/components/admin-account-page.tsx b/packages/features/admin/src/components/admin-account-page.tsx index e1ffaf11d..053fe16c1 100644 --- a/packages/features/admin/src/components/admin-account-page.tsx +++ b/packages/features/admin/src/components/admin-account-page.tsx @@ -7,7 +7,7 @@ import { } from 'lucide-react'; import { Database } from '@kit/supabase/database'; -import { getSupabaseServerComponentClient } from '@kit/supabase/server-component-client'; +import { getSupabaseServerAdminClient } from '@kit/supabase/server-admin-client'; import { Alert, AlertDescription, AlertTitle } from '@kit/ui/alert'; import { AppBreadcrumbs } from '@kit/ui/app-breadcrumbs'; import { Badge } from '@kit/ui/badge'; @@ -49,9 +49,7 @@ export function AdminAccountPage(props: { } async function PersonalAccountPage(props: { account: Account }) { - const client = getSupabaseServerComponentClient({ - admin: true, - }); + const client = getSupabaseServerAdminClient(); const memberships = await getMemberships(props.account.id); const { data, error } = await client.auth.admin.getUserById(props.account.id); @@ -196,9 +194,7 @@ async function TeamAccountPage(props: { } async function SubscriptionsTable(props: { accountId: string }) { - const client = getSupabaseServerComponentClient({ - admin: true, - }); + const client = getSupabaseServerAdminClient(); const { data: subscription, error } = await client .from('subscriptions') @@ -345,9 +341,7 @@ async function SubscriptionsTable(props: { accountId: string }) { } async function getMemberships(userId: string) { - const client = getSupabaseServerComponentClient({ - admin: true, - }); + const client = getSupabaseServerAdminClient(); const memberships = await client .from('accounts_memberships') @@ -370,9 +364,7 @@ async function getMemberships(userId: string) { } async function getMembers(accountSlug: string) { - const client = getSupabaseServerComponentClient({ - admin: true, - }); + const client = getSupabaseServerAdminClient(); const members = await client.rpc('get_account_members', { account_slug: accountSlug, diff --git a/packages/features/admin/src/components/admin-guard.tsx b/packages/features/admin/src/components/admin-guard.tsx index 0bb8091e1..502d8f6e5 100644 --- a/packages/features/admin/src/components/admin-guard.tsx +++ b/packages/features/admin/src/components/admin-guard.tsx @@ -1,6 +1,6 @@ import { notFound } from 'next/navigation'; -import { getSupabaseServerComponentClient } from '@kit/supabase/server-component-client'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; import { isSuperAdmin } from '../lib/server/utils/is-super-admin'; @@ -15,7 +15,7 @@ export function AdminGuard( Component: LayoutOrPageComponent, ) { return async function AdminGuardServerComponentWrapper(params: Params) { - const client = getSupabaseServerComponentClient(); + const client = getSupabaseServerClient(); const isUserSuperAdmin = await isSuperAdmin(client); // if the user is not a super-admin, we redirect to a 404 diff --git a/packages/features/admin/src/lib/server/admin-server-actions.ts b/packages/features/admin/src/lib/server/admin-server-actions.ts index 31444bf64..054daf39a 100644 --- a/packages/features/admin/src/lib/server/admin-server-actions.ts +++ b/packages/features/admin/src/lib/server/admin-server-actions.ts @@ -5,7 +5,8 @@ import { redirect } from 'next/navigation'; import { enhanceAction } from '@kit/next/actions'; import { getLogger } from '@kit/shared/logger'; -import { getSupabaseServerActionClient } from '@kit/supabase/server-actions-client'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; +import { getSupabaseServerAdminClient } from '@kit/supabase/server-admin-client'; import { BanUserSchema, @@ -150,14 +151,14 @@ export const deleteAccountAction = adminAction( ); function getAdminAuthService() { - const client = getSupabaseServerActionClient(); - const adminClient = getSupabaseServerActionClient({ admin: true }); + const client = getSupabaseServerClient(); + const adminClient = getSupabaseServerAdminClient(); return createAdminAuthUserService(client, adminClient); } function getAdminAccountsService() { - const adminClient = getSupabaseServerActionClient({ admin: true }); + const adminClient = getSupabaseServerAdminClient(); return createAdminAccountsService(adminClient); } diff --git a/packages/features/admin/src/lib/server/loaders/admin-dashboard.loader.ts b/packages/features/admin/src/lib/server/loaders/admin-dashboard.loader.ts index f64f8ec26..fa0757882 100644 --- a/packages/features/admin/src/lib/server/loaders/admin-dashboard.loader.ts +++ b/packages/features/admin/src/lib/server/loaders/admin-dashboard.loader.ts @@ -2,7 +2,7 @@ import 'server-only'; import { cache } from 'react'; -import { getSupabaseServerComponentClient } from '@kit/supabase/server-component-client'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; import { createAdminDashboardService } from '../services/admin-dashboard.service'; @@ -14,7 +14,7 @@ import { createAdminDashboardService } from '../services/admin-dashboard.service export const loadAdminDashboard = cache(adminDashboardLoader); function adminDashboardLoader() { - const client = getSupabaseServerComponentClient({ admin: true }); + const client = getSupabaseServerClient(); const service = createAdminDashboardService(client); return service.getDashboardData(); diff --git a/packages/features/admin/src/lib/server/utils/admin-action.ts b/packages/features/admin/src/lib/server/utils/admin-action.ts index 9d4120919..04fb54821 100644 --- a/packages/features/admin/src/lib/server/utils/admin-action.ts +++ b/packages/features/admin/src/lib/server/utils/admin-action.ts @@ -1,6 +1,6 @@ import { notFound } from 'next/navigation'; -import { getSupabaseServerActionClient } from '@kit/supabase/server-actions-client'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; import { isSuperAdmin } from './is-super-admin'; @@ -11,7 +11,7 @@ import { isSuperAdmin } from './is-super-admin'; */ export function adminAction(fn: (params: Args) => Response) { return async (params: Args) => { - const isAdmin = await isSuperAdmin(getSupabaseServerActionClient()); + const isAdmin = await isSuperAdmin(getSupabaseServerClient()); if (!isAdmin) { notFound(); diff --git a/packages/features/team-accounts/src/server/actions/create-team-account-server-actions.ts b/packages/features/team-accounts/src/server/actions/create-team-account-server-actions.ts index f6cd2f4b6..64d85a237 100644 --- a/packages/features/team-accounts/src/server/actions/create-team-account-server-actions.ts +++ b/packages/features/team-accounts/src/server/actions/create-team-account-server-actions.ts @@ -4,7 +4,7 @@ import { redirect } from 'next/navigation'; import { enhanceAction } from '@kit/next/actions'; import { getLogger } from '@kit/shared/logger'; -import { getSupabaseServerActionClient } from '@kit/supabase/server-actions-client'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; import { CreateTeamSchema } from '../../schema/create-team.schema'; import { createCreateTeamAccountService } from '../services/create-team-account.service'; @@ -12,7 +12,7 @@ import { createCreateTeamAccountService } from '../services/create-team-account. export const createTeamAccountAction = enhanceAction( async ({ name }, user) => { const logger = await getLogger(); - const client = getSupabaseServerActionClient(); + const client = getSupabaseServerClient(); const service = createCreateTeamAccountService(client); const ctx = { diff --git a/packages/features/team-accounts/src/server/actions/leave-team-account-server-actions.ts b/packages/features/team-accounts/src/server/actions/leave-team-account-server-actions.ts index 5fdb34223..0ed33a450 100644 --- a/packages/features/team-accounts/src/server/actions/leave-team-account-server-actions.ts +++ b/packages/features/team-accounts/src/server/actions/leave-team-account-server-actions.ts @@ -4,7 +4,7 @@ import { revalidatePath } from 'next/cache'; import { redirect } from 'next/navigation'; import { enhanceAction } from '@kit/next/actions'; -import { getSupabaseServerActionClient } from '@kit/supabase/server-actions-client'; +import { getSupabaseServerAdminClient } from '@kit/supabase/server-admin-client'; import { LeaveTeamAccountSchema } from '../../schema/leave-team-account.schema'; import { createLeaveTeamAccountService } from '../services/leave-team-account.service'; @@ -15,7 +15,7 @@ export const leaveTeamAccountAction = enhanceAction( const params = LeaveTeamAccountSchema.parse(body); const service = createLeaveTeamAccountService( - getSupabaseServerActionClient({ admin: true }), + getSupabaseServerAdminClient(), ); await service.leaveTeamAccount({ diff --git a/packages/features/team-accounts/src/server/actions/team-details-server-actions.ts b/packages/features/team-accounts/src/server/actions/team-details-server-actions.ts index 1a5f174f6..da5e41700 100644 --- a/packages/features/team-accounts/src/server/actions/team-details-server-actions.ts +++ b/packages/features/team-accounts/src/server/actions/team-details-server-actions.ts @@ -4,13 +4,13 @@ import { redirect } from 'next/navigation'; import { enhanceAction } from '@kit/next/actions'; import { getLogger } from '@kit/shared/logger'; -import { getSupabaseServerActionClient } from '@kit/supabase/server-actions-client'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; import { UpdateTeamNameSchema } from '../../schema/update-team-name.schema'; export const updateTeamAccountName = enhanceAction( async (params) => { - const client = getSupabaseServerActionClient(); + const client = getSupabaseServerClient(); const logger = await getLogger(); const { name, path, slug } = params; diff --git a/packages/features/team-accounts/src/server/actions/team-invitations-server-actions.ts b/packages/features/team-accounts/src/server/actions/team-invitations-server-actions.ts index a31b7dc68..2e210c2ee 100644 --- a/packages/features/team-accounts/src/server/actions/team-invitations-server-actions.ts +++ b/packages/features/team-accounts/src/server/actions/team-invitations-server-actions.ts @@ -6,7 +6,8 @@ import { redirect } from 'next/navigation'; import { z } from 'zod'; import { enhanceAction } from '@kit/next/actions'; -import { getSupabaseServerActionClient } from '@kit/supabase/server-actions-client'; +import { getSupabaseServerAdminClient } from '@kit/supabase/server-admin-client'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; import { AcceptInvitationSchema } from '../../schema/accept-invitation.schema'; import { DeleteInvitationSchema } from '../../schema/delete-invitation.schema'; @@ -22,7 +23,7 @@ import { createAccountPerSeatBillingService } from '../services/account-per-seat */ export const createInvitationsAction = enhanceAction( async (params) => { - const client = getSupabaseServerActionClient(); + const client = getSupabaseServerClient(); // Create the service const service = createAccountInvitationsService(client); @@ -51,7 +52,7 @@ export const createInvitationsAction = enhanceAction( */ export const deleteInvitationAction = enhanceAction( async (data) => { - const client = getSupabaseServerActionClient(); + const client = getSupabaseServerClient(); const service = createAccountInvitationsService(client); // Delete the invitation @@ -74,7 +75,7 @@ export const deleteInvitationAction = enhanceAction( */ export const updateInvitationAction = enhanceAction( async (invitation) => { - const client = getSupabaseServerActionClient(); + const client = getSupabaseServerClient(); const service = createAccountInvitationsService(client); await service.updateInvitation(invitation); @@ -96,7 +97,7 @@ export const updateInvitationAction = enhanceAction( */ export const acceptInvitationAction = enhanceAction( async (data: FormData, user) => { - const client = getSupabaseServerActionClient(); + const client = getSupabaseServerClient(); const { inviteToken, nextPath } = AcceptInvitationSchema.parse( Object.fromEntries(data), @@ -106,14 +107,14 @@ export const acceptInvitationAction = enhanceAction( const perSeatBillingService = createAccountPerSeatBillingService(client); const service = createAccountInvitationsService(client); + // use admin client to accept invitation + const adminClient = getSupabaseServerAdminClient(); + // Accept the invitation - const accountId = await service.acceptInvitationToTeam( - getSupabaseServerActionClient({ admin: true }), - { - inviteToken, - userId: user.id, - }, - ); + const accountId = await service.acceptInvitationToTeam(adminClient, { + inviteToken, + userId: user.id, + }); // If the account ID is not present, throw an error if (!accountId) { @@ -134,7 +135,7 @@ export const acceptInvitationAction = enhanceAction( */ export const renewInvitationAction = enhanceAction( async (params) => { - const client = getSupabaseServerActionClient(); + const client = getSupabaseServerClient(); const { invitationId } = RenewInvitationSchema.parse(params); const service = createAccountInvitationsService(client); diff --git a/packages/next/src/actions/index.ts b/packages/next/src/actions/index.ts index 7959e36b0..2420ee810 100644 --- a/packages/next/src/actions/index.ts +++ b/packages/next/src/actions/index.ts @@ -9,7 +9,7 @@ import { ZodType, z } from 'zod'; import { verifyCaptchaToken } from '@kit/auth/captcha/server'; import { requireUser } from '@kit/supabase/require-user'; -import { getSupabaseServerActionClient } from '@kit/supabase/server-actions-client'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; import { captureException, zodParseFactory } from '../utils'; @@ -63,7 +63,7 @@ export function enhanceAction< // verify the user is authenticated if required if (requireAuth) { // verify the user is authenticated if required - const auth = await requireUser(getSupabaseServerActionClient()); + const auth = await requireUser(getSupabaseServerClient()); // If the user is not authenticated, redirect to the specified URL. if (!auth.data) { diff --git a/packages/next/src/routes/index.ts b/packages/next/src/routes/index.ts index 7984e4449..5ec0174df 100644 --- a/packages/next/src/routes/index.ts +++ b/packages/next/src/routes/index.ts @@ -10,7 +10,7 @@ import { z } from 'zod'; import { verifyCaptchaToken } from '@kit/auth/captcha/server'; import { requireUser } from '@kit/supabase/require-user'; -import { getSupabaseRouteHandlerClient } from '@kit/supabase/route-handler-client'; +import { getSupabaseServerClient } from '@kit/supabase/server-client'; import { captureException, zodParseFactory } from '../utils'; @@ -96,7 +96,7 @@ export const enhanceRouteHandler = < } } - const client = getSupabaseRouteHandlerClient(); + const client = getSupabaseServerClient(); const shouldVerifyAuth = params?.auth ?? true; diff --git a/packages/supabase/package.json b/packages/supabase/package.json index 97121737d..d44b1e693 100644 --- a/packages/supabase/package.json +++ b/packages/supabase/package.json @@ -10,11 +10,13 @@ }, "prettier": "@kit/prettier-config", "exports": { - "./middleware-client": "./src/clients/middleware.client.ts", - "./server-actions-client": "./src/clients/server-actions.client.ts", - "./route-handler-client": "./src/clients/route-handler.client.ts", - "./server-component-client": "./src/clients/server-component.client.ts", - "./browser-client": "./src/clients/browser.client.ts", + "./server-client": "./src/clients/server-client.ts", + "./server-admin-client": "./src/clients/server-admin-client.ts", + "./middleware-client": "./src/clients/middleware-client.ts", + "./server-actions-client": "./src/clients/server-actions-client.ts", + "./route-handler-client": "./src/clients/route-handler-client.ts", + "./server-component-client": "./src/clients/server-component-client.ts", + "./browser-client": "./src/clients/browser-client.ts", "./check-requires-mfa": "./src/check-requires-mfa.ts", "./require-user": "./src/require-user.ts", "./hooks/*": "./src/hooks/*.ts", diff --git a/packages/supabase/src/clients/browser.client.ts b/packages/supabase/src/clients/browser-client.ts similarity index 100% rename from packages/supabase/src/clients/browser.client.ts rename to packages/supabase/src/clients/browser-client.ts diff --git a/packages/supabase/src/clients/middleware-client.ts b/packages/supabase/src/clients/middleware-client.ts new file mode 100644 index 000000000..608dc3b81 --- /dev/null +++ b/packages/supabase/src/clients/middleware-client.ts @@ -0,0 +1,38 @@ +import 'server-only'; + +import { type NextRequest, NextResponse } from 'next/server'; + +import { createServerClient } from '@supabase/ssr'; + +import { Database } from '../database.types'; +import { getSupabaseClientKeys } from '../get-supabase-client-keys'; + +/** + * Creates a middleware client for Supabase. + * + * @param {NextRequest} request - The Next.js request object. + * @param {NextResponse} response - The Next.js response object. + */ +export function createMiddlewareClient( + request: NextRequest, + response: NextResponse, +) { + const keys = getSupabaseClientKeys(); + + return createServerClient(keys.url, keys.anonKey, { + cookies: { + getAll() { + return request.cookies.getAll(); + }, + setAll(cookiesToSet) { + cookiesToSet.forEach(({ name, value }) => + request.cookies.set(name, value), + ); + + cookiesToSet.forEach(({ name, value, options }) => + response.cookies.set(name, value, options), + ); + }, + }, + }); +} diff --git a/packages/supabase/src/clients/middleware.client.ts b/packages/supabase/src/clients/middleware.client.ts deleted file mode 100644 index 6ea496516..000000000 --- a/packages/supabase/src/clients/middleware.client.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { type NextRequest, NextResponse } from 'next/server'; - -import { type CookieOptions, createServerClient } from '@supabase/ssr'; - -import { Database } from '../database.types'; -import { getSupabaseClientKeys } from '../get-supabase-client-keys'; - -/** - * Creates a middleware client for Supabase. - * - * @param {NextRequest} request - The Next.js request object. - * @param {NextResponse} response - The Next.js response object. - */ -export function createMiddlewareClient( - request: NextRequest, - response: NextResponse, -) { - const keys = getSupabaseClientKeys(); - - return createServerClient(keys.url, keys.anonKey, { - cookies: getCookieStrategy(request, response), - }); -} - -function getCookieStrategy(request: NextRequest, response: NextResponse) { - return { - set: (name: string, value: string, options: CookieOptions) => { - request.cookies.set({ name, value, ...options }); - - response = NextResponse.next({ - request: { - headers: request.headers, - }, - }); - - response.cookies.set({ - name, - value, - ...options, - }); - }, - get: (name: string) => { - return request.cookies.get(name)?.value; - }, - remove: (name: string, options: CookieOptions) => { - request.cookies.set({ - name, - value: '', - ...options, - }); - - response = NextResponse.next({ - request: { - headers: request.headers, - }, - }); - - response.cookies.set({ - name, - value: '', - ...options, - }); - }, - }; -} diff --git a/packages/supabase/src/clients/route-handler.client.ts b/packages/supabase/src/clients/route-handler-client.ts similarity index 96% rename from packages/supabase/src/clients/route-handler.client.ts rename to packages/supabase/src/clients/route-handler-client.ts index 076147ae7..dcc208479 100644 --- a/packages/supabase/src/clients/route-handler.client.ts +++ b/packages/supabase/src/clients/route-handler-client.ts @@ -20,6 +20,7 @@ const keys = getSupabaseClientKeys(); /** * @name getSupabaseRouteHandlerClient + * @deprecated Use `getSupabaseServerClient` instead. * @description Get a Supabase client for use in the Route Handler Routes */ export function getSupabaseRouteHandlerClient( diff --git a/packages/supabase/src/clients/server-actions.client.ts b/packages/supabase/src/clients/server-actions-client.ts similarity index 93% rename from packages/supabase/src/clients/server-actions.client.ts rename to packages/supabase/src/clients/server-actions-client.ts index 6bf8d2d36..e4c53e63c 100644 --- a/packages/supabase/src/clients/server-actions.client.ts +++ b/packages/supabase/src/clients/server-actions-client.ts @@ -25,6 +25,11 @@ function createServerSupabaseClient< }); } +/** + * @name getSupabaseServerComponentClient + * @deprecated Use `getSupabaseServerClient` instead. + * @param params + */ export function getSupabaseServerActionClient< GenericSchema extends Database = Database, >(params?: { admin: boolean }) { diff --git a/packages/supabase/src/clients/server-admin-client.ts b/packages/supabase/src/clients/server-admin-client.ts new file mode 100644 index 000000000..9c187010a --- /dev/null +++ b/packages/supabase/src/clients/server-admin-client.ts @@ -0,0 +1,31 @@ +import 'server-only'; + +import { unstable_noStore as noStore } from 'next/cache'; + +import { createClient } from '@supabase/supabase-js'; + +import { Database } from '../database.types'; +import { + getServiceRoleKey, + warnServiceRoleKeyUsage, +} from '../get-service-role-key'; +import { getSupabaseClientKeys } from '../get-supabase-client-keys'; + +/** + * @name getSupabaseServerAdminClient + * @description Get a Supabase client for use in the Server with admin access to the database. + */ +export function getSupabaseServerAdminClient() { + noStore(); + warnServiceRoleKeyUsage(); + + const url = getSupabaseClientKeys().url; + + return createClient(url, getServiceRoleKey(), { + auth: { + persistSession: false, + detectSessionInUrl: false, + autoRefreshToken: false, + }, + }); +} diff --git a/packages/supabase/src/clients/server-client.ts b/packages/supabase/src/clients/server-client.ts new file mode 100644 index 000000000..66b4d1f3a --- /dev/null +++ b/packages/supabase/src/clients/server-client.ts @@ -0,0 +1,39 @@ +import 'server-only'; + +import { unstable_noStore as noStore } from 'next/cache'; +import { cookies } from 'next/headers'; + +import { createServerClient } from '@supabase/ssr'; + +import { Database } from '../database.types'; +import { getSupabaseClientKeys } from '../get-supabase-client-keys'; + +/** + * @name getSupabaseServerClient + * @description Creates a Supabase client for use in the Server. + */ +export function getSupabaseServerClient() { + noStore(); + + const cookieStore = cookies(); + const keys = getSupabaseClientKeys(); + + return createServerClient(keys.url, keys.anonKey, { + cookies: { + getAll() { + return cookieStore.getAll(); + }, + setAll(cookiesToSet) { + try { + cookiesToSet.forEach(({ name, value, options }) => + cookieStore.set(name, value, options), + ); + } catch { + // The `setAll` method was called from a Server Component. + // This can be ignored if you have middleware refreshing + // user sessions. + } + }, + }, + }); +} diff --git a/packages/supabase/src/clients/server-component.client.ts b/packages/supabase/src/clients/server-component-client.ts similarity index 100% rename from packages/supabase/src/clients/server-component.client.ts rename to packages/supabase/src/clients/server-component-client.ts diff --git a/packages/supabase/src/hooks/use-supabase.ts b/packages/supabase/src/hooks/use-supabase.ts index 19ff67a11..f2bc940eb 100644 --- a/packages/supabase/src/hooks/use-supabase.ts +++ b/packages/supabase/src/hooks/use-supabase.ts @@ -1,6 +1,6 @@ import { useMemo } from 'react'; -import { getSupabaseBrowserClient } from '../clients/browser.client'; +import { getSupabaseBrowserClient } from '../clients/browser-client'; export function useSupabase() { return useMemo(() => getSupabaseBrowserClient(), []);