class ReeSwagger::BuildEndpointSchema
def call(endpoint)
def call(endpoint) path_params = [] path = endpoint.path .split('/') .map { if _1.start_with?(':') path_param = _1[1..-1] path_params << path_param.to_sym "{#{path_param}}" else _1 end } .join('/') mime_type = get_mime_type(endpoint.respond_to) missed_caster = path_params - endpoint.caster&.fields&.keys.to_a if missed_caster.any? raise MissingCasterError, "missing caster for path parameters #{missed_caster.inspect}" end if endpoint.caster && METHODS_WITH_BODY.include?(endpoint.method) parameters = build_parameters(endpoint.caster, path_params, false) request_body_schema = build_request_body_schema( endpoint.caster, path_params ) request_body = request_body_schema && { content: { :"#{mime_type}" => { schema: request_body_schema } } } elsif endpoint.caster parameters = build_parameters(endpoint.caster, path_params, true) end request_body = if endpoint.caster && METHODS_WITH_BODY.include?(endpoint.method) request_body_schema = build_request_body_schema( endpoint.caster, path_params ) request_body_schema && { content: { :"#{mime_type}" => { schema: request_body_schema } } } end response_schema = { description: endpoint.response_description || '' } if endpoint.serializer response_schema[:content] = { :"#{mime_type}" => { schema: build_serializer_schema(endpoint.serializer) } } end responses = { endpoint.response_status => response_schema } endpoint.errors.each do |error| if responses.key?(error.status) responses[error.status][:description] += "\n- #{error.description}" next end responses[error.status] = { description: "- #{error.description}", } end method_schema = { responses: responses } method_schema[:summary] = endpoint.summary if endpoint.summary method_schema[:description] = endpoint.description if endpoint.description method_schema[:tags] = endpoint.sections if endpoint.sections method_schema[:parameters] = parameters if parameters method_schema[:requestBody] = request_body if request_body method_schema[:security] = [{ ApiKeyAuth: [] }] if endpoint.authenticate schema = {endpoint.method => method_schema} PathDto.new( path: path, schema: schema ) end