1+ import { supabaseAdminClient } from "@/lib/supabase/admin" ;
12import { loadPeople } from "@/lib/people" ;
3+ import { supabaseServerClient } from "@/lib/supabase/server" ;
24
3- export async function GET ( ) {
5+ type ViewTier = "public" | "authenticated" | "dao-member" ;
6+
7+ async function resolveTier ( request : Request ) : Promise < ViewTier > {
8+ const authHeader = request . headers . get ( "authorization" ) ;
9+ if ( ! authHeader ?. startsWith ( "Bearer " ) ) {
10+ return "public" ;
11+ }
12+
13+ const token = authHeader . replace ( "Bearer " , "" ) ;
14+ let userId : string ;
15+ try {
16+ const supabase = supabaseServerClient ( ) ;
17+ const { data : userData , error : userError } = await supabase . auth . getUser ( token ) ;
18+ if ( userError || ! userData . user ) {
19+ return "public" ;
20+ }
21+ userId = userData . user . id ;
22+ } catch {
23+ return "public" ;
24+ }
25+
26+ try {
27+ const admin = supabaseAdminClient ( ) ;
28+ const now = new Date ( ) . toISOString ( ) ;
29+ const { data, error } = await admin
30+ . from ( "entitlements" )
31+ . select ( "entitlement" )
32+ . eq ( "user_id" , userId )
33+ . eq ( "status" , "active" )
34+ . or ( `expires_at.is.null,expires_at.gt.${ now } ` ) ;
35+
36+ if ( error || ! data ) {
37+ return "authenticated" ;
38+ }
39+
40+ const entitlements = new Set ( data . map ( ( row ) => row . entitlement ) ) ;
41+ return entitlements . has ( "dao-member" ) ? "dao-member" : "authenticated" ;
42+ } catch {
43+ return "authenticated" ;
44+ }
45+ }
46+
47+ export async function GET ( request : Request ) {
48+ const tier = await resolveTier ( request ) ;
449 const people = await loadPeople ( ) ;
550 const allSkills = people . flatMap ( ( person ) => person . skills ?? [ ] ) ;
651 const uniqueSkills = new Set ( allSkills ) ;
@@ -14,12 +59,20 @@ export async function GET() {
1459 . sort ( ( a , b ) => b [ 1 ] - a [ 1 ] )
1560 . at ( 0 ) ;
1661
62+ const visibility =
63+ tier === "dao-member"
64+ ? "DAO detail"
65+ : tier === "authenticated"
66+ ? "Authenticated aggregate"
67+ : "Public aggregate" ;
68+
1769 return Response . json ( {
1870 title : "Cohort Skills" ,
1971 items : [
2072 { label : "People" , value : String ( people . length ) } ,
2173 { label : "Unique skills" , value : String ( uniqueSkills . size ) } ,
2274 { label : "Top skill" , value : top ? `${ top [ 0 ] } ` : "TBD" } ,
75+ { label : "View" , value : visibility } ,
2376 ] ,
2477 } ) ;
2578}
0 commit comments