<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="187244" data-post-id="187244">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="stefanluptak" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/stefanluptak/120/34398_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  stefanluptak
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thanks a lot for the latest release and also for the whole library. It’s really useful for me.</p>
<p>One thing I am not sure how to do is something like <em>“polymorphic”</em> schemas. This could be used for example with an endpoint returning <code>409</code> (conflict) with multiple meanings.<br>
For example for one endpoint it means email is already registered or email is already invited. For some other endpoint <code>409</code> could mean some other options. I know I can create new <code>Error.Conflict*</code> schema for each endpoint and use the <code>enum: [ ... ]</code> atribute, but this could become quite non-DRY after a while.</p>
<p>I would really like something like</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">409 =&gt; {"Conflict", "application/json", Api.Schema.Conflict.new("email_already_registered", "email_already_used")
</code></pre>
<p>with the schema defined like this:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule Api.Schema.Conflict do
  require OpenApiSpex
  alias OpenApiSpex.Schema

  def new(enum) do
    OpenApiSpex.schema(%{
      title: "Error.Conflict",
      type: :object,
      properties: %{
        error: %Schema{
          type: :object,
          properties: %{
            name: %Schema{
              type: :string,
              enum: enum,
              required: true
            },
            message: %Schema{type: :string}
          }
        }
      }
    })
  end
end
</code></pre>
<p>Is it possible or am trying to use a completely wrong approach? <img src="https://forum.elixirforum.com/images/emoji/apple/slight_smile.png?v=15" title=":slight_smile:" class="emoji" alt=":slight_smile:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="187244" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/openapispex-openapi-swagger-3-0-for-plug-apis/15614/22">Post #21</a>
	                </div>
	            </div>
              <div id="likers-container-187244" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="187244"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #21"></div>
  </section>
</div>
    <div class="postbit" id="187391" data-post-id="187391">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="mbuhot" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/mbuhot/120/33444_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  mbuhot
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Interesting! How about if you construct the <code>%Schema{}</code> struct directly in <code>new</code>?</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule Api.Schema.Conflict do
  require OpenApiSpex
  alias OpenApiSpex.Schema

  def new(enum) do
    %Schema{
      title: "Error.Conflict",
      type: :object,
      properties: %{
        error: %Schema{
          type: :object,
          properties: %{
            name: %Schema{
              type: :string,
              enum: enum,
              required: true
            },
            message: %Schema{type: :string}
          }
        }
      }
    }
  end
end
</code></pre>
<p>It won’t define a struct for you, but it might be fine for a simple response schema?</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="187391" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/openapispex-openapi-swagger-3-0-for-plug-apis/15614/23">Post #22</a>
	                </div>
	            </div>
              <div id="likers-container-187391" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="187391"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #22"></div>
  </section>
</div>
    <div class="postbit" id="187413" data-post-id="187413">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="stefanluptak" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/stefanluptak/120/34398_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  stefanluptak
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thanks. That works for generating the OpenAPI and Swagger UI, but not when I am trying to use the <code>assert_schema</code> function, since that <code>Conflict</code> schema doesn’t really exist as a struct. I am going to stick to the non-DRY approach.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="187413" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/openapispex-openapi-swagger-3-0-for-plug-apis/15614/24">Post #23</a>
	                </div>
	            </div>
              <div id="likers-container-187413" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="187413"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #23"></div>
  </section>
</div>
    <div class="postbit" id="187423" data-post-id="187423">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="stefanluptak" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/stefanluptak/120/34398_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  stefanluptak
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>OK, I ended up somewhere in-between. File for each response, but at least the function/macro is in one place.<br>
Thanks for pointing me to the correct direction.</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule Api.Schema.Error do
  @moduledoc """
  ## Usage:

      defmodule Your.Api.Error do
        use Api.Schema.Error,
          title: "Your.Api.Error",
          enum: ["possible", "error", "names"]
      end
  """
  defmacro __using__(opts) do
    title = Keyword.fetch!(opts, :title)
    enum = Keyword.fetch!(opts, :enum)

    quote do
      require OpenApiSpex
      alias OpenApiSpex.Schema

      OpenApiSpex.schema(%{
        title: unquote(title),
        type: :object,
        required: [:error],
        properties: %{
          error: %Schema{
            type: :object,
            required: [:name],
            properties: %{
              name: %Schema{
                type: :string,
                enum: unquote(enum)
              },
              message: %Schema{type: :string}
            }
          }
        }
      })
    end
  end
end
</code></pre> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="187423" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/openapispex-openapi-swagger-3-0-for-plug-apis/15614/25">Post #24</a>
	                </div>
	            </div>
              <div id="likers-container-187423" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="187423"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #24"></div>
  </section>
</div>
    <div class="postbit" id="187496" data-post-id="187496">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="mbuhot" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/mbuhot/120/33444_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  mbuhot
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Nice! I think we could do something similar for JSON:API wrapper schemas, where paginated responses all have a similar outer envelope, but different <code>data</code> inside. <img src="https://forum.elixirforum.com/images/emoji/apple/+1.png?v=15" title=":+1:" class="emoji" alt=":+1:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="187496" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/openapispex-openapi-swagger-3-0-for-plug-apis/15614/26">Post #25</a>
	                </div>
	            </div>
              <div id="likers-container-187496" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="187496"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #25"></div>
  </section>
</div>
    <div class="postbit" id="188031" data-post-id="188031">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="rsimmonsjr" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  rsimmonsjr
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I am new to OpenApiSpex librtary and I am trying to figure out how I would specify the doc tags for a multipart form and comming up dry on documentation. Essentially what I want is this example from OpenAPI</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">          requestBody:
            content:
              multipart/form-data:
                schema:
                  type: object
                  properties:
                    orderId:
                      type: integer
                    userId:
                      type: integer
                    fileName:
                      type: string
                      format: binary
</code></pre>
<p>RE: <a href="https://swagger.io/docs/specification/describing-request-body/file-upload/" class="inline-onebox" rel="noopener nofollow ugc">File Upload | Swagger Docs</a></p>
<p>Is there a way to do this? I havent been able to find it.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="188031" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/openapispex-openapi-swagger-3-0-for-plug-apis/15614/27">Post #26</a>
	                </div>
	            </div>
              <div id="likers-container-188031" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="188031"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #26"></div>
  </section>
</div>
    <div class="postbit" id="188052" data-post-id="188052">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="mbuhot" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/mbuhot/120/33444_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  mbuhot
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p><a class="mention" href="/u/rsimmonsjr" rel="nofollow">@rsimmonsjr</a> yes, please see <a href="https://github.com/open-api-spex/open_api_spex/issues/253#issuecomment-663289381" class="inline-onebox" rel="noopener nofollow ugc">File uploading with other data · Issue #253 · open-api-spex/open_api_spex · GitHub</a></p>
<p>Define the schema:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">
defmodule Schemas.UserMultipartRequest do
    OpenApiSpex.schema(%{
      type: :object,
      # Request parts
      properties: %{
        # Part 1 (string value)
        id: %Schema{type: :string, format: :uuid},
        # Part2 (object)
        address: %Schema{
          type: :object,
          properties: %{
            street: %Schema{type: :string},
            city: %Schema{type: :string}
          }
        },
        # Part 3 (an image)
        profileImage: %Schema{
          type: :string,
          format: :binary
        }
      }
    })
  end
</code></pre>
<p>Then use it to describe an operation request body:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">
@doc parameters: [group_id: [in: :path, type: :integer, description: "Group ID", example: 1]],
  request_body: {"The user attributes", "multipart/form-data", Schemas.UserMultipartRequest, required: true},
  responses: [created: {"User", "application/json", Schemas.UserResponse}]
  def create(conn = %{body_params: body = %Schemas.UserMultipartRequest{}}, %{
        group_id: _group_id
      }) do
  end
</code></pre> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="188052" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/openapispex-openapi-swagger-3-0-for-plug-apis/15614/28">Post #27</a>
	                </div>
	            </div>
              <div id="likers-container-188052" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="188052"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #27"></div>
  </section>
</div>
    <div class="postbit" id="188074" data-post-id="188074">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="rsimmonsjr" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  rsimmonsjr
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Awesome, thanks for the alacrity in response. I will try this out.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="188074" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/openapispex-openapi-swagger-3-0-for-plug-apis/15614/29">Post #28</a>
	                </div>
	            </div>
              <div id="likers-container-188074" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="188074"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #28"></div>
  </section>
</div>
    <div class="postbit" id="188081" data-post-id="188081">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="rsimmonsjr" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  rsimmonsjr
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Is it possible to do the request body schema inline with the <code>@doc</code> tags? Since its a form of only one element that would be optimal rather than declaring a whole schema for it. In fact, in general I would prefer to put schemas inline on requests rather than declare a schema unless that schema is re-used somehow.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="188081" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/openapispex-openapi-swagger-3-0-for-plug-apis/15614/30">Post #29</a>
	                </div>
	            </div>
              <div id="likers-container-188081" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="188081"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #29"></div>
  </section>
</div>
    <div class="postbit" id="188130" data-post-id="188130">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="mbuhot" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/mbuhot/120/33444_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  mbuhot
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Yes, the <code>request_body</code> <code>@doc</code> tag eventually passes the elements of the tuple through to the <a href="https://hexdocs.pm/open_api_spex/OpenApiSpex.Operation.html#request_body/4" rel="noopener nofollow ugc">Operation.request_body/4</a> function, which accepts a schema module name, schema reference, or schema struct.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="188130" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/openapispex-openapi-swagger-3-0-for-plug-apis/15614/31">Post #30</a>
	                </div>
	            </div>
              <div id="likers-container-188130" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="188130"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #30"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <a class="load-more-button" data-turbo-stream="true" href="/topics/15614/load_more?page=4">Load more posts (24 remaining)</a>
</div></template></turbo-stream>