|
| 1 | +import type { NextApiRequest, NextApiResponse } from 'next' |
| 2 | +import { supabase } from '../../../lib/supabase' |
| 3 | + |
| 4 | +type ExistingIdsResponse = { |
| 5 | + repoId: number | null |
| 6 | + commitShas: string[] |
| 7 | + prNumbers: number[] |
| 8 | + issueNumbers: number[] |
| 9 | +} |
| 10 | + |
| 11 | +export default async function handler(req: NextApiRequest, res: NextApiResponse) { |
| 12 | + if (req.method !== 'GET') { |
| 13 | + return res.status(405).json({ error: 'Method not allowed' }) |
| 14 | + } |
| 15 | + |
| 16 | + try { |
| 17 | + const orgLogin = (req.query.org as string | undefined)?.trim() |
| 18 | + const repoName = (req.query.repo as string | undefined)?.trim() |
| 19 | + |
| 20 | + if (!orgLogin || !repoName) { |
| 21 | + return res.status(400).json({ error: 'Missing required query params: org, repo' }) |
| 22 | + } |
| 23 | + |
| 24 | + // Get org id |
| 25 | + const { data: orgs, error: orgError } = await supabase |
| 26 | + .from('github_orgs') |
| 27 | + .select('id') |
| 28 | + .eq('login', orgLogin) |
| 29 | + .limit(1) |
| 30 | + |
| 31 | + if (orgError) throw new Error(orgError.message) |
| 32 | + if (!orgs || orgs.length === 0) { |
| 33 | + return res.status(404).json({ error: 'Organization not found' }) |
| 34 | + } |
| 35 | + |
| 36 | + const orgId = orgs[0].id as number |
| 37 | + |
| 38 | + // Get repo id by org_id + name |
| 39 | + const { data: repos, error: repoError } = await supabase |
| 40 | + .from('github_repos') |
| 41 | + .select('id, name') |
| 42 | + .eq('org_id', orgId) |
| 43 | + .eq('name', repoName) |
| 44 | + .limit(1) |
| 45 | + |
| 46 | + if (repoError) throw new Error(repoError.message) |
| 47 | + if (!repos || repos.length === 0) { |
| 48 | + const empty: ExistingIdsResponse = { repoId: null, commitShas: [], prNumbers: [], issueNumbers: [] } |
| 49 | + return res.status(200).json(empty) |
| 50 | + } |
| 51 | + |
| 52 | + const repoId = repos[0].id as number |
| 53 | + |
| 54 | + // Fetch existing commit SHAs, PR numbers, Issue numbers in parallel |
| 55 | + const [commitsResp, prsResp, issuesResp] = await Promise.all([ |
| 56 | + supabase.from('commits').select('sha').eq('repo_id', repoId), |
| 57 | + supabase.from('pull_requests').select('number').eq('repo_id', repoId), |
| 58 | + supabase.from('issues').select('number').eq('repo_id', repoId), |
| 59 | + ]) |
| 60 | + |
| 61 | + if (commitsResp.error) throw new Error(commitsResp.error.message) |
| 62 | + if (prsResp.error) throw new Error(prsResp.error.message) |
| 63 | + if (issuesResp.error) throw new Error(issuesResp.error.message) |
| 64 | + |
| 65 | + const commitShas = (commitsResp.data ?? []).map((c: any) => c.sha as string) |
| 66 | + const prNumbers = (prsResp.data ?? []).map((p: any) => p.number as number) |
| 67 | + const issueNumbers = (issuesResp.data ?? []).map((i: any) => i.number as number) |
| 68 | + |
| 69 | + const payload: ExistingIdsResponse = { repoId, commitShas, prNumbers, issueNumbers } |
| 70 | + return res.status(200).json(payload) |
| 71 | + } catch (err: any) { |
| 72 | + console.error('existing-ids API error:', err?.message || err) |
| 73 | + return res.status(500).json({ error: 'Internal server error' }) |
| 74 | + } |
| 75 | +} |
| 76 | + |
0 commit comments