Phoenix and Swagger

Hi Elixir community,
My phoenix application already set up the swagger and it’s up and running.
I specified swagger specification for /get and it works well

 swagger_path :index do
    get("/api/campaigns")
    description("List of campaigns")
    response(code(:ok), "Success")
  end

but when I tried specify swagger for /post, I got stuck at its parameter() although I followed the documents, I installed latest PhoenixSwagger from its github branch
I still can’t specify the parameter right
I tried this

swagger_path :create do
    post("/api/campaigns")
    description("Create a campaign")
    PhoenixSwagger.Path.Parameter(:name, :start_date, :end_date, :budget, :hashtags, :team_id, :description)
    response(code(:ok), "Success")
  end

with parenthesis and not with parenthesis
or this

swagger_path :create do
    post("/api/campaigns")
    description("Create a campaign")
    parameter(:name, :start_date, :end_date, :budget, :hashtags, :team_id, :description)
    response(code(:ok), "Success")
  end

and I got this error for the two above code:

lib/kernel/parallel_compiler.ex:346: anonymous fn/5 in Kernel.ParallelCompiler.spawn_workers/7

How can I get the parameter right ? Thank you

With phoenix_swagger you probably want to refer to the Swagger 2.0 Documentation. You have to define a request body as described here: Describing Request Body.

Did you check out the example they provide in the repository?

This could look like the following example

  swagger_path :create do
    post("/api/campaigns")
    description("Create a campaign")

    parameter(:campaign, :body, Schema.ref(:campaign), "Campaign Attributes")

    response(200, "Success")
  end

Additionally you have to define the :campaign schema. Here you can make use of the swagger_definitions/0 function, which you can also add into the same controller:

  def swagger_definitions do
    %{
      campaign:
        swagger_schema do
          title("Campaign")
          description("A campaign.")

          properties do
            data(
              Schema.new do
                properties do
                  name(:string, "Campaign name", required: true)

                  start_time(:string, "Start time of the campaign.",
                    required: true,
                    format: "date-time"
                  )

                  id(:string, "Auto generated ID of type binary_id", required: false)
                end
              end
            )
          end

          example(%{
            campaign: %{
              name: "Marketing 101",
              start_time: "2030-07-01T21:00:00Z"
            }
          })
        end
    }
  end
3 Likes