Update Harbor client and gateway integration workflows
Build and Deploy Gateway / build-and-push (push) Failing after 14s
Build and Deploy Gateway / deploy (push) Has been skipped

This commit is contained in:
2026-08-19 18:16:10 +03:00
parent 416b2b294a
commit daec12e013
63 changed files with 5016 additions and 108 deletions
@@ -0,0 +1,17 @@
import type { IncomingMessage, ServerResponse } from 'node:http';
import type { ActivityJournalService } from '../../services/activityJournalService.js';
import { sendJson } from '../response.js';
export function createActivityJournalRoute({ journal }: { journal: ActivityJournalService }) {
return {
async handle(req: IncomingMessage, res: ServerResponse) {
const url = new URL(req.url || '/', 'http://localhost');
if (url.pathname !== '/api/activity-journal' || req.method !== 'GET') return false;
sendJson(res, 200, journal.page(
Number(url.searchParams.get('limit')) || 50,
url.searchParams.get('cursor'),
));
return true;
},
};
}
+49
View File
@@ -0,0 +1,49 @@
import type { IncomingMessage, ServerResponse } from 'node:http';
import type { FailoverService } from '../../features/failover/failoverService.js';
import { HarborError } from '../../../shared/errors.js';
interface FailoverRouteDependencies {
appMode: string;
failover: Pick<FailoverService, 'save' | 'pause' | 'manualSwitch' | 'checkNow'>;
readBody(req: IncomingMessage): Promise<Record<string, unknown>>;
withOperation<T>(kind: string, operation: () => Promise<T>, options?: { expectedRevision?: unknown }): Promise<T>;
sendState(res: ServerResponse): Promise<void>;
}
export function createFailoverRoute(dependencies: FailoverRouteDependencies) {
return {
async handle(req: IncomingMessage, res: ServerResponse) {
const pathname = new URL(req.url || '/', 'http://localhost').pathname;
if (!pathname.startsWith('/api/failover')) return false;
if (dependencies.appMode !== 'gateway') throw new HarborError('ENDPOINT_NOT_FOUND');
const body = await dependencies.readBody(req);
if (pathname === '/api/failover' && req.method === 'PUT') {
await dependencies.withOperation(
'failover-save',
() => dependencies.failover.save(body.policy),
{ expectedRevision: body.expectedRevision },
);
} else if (pathname === '/api/failover/pause' && req.method === 'POST') {
if (typeof body.paused !== 'boolean') throw new HarborError('REQUEST_INVALID');
await dependencies.withOperation(
body.paused ? 'failover-pause' : 'failover-resume',
() => dependencies.failover.pause(body.paused as boolean),
{ expectedRevision: body.expectedRevision },
);
} else if (pathname === '/api/failover/switch' && req.method === 'POST') {
if (body.role !== 'primary' && body.role !== 'reserve') throw new HarborError('REQUEST_INVALID');
await dependencies.withOperation(
'failover-switch',
() => dependencies.failover.manualSwitch(body.role as 'primary' | 'reserve'),
{ expectedRevision: body.expectedRevision },
);
} else if (pathname === '/api/failover/check' && req.method === 'POST') {
await dependencies.failover.checkNow();
} else {
throw new HarborError('ENDPOINT_NOT_FOUND');
}
await dependencies.sendState(res);
return true;
},
};
}