diff options
| author | Fuwn <[email protected]> | 2026-02-07 01:42:57 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2026-02-07 01:42:57 -0800 |
| commit | 5c5b1993edd890a80870ee05607ac5f088191d4e (patch) | |
| tree | a721b76bcd49ba10826c53efc87302c7a689512f /apps/web/lib/supabase | |
| download | asa.news-5c5b1993edd890a80870ee05607ac5f088191d4e.tar.xz asa.news-5c5b1993edd890a80870ee05607ac5f088191d4e.zip | |
feat: asa.news RSS reader with developer tier, REST API, and webhooks
Full-stack RSS reader SaaS: Supabase + Next.js + Go worker.
Includes three subscription tiers (free/pro/developer), API key auth,
read-only REST API, webhook push notifications, Stripe billing with
proration, and PWA support.
Diffstat (limited to 'apps/web/lib/supabase')
| -rw-r--r-- | apps/web/lib/supabase/admin.ts | 8 | ||||
| -rw-r--r-- | apps/web/lib/supabase/client.ts | 8 | ||||
| -rw-r--r-- | apps/web/lib/supabase/middleware.ts | 39 | ||||
| -rw-r--r-- | apps/web/lib/supabase/server.ts | 27 |
4 files changed, 82 insertions, 0 deletions
diff --git a/apps/web/lib/supabase/admin.ts b/apps/web/lib/supabase/admin.ts new file mode 100644 index 0000000..5f5684d --- /dev/null +++ b/apps/web/lib/supabase/admin.ts @@ -0,0 +1,8 @@ +import { createClient } from "@supabase/supabase-js" + +export function createSupabaseAdminClient() { + return createClient( + process.env.NEXT_PUBLIC_SUPABASE_URL!, + process.env.SUPABASE_SERVICE_ROLE_KEY! + ) +} diff --git a/apps/web/lib/supabase/client.ts b/apps/web/lib/supabase/client.ts new file mode 100644 index 0000000..c6747fb --- /dev/null +++ b/apps/web/lib/supabase/client.ts @@ -0,0 +1,8 @@ +import { createBrowserClient } from "@supabase/ssr" + +export function createSupabaseBrowserClient() { + return createBrowserClient( + process.env.NEXT_PUBLIC_SUPABASE_URL!, + process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY! + ) +} diff --git a/apps/web/lib/supabase/middleware.ts b/apps/web/lib/supabase/middleware.ts new file mode 100644 index 0000000..038e7c0 --- /dev/null +++ b/apps/web/lib/supabase/middleware.ts @@ -0,0 +1,39 @@ +import { createServerClient } from "@supabase/ssr" +import { NextResponse, type NextRequest } from "next/server" + +export async function updateSupabaseSession(request: NextRequest) { + let supabaseResponse = NextResponse.next({ + request, + }) + + const supabaseClient = createServerClient( + process.env.NEXT_PUBLIC_SUPABASE_URL!, + process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, + { + cookies: { + getAll() { + return request.cookies.getAll() + }, + setAll(cookiesToSet) { + cookiesToSet.forEach(({ name, value }) => + request.cookies.set(name, value) + ) + + supabaseResponse = NextResponse.next({ + request, + }) + + cookiesToSet.forEach(({ name, value, options }) => + supabaseResponse.cookies.set(name, value, options) + ) + }, + }, + } + ) + + const { + data: { user }, + } = await supabaseClient.auth.getUser() + + return { user, supabaseResponse } +} diff --git a/apps/web/lib/supabase/server.ts b/apps/web/lib/supabase/server.ts new file mode 100644 index 0000000..f781393 --- /dev/null +++ b/apps/web/lib/supabase/server.ts @@ -0,0 +1,27 @@ +import { createServerClient } from "@supabase/ssr" +import { cookies } from "next/headers" + +export async function createSupabaseServerClient() { + const cookieStore = await cookies() + + return createServerClient( + process.env.NEXT_PUBLIC_SUPABASE_URL!, + process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, + { + cookies: { + getAll() { + return cookieStore.getAll() + }, + setAll(cookiesToSet) { + try { + cookiesToSet.forEach(({ name, value, options }) => + cookieStore.set(name, value, options) + ) + } catch { + // no-op + } + }, + }, + } + ) +} |