/** * Fetch all comments on a given GitHub discussion * A simple REST API, built for Cloudflare Workers * Code licensed under MIT, (C) Alicia Sykes 2024 */ addEventListener('fetch', event => { event.respondWith(handleRequest(event.request)) }) async function handleRequest(request) { const url = new URL(request.url); const username = url.searchParams.get('username'); const repo = url.searchParams.get('repo'); const discussionId = url.searchParams.get('discussionId'); if (!username || !repo || !discussionId) { return new Response('Missing required parameters', { status: 400 }); } const query = ` query { repository(owner: "${username}", name: "${repo}") { discussion(number: ${discussionId}) { comments(first: 100) { nodes { id body bodyHTML author { login avatarUrl ... on User { name location websiteUrl createdAt followers { totalCount } } } createdAt lastEditedAt upvoteCount reactionGroups { content users { totalCount } } } } } } } `; try { const apiResponse = await fetch('https://api.github.com/graphql', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `bearer ${GH_API_TOKEN}`, 'User-Agent': 'GetDiscussionComments' }, body: JSON.stringify({ query }) }); const result = await apiResponse.json(); if (!apiResponse.ok) { throw new Error(result.message || 'Failed to fetch GitHub data'); } return new Response(JSON.stringify(result.data.repository.discussion.comments.nodes), { headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, OPTIONS', 'Access-Control-Allow-Headers': 'Content-Type' }, }); } catch (error) { return new Response(error.message, { status: 500 }); } }