Update Harbor client and gateway integration workflows
This commit is contained in:
@@ -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;
|
||||
},
|
||||
};
|
||||
}
|
||||
@@ -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;
|
||||
},
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user