Files
wanderer/lib/wanderer_app_web/api_spec_v1.ex
2025-07-16 20:39:30 +00:00

95 lines
2.6 KiB
Elixir

defmodule WandererAppWeb.ApiSpecV1 do
@moduledoc """
OpenAPI spec that combines legacy and v1 JSON:API endpoints.
"""
@behaviour OpenApiSpex.OpenApi
alias OpenApiSpex.{OpenApi, Info, Components}
@impl OpenApiSpex.OpenApi
def spec do
# Get the base spec from the original
base_spec = WandererAppWeb.ApiSpec.spec()
# Get v1 spec
v1_spec = WandererAppWeb.OpenApiV1Spec.spec()
# Merge the specs
merged_paths = Map.merge(base_spec.paths || %{}, v1_spec.paths || %{})
# Merge components
merged_components = %Components{
securitySchemes:
Map.merge(
get_security_schemes(base_spec),
get_security_schemes(v1_spec)
),
schemas:
Map.merge(
get_schemas(base_spec),
get_schemas(v1_spec)
),
responses:
Map.merge(
get_responses(base_spec),
get_responses(v1_spec)
)
}
%OpenApi{
info: %Info{
title: "WandererApp API (Legacy & v1)",
version: "1.1.0",
description: """
Complete API documentation for WandererApp including both legacy endpoints and v1 JSON:API endpoints.
## Authentication
All endpoints require authentication via Bearer token:
```
Authorization: Bearer YOUR_API_KEY
```
## API Versions
- **Legacy API** (`/api/*`): Original endpoints, maintained for backward compatibility
- **v1 JSON:API** (`/api/v1/*`): New standardized JSON:API endpoints with filtering, sorting, and pagination
"""
},
servers: base_spec.servers,
paths: merged_paths,
components: merged_components,
tags: merge_tags(base_spec, v1_spec),
security: [%{"bearerAuth" => []}]
}
end
defp get_security_schemes(%{components: %{securitySchemes: schemes}}) when is_map(schemes),
do: schemes
defp get_security_schemes(_), do: %{}
defp get_schemas(%{components: %{schemas: schemas}}) when is_map(schemas), do: schemas
defp get_schemas(_), do: %{}
defp get_responses(%{components: %{responses: responses}}) when is_map(responses), do: responses
defp get_responses(_), do: %{}
defp merge_tags(_base_spec, v1_spec) do
base_tags = [
%{name: "Legacy API", description: "Original API endpoints"}
]
# Get tags from v1 spec if available
spec_tags = Map.get(v1_spec, :tags, [])
# Add custom v1 tags
v1_label_tags = [
%{name: "v1 JSON:API", description: "JSON:API compliant endpoints with advanced querying"}
]
base_tags ++ v1_label_tags ++ spec_tags
end
end