njuhel/php-swagger-to-md

View on GitHub
src/SwaggerValidator/Object/Operation.php

Summary

Maintainability
C
1 day
Test Coverage
<?php

/*
 * Copyright 2016 Nicolas JUHEL <swaggervalidator@nabbar.com>.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

namespace Swagger2md\SwaggerValidator\Object;

/**
 * Description of Operation
 *
 * @author Nicolas JUHEL<swaggervalidator@nabbar.com>
 * @version 1.0.0
 */
class Operation extends \SwaggerValidator\Object\Operation
{

    /**
     *
     * @param \SwaggerValidator\Common\Context $context
     * @param array $generalItems
     */
    public function markdown(\SwaggerValidator\Common\Context $context, $generalItems)
    {
        $method         = __FUNCTION__;
        $generalItems   = $this->getMethodGeneric($context, $method, $generalItems);
        $exampleRequest = $this->makeRequestExample($context, $generalItems);
        $reduce         = array();

        $tpl = explode('\\', trim(__CLASS__, "\\"));
        array_shift($tpl);
        array_shift($tpl);
        $tpl = implode('', array_map('ucfirst', $tpl));

        foreach ($generalItems[\SwaggerValidator\Common\FactorySwagger::KEY_PARAMETERS] as $listParams) {
            if (is_array($listParams) && !empty($listParams)) {
                $reduce = array_merge($reduce, array_values($listParams));
            }
        }
        $generalItems[\SwaggerValidator\Common\FactorySwagger::KEY_PARAMETERS] = $reduce;
        unset($reduce);

        $generalItems[\SwaggerValidator\Common\FactorySwagger::KEY_PARAMETERS] = array_map(function($val) {
            if (is_array($val) && array_key_exists(\SwaggerValidator\Common\FactorySwagger::KEY_TYPE, $val) && array_key_exists('model', $val)) {

                if (in_array($val[\SwaggerValidator\Common\FactorySwagger::KEY_TYPE], array(
                            \SwaggerValidator\Common\FactorySwagger::TYPE_OBJECT,
                            \SwaggerValidator\Common\FactorySwagger::TYPE_ARRAY,
                        ))) {
                    unset($val['model']);
                }
                elseif (empty($val[\SwaggerValidator\Common\FactorySwagger::KEY_EXAMPLE])) {
                    $val[\SwaggerValidator\Common\FactorySwagger::KEY_EXAMPLE] = $val['model'];
                    unset($val['model']);
                }
            }

            return $val;
        }, $generalItems[\SwaggerValidator\Common\FactorySwagger::KEY_PARAMETERS]);

        $parameters = \Swagger2md\Swagger2md::getInstance()->renderTemplate($tpl . 'Parameters', array(
            \SwaggerValidator\Common\FactorySwagger::KEY_PARAMETERS => \Swagger2md\Swagger2md::getInstance()->renderTable(null, null, \SwaggerValidator\Common\FactorySwagger::KEY_PARAMETERS, 'ColonsConfigOperation', 'TableOperationRequest', $generalItems, false),
            \SwaggerValidator\Common\FactorySwagger::KEY_CONSUMES   => $generalItems[\SwaggerValidator\Common\FactorySwagger::KEY_CONSUMES],
            'example'                                               => $exampleRequest,
            'suffix'                                                => \Swagger2md\Swagger2md::getInstance()->extractStored(),
        ));

        $templateVars = array(
            \SwaggerValidator\Common\FactorySwagger::KEY_PARAMETERS => $parameters,
            \SwaggerValidator\Common\FactorySwagger::KEY_RESPONSES  => null,
            \SwaggerValidator\Common\FactorySwagger::KEY_CONSUMES   => $generalItems[\SwaggerValidator\Common\FactorySwagger::KEY_CONSUMES],
            \SwaggerValidator\Common\FactorySwagger::KEY_PRODUCES   => $generalItems[\SwaggerValidator\Common\FactorySwagger::KEY_PRODUCES],
        );

        unset($parameters);

        foreach ($this->keys() as $key) {
            if (array_key_exists($key, $templateVars)) {
                continue;
            }

            if (is_object($this->$key) && method_exists($this->$key, $method)) {
                $templateVars[$key] = $this->$key->$method($context->setDataPath($paths), $generalItems);
            }
            elseif (!is_object($this->$key)) {
                $templateVars[$key] = $this->$key;
            }
        }

        return \Swagger2md\Swagger2md::getInstance()->renderTemplate($tpl, $templateVars);
    }

    protected function calculateLength($mixed)
    {
        if (is_array($mixed)) {
            return array_sum(array_map(array($this, 'calculateLength'), $mixed)) + count($mixed);
        }
        else {
            return strlen($mixed);
        }
    }

    protected function makeRequestExample(\SwaggerValidator\Common\Context $context, $operation)
    {
        $keyParameters = \SwaggerValidator\Common\FactorySwagger::KEY_PARAMETERS;
        $keyResponses  = \SwaggerValidator\Common\FactorySwagger::KEY_RESPONSES;
        $keyConsumes   = \SwaggerValidator\Common\FactorySwagger::KEY_CONSUMES;
        $keyProduces   = \SwaggerValidator\Common\FactorySwagger::KEY_PRODUCES;

        $keyLocationPath   = \SwaggerValidator\Common\FactorySwagger::LOCATION_PATH;
        $keyLocationQuery  = \SwaggerValidator\Common\FactorySwagger::LOCATION_QUERY;
        $keyLocationForm   = \SwaggerValidator\Common\FactorySwagger::LOCATION_FORM;
        $keyLocationHeader = \SwaggerValidator\Common\FactorySwagger::LOCATION_HEADER;
        $keyLocationBody   = \SwaggerValidator\Common\FactorySwagger::LOCATION_BODY;

        if (empty($operation[$keyParameters])) {
            $operation[$keyParameters] = array();
        }

        if (empty($operation[$keyConsumes])) {
            $operation[$keyConsumes] = array();
        }

        //\Swagger2md\Swagger2md::printOutVV('Request Example Base Parameters : ' . print_r($operation[$keyParameters], true));

        $templateVars = array(
        );

        $path        = $context->getBasePath() . $context->getRoutePath();
        $queryString = null;

        if (array_key_exists($keyLocationPath, $operation[$keyParameters])) {
            foreach ($operation[$keyParameters][$keyLocationPath] as $key => $value) {
                $path = str_replace('{' . $key . '}', urlencode($value['model']), $path);
            }
        }

        if (array_key_exists($keyLocationQuery, $operation[$keyParameters])) {
            $queryString = array();

            foreach ($operation[$keyParameters][$keyLocationQuery] as $key => $value) {
                if (!is_array($value['model']) && !is_object($value['model'])) {
                    $queryString[$key] = $value['model'];
                }
            }

            if (!empty($queryString)) {
                $queryString = '?' . preg_replace('/%5B[0-9]+%5D/simU', '%5B%5D', http_build_query($queryString, null, '&', PHP_QUERY_RFC3986));
            }
            else {
                $queryString = null;
            }
        }

        $templateVars['host']     = $context->getHost();
        $templateVars['scheme']   = $context->getScheme();
        $templateVars['path']     = $path . $queryString;
        $templateVars['method']   = $context->getMethod();
        $templateVars['headers']  = array();
        $templateVars['postForm'] = array();
        $templateVars['bodyRaw']  = null;

        if (array_key_exists($keyLocationHeader, $operation[$keyParameters])) {
            foreach ($operation[$keyParameters][$keyLocationHeader] as $name => $data) {
                $templateVars['headers'][] = $name . ': ' . $data['model'];
            }
        }

        if (array_key_exists($keyLocationForm, $operation[$keyParameters])) {
            $boundary = uniqid();
            foreach ($operation[$keyParameters][$keyLocationForm] as $name => $data) {
                $templateVars['postForm'][] = array(
                    'boundary' => '--' . $boundary,
                    'header'   => 'content-disposition: form-data; name="' . $name . '"',
                    'value'    => $data['model'],
                );
            }
            if (!empty($templateVars['postForm'])) {
                $templateVars['headers'][] = 'Content-Type: multipart/form-data, boundary=' . $boundary;
                $templateVars['headers'][] = 'Content-Length: ' . $this->calculateLength($templateVars['postForm']);
            }
        }

        if (array_key_exists($keyLocationBody, $operation[$keyParameters])) {
            $templateVars['bodyRaw']   = json_encode($operation[$keyParameters][$keyLocationBody][$keyLocationBody]['model'], JSON_NUMERIC_CHECK | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
            $templateVars['headers'][] = 'Content-Type: ' . array_shift($operation[$keyConsumes]);
            $templateVars['headers'][] = 'Content-Length: ' . strlen($templateVars['bodyRaw']);
        }

        \Swagger2md\Swagger2md::printOutV('Rendering this template : ExampleRequest');
        return \Swagger2md\Swagger2md::getInstance()->renderTemplate('ExampleRequest', $templateVars);
    }

}