mirror of
https://github.com/wanderer-industries/wanderer
synced 2025-12-13 19:25:53 +00:00
95 lines
2.6 KiB
Elixir
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
|