44 lines
1.5 KiB
TypeScript
44 lines
1.5 KiB
TypeScript
import { createReferenceFeatureInput } from "../application/reference-feature-api.js";
|
|
import {
|
|
REFERENCE_FEATURE_CONTRACT,
|
|
REFERENCE_FEATURE_ID,
|
|
} from "../contracts/reference-feature-contract.js";
|
|
import { mapReferenceOperation } from "../contracts/reference-mapper.js";
|
|
import {
|
|
validateReferencePayload,
|
|
validateReferenceRequest,
|
|
} from "../contracts/reference-schemas.js";
|
|
import { createReferenceHttpGateway } from "./reference-http-gateway.js";
|
|
|
|
type HttpContract = Readonly<{
|
|
getOperation(operationId: string): unknown;
|
|
validatePayload: typeof validateReferencePayload;
|
|
validateRequest: typeof validateReferenceRequest;
|
|
mapPayload: typeof mapReferenceOperation;
|
|
}>;
|
|
|
|
type HttpExecutor = Parameters<typeof createReferenceHttpGateway>[0];
|
|
|
|
export function createReferenceFeatureInstalledInput(context: Readonly<{
|
|
createHttpClient(contract: HttpContract): HttpExecutor;
|
|
}>) {
|
|
const operations =
|
|
REFERENCE_FEATURE_CONTRACT.apiOperations as Readonly<Record<string, unknown>>;
|
|
const http = context.createHttpClient({
|
|
getOperation(operationId) {
|
|
const operation = operations[operationId];
|
|
if (!operation) {
|
|
throw new Error(`Unknown reference operation: ${operationId}`);
|
|
}
|
|
return operation;
|
|
},
|
|
validatePayload: validateReferencePayload,
|
|
validateRequest: validateReferenceRequest,
|
|
mapPayload: mapReferenceOperation,
|
|
});
|
|
return Object.freeze({
|
|
featureId: REFERENCE_FEATURE_ID,
|
|
input: createReferenceFeatureInput(createReferenceHttpGateway(http)),
|
|
});
|
|
}
|