All files reference-http-gateway.ts

100% Statements 11/11
100% Branches 8/8
100% Functions 5/5
100% Lines 11/11

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83                                                2x   2x                     5x 2x         3x 2x         1x                                 8x   1x     6x     3x                
import {
  defineFeatureHttpOperationForRoutes,
  type FeatureHttpBinding,
} from "../../../adapters/http/index.ts";
import {
  CREATE_REFERENCE_RESOURCE_CONTRACT,
  GET_REFERENCE_RESOURCE_CONTRACT,
  LIST_REFERENCE_RESOURCES_CONTRACT,
} from "../contracts/reference-feature-contract-contribution.ts";
import {
  REFERENCE_FEATURE_CONTRACT,
} from "../contracts/reference-feature-contract.ts";
import {
  mapReferenceResourceListPayload,
  mapReferenceResourcePayload,
} from "../contracts/reference-mapper.ts";
import type {
  ReferenceGateway,
} from "../application/reference-feature-api.ts";
 
export type ReferenceFeatureRouteId =
  keyof typeof REFERENCE_FEATURE_CONTRACT.routes;
 
const defineReferenceHttpOperation =
  defineFeatureHttpOperationForRoutes<ReferenceFeatureRouteId>();
 
export const REFERENCE_HTTP_OPERATIONS = Object.freeze({
  LIST_REFERENCE_RESOURCES: defineReferenceHttpOperation({
    contract: LIST_REFERENCE_RESOURCES_CONTRACT,
    routeId: "REFERENCE_RESOURCE_LIST",
    mapSuccess: mapReferenceResourceListPayload,
  }),
  CREATE_REFERENCE_RESOURCE: defineReferenceHttpOperation({
    contract: CREATE_REFERENCE_RESOURCE_CONTRACT,
    routeId: "REFERENCE_RESOURCE_LIST",
    mapSuccess: mapReferenceResourcePayload,
    mapProblem(problem, metadata) {
      if (metadata.status === 409) {
        return Object.freeze({
          kind: "CONFLICT" as const,
          code: problem.code ?? "REFERENCE_RESOURCE_CONFLICT",
        });
      }
      if (metadata.status === 422) {
        return Object.freeze({
          kind: "VALIDATION_REJECTED" as const,
          code: problem.code ?? "REFERENCE_RESOURCE_REJECTED",
        });
      }
      return undefined;
    },
  }),
  GET_REFERENCE_RESOURCE: defineReferenceHttpOperation({
    contract: GET_REFERENCE_RESOURCE_CONTRACT,
    routeId: "REFERENCE_RESOURCE_DETAIL",
    mapSuccess: mapReferenceResourcePayload,
  }),
} as const);
 
export type ReferenceHttpBinding = FeatureHttpBinding<
  typeof REFERENCE_HTTP_OPERATIONS
>;
 
export function createReferenceHttpGateway(
  http: ReferenceHttpBinding,
): ReferenceGateway {
  return Object.freeze({
    list(filters, context) {
      return http.execute("LIST_REFERENCE_RESOURCES", filters, context);
    },
    create(command, context) {
      return http.execute("CREATE_REFERENCE_RESOURCE", command, context);
    },
    get(resourceId, context) {
      return http.execute(
        "GET_REFERENCE_RESOURCE",
        Object.freeze({ resourceId }),
        context,
      );
    },
  });
}