opinionated-machine
Version:
Very opinionated DI framework for fastify, built on top of awilix
42 lines (41 loc) • 1.63 kB
TypeScript
import type { ApiContract } from '@lokalise/api-contracts';
import type { RouteOptions } from 'fastify';
import type { GatewayMetadataValue } from '../gateway/gatewayMetadata.ts';
/**
* Abstract base class for controllers that use the `ApiContract` API.
*
* Concrete controllers declare a static `contracts` field and a `routes` object
* built with `buildApiRoute()`. The generic ensures every contract has a matching route.
*
* @example
* ```typescript
* class UserController extends AbstractApiController<typeof UserController.contracts> {
* static contracts = {
* getUser: getUserContract,
* streamUpdates: streamUpdatesContract,
* } as const
*
* readonly routes = {
* getUser: buildApiRoute(UserController.contracts.getUser, async (req) => ({
* status: 200,
* body: { id: req.params.id },
* })),
* streamUpdates: buildApiRoute(UserController.contracts.streamUpdates, async (_req, sse) => {
* sse.start('keepAlive')
* }),
* }
* }
* ```
*/
export declare abstract class AbstractApiController<APIContracts extends Record<string, ApiContract>> {
abstract readonly routes: Record<keyof APIContracts, RouteOptions>;
/**
* Optional controller-level defaults for gateway metadata.
*
* Merged underneath per-route metadata (passed inline via
* `buildApiRoute(..., { gatewayMetadata })` or attached post-hoc via
* `withGatewayMetadata`) when `DIContext.buildGatewayManifest()` assembles a
* manifest. See `AbstractController.gatewayDefaults` for full semantics.
*/
readonly gatewayDefaults?: GatewayMetadataValue;
}