260 lines
9.2 KiB
TypeScript
260 lines
9.2 KiB
TypeScript
import { canonicalize } from "../../../contracts/query-keys.ts";
|
|
import { defineQueryInvalidationTopic } from "../../../contracts/query-invalidation.ts";
|
|
import { defineRestOperation } from "../../../contracts/api-operations.ts";
|
|
import { REFERENCE_RUNTIME_SCHEMA_CODECS } from "./reference-schemas.ts";
|
|
import { REFERENCE_BOUNDARY_MAPPERS } from "./reference-mapper.ts";
|
|
|
|
export const REFERENCE_FEATURE_ID = "reference-feature";
|
|
const REFERENCE_NAMESPACE = Object.freeze(["reference-resource", 1] as const);
|
|
export const REFERENCE_RESOURCE_INVALIDATION_TOPIC =
|
|
defineQueryInvalidationTopic("qinv.01k10f7m3w9p6r2c8v5n4x");
|
|
|
|
export const referenceQueryKeys = Object.freeze({
|
|
all: () => REFERENCE_NAMESPACE,
|
|
list: (filters: Readonly<object> = {}) =>
|
|
Object.freeze([...REFERENCE_NAMESPACE, "list", canonicalize(filters)]),
|
|
|
|
detail: (resourceId: string) =>
|
|
Object.freeze([...REFERENCE_NAMESPACE, "detail", String(resourceId)]),
|
|
});
|
|
|
|
export const REFERENCE_FEATURE_CONTRACT = Object.freeze({
|
|
featureId: REFERENCE_FEATURE_ID,
|
|
runtimeSchemas: REFERENCE_RUNTIME_SCHEMA_CODECS,
|
|
mappers: REFERENCE_BOUNDARY_MAPPERS,
|
|
schemas: Object.freeze({
|
|
ReferenceResourceParams: Object.freeze({
|
|
schemaId: "ReferenceResourceParams",
|
|
boundary: "route-params",
|
|
owner: "feature-frontend-reference-feature-vertical-slice",
|
|
runtime: "zod",
|
|
schemaVersion: 1,
|
|
direction: "REQUEST",
|
|
unknownFieldPolicy: "REJECT_UNKNOWN",
|
|
}),
|
|
ReferenceResourceListQuery: Object.freeze({
|
|
schemaId: "ReferenceResourceListQuery",
|
|
boundary: "route-search-api-request",
|
|
owner: "feature-frontend-reference-feature-vertical-slice",
|
|
runtime: "zod",
|
|
schemaVersion: 1,
|
|
direction: "REQUEST",
|
|
unknownFieldPolicy: "REJECT_UNKNOWN",
|
|
}),
|
|
CreateReferenceResourceCommand: Object.freeze({
|
|
schemaId: "CreateReferenceResourceCommand",
|
|
boundary: "api-request",
|
|
owner: "feature-frontend-reference-feature-vertical-slice",
|
|
runtime: "zod",
|
|
schemaVersion: 1,
|
|
direction: "REQUEST",
|
|
unknownFieldPolicy: "REJECT_UNKNOWN",
|
|
}),
|
|
NoRequest: Object.freeze({
|
|
schemaId: "NoRequest",
|
|
boundary: "api-request",
|
|
owner: "feature-frontend-reference-feature-vertical-slice",
|
|
runtime: "zod",
|
|
schemaVersion: 1,
|
|
direction: "REQUEST",
|
|
unknownFieldPolicy: "REJECT_UNKNOWN",
|
|
}),
|
|
ReferenceResourceListPayload: Object.freeze({
|
|
schemaId: "ReferenceResourceListPayload",
|
|
boundary: "api-response",
|
|
owner: "feature-frontend-reference-feature-vertical-slice",
|
|
runtime: "zod",
|
|
schemaVersion: 1,
|
|
direction: "RESPONSE",
|
|
unknownFieldPolicy: "STRIP_UNKNOWN",
|
|
}),
|
|
ReferenceResourcePayload: Object.freeze({
|
|
schemaId: "ReferenceResourcePayload",
|
|
boundary: "api-response",
|
|
owner: "feature-frontend-reference-feature-vertical-slice",
|
|
runtime: "zod",
|
|
schemaVersion: 1,
|
|
direction: "RESPONSE",
|
|
unknownFieldPolicy: "STRIP_UNKNOWN",
|
|
}),
|
|
}),
|
|
routes: Object.freeze({
|
|
REFERENCE_RESOURCE_LIST: Object.freeze({
|
|
routeId: "REFERENCE_RESOURCE_LIST",
|
|
path: "/examples/reference-resources",
|
|
paramsSchema: null,
|
|
searchSchema: "ReferenceResourceListQuery",
|
|
access: "integration-defined",
|
|
loadingSurface: "reference-resource-list",
|
|
errorSurface: "feature-boundary",
|
|
chunkId: "route-reference-resources",
|
|
title: "Reference feature",
|
|
navigationLabel: "Reference feature",
|
|
navigationOrder: 50,
|
|
}),
|
|
REFERENCE_RESOURCE_DETAIL: Object.freeze({
|
|
routeId: "REFERENCE_RESOURCE_DETAIL",
|
|
path: "/examples/reference-resources/:resourceId",
|
|
paramsSchema: "ReferenceResourceParams",
|
|
searchSchema: null,
|
|
access: "integration-defined",
|
|
loadingSurface: "reference-resource-detail",
|
|
errorSurface: "feature-boundary",
|
|
chunkId: "route-reference-resource-detail",
|
|
title: "Reference detail",
|
|
navigationLabel: null,
|
|
navigationOrder: null,
|
|
}),
|
|
REFERENCE_RESOURCE_FORM: Object.freeze({
|
|
routeId: "REFERENCE_RESOURCE_FORM",
|
|
path: "/examples/reference-resources/new",
|
|
paramsSchema: null,
|
|
searchSchema: null,
|
|
access: "integration-defined",
|
|
loadingSurface: "reference-resource-form",
|
|
errorSurface: "feature-boundary",
|
|
chunkId: "route-reference-resource-form",
|
|
title: "Reference form",
|
|
navigationLabel: null,
|
|
navigationOrder: null,
|
|
}),
|
|
REFERENCE_RESOURCE_STATUS: Object.freeze({
|
|
routeId: "REFERENCE_RESOURCE_STATUS",
|
|
path: "/examples/reference-resources/status",
|
|
paramsSchema: null,
|
|
searchSchema: null,
|
|
access: "integration-defined",
|
|
loadingSurface: "reference-resource-status",
|
|
errorSurface: "feature-boundary",
|
|
chunkId: "route-reference-resource-status",
|
|
title: "Reference status",
|
|
navigationLabel: null,
|
|
navigationOrder: null,
|
|
}),
|
|
}),
|
|
routeRuntimeContracts: Object.freeze({
|
|
REFERENCE_RESOURCE_LIST: Object.freeze({
|
|
routeId: "REFERENCE_RESOURCE_LIST",
|
|
moduleId: "reference-resource-page",
|
|
paramsCodec: "none",
|
|
searchCodec: "ReferenceResourceListQuery",
|
|
}),
|
|
REFERENCE_RESOURCE_DETAIL: Object.freeze({
|
|
routeId: "REFERENCE_RESOURCE_DETAIL",
|
|
moduleId: "reference-resource-detail-page",
|
|
paramsCodec: "ReferenceResourceParams",
|
|
searchCodec: "none",
|
|
}),
|
|
REFERENCE_RESOURCE_FORM: Object.freeze({
|
|
routeId: "REFERENCE_RESOURCE_FORM",
|
|
moduleId: "reference-resource-form-page",
|
|
paramsCodec: "none",
|
|
searchCodec: "none",
|
|
}),
|
|
REFERENCE_RESOURCE_STATUS: Object.freeze({
|
|
routeId: "REFERENCE_RESOURCE_STATUS",
|
|
moduleId: "reference-resource-status-page",
|
|
paramsCodec: "none",
|
|
searchCodec: "none",
|
|
}),
|
|
}),
|
|
apiOperations: Object.freeze({
|
|
LIST_REFERENCE_RESOURCES: defineRestOperation({
|
|
method: "GET",
|
|
path: "/api/reference-resources",
|
|
operationId: "LIST_REFERENCE_RESOURCES",
|
|
auth: "external-session",
|
|
timeoutMs: null,
|
|
idempotency: "safe",
|
|
retry: "runtime",
|
|
requestSource: "search",
|
|
requestSchema: "ReferenceResourceListQuery",
|
|
responseSchema: "ReferenceResourceListPayload",
|
|
owner: "feature-frontend-reference-feature-vertical-slice",
|
|
contractVersion: 2,
|
|
protocol: "REST",
|
|
semantics: "QUERY",
|
|
replayPolicy: "SAFE",
|
|
idempotencyKeyPolicy: "NONE",
|
|
mapperId: "ReferenceResourceListMapper",
|
|
successStatuses: [200],
|
|
responseMediaTypes: ["application/json"],
|
|
maxResponseBytes: 262_144,
|
|
providerId: "PRIMARY_API",
|
|
authProfileId: "REFERENCE_EXTERNAL_BEARER",
|
|
csrfProfileId: "NO_CSRF_BEARER",
|
|
pathSchema: "NoRequest",
|
|
pathParameterNames: [],
|
|
maxEncodedSearchBytes: 4_096,
|
|
}),
|
|
CREATE_REFERENCE_RESOURCE: defineRestOperation({
|
|
method: "POST",
|
|
path: "/api/reference-resources",
|
|
operationId: "CREATE_REFERENCE_RESOURCE",
|
|
auth: "external-session",
|
|
timeoutMs: null,
|
|
idempotency: "keyed",
|
|
retry: "runtime",
|
|
requestSource: "body",
|
|
requestSchema: "CreateReferenceResourceCommand",
|
|
responseSchema: "ReferenceResourcePayload",
|
|
owner: "feature-frontend-reference-feature-vertical-slice",
|
|
contractVersion: 2,
|
|
protocol: "REST",
|
|
semantics: "COMMAND",
|
|
replayPolicy: "KEYED_COMMAND",
|
|
idempotencyKeyPolicy: "REQUIRED",
|
|
mapperId: "ReferenceResourceMapper",
|
|
successStatuses: [200, 201],
|
|
responseMediaTypes: ["application/json"],
|
|
maxResponseBytes: 32_768,
|
|
providerId: "PRIMARY_API",
|
|
authProfileId: "REFERENCE_EXTERNAL_BEARER",
|
|
csrfProfileId: "NO_CSRF_BEARER",
|
|
pathSchema: "NoRequest",
|
|
pathParameterNames: [],
|
|
maxEncodedSearchBytes: 0,
|
|
}),
|
|
GET_REFERENCE_RESOURCE: defineRestOperation({
|
|
method: "GET",
|
|
path: "/api/reference-resources/{resourceId}",
|
|
operationId: "GET_REFERENCE_RESOURCE",
|
|
auth: "external-session",
|
|
timeoutMs: null,
|
|
idempotency: "safe",
|
|
retry: "runtime",
|
|
requestSource: "none",
|
|
requestSchema: "NoRequest",
|
|
responseSchema: "ReferenceResourcePayload",
|
|
owner: "feature-frontend-reference-feature-vertical-slice",
|
|
contractVersion: 2,
|
|
protocol: "REST",
|
|
semantics: "QUERY",
|
|
replayPolicy: "SAFE",
|
|
idempotencyKeyPolicy: "NONE",
|
|
mapperId: "ReferenceResourceMapper",
|
|
successStatuses: [200],
|
|
responseMediaTypes: ["application/json"],
|
|
maxResponseBytes: 32_768,
|
|
providerId: "PRIMARY_API",
|
|
authProfileId: "REFERENCE_EXTERNAL_BEARER",
|
|
csrfProfileId: "NO_CSRF_BEARER",
|
|
pathSchema: "ReferenceResourceParams",
|
|
pathParameterNames: ["resourceId"],
|
|
maxEncodedSearchBytes: 0,
|
|
}),
|
|
}),
|
|
queryRegistry: Object.freeze({
|
|
REFERENCE_RESOURCE: Object.freeze({
|
|
namespace: REFERENCE_NAMESPACE,
|
|
serialization: "canonical-object-order",
|
|
identity: "no-pii-token-or-raw-url",
|
|
invalidation: "reference resource namespace after successful mutation",
|
|
invalidationTopic: REFERENCE_RESOURCE_INVALIDATION_TOPIC,
|
|
crossContext: "invalidate-only",
|
|
version: 1,
|
|
persistence: "disabled",
|
|
}),
|
|
}),
|
|
} as const);
|