summaryrefslogtreecommitdiff
path: root/admin-panel/src/server/services/gerrit.service.ts
diff options
context:
space:
mode:
Diffstat (limited to 'admin-panel/src/server/services/gerrit.service.ts')
-rw-r--r--admin-panel/src/server/services/gerrit.service.ts81
1 files changed, 81 insertions, 0 deletions
diff --git a/admin-panel/src/server/services/gerrit.service.ts b/admin-panel/src/server/services/gerrit.service.ts
new file mode 100644
index 0000000..53c8f13
--- /dev/null
+++ b/admin-panel/src/server/services/gerrit.service.ts
@@ -0,0 +1,81 @@
+const GERRIT_URL = process.env.GERRIT_URL || 'http://gerrit:8080';
+
+export interface GerritChange {
+ id: string;
+ change_id: string;
+ _number: number;
+ subject: string;
+ status: string;
+ created: string;
+ updated: string;
+ mergeable?: boolean;
+ labels?: Record<string, unknown>;
+}
+
+export interface GerritReview {
+ message: string;
+ labels?: Record<string, number>;
+ comments?: Record<string, Array<{ line: number; message: string }>>;
+}
+
+async function gerritFetch(path: string, options?: RequestInit): Promise<unknown> {
+ const url = `${GERRIT_URL}/a${path}`;
+ const res = await fetch(url, {
+ headers: {
+ 'Content-Type': 'application/json',
+ ...options?.headers,
+ },
+ ...options,
+ });
+
+ if (!res.ok) {
+ throw new Error(`Gerrit API error: ${res.status} ${res.statusText}`);
+ }
+
+ const text = await res.text();
+ // Gerrit prepends )]}' to JSON responses
+ const json = text.startsWith(")]}'") ? text.slice(4) : text;
+ return json ? JSON.parse(json) : null;
+}
+
+export async function getChange(changeId: string): Promise<GerritChange | null> {
+ try {
+ return (await gerritFetch(`/changes/${encodeURIComponent(changeId)}`)) as GerritChange;
+ } catch {
+ return null;
+ }
+}
+
+export async function getChangeByNumber(changeNumber: number): Promise<GerritChange | null> {
+ try {
+ return (await gerritFetch(`/changes/${changeNumber}`)) as GerritChange;
+ } catch {
+ return null;
+ }
+}
+
+export async function postReview(changeId: string, review: GerritReview): Promise<void> {
+ await gerritFetch(`/changes/${encodeURIComponent(changeId)}/revisions/current/review`, {
+ method: 'POST',
+ body: JSON.stringify(review),
+ });
+}
+
+export async function getChangeDiff(changeId: string): Promise<string> {
+ const result = await gerritFetch(
+ `/changes/${encodeURIComponent(changeId)}/revisions/current/patch`
+ );
+ // Patch is base64 encoded
+ if (typeof result === 'string') {
+ return Buffer.from(result, 'base64').toString('utf-8');
+ }
+ return '';
+}
+
+export async function queryChanges(query: string): Promise<GerritChange[]> {
+ try {
+ return (await gerritFetch(`/changes/?q=${encodeURIComponent(query)}`)) as GerritChange[];
+ } catch {
+ return [];
+ }
+}