Skip to main content

API Schema Documentation

Alapa supports reusable OpenAPI schemas to document your API endpoints, improving maintainability and reducing code duplication. All schema files are organized in the docs/schemas directory.

Defining a Schema

Schemas are defined in YAML files and can represent:

  • Objects
  • Arrays
  • Enums
  • Other complex data types

Example: Album Object Schema

docs/schemas/album/info.yaml
Albums: # Schema identifier for references - MUST be unique across all schemas
type: object
properties:
id:
type: string
title:
type: string
artist:
type: string
releaseDate:
type: string
format: date
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time

This schema defines an Album object with core metadata and automatic timestamp fields, reusable across endpoints.

Schema Naming Rules:

Each schema requires a globally unique name (case-sensitive, e.g., UserProfile ≠ userprofile), and duplicate names will silently override existing definitions.

Schema References

Reference schemas by name using the \$ref notation:

src/api/album/Controller.ts
data: {
$ref: "#components/schemas/Albums";
}

Alapa's decorator system automatically incorporates these references into generated Swagger/OpenAPI documentation.

Single Object Response

src/api/album/Controller.ts
@OpenApiOperation({
summary: "Get an album by ID",
description: "Returns an album by its ID",
parameters: [{
name: "album",
in: "path",
required: true
}],
responses: {
200: {
description: "Success response",
content: {
"application/json": {
schema: {
type: "object",
properties: {
status: { type: "string", example: "success" },
message: { type: "string", example: "Album fetched successfully" },
data: { $ref: "#components/schemas/Albums" }
}
}
}
}
}
}
})

Array Response Example

src/api/album/Controller.ts
@OpenApiOperation({
summary: "Get all albums",
description: "Returns all albums",
responses: {
200: {
description: "Success response",
content: {
"application/json": {
schema: {
type: "object",
properties: {
status: { type: "string", example: "success" },
message: { type: "string", example: "Albums fetched successfully" },
data: {
type: "array",
items: { $ref: "#components/schemas/Albums" }
}
}
}
}
}
}
}
})

Custom Schema Locations

Configure the schema directory path in your API configuration:

src/config/api.ts
import { APIConfiguration } from "alapa";

export const apiConfig: APIConfiguration = {
docs: {
schemasDir: process.env.DOCS_SCHEMAS_DIR || "docs/schemas",
},
// ... other configuration
};

Override the default path via environment variable:

.env
DOCS_SCHEMAS_DIR=custom/path/to/schemas

Key Advantages

Consistent Documentation - Uniform structure across all endpoints
Single Source of Truth - Changes propagate automatically
Reduced Duplication - Eliminate repetitive definitions
Flexible Configuration - Customizable storage location