// Minimaler Gitea-API-Client (Token-Auth) — für /bug → Issues import { giteaUrl, giteaApiToken } from './runtime-settings.js'; function headers(extra = {}) { return { Authorization: `token ${giteaApiToken()}`, Accept: 'application/json', ...extra, }; } /** Issue anlegen; gibt { number, html_url } zurück */ export async function createIssue(repo, title, body) { const res = await fetch(`${giteaUrl()}/api/v1/repos/${repo}/issues`, { method: 'POST', headers: headers({ 'Content-Type': 'application/json' }), body: JSON.stringify({ title, body }), }); if (!res.ok) { throw new Error(`Gitea createIssue ${res.status}: ${(await res.text()).slice(0, 200)}`); } const issue = await res.json(); return { number: issue.number, html_url: issue.html_url }; } /** Milestones eines Repos (für die Roadmap-Seite); Token optional bei öffentlichen Repos */ export async function getMilestones(repo) { const res = await fetch(`${giteaUrl()}/api/v1/repos/${repo}/milestones?state=all&per_page=50`, { headers: giteaApiToken() ? headers() : { Accept: 'application/json' }, }); if (!res.ok) { throw new Error(`Gitea getMilestones ${res.status}`); } return res.json(); } /** Datei (z. B. Screenshot) als Issue-Attachment hochladen */ export async function uploadIssueAsset(repo, issueNumber, filename, buffer) { const form = new FormData(); form.append('attachment', new Blob([buffer]), filename); const res = await fetch( `${giteaUrl()}/api/v1/repos/${repo}/issues/${issueNumber}/assets?name=${encodeURIComponent(filename)}`, { method: 'POST', headers: headers(), body: form } ); if (!res.ok) { throw new Error(`Gitea uploadIssueAsset ${res.status}`); } return res.json(); }