Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Available versions endpoint #42

Merged
merged 8 commits into from
Oct 3, 2023
52 changes: 52 additions & 0 deletions lib/schema_web/controllers/schema_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,19 @@ defmodule SchemaWeb.SchemaController do
version: "1.0.0"
})
end,
Versions:
swagger_schema do
title("Versions")
description("Schema versions, using Semantic Versioning Specification (SemVer) format.")

properties do
versions(:string, "Version numbers", required: true)
end

example(%{
versions: ["1.0.0", "1.1.0"]
dfederschmidt marked this conversation as resolved.
Show resolved Hide resolved
})
end,
ClassDesc:
swagger_schema do
title("Class Descriptor")
Expand Down Expand Up @@ -122,6 +135,45 @@ defmodule SchemaWeb.SchemaController do
send_json_resp(conn, version)
end

@doc """
Get available OCSF schema versions.
"""
swagger_path :versions do
get("/api/versions")
summary("Versions")
description("Get available OCSF schema versions.")
produces("application/json")
tag("Schema")
response(200, "Success", :Versions)
end

@spec versions(Plug.Conn.t(), any) :: Plug.Conn.t()
def versions(conn, _params) do

url = Application.get_env(:schema_server, SchemaWeb.Endpoint)[:url]

base_url = "#{conn.scheme}://#{Keyword.fetch!(url, :host)}:#{Keyword.fetch!(url, :port)}"
dfederschmidt marked this conversation as resolved.
Show resolved Hide resolved

available_versions = Schemas.versions()
|> Enum.map(fn {version, _} -> version end)

default_version = %{:version => Schema.version(), :url => "#{base_url}/api"}

versions_response = case available_versions do
[] ->
# If there is no response, we only provide a single schema
%{:versions => [default_version], :default => default_version}
rmouritzen-splunk marked this conversation as resolved.
Show resolved Hide resolved

[_head | _tail] ->
available_versions_objects = available_versions
|> Enum.map(fn version -> %{:version => version, :url => "#{base_url}/#{version}/api"} end)
%{:versions => available_versions_objects, :default => default_version}

end

send_json_resp(conn, versions_response)
end

@doc """
Get the schema data types.
"""
Expand Down
8 changes: 5 additions & 3 deletions lib/schema_web/router.ex
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ defmodule SchemaWeb.Router do
get "/classes", PageController, :classes
get "/classes/:id", PageController, :classes
get "/classes/:extension/:id", PageController, :classes

get "/class/graph/:id", PageController, :class_graph
get "/class/graph/:extension/:id", PageController, :class_graph

Expand All @@ -51,7 +51,7 @@ defmodule SchemaWeb.Router do

get "/object/graph/:id", PageController, :object_graph
get "/object/graph/:extension/:id", PageController, :object_graph

get "/data_types", PageController, :data_types
get "/guidelines", PageController, :guidelines
end
Expand All @@ -61,6 +61,8 @@ defmodule SchemaWeb.Router do
pipe_through :api

get "/version", SchemaController, :version
get "/versions", SchemaController, :versions

get "/profiles", SchemaController, :profiles
get "/extensions", SchemaController, :extensions

Expand Down Expand Up @@ -94,7 +96,7 @@ defmodule SchemaWeb.Router do

get "/classes/:id", SchemaController, :json_class
get "/classes/:extension/:id", SchemaController, :json_class

get "/objects/:id", SchemaController, :json_object
get "/objects/:extension/:id", SchemaController, :json_object
end
Expand Down
Loading