PageSourceSearch

https://www.harleyacademy.ai/assets/AdminApiExplorer-BavBwko9.js

js harleyacademy.ai collected 2026-10-05 13:46:45 UTC 31,374 bytes, 27 lines download raw bytes

1import{r as c,j as e}from"./vendor-react-0BgUAC16.js";import{f as N,be as O,av as I,f1 as F,bf as J,C as x,T as y,V as f,a as j,B as _,s as q,an as H,L as G,b as w,as as M,ao as D,ap as Q,at as W,au as V,aS as S,m as K,a1 as Y,am as X,e as Z}from"./index-VBmyz7oY.js";import{S as ee}from"./search-DEDb5_ug.js";import{T as ae}from"./textarea-Cg9QF-0w.js";import{T as te,a as se,b as C,c as T}from"./tabs-DSMQ77q6.js";import{C as ne}from"./copy-Dkdq95dc.js";import{P as re}from"./play-QCOEx9ET.js";import"./vendor-shared-C4h37-Rp.js";import"./vendor-sentry-hvZPoHao.js";import"./vendor-animation-t_MKAynu.js";(function(){try{var s=typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:typeof self<"u"?self:{};s.SENTRY_RELEASE={id:"harley-ai@1791200088371"};var t=new s.Error().stack;t&&(s._sentryDebugIds=s._sentryDebugIds||{},s._sentryDebugIds[t]="23acc239-60cc-4a76-9aac-e27a1dc9165d",s._sentryDebugIdIdentifier="sentry-dbid-23acc239-60cc-4a76-9aac-e27a1dc9165d")}catch{}})();const R=[{name:"admin-confirm-user-email",category:"admin"},{name:"admin-fastspring-catalogue",category:"admin"},{name:"admin-fastspring-reconciliation",category:"admin"},{name:"admin-fastspring-repair",category:"admin"},{name:"admin-fastspring-revenue",category:"admin"},{name:"admin-impersonate-user",category:"admin"},{name:"admin-manage-user-role",category:"admin"},{name:"admin-user-payments",category:"admin"},{name:"aggregate-clinical-scenario-taxonomy",category:"aggregate"},{name:"ai-tutor-token",category:"ai"},{name:"analytics-digest",category:"analytics"},{name:"analytics-digest-email",category:"analytics"},{name:"analyze-complications-simulation",category:"analyze"},{name:"analyze-consult-simulation",category:"analyze"},{name:"analyze-diagnosis-simulation",category:"analyze"},{name:"analyze-patient-photo",category:"analyze"},{name:"analyze-photo-for-avatar",category:"analyze"},{name:"analyze-product-simulation",category:"analyze"},{name:"analyze-sales-simulation",category:"analyze"},{name:"analyze-treatment-pricing",category:"analyze"},{name:"api-explorer-schema",category:"api"},{name:"append-knowledge-chunk",category:"append"},{name:"asset-link-health",category:"asset"},{name:"assign-metadata-and-save",category:"assign"},{name:"audit-clinical-ranking-questions",category:"audit"},{name:"backfill-masterpiece-images",category:"backfill"},{name:"backfill-profile-geocode",category:"backfill"},{name:"bulk-generate-taxonomy-mappings",category:"bulk"},{name:"cluster-popular-searches",category:"cluster"},{name:"complications-assistant",category:"complications"},{name:"complications-simulator-token",category:"complications"},{name:"consult-simulator-text-chat",category:"consult"},{name:"consult-simulator-token",category:"consult"},{name:"content-pipeline-worker",category:"content"},{name:"course-authoring",category:"course"},{name:"database-functions-inspector",category:"database"},{name:"delete-my-account",category:"delete"},{name:"delete-specific-knowledge-content",category:"delete"},{name:"delete-user",category:"delete"},{name:"diagnosis-simulator-token",category:"diagnosis"},{name:"download-assessment-portfolio",category:"download"},{name:"draft-aesthetic-step-content",category:"draft"},{name:"draft-masterpiece-story-cards",category:"draft"},{name:"elevenlabs-feedback-token",category:"elevenlabs"},{name:"elevenlabs-feedback-webhook",category:"elevenlabs"},{name:"elevenlabs-usage-report",category:"elevenlabs"},{name:"elevenlabs-voice-preview",category:"elevenlabs"},{name:"elevenlabs-voices-list",category:"elevenlabs"},{name:"enhance-complex-fields",category:"enhance"},{name:"extract-source-text",category:"extract"},{name:"fastspring-account-portal",category:"fastspring"},{name:"fastspring-reconcile-subscriptions",category:"fastspring"},{name:"fastspring-webhook",category:"fastspring"},{name:"fetch-paper-full-text",category:"fetch"},{name:"ga4-report",category:"ga4"},{name:"gem-gpt-chat",category:"gem"},{name:"generate-aesthetic-case-image",category:"generate"},{name:"generate-avatar",category:"generate"},{name:"generate-chunk-illustration",category:"generate"},{name:"generate-chunks-preview",category:"generate"},{name:"generate-clinical-application-questions",category:"generate"},{name:"generate-clinical-scenario",category:"generate"},{name:"generate-clinical-scenario-graph",category:"generate"},{name:"generate-clinical-scenario-observer-cache",category:"generate"}
1,{name:"generate-comprehensive-questions",category:"generate"},{name:"generate-course-page-blocks",category:"generate"},{name:"generate-course-page-illustration",category:"generate"},{name:"generate-daily-five",category:"generate"},{name:"generate-dialogue",category:"generate"},{name:"generate-flashcards",category:"generate"},{name:"generate-goal-description",category:"generate"},{name:"generate-illustration-prompt",category:"generate"},{name:"generate-instant-treatment-plan",category:"generate"},{name:"generate-intro-quiz-questions",category:"generate"},{name:"generate-lesson-intro",category:"generate"},{name:"generate-monthly-summary",category:"generate"},{name:"generate-monthly-summary-audio",category:"generate"},{name:"generate-patient-avatar",category:"generate"},{name:"generate-personalised-lesson",category:"generate"},{name:"generate-personalized-blend",category:"generate"},{name:"generate-personalized-news",category:"generate"},{name:"generate-qa-quick-questions",category:"generate"},{name:"generate-quick-learn-v4",category:"generate"},{name:"generate-quick-questions",category:"generate"},{name:"generate-research-illustration",category:"generate"},{name:"generate-research-illustration-prompt",category:"generate"},{name:"generate-research-lesson",category:"generate"},{name:"generate-research-questions",category:"generate"},{name:"generate-simulator-patient-image",category:"generate"},{name:"generate-simulator-stage-content",category:"generate"},{name:"generate-stage-image-prompts",category:"generate"},{name:"generate-summary-audio",category:"generate"},{name:"generate-synthetic-brief",category:"generate"},{name:"generate-weekly-reflection",category:"generate"},{name:"get-airtable-fields",category:"get"},{name:"get-news-article-detail",category:"get"},{name:"get-popular-searches",category:"get"},{name:"get-related-topics",category:"get"},{name:"get-user-emails",category:"get"},{name:"global-search-v2",category:"global"},{name:"growth-ai-insights",category:"growth"},{name:"growth-snapshot",category:"growth"},{name:"growth-weekly-email",category:"growth"},{name:"guidelines-assistant",category:"guidelines"},{name:"harley-ai-token",category:"harley"},{name:"harley-guide-analysis",category:"harley"},{name:"hubspot-cron",category:"hubspot"},{name:"hubspot-sync",category:"hubspot"},{name:"hubspot-webhook",category:"hubspot"},{name:"illustration-engine",category:"illustration"},{name:"knowledge-guide",category:"knowledge"},{name:"lesson-audio-generate",category:"lesson"},{name:"link-content-to-studio-goal",category:"link"},{name:"log-partner-view",category:"log"},{name:"lookup-postal-code",category:"lookup"},{name:"mentor-signoff",category:"mentor"},{name:"mentor-signoff-request",category:"mentor"},{name:"one-to-one-tuition-simulator-token",category:"one"},{name:"origins-of-beauty-tts",category:"origins"},{name:"parse-presentation-slides",category:"parse"},{name:"partner-admin-invite",category:"partner"},{name:"partner-demo-auth",category:"partner"},{name:"partner-quarterly-report-signed-url",category:"partner"},{name:"partner-quarterly-report-upload",category:"partner"},{name:"partner-survey-cluster-themes",category:"partner"},{name:"partner-survey-suggest-questions",category:"partner"},{name:"patient-counselling-simulator-token",category:"patient"},{name:"patient-objection-simulator-token",category:"patient"},{name:"polish-presentation-transcript",category:"polish"},{name:"presentation-guide-analysis",category:"presentation"},{name:"presentation-qa-chat",category:"presentation"},{name:"presentation-qa-score",category:"presentation"},{name:"presentation-qa-voice-token",category:"presentation"},{name:"process-abstract-chunks",category:"process"},{name:"process-intelligent-content",category:"process"},{name:"process-research-papers-v2",category:"process"},{name:"process-scheduled-notifications",category:"process"},{name:"process-transactional-emails",category:"process"},{name:"programme-due-date-reminders",category:"programme"},{name:"public-booking-intent",category:"public"},{name:"public-programmes-events",category:"public"},{name:"pubmed-research-import",category:"pubmed"},{name:"recompute-partner-intent-scores",category:"recompute"},{name:"record-simulator-completion",category:"record"},{name:"remap-flashcard-topics",category:"remap"},{name:"remap-single-chunk",category:"remap"},{name:"repair-bite-placeholders",category:"repair"},{name:"repair-taxonomy-mappings",category:"repair"},{name:"research-paper-audio",category:"research"},{name:"research-paper-summarize",category:"research"},{name:"resend-webhook",category:"resend"},{name:"resize-gem-illustrations",category:"resize"},{name:"resolve-emails-to-users",category:"resolve"},{name:"revenuecat-reconcile-subscriptions",category:"revenuecat"},{name:"revenuecat-webhook",category:"revenuecat"},{name:"run-scheduled-report",category:"run"}
1,{name:"sales-coaching-chat",category:"sales"},{name:"sales-training-token",category:"sales"},{name:"scorm-preview",category:"scorm"},{name:"scorm-refetch-thumbnail",category:"scorm"},{name:"scorm-upload",category:"scorm"},{name:"scrape-news-sources",category:"scrape"},{name:"search-users-by-email",category:"search"},{name:"search-wikimedia-masterpieces",category:"search"},{name:"select-guide-illustrations",category:"select"},{name:"send-transactional-email",category:"send"},{name:"snapshot-course-completion",category:"snapshot"},{name:"streak-notifications",category:"streak"},{name:"submit-landing-page",category:"submit"},{name:"suggest-topic-split",category:"suggest"},{name:"summarize-feedback-call",category:"summarize"},{name:"sync-airtable-techniques",category:"sync"},{name:"sync-product-images",category:"sync"},{name:"sync-regfox-event",category:"sync"},{name:"synthesize-treatment-protocol",category:"synthesize"},{name:"test-partner-integration",category:"test"},{name:"track-achievements",category:"track"},{name:"transactional-email-scheduler",category:"transactional"},{name:"transform-presentation-guide",category:"transform"},{name:"transform-to-bites",category:"transform"},{name:"treatment-log-voice-extract",category:"treatment"},{name:"treatment-pricing-text-chat",category:"treatment"},{name:"treatment-pricing-token",category:"treatment"},{name:"twin-clinic-menu-growth",category:"twin"},{name:"twin-clinic-menu-optimiser",category:"twin"},{name:"twin-clinic-plan-builder",category:"twin"},{name:"upload-manual-illustration",category:"upload"},{name:"upload-manual-research-illustration",category:"upload"},{name:"validate-clinical-protocol",category:"validate"},{name:"weekly-feedback-targeting",category:"weekly"},{name:"weekly-summary",category:"weekly"},{name:"whisper-transcribe",category:"whisper"},{name:"zoom-create-webinar",category:"zoom"},{name:"zoom-register-attendee",category:"zoom"},{name:"zoom-sdk-signature",category:"zoom"},{name:"zoom-webhook",category:"zoom"}],oe=({tables:s,selection:t,onSelect:n})=>{const[r,i]=c.useState(""),l=c.useCallback(a=>i(a.target.value),[]),d=c.useCallback(()=>n({kind:"overview",name:"overview"}),[n]),u=c.useCallback(()=>n({kind:"auth",name:"auth"}),[n]),g=c.useCallback(a=>n({kind:"table",name:a.currentTarget.dataset.name??""}),[n]),m=c.useCallback(a=>n({kind:"function",name:a.currentTarget.dataset.name??""}),[n]),h=c.useMemo(()=>s.filter(a=>a.toLowerCase().includes(r.toLowerCase())),[s,r]),v=c.useMemo(()=>{const a=new Map;for(const o of R){if(r&&!o.name.toLowerCase().includes(r.toLowerCase()))continue;const p=a.get(o.category)??[];p.push(o.name),a.set(o.category,p)}return[...a.entries()].sort((o,p)=>o[0].localeCompare(p[0]))},[r]),b=(a,o)=>(t==null?void 0:t.kind)===a&&t.name===o;return e.jsxs("aside",{className:"w-72 shrink-0 border-r bg-muted/20 overflow-y-auto",children:[e.jsx("div",{className:"p-3 sticky top-0 bg-muted/40 backdrop-blur border-b",children:e.jsxs("div",{className:"relative",children:[e.jsx(ee,{className:"absolute left-2 top-2.5 h-4 w-4 text-muted-foreground"}),e.jsx("input",{className:"w-full pl-8 pr-2 py-2 text-sm rounded-md border bg-background",placeholder:"Search tables & functions",value:r,onChange:l})]})}),e.jsxs("div",{className:"p-2",children:[e.jsx("button",{className:N("w-full text-left px-2 py-1.5 rounded text-sm hover:bg-muted",(t==null?void 0:t.kind)==="overview"&&"bg-muted font-medium"),onClick:d,children:"Overview"}),e.jsx("button",{className:N("w-full text-left px-2 py-1.5 rounded text-sm hover:bg-muted",(t==null?void 0:t.kind)==="auth"&&"bg-muted font-medium"),onClick:u,children:"Authentication"})]}),e.jsxs("div",{className:"px-3 pt-3 pb-1 text-xs uppercase tracking-wider text-muted-foreground",children:["Tables (",h.length,")"]}),e.jsx("div",{className:"pb-4",children:h.map(a=>e.jsx("button",{className:N("w-full text-left px-3 py-1.5 text-xs font-mono hover:bg-muted truncate",b("table",a)&&"bg-muted text-primary font-medium"),"data-name":a,onClick:g,children:a},a))}),e.jsx("div",{className:"px-3 pt-2 pb-1 text-xs uppercase tracking-wider text-muted-foreground border-t",children:"Edge functions"}),v.map(([a,o])=>e.jsxs("details",{className:"group",children:[e.jsxs("summary",{className:"px-3 py-1.5 text-xs font-semibold cursor-pointer hover:bg-muted flex justify-between",children:[e.jsx("span",{children:a}),e.jsx("span",{className:"text-muted-foreground",children:o.length})]}),e.jsx("div",{className:"pb-2",children:o.map(p=>e.jsx("button",{className:N("w-full text-left pl-6 pr-3 py-1 text-xs font-mono hover:bg-muted truncate",b("function",p)&&"bg-muted text-primary font-medium"),"data-name":p,onClick:m,children:p},p))})]},a))]})},ce=()=>e.jsxs("div",{className:"max-w-3xl space-y-6",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold",children:"Authentication"}),e.jsxs("p",{className:"text-muted-foreground mt-1",children:["All calls need an ",e.jsx("code",{children:"apikey"})," header (the Supabase anon key) plus, for anything RLS-restricted, an"," ",e.jsx("code",{children:"Authorization: Bearer <jwt>"})," header identifying the user."]})]}),e.jsxs(O,{variant:"destructive",children:[e.jsx(I,{className:"h-4 w-4"}),e.jsx(F,{children:"Never share the service_role key"}),e.jsx(J,{children:"The service_role key bypasses RLS entirely and must stay server-side. Never paste it into a Google Sheet, a Coefficient source, or any browser context. Use a scoped user JWT instead."})]}),e.jsxs(x,{children:[e.jsx(y,{children:e.jsx(f,{className:"text-base",children:"Getting a user JWT"})}),e.jsxs(j,{className:"text-sm space-y-2 text-muted-foreground",children:[e.jsxs("p",{children:["Log into the app, open the browser devtools, and copy the value of the Supabase auth token from local storage. That value is your"," ",e.jsx("code",{children:"access_token"}),"."]}),e.jsxs("p",{children:["For Apps Script, store it in Script Properties as"," ",e.jsx("code",{children:"USER_JWT"}),"."]})]})]}),e.jsxs(x,{children:[e.jsx(y,{children:e.jsx(f,{className:"text-base",children:"Rate limits"})}),e.jsxs(j,{className:"text-sm text-muted-foreground",children:["PostgREST caps responses at 1000 rows by default. Use"," ",e.jsx("code",{children:"Range"})," headers or",e.jsx("code",{children:"?limit="})," and ",e.jsx("code",{children:"?offset="})," for pagination."]})]})]}),E={profiles:"User profile data. Read via RLS — anon key returns only rows the current user can see.",purchases:"Fulfilled purchases from FastSpring. Use for revenue reporting. Filter by created_at.",events:"All events (webinars, courses, conferences). See event_registrations for attendance.",event_registrations:"One row per learner-per-event registration.",educational_content:"Parent module for knowledge chunks. Aggregate topic codes via knowledge_chunks -> content_taxonomy_mappings.",knowledge_chunks:"Atomic learning units. Primary taxonomy mapping lives in content_taxonomy_mappings (mapping_type='primary').",partner_portals:"Partner portals. Slug + branding config.",partner_intent_events:"Fan-out events from learner activity to partner products (rung 2 = content_completed).",analytics_digest_reports:"Weekly digest snapshots — payload_json contains the full AI input."},P={analytics:"Weekly digest generation, email, and payload builders.",generate:"Content generation via Lovable AI Gateway (lessons, questions, illustrations).",fastspring:"FastSpring webhook + reconciliation for purchases.",hubspot:"HubSpot 
1CRM sync (contacts, deals, line items).",zoom:"Zoom webinar create/register + webhook.",partner:"Partner portal admin, invites, quarterly reports.",elevenlabs:"ElevenLabs voice + conversational-AI token minting and webhooks.",harley:"Harley Guide daily paths and coaching."},A=({label:s,text:t,copied:n,onCopy:r})=>{const i=c.useCallback(()=>r(s,t),[s,t,r]);return e.jsxs(_,{size:"sm",variant:"ghost",className:"absolute top-2 right-2 h-7",onClick:i,children:[e.jsx(ne,{className:"h-3.5 w-3.5 mr-1"}),n===s?"Copied":"Copy"]})},$=({method:s,url:t,body:n,authNote:r})=>{const[i,l]=c.useState(null),d=c.useCallback((v,b)=>{navigator.clipboard.writeText(b),l(v),setTimeout(()=>l(null),1500)},[]),u=n?` \\
2  -d '${n.replaceAll("'","'\\''")}'`:"",g=`curl -X ${s} '${t}' \\
3  -H "apikey: $SUPABASE_ANON_KEY" \\
4  -H "Authorization: Bearer $USER_JWT" \\
5  -H "Content-Type: application/json"${u}`,m=`const res = await fetch(${JSON.stringify(t)}, {
6  method: ${JSON.stringify(s)},
7  headers: {
8    apikey: import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY,
9    Authorization: \`Bearer \${session.access_token}\`,
10    "Content-Type": "application/json",
11  },${n?`
12  body: ${JSON.stringify(n)},`:""}
13});
14const data = await res.json();`,h=`function callHarleyApi() {
15  const props = PropertiesService.getScriptProperties();
16  const anon = props.getProperty('SUPABASE_ANON_KEY');
17  const jwt  = props.getProperty('USER_JWT');
18
19  const res = UrlFetchApp.fetch(${JSON.stringify(t)}, {
20    method: ${JSON.stringify(s.toLowerCase())},
21    contentType: 'application/json',
22    headers: { apikey: anon, Authorization: 'Bearer ' + jwt },${n?`
23    payload: ${JSON.stringify(n)},`:""}
24    muteHttpExceptions: true,
25  });
26  Logger.log(res.getContentText());
27}`;return e.jsxs("div",{children:[r&&e.jsx("p",{className:"text-xs text-muted-foreground mb-2",children:r}),e.jsxs(te,{defaultValue:"curl",children:[e.jsxs(se,{children:[e.jsx(C,{value:"curl",children:"curl"}),e.jsx(C,{value:"js",children:"JavaScript"}),e.jsx(C,{value:"gas",children:"Google Apps Script"})]}),e.jsxs(T,{value:"curl",className:"relative",children:[e.jsx("pre",{className:"text-xs bg-muted p-3 rounded overflow-x-auto",children:g}),e.jsx(A,{label:"curl",text:g,copied:i,onCopy:d})]}),e.jsxs(T,{value:"js",className:"relative",children:[e.jsx("pre",{className:"text-xs bg-muted p-3 rounded overflow-x-auto",children:m}),e.jsx(A,{label:"js",text:m,copied:i,onCopy:d})]}),e.jsxs(T,{value:"gas",className:"relative",children:[e.jsx("pre",{className:"text-xs bg-muted p-3 rounded overflow-x-auto",children:h}),e.jsx(A,{label:"gas",text:h,copied:i,onCopy:d})]})]})]})},U=({buildRequest:s})=>{const[t,n]=c.useState(!1),[r,i]=c.useState(null),[l,d]=c.useState(""),[u,g]=c.useState(null),[m,h]=c.useState(null),v=c.useCallback(async()=>{n(!0),g(null),d(""),i(null),h(null);const b=performance.now();try{const a=await s(),{data:{session:o}}=await q.auth.getSession(),p={...a.headers};o!=null&&o.access_token&&!p.Authorization&&(p.Authorization=`Bearer ${o.access_token}`);const k=await fetch(a.url,{method:a.method,headers:p,body:a.body});i(k.status);const z=await k.text();try{d(JSON.stringify(JSON.parse(z),null,2))}catch{d(z)}}catch(a){H(a,{message:"Unhandled error in TryItRunner.text",location:"TryItRunner.text",level:"error"}),g(a instanceof Error?a.message:String(a))}finally{h(Math.round(performance.now()-b)),n(!1)}},[s]);return e.jsxs("div",{className:"space-y-3",children:[e.jsxs(_,{onClick:v,disabled:t,size:"sm",children:[t?e.jsx(G,{className:"h-4 w-4 mr-2 animate-spin"}):e.jsx(re,{className:"h-4 w-4 mr-2"}),"Run request"]}),r!==null&&e.jsxs("div",{className:"text-xs text-muted-foreground",children:["Status:"," ",e.jsx("span",{className:r<400?"text-green-600":"text-red-600",children:r}),m!==null&&` · ${m}ms`]}),u&&e.jsx("pre",{className:"text-xs bg-red-50 text-red-700 p-3 rounded overflow-x-auto",children:u}),l&&e.jsx("pre",{className:"text-xs bg-muted p-3 rounded overflow-x-auto max-h-96",children:l})]})},ie="https://fwxzitmljavwuxezvuei.supabase.co",le="sb_publishable_esfzyTiT7Nx_DR89HtUfPQ_sePraF0N",de=({functionName:s})=>{const t=R.find(a=>a.name===s),[n,r]=c.useState("POST"),[i,l]=c.useState("{}"),[d,u]=c.useState(""),g=c.useMemo(()=>{let a=`${ie}/functions/v1/${s}`;return d.trim()&&(a+=`?${d.replace(/^\?/u,"")}`),a},[s,d]),m=n!=="GET"&&n!=="DELETE",h=c.useCallback(a=>u(a.target.value),[]),v=c.useCallback(a=>l(a.target.value),[]),b=c.useCallback(()=>Promise.resolve({url:g,method:n,headers:{apikey:le,"Content-Type":"application/json"},body:m?i:void 0}),[g,n,m,i]);return e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:[e.jsxs("div",{className:"space-y-4 min-w-0",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"text-xs uppercase text-muted-foreground",children:["Edge function · ",t==null?void 0:t.category]}),e.jsx("h1",{className:"text-2xl font-bold font-mono",children:s}),t&&P[t.category]&&e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:P[t.category]})]}),e.jsxs(x,{children:[e.jsx(y,{children:e.jsx(f,{className:"text-base",children:"About"})}),e.jsxs(j,{className:"text-sm text-muted-foreground space-y-2",children:[e.jsxs("p",{children:["This endpoint is auto-discovered from the deployed functions. Detailed per-endpoint docs (request body, response shape) will land in Phase 2 once we roll out the",e.jsx("code",{className:"mx-1",children:"@apiExplorer"})," doc-header convention."]}),e.jsxs("p",{children:["For now, use the source at"," ",e.jsxs("code",{children:["supabase/functions/",s,"/index.ts"]})," as the source of truth for the request contract."]})]})]})]}),e.jsxs("div",{className:"space-y-4 min-w-0",children:[e.jsxs(x,{children:[e.jsx(y,{children:e.jsx(f,{className:"text-base",children:"Try it"})}),e.jsxs(j,{className:"space-y-3",children:[e.jsxs("div",{className:"grid grid-cols-[120px_1fr] gap-2",children:[e.jsxs("div",{children:[e.jsx(w,{className:"text-xs",children:"Method"}),e.jsxs(M,{value:n,onValueChange:r,children:[e.jsx(D,{children:e.jsx(Q,{})}),e.jsx(W,{children:["GET","POST","PUT","PATCH","DELETE"].map(a=>e.jsx(V,{value:a,children:a},a))})]})]}),e.jsxs("div",{children:[e.jsx(w,{className:"text-xs",children:"Query string"}),e.jsx(S,{value:d,onChange:h,placeholder:"key=value&other=1"})]})]}),m&&e.jsxs("div",{children:[e.jsx(w,{className:"text-xs",children:"Body (JSON)"}),e.jsx(ae,{value:i,onChange:v,rows:6,className:"font-mono text-xs"})]}),e.jsxs("div",{className:"text-xs break-all bg-muted p-2 rounded font-mono",children:[n," ",g]}),e.jsx(U,{buildRequest:b})]})]}),e.jsxs(x,{children:[e.jsx(y,{children:e.jsx(f,{className:"text-base",children:"Code snippets"})}),e.jsx(j,{children:e.jsx($,{method:n,url:g,body:m?i:void 0})})]})]})]})},L="https://fwxzitmljavwuxezvuei.supabase.co",me=()=>e.jsxs("div",{className:"max-w-3xl space-y-6",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold",children:"Platform API Explorer"}),e.jsx("p",{className:"text-muted-foreground mt-1",children:"Internal reference for the platform's data and edge-function surface. Use it to build external dashboards in Google Sheets, Coefficient, or any HTTP client."})]}),e.jsxs(x,{children:[e.jsx(y,{children:e.jsx(f,{className:"text-base",children:"Base URLs"})}),e.jsxs(j,{className:"space-y-2 text-sm",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-xs uppercase text-muted-foreground",children:"REST (tables)"}),e.jsxs("code",{className:"text-xs",children:[L,"/rest/v1/<table>"]})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs uppercase text-muted-foreground",children:"Edge functions"}),e.jsxs("code",{className:"text-xs",children:[L,"/functions/v1/<function-name>"]})]})]})]}),e.jsxs(x,{children:[e.jsx(y,{children:e.jsx(f,{className:"text-base",children:"How to use this explorer"})}),e.jsxs(j,{className:"text-sm space-y-2 text-muted-foreground",children:[e.jsx("p",{children:"1. Pick a table or function in the left sidebar."}),e.jsx("p",{children:"2. The middle pane shows the schema or metadata; the right pane lets you run a live request against the current environment using your admin session."}),e.jsx("p",{children:"3. Copy the ready-made curl, JavaScript, or Google Apps Script snippet to reuse it externally."})]})]}),e.jsxs(x,{children:[e.jsx(y,{children:e.jsx(f,{className:"text-base",children:"Google Sheets / Coefficient"})}),e.jsxs(j,{className:"text-sm space-y-2 text-muted-foreground",children:[e.jsxs("p",{children:["For Coefficient, use a Custom REST source pointing at the endpoint URL. Add headers",e.jsx("code",{className:"mx-1",children:"apikey"})," (anon key) and",e.jsx("code",{className:"mx-1",children:"Authorization: Bearer <jwt>"}),"."]}),e.jsxs("p",{children:["For Google Apps Script, store the anon key and a service JWT in",e.jsx("code",{className:"mx-1",children:"PropertiesService.getScriptProperties()"}),"and use the Apps Script snippet on each endpoint page."]})]})]})]}),ge=async()=>{const{data:s,error:t}=await q.functions.invoke("api-explorer-schema",{body:{}});if(t)throw new Error(`OpenAPI fetch failed: ${t.message}`);const r=(s??{}).definitions??{};return Object.entries(r).map(([i,l])=>{const d=new Set(l.required??[]),u=Object.entries(l.properties??{}).map(([g,m])=>({name:g,type:m.type??"unknown",format:m.format,description:m.description,nullable:!d.has(g)}));return{name:i,description:l.description,columns:u}}).sort((i,l)=>i.name.localeCompare(l.name))},B=()=>K({queryKey:["api-explorer","openapi"],queryFn:ge,staleTime:5*6e4}),ue="https://fwxzitmljavwuxezvuei.supabase.co",pe="sb_publishable_esfzyTiT7Nx_DR89HtUfPQ_sePraF0N",he=({tableName:s})=>{const{data:t}=B(),n=c.useMemo(()=>t==null?void 0:t.find(o=>o.name===s),[t,s]),[r,i]=c.useState("*"),[l,d]=c.useState("10"),[u,g]=c.useState(""),m=c.useMemo(()=>{const o=new URLSearchParams;r&&o.set("select",r),l&&o.set("limit",l);const p=u.trim();let k=`${ue}/rest/v1/${s}?${o.toString()}`;return p&&(k+=`&${p}`),k},[s,r,l,u]),h=c.useCallback(o=>i(o.target.value),[]),v=c.useCallback(o=>d(o.target.value),[]),b=c.useCallback(o=>g(o.target.value),[]),a=c.useCallback(()=>Promise.resolve({url:m,method:"GET",headers:{apikey:pe,Accept:"application/json"}}),[m]);return e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6",children:[e.jsxs("div",{className:"space-y-4 min-w-0",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-xs uppercase text-muted-foreground",children:"Table"}),e.jsx("h1",{className:"text-2xl font-bold font-mono",children:s}),E[s]&&e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:E[s]})]}),e.jsxs(x,{children:[e.jsx(y,{children:e.jsx(f,{className:"text-base",children:"Columns"})}),e.jsx(j,{className:"p-0",children:n?e.jsx("div",{className:"max-h-[500px] overflow-y-auto",children:e.jsxs("table",{className:"w-full text-xs",children:[e.jsx("thead",{className:"sticky top-0 bg-muted",children:e.jsxs("tr",{className:"text-left",children:[e.jsx("th",{className:"px-3 py-2",children:"Name"}),e.jsx("th",{className:"px-3 py-2",children:"Type"}),e.jsx("th",{className:"px-3 py-2",children:"Nullable"})]})}),e.jsx("tbody",{children:n.columns.map(o=>e.jsxs("tr",{className:"border-t",children:[e.jsx("td",{className:"px-3 py-1.5 font-mono",children:o.name}),e.jsx("td",{className:"px-3 py-1.5 text-muted-foreground",children:o.format??o.type}),e.jsx("td",{className:"px-3 py-1.5 text-muted-foreground",children:o.nullable?"yes":"no"})]},o.name))})]})}):e.jsx("div",{className:"p-4 text-sm text-muted-foreground",children:"Loading schema…"})})]}),e.jsxs(x,{children:[e.jsx(y,{children:e.jsx(f,{className:"text-base",children:"PostgREST cheatsheet"})}),e.jsxs(j,{className:"text-xs text-muted-foreground space-y-1",children:[e.jsxs("div",{children:[e.jsx("code",{children:"?select=id,name,created_at"})," — choose columns"]}),e.jsxs("div",{children:[e.jsx("code",{children:"?created_at=gte.2025-01-01"})," — filter"]}),e.jsxs("div",{children:[e.jsx("code",{children:"?order=created_at.desc"})," — order"]}
27),e.jsxs("div",{children:[e.jsx("code",{children:"?limit=100&offset=100"})," — paginate"]})]})]})]}),e.jsxs("div",{className:"space-y-4 min-w-0",children:[e.jsxs(x,{children:[e.jsx(y,{children:e.jsx(f,{className:"text-base",children:"Try it"})}),e.jsxs(j,{className:"space-y-3",children:[e.jsxs("div",{children:[e.jsx(w,{className:"text-xs",children:"select"}),e.jsx(S,{value:r,onChange:h})]}),e.jsxs("div",{children:[e.jsx(w,{className:"text-xs",children:"limit"}),e.jsx(S,{value:l,onChange:v})]}),e.jsxs("div",{children:[e.jsxs(w,{className:"text-xs",children:["Extra query (e.g. ",e.jsx("code",{children:"created_at=gte.2025-01-01"}),")"]}),e.jsx(S,{value:u,onChange:b,placeholder:"key=op.value"})]}),e.jsxs("div",{className:"text-xs break-all bg-muted p-2 rounded font-mono",children:["GET ",m]}),e.jsx(U,{buildRequest:a})]})]}),e.jsxs(x,{children:[e.jsx(y,{children:e.jsx(f,{className:"text-base",children:"Code snippets"})}),e.jsx(j,{children:e.jsx($,{method:"GET",url:m})})]})]})]})},xe="https://fwxzitmljavwuxezvuei.supabase.co",Te=()=>{const{data:s,isLoading:t,error:n}=B(),[r,i]=c.useState({kind:"overview",name:"overview"}),l=(s??[]).map(u=>u.name),d=typeof window<"u"&&window.location.hostname.includes("harleyacademy.ai")?"production":"development";return e.jsxs(e.Fragment,{children:[e.jsx("title",{children:"API Explorer · Harley Admin"}),e.jsx("meta",{name:"description",content:"Internal reference for platform tables and edge functions."}),e.jsxs("div",{className:"h-screen flex flex-col",children:[e.jsxs("header",{className:"flex items-center gap-3 border-b px-4 py-2 shrink-0",children:[e.jsx(_,{variant:"ghost",size:"sm",asChild:!0,children:e.jsxs(Y,{to:"/admin",children:[e.jsx(X,{className:"h-4 w-4 mr-1"}),"Admin"]})}),e.jsxs("div",{className:"flex-1",children:[e.jsx("h1",{className:"text-sm font-semibold",children:"Platform API Explorer"}),e.jsx("p",{className:"text-xs text-muted-foreground",children:xe})]}),e.jsx(Z,{variant:d==="production"?"destructive":"secondary",children:d})]}),e.jsxs("div",{className:"flex-1 flex overflow-hidden",children:[e.jsx(oe,{tables:l,selection:r,onSelect:i}),e.jsxs("main",{className:"flex-1 overflow-y-auto p-6",children:[n&&e.jsxs("div",{className:"text-sm text-red-600 mb-4",children:["Failed to load PostgREST schema: ",String(n)]}),t&&r.kind==="table"&&e.jsx("div",{className:"text-sm text-muted-foreground",children:"Loading schema…"}),r.kind==="overview"&&e.jsx(me,{}),r.kind==="auth"&&e.jsx(ce,{}),r.kind==="table"&&e.jsx(he,{tableName:r.name}),r.kind==="function"&&e.jsx(de,{functionName:r.name})]})]})]})]})};export{Te as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.