public function actionSwagger() { $_resourcesPath = $this->_apiDomain . $this->_docPath . $this->_resourcesPath; $site = new FetchSwaggerCore(); if (!$site->setResource($_resourcesPath)) { $message = "Something went wrong!"; } if (!$site->setSchemas()) { $message = "Something went wrong!"; } $_resource = $site->getResource(); $_schemas = $site->getSchemas(); $swaggerJSON = new BuildSwaggerAnnotationsOnly(); $swaggerJSON->BuildJSON(); foreach ($_schemas as $schema) { // Build the swagger $swaggerJSON->BuildResource($_resource->apiVersion, $_resource->swaggerVersion, $this->_apiDomain, $schema->resource); // Make the Object //$swaggerJSON->BuildClass($schema->resource); foreach ($schema->apis as $api) { $swaggerJSON->BuildAPI($api->path, NULL); foreach ($api->operations as $operation) { $_notes = property_exists($operation, 'notes') ? $operation->notes : ""; $operation->responseClass = $operation->responseClass === 'ListView' ? $operation->responseClass . '_' . $schema->resource : $operation->responseClass; $swaggerJSON->BuildOperation($operation->httpMethod, $operation->summary, $_notes, $operation->responseClass, $operation->nickname); foreach ($operation->parameters as $parameter) { $swaggerJSON->BuildParameter($parameter->name, $parameter->description, $parameter->required, $parameter->dataType, $parameter->paramType); } $swaggerJSON->CloseOperation(); } $swaggerJSON->CloseAPI(); } $swaggerJSON->CloseResource(); foreach ($schema->models as $model) { // Here we had the problem of having the same name for all the resources. // Objects is used to describe a list of objects. So I renamed it here and in the type used below. if ($model->id === 'Objects') { $swaggerJSON->BuildModel($model->id . '_' . $schema->resource); } else { if ($model->id === 'ListView') { $swaggerJSON->BuildModel($model->id . '_' . $schema->resource); } else { $swaggerJSON->BuildModel($model->id); } } foreach ($model->properties as $name => $property) { if ($model->id === 'Objects') { $swaggerJSON->BuildProperty($name, $property->description, 'array', $schema->resource); } else { if ($property->type === 'Objects') { $swaggerJSON->BuildProperty($name, $property->description, $property->type . '_' . $schema->resource); } else { $swaggerJSON->BuildProperty($name, $property->description, $property->type); } } } $swaggerJSON->CloseModel(); } } $swaggerJSON->CloseJSON(); $file = new FileManipulation(); $file->setFilename(ucfirst($this->_core) . '/' . $this->_core . '.php'); $file->makeDirectory(ucfirst($this->_core) . '/'); $file->write_file($swaggerJSON->getSwaggerJSON()); return $this->redirect(['index']); }
/** * Publishes an API Swagger. * If publish is successful, the browser will be redirected to the 'swagger/index?url=$model->name' page. * @param integer $id * @return mixed */ public function actionPublish($id) { $api = $this->findModel($id); $api->published = 1; $api->save(); $apiName = preg_replace('/\\s+/', '', $api->name); $change = new NotifAPIHelper(); $followersNotified = $change->apiChangedPublished($id); $basePathPart = Url::canonical(); $basePathPart = explode('swagger', $basePathPart); $basePathPart = explode('hydra', $basePathPart[0]); $basePathPart = explode('raml', $basePathPart[0]); $basePathPart = explode('wadl', $basePathPart[0]); $basePath = $basePathPart[0] . $apiName . '/'; $objects = Objects::findAll(['api' => $id]); $swaggerJSON = new BuildSwaggerAnnotationsOnly(); $swaggerJSON->BuildJSON(); foreach ($objects as $object) { $object->methods = explode(',', $object->methods); // If this Resource has Methods if ($object->methods !== ['']) { $swaggerJSON->BuildResource($api->version, '1.2', $basePath, $object->name); foreach ($object->methods as $methodName) { // $methodParts[method_name, path] $tempMethodParts = explode(' ', $methodName); foreach ($tempMethodParts as $key => $methodPart) { if ($key === 0) { $methodParts[$key] = $methodPart; $methodParts[1] = ''; } else { $methodParts[1] .= $methodPart; } } $upper_method = strtoupper($methodParts[0]); // $pathParts = [object, ({id}, connection)] $pathParts = explode('/', $methodParts[1]); $numOfPathParts = count($pathParts); $swaggerJSON->BuildAPI($methodParts[1], NULL); $summary = ''; $nickname = ''; $returnType = ''; switch ($upper_method) { case 'GET': switch ($numOfPathParts) { case 1: $summary = 'Retrieve a list of ' . $pathParts[0]; $nickname = 'Get_all_' . $pathParts[0]; $returnType = 'list_' . $pathParts[0]; break; case 2: $summary = 'Retrieve one ' . $pathParts[0]; $nickname = 'Get_one_' . $pathParts[0]; $returnType = $pathParts[0]; break; case 3: $summary = 'Retrieve a list of ' . $pathParts[0] . ' ' . $pathParts[2]; $nickname = 'Get_all_' . $pathParts[2]; $returnType = 'list_' . $pathParts[2]; } break; case 'POST': switch ($numOfPathParts) { case 1: $summary = 'Create a new ' . $pathParts[0] . ' object'; $nickname = 'Post_one_' . $pathParts[0]; $returnType = $pathParts[0]; break; case 3: $summary = 'Create a new ' . $pathParts[2] . 'as a cconection of ' . $pathParts[0]; $nickname = 'Post_one_' . $pathParts[2]; $returnType = $pathParts[2] . '_post'; } break; case 'PUT': switch ($numOfPathParts) { case 2: $summary = 'Change a particular ' . $pathParts[0]; $nickname = 'Put_' . $pathParts[0]; $returnType = $pathParts[0]; } break; case 'DELETE': switch ($numOfPathParts) { case 1: $summary = 'Delete all ' . $pathParts[0]; $nickname = 'Delete_all_' . $pathParts[0]; $returnType = 'list_' . $pathParts[0]; break; case 2: $summary = 'Delete one ' . $pathParts[0]; $nickname = 'Delete_one_' . $pathParts[0]; $returnType = 'boolean'; break; case 3: $summary = 'Delete all ' . $pathParts[2] . ' connections of ' . $pathParts[0]; $nickname = 'Delete_all_' . $pathParts[0]; $returnType = 'boolean'; } break; } $swaggerJSON->BuildOperation($upper_method, $summary, '', $returnType, $nickname); if ($numOfPathParts > 1) { $swaggerJSON->BuildParameter('id', 'Primary key of resource', true, 'integer', 'body'); } if ($upper_method === 'POST' or $upper_method === 'PUT') { $swaggerJSON->BuildParameter($pathParts[0], 'Model of resource', true, $pathParts[0] . '_post_put', 'query'); } $swaggerJSON->CloseOperation(); $swaggerJSON->CloseAPI(); } $swaggerJSON->CloseResource(); // ALL THE DIFFERENT MODEL TYPES THAT NEED TO BE IMPLEMENTED // Meta // $pathParts[0] + Meta // $pathParts[0] . '_post_put' // $pathParts[2] . '_post' // 'list_' . $pathParts[0] // 'list_' . $pathParts[2] // THE MODELS FOR THE CONNECTIONS HAVE TO BE BUILT WHEN THAT PARTICULAR OBJECT COMES IN $swaggerJSON->BuildModel('Meta'); $swaggerJSON->BuildProperty('previous', 'Uri of the previous page relative to the current page settings.', 'string'); $swaggerJSON->BuildProperty('next', 'Uri of the next page relative to the current page settings.', 'string'); $swaggerJSON->BuildProperty('total_count', 'Total items count for all the collection.', 'integer'); $swaggerJSON->BuildProperty('offset', 'Specify the offset to start displaying element on a page.', 'integer'); $swaggerJSON->BuildProperty('limit', 'Specify the number of element to display per page.', 'integer'); $swaggerJSON->CloseModel(); $properties = Properties::findAll(['object' => $object->id]); // $pathParts[0] + Meta $swaggerJSON->BuildModel($object->name); foreach ($properties as $property) { if ($property->type === 'byte') { $swaggerJSON->BuildProperty($property->name, $property->description, 'string', '', 'byte'); } else { if ($property->type === 'date') { $swaggerJSON->BuildProperty($property->name, $property->description, 'string', '', 'date'); } else { if ($property->type === 'dateTime') { $swaggerJSON->BuildProperty($property->name, $property->description, 'string', '', 'date-format'); } else { if ($property->type === 'long') { $swaggerJSON->BuildProperty($property->name, $property->description, 'integer', '', 'int64'); } else { switch ($property->type) { case 'Integer': case 'String': $property->type = strtolower($property->type); } $swaggerJSON->BuildProperty($property->name, $property->description, $property->type); } } } } } $swaggerJSON->BuildProperty('meta', '', 'Meta'); $swaggerJSON->CloseModel(); // $pathParts[0] . '_post_put' $swaggerJSON->BuildModel($object->name . '_post_put'); foreach ($properties as $property) { if ($property->name !== 'id') { if ($property->type === 'byte') { $swaggerJSON->BuildProperty($property->name, $property->description, 'string', '', 'byte'); } else { if ($property->type === 'date') { $swaggerJSON->BuildProperty($property->name, $property->description, 'string', '', 'date'); } else { if ($property->type === 'dateTime') { $swaggerJSON->BuildProperty($property->name, $property->description, 'string', '', 'date-format'); } else { if ($property->type === 'long') { $swaggerJSON->BuildProperty($property->name, $property->description, 'integer', '', 'int64'); } else { switch ($property->type) { case 'Integer': case 'String': $property->type = strtolower($property->type); } $swaggerJSON->BuildProperty($property->name, $property->description, $property->type); } } } } } } $swaggerJSON->CloseModel(); // 'list_' . $pathParts[0] $swaggerJSON->BuildModel('Objects_' . $object->name); $swaggerJSON->BuildProperty($object->name, '', 'array', $object->name); $swaggerJSON->CloseModel(); $swaggerJSON->BuildModel('list_' . $object->name); $swaggerJSON->BuildProperty('meta', '', 'Meta'); $swaggerJSON->BuildProperty('objects', '', 'Objects_' . $object->name); $swaggerJSON->CloseModel(); } } $swaggerJSON->CloseJSON(); $file = new FileManipulation(); $file->setFilename(ucfirst($apiName) . '/' . $apiName . '.php'); $file->makeDirectory(ucfirst($apiName) . '/'); $file->write_file($swaggerJSON->getSwaggerJSON()); // Actually Publish the API $_file = Yii::getAlias('@apisDirectory') . '/' . ucfirst($apiName); $swagger = new Swagger($_file); $basePathPart = explode('/apis/', $basePathPart[0]); $writeFiles = new FileManipulation(); $writeFiles->setFilename(ucfirst($apiName) . '/api-docs.json'); $writeFiles->write_file($swagger->getResourceList(array('output' => 'json', 'basePath' => $basePathPart[0] . '/api-docs/' . ucfirst($apiName)))); foreach ($swagger->registry as $api_name => $api_resource) { $writeFiles->setFilename(ucfirst($apiName) . '/' . $api_name); $writeFiles->write_file($swagger->getResource($api_name, array('output' => 'json'))); } return $apiName; }