diff --git a/apps/docs/pages/guides/functions/auth.mdx b/apps/docs/pages/guides/functions/auth.mdx index 2a611f8c3b9..871c16bd6f2 100644 --- a/apps/docs/pages/guides/functions/auth.mdx +++ b/apps/docs/pages/guides/functions/auth.mdx @@ -21,7 +21,7 @@ By creating a supabase client with the auth context from the function, you can d ```js lines=14,17-19,22-23 title=supabase/functions/select-from-table-with-auth-rls/index.ts import { serve } from 'https://deno.land/std@0.131.0/http/server.ts' -import { createClient } from 'https://esm.sh/@supabase/supabase-js@2.0.0-rc.12' +import { createClient } from 'https://esm.sh/@supabase/supabase-js@2' serve(async (req: Request) => { try { diff --git a/examples/edge-functions/supabase/functions/og-image-with-storage-cdn/README.md b/examples/edge-functions/supabase/functions/og-image-with-storage-cdn/README.md new file mode 100644 index 00000000000..2adb83328c7 --- /dev/null +++ b/examples/edge-functions/supabase/functions/og-image-with-storage-cdn/README.md @@ -0,0 +1,21 @@ +# Open Graph (OG) Image Generation with Supabase Storage CDN Caching + +Generate Open Graph images with Deno and Supabase Edge Functions and cache the generated image with Supabase Storage CDN. + +- Docs: https://deno.land/x/og_edge@0.0.2 +- Examples: https://vercel.com/docs/concepts/functions/edge-functions/og-image-examples +- Demo: https://obuldanrptloktxcffvn.functions.supabase.co/launchweek-ticket-og?ticketNumber=1234&username=thorwebdev&name=Thor%20%E9%9B%B7%E7%A5%9E%20Schaeff + +## Run locally + +```bash +supabase functions serve og-image-with-storage-cdn --no-verify-jwt +``` + +Navigate to http://localhost:54321/functions/v1/og-image-with-storage-cdn?ticketNumber=3524&username=thorwebdev&name=Thor%20%E9%9B%B7%E7%A5%9E%20Schaeff + +## Deploy + +```bash +supabase functions deploy og-image-with-storage-cdn --no-verify-jwt +``` diff --git a/examples/edge-functions/supabase/functions/og-image-with-storage-cdn/handler.tsx b/examples/edge-functions/supabase/functions/og-image-with-storage-cdn/handler.tsx new file mode 100644 index 00000000000..6a47dc69170 --- /dev/null +++ b/examples/edge-functions/supabase/functions/og-image-with-storage-cdn/handler.tsx @@ -0,0 +1,205 @@ +import React from 'https://esm.sh/react@18.2.0?deno-std=0.140.0' +import { ImageResponse } from 'https://deno.land/x/og_edge@0.0.4/mod.ts' +import { createClient } from 'https://esm.sh/@supabase/supabase-js@2' +import { corsHeaders } from '../_shared/cors.ts' + +const STORAGE_URL = 'https://obuldanrptloktxcffvn.supabase.co/storage/v1/object/public/images/lw6' +const BACKGROUND_IMAGE_STD = `${STORAGE_URL}/lw6_ticket_regular.jpg` +const BACKGROUND_IMAGE_GOLDEN = `${STORAGE_URL}/lw6_ticket_gold.jpg` +const SUPA_CHECKMARK = `${STORAGE_URL}/supaverified.png` + +// Load custom font +const FONT_URL = `${STORAGE_URL}/CircularStd-Bold.otf` +const font = fetch(new URL(FONT_URL, import.meta.url)).then((res) => res.arrayBuffer()) + +export async function handler(req: Request) { + const url = new URL(req.url) + const ticketNumber = url.searchParams.get('ticketNumber') + const username = url.searchParams.get('username') ?? url.searchParams.get('amp;username') + const name = url.searchParams.get('name') ?? url.searchParams.get('amp;name') + const golden = url.searchParams.get('golden') ?? url.searchParams.get('amp;golden') + + if (!username || !ticketNumber || !name) + return new Response(JSON.stringify({ error: 'missing params' }), { + headers: { ...corsHeaders, 'Content-Type': 'application/json' }, + status: 400, + }) + + try { + // Try to get image from Supabase Storage CDN. + const storageResponse = await fetch(`${STORAGE_URL}/tickets/${username}.png?version=dev`) // TODO change for prod. + if (storageResponse.ok) return storageResponse + + // Else, generate image ad upload to storage. + const fontData = await font + const numDigits = `${Number(ticketNumber)}`.length + const prefix = `00000000`.slice(numDigits) + + const generatedImage = new ImageResponse( + ( +
+ {/* Name & username */}
+ + {name} +
+ {/* Username and supaverified checkmark */} ++ December 12th, 2022 +
+ {/* URL */} ++ supabase.com/launch-week +
+ {/* Ticket No */} ++ {`№ ${prefix}${ticketNumber}`} +
+