GUIDES
GUIDESDOCS

Versioning

Here is a simple example. maru_version

1. add versioning to your config.exs

use Mix.Config

config :maru, MaruVersion.API,
  versioning: [
    using: :path
  ],
  http: [port: 4001]
use Mix.Config

config :maru, MaruVersion.API,
  versioning: [
    using: :param,
    parameter: "v"
  ],
  http: [port: 4001]
use Mix.Config

config :maru, MaruVersion.API,
  versioning: [
    using: :accept_version_header
  ],
  http: [port: 4001]

2. use version/1 or version/2 DSL

defmodule MaruVersion.API.V1 do
  use Maru.Router

  version "v1"

  desc "get v1"
  get do
    "It works V1!"
  end

  mount Maru.Version.API.Shared
end
defmodule MaruVersion.API.V2 do
  use Maru.Router

  version "v2" do
    desc "get v2"
    get do
      "It works V2!"
    end

    mount Maru.Version.API.Shared
  end
end

3. mount to top API router

defmodule MaruVersion.API do
  use Maru.Router

  mount MaruVersion.API.V1
  mount MaruVersion.API.V2
end

Version Extend

defmodule MaruVersion.API.V2 do
  use Maru.Router

  version "v2" do
    desc "get v2"
    get do
      "It works V2!"
    end

    get :extend do
      "This will be extended!"
    end

    get :no_extend do
      "This will NOT be extended!"
    end
  end
end
defmodule MaruVersion.API.V3 do
  # extend all
  version "v3", extend: "v2", at: MaruVersion.API.V2,
  
  # extend only 
  version "v3", extend: "v2", at: MaruVersion.API.V2, only: [
    get: "/extend/*",
  ]

  # extend except 
  version "v3", extend: "v2", at: MaruVersion.API.V2, except: [
    match: "/no_extend",
  ]

  # high priority
  get do
    "It works V3!"
  end
end