diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 0119d46..3745ef1 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,6 +1,6 @@ # These are supported funding model platforms -github: [IKatsuba,Saasfy] +github: [IKatsuba, Saasfy] patreon: # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username diff --git a/apps/web/app/app/(dashboard)/[workspaceSlug]/page.tsx b/apps/web/app/app/(dashboard)/[workspaceSlug]/page.tsx index 7985194..3c85313 100644 --- a/apps/web/app/app/(dashboard)/[workspaceSlug]/page.tsx +++ b/apps/web/app/app/(dashboard)/[workspaceSlug]/page.tsx @@ -20,7 +20,7 @@ export default async function Component({ params }: { params: { workspaceSlug: s const { data: workspace } = await supabase .from('workspaces') - .select('*, workspace_users(*)') + .select('*, workspace_users!inner(*)') .eq('slug', params.workspaceSlug) .eq('workspace_users.user_id', user.id) .single(); diff --git a/apps/web/app/app/(dashboard)/[workspaceSlug]/settings/domains/page.tsx b/apps/web/app/app/(dashboard)/[workspaceSlug]/settings/domains/page.tsx index 049b423..4cdb7d9 100644 --- a/apps/web/app/app/(dashboard)/[workspaceSlug]/settings/domains/page.tsx +++ b/apps/web/app/app/(dashboard)/[workspaceSlug]/settings/domains/page.tsx @@ -1,6 +1,8 @@ +import { redirect } from 'next/navigation'; + import { ExternalLinkIcon } from 'lucide-react'; -import { createAdminClient } from '@saasfy/supabase/server'; +import { createAdminClient, getUser } from '@saasfy/supabase/server'; import { Badge } from '@saasfy/ui/badge'; import { AddDomainForm } from './add-form'; @@ -8,22 +10,26 @@ import { DomainConfiguration } from './domain-configuration'; import { RemoveDomainButton } from './remove-domain-button'; export default async function Component({ params }: { params: { workspaceSlug: string } }) { + const user = await getUser(); + + if (!user) { + return redirect('/login'); + } + const supabase = createAdminClient(); const { data: workspace } = await supabase .from('workspaces') - .select('*') + .select('*, workspace_users!inner(*), domains(*)') .eq('slug', params.workspaceSlug) + .eq('workspace_users.user_id', user.id) .single(); if (!workspace) { return null; } - const { data: domains, error } = await supabase - .from('domains') - .select('*') - .eq('workspace_id', workspace.id); + const domains = workspace.domains; return (
diff --git a/apps/web/app/app/(dashboard)/[workspaceSlug]/settings/layout.tsx b/apps/web/app/app/(dashboard)/[workspaceSlug]/settings/layout.tsx index b51729d..96b58e5 100644 --- a/apps/web/app/app/(dashboard)/[workspaceSlug]/settings/layout.tsx +++ b/apps/web/app/app/(dashboard)/[workspaceSlug]/settings/layout.tsx @@ -1,7 +1,7 @@ import { ReactNode } from 'react'; import { redirect } from 'next/navigation'; -import { createAdminClient } from '@saasfy/supabase/server'; +import { createAdminClient, getUser } from '@saasfy/supabase/server'; import { Nav } from './nav'; @@ -12,11 +12,18 @@ export default async function SettingsLayout({ children: ReactNode; params: { workspaceSlug: string }; }) { + const user = await getUser(); + + if (!user) { + return redirect(`/signin/signin`); + } + const supabase = createAdminClient(); const { data: workspace } = await supabase .from('workspaces') - .select('*') + .select('*, workspace_users!inner(*)') + .eq('workspace_users.user_id', user.id) .eq('slug', params.workspaceSlug) .single(); diff --git a/apps/web/app/app/(dashboard)/[workspaceSlug]/settings/members/page.tsx b/apps/web/app/app/(dashboard)/[workspaceSlug]/settings/members/page.tsx index 45c54af..c7522ee 100644 --- a/apps/web/app/app/(dashboard)/[workspaceSlug]/settings/members/page.tsx +++ b/apps/web/app/app/(dashboard)/[workspaceSlug]/settings/members/page.tsx @@ -4,7 +4,7 @@ import { redirect } from 'next/navigation'; import { FilterIcon, PlusIcon } from 'lucide-react'; import postgres from 'postgres'; -import { createAdminClient, Tables } from '@saasfy/supabase/server'; +import { createAdminClient, getUser, Tables } from '@saasfy/supabase/server'; import { Button } from '@saasfy/ui/button'; import { DropdownMenu, @@ -22,12 +22,19 @@ import { InviteTable } from './invite-table'; import { MemberTable } from './member-table'; export default async function Component({ params }: { params: { workspaceSlug: string } }) { + const user = await getUser(); + + if (!user) { + return redirect('/login'); + } + const supabase = createAdminClient(); const { data: workspace } = await supabase .from('workspaces') - .select('*') + .select('*, workspace_users!inner(*)') .eq('slug', params.workspaceSlug) + .eq('workspace_users.user_id', user.id) .single(); if (!workspace) { diff --git a/apps/web/app/app/(dashboard)/[workspaceSlug]/settings/page.tsx b/apps/web/app/app/(dashboard)/[workspaceSlug]/settings/page.tsx index f268128..48dc482 100644 --- a/apps/web/app/app/(dashboard)/[workspaceSlug]/settings/page.tsx +++ b/apps/web/app/app/(dashboard)/[workspaceSlug]/settings/page.tsx @@ -23,7 +23,7 @@ export default async function Settings({ params }: { params: { workspaceSlug: st const { data: workspace } = await supabase .from('workspaces') - .select('*, workspace_users(*)') + .select('*, workspace_users!inner(*)') .eq('slug', params.workspaceSlug) .eq('workspace_users.user_id', user.id) .single(); diff --git a/apps/web/app/app/(dashboard)/layout.tsx b/apps/web/app/app/(dashboard)/layout.tsx index 4a9ed2f..de6ff17 100644 --- a/apps/web/app/app/(dashboard)/layout.tsx +++ b/apps/web/app/app/(dashboard)/layout.tsx @@ -20,7 +20,7 @@ export default async function DashboardLayout({ children }: { children: ReactNod const { data: workspaces } = await supabase .from('workspaces') - .select('*, workspace_users(*)') + .select('*, workspace_users!inner(*)') .eq('workspace_users.user_id', user.id); return ( diff --git a/apps/web/app/app/(dashboard)/page.tsx b/apps/web/app/app/(dashboard)/page.tsx index ab2e4c0..7013085 100644 --- a/apps/web/app/app/(dashboard)/page.tsx +++ b/apps/web/app/app/(dashboard)/page.tsx @@ -20,7 +20,7 @@ export default async function Component() { const supabase = createAdminClient(); const { data: workspaces } = await supabase .from('workspaces') - .select('*, projects(id), domains(id), workspace_users(id), plans(name)') + .select('*, projects(id), domains(id), workspace_users!inner(id), plans(name)') .eq('workspace_users.user_id', user.id) .limit(8); diff --git a/packages/api/src/lib/with-workspace-user.ts b/packages/api/src/lib/with-workspace-user.ts index 76b65fa..bb350e7 100644 --- a/packages/api/src/lib/with-workspace-user.ts +++ b/packages/api/src/lib/with-workspace-user.ts @@ -24,7 +24,7 @@ export function withWorkspaceUser( const { data: workspace } = await supabase .from('workspaces') - .select('*, workspace_users(*)') + .select('*, workspace_users!inner(*)') .eq('slug', params.workspaceSlug) .eq('workspace_users.user_id', user.id) .in('workspace_users.role', roles) diff --git a/packages/components/src/lib/create-project/actions.ts b/packages/components/src/lib/create-project/actions.ts index 40df895..cb265e1 100644 --- a/packages/components/src/lib/create-project/actions.ts +++ b/packages/components/src/lib/create-project/actions.ts @@ -46,7 +46,7 @@ export async function createProject(formData: FormData) { const { data: workspace } = await supabase .from('workspaces') - .select('*, workspace_users(*)') + .select('*, workspace_users!inner(*)') .eq('slug', workspaceSlug) .eq('workspace_users.user_id', user.id) .single();