Repository: usergrid-qakka
Updated Branches:
  refs/heads/master 6426fde9a -> 2513d0a69


Add Swagger annotations to Queue API


Project: http://git-wip-us.apache.org/repos/asf/usergrid-qakka/repo
Commit: http://git-wip-us.apache.org/repos/asf/usergrid-qakka/commit/2513d0a6
Tree: http://git-wip-us.apache.org/repos/asf/usergrid-qakka/tree/2513d0a6
Diff: http://git-wip-us.apache.org/repos/asf/usergrid-qakka/diff/2513d0a6

Branch: refs/heads/master
Commit: 2513d0a6986b71267a75f95b3f731949d2d36ae2
Parents: 6426fde
Author: Dave Johnson <snoopd...@apache.org>
Authored: Wed Nov 30 15:57:33 2016 -0500
Committer: Dave Johnson <snoopd...@apache.org>
Committed: Wed Nov 30 15:57:33 2016 -0500

----------------------------------------------------------------------
 pom.xml                                         |  42 +++++-
 .../persistence/qakka/api/ApiDefinition.java    |  32 +++++
 .../persistence/qakka/api/ApiResponse.java      |   7 +
 .../persistence/qakka/api/QueueResource.java    | 131 +++++++++++++++----
 .../persistence/qakka/api/StatusResource.java   |   6 +-
 templates/markdown.hbs                          | 105 +++++++++++++++
 templates/operation.hbs                         |  73 +++++++++++
 templates/security.hbs                          |  88 +++++++++++++
 templates/strapdown.html.hbs                    |  10 ++
 9 files changed, 467 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/usergrid-qakka/blob/2513d0a6/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 008a2d7..b2807f6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -62,7 +62,7 @@
                         <forkCount>0</forkCount>
                         <threadCount>0</threadCount>
                         <argLine>
-                            -Xms2G -Xmx4G 
-Dlog4j.configuration=file:${basedir}/src/test/resources/log4j.properties
+                        -Xms2G -Xmx4G 
-Dlog4j.configuration=file:${basedir}/src/test/resources/log4j.properties
                         </argLine>
                     </configuration>
                 </plugin>
@@ -90,6 +90,40 @@
                 </configuration>
             </plugin>
 
+            <plugin>
+                <groupId>com.github.kongchen</groupId>
+                <artifactId>swagger-maven-plugin</artifactId>
+                <version>3.1.3</version>
+                <configuration>
+                    <apiSources>
+                        <apiSource>
+                            <springmvc>false</springmvc>
+                            
<locations>org.apache.usergrid.persistence.qakka.api</locations>
+                            <info>
+                                <title>Qakka</title>
+                                <version>v1</version>
+                                <description>API for Qakka Queue 
System</description>
+                                <license>
+                                    
<url>http://www.apache.org/licenses/LICENSE-2.0.html</url>
+                                    <name>Apache 2.0</name>
+                                </license>
+                            </info>
+                            
<templatePath>${basedir}/templates/strapdown.html.hbs</templatePath>
+                            
<outputPath>${basedir}/target/swagger-docs/document.html</outputPath>
+                            
<swaggerDirectory>${basedir}/target/swagger-docs</swaggerDirectory>
+                        </apiSource>
+                    </apiSources>
+                </configuration>
+                <executions>
+                    <execution>
+                        <phase>compile</phase>
+                        <goals>
+                            <goal>generate</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            
         </plugins>
 
         <testResources>
@@ -185,6 +219,12 @@
             <artifactId>jersey-test-framework-provider-jetty</artifactId>
             <version>${jersey.version}</version>
         </dependency>
+
+        <dependency>
+            <groupId>io.swagger</groupId>
+            <artifactId>swagger-jersey2-jaxrs</artifactId>
+            <version>1.5.0</version>
+        </dependency>
         
     </dependencies>
 

http://git-wip-us.apache.org/repos/asf/usergrid-qakka/blob/2513d0a6/src/main/java/org/apache/usergrid/persistence/qakka/api/ApiDefinition.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/usergrid/persistence/qakka/api/ApiDefinition.java 
b/src/main/java/org/apache/usergrid/persistence/qakka/api/ApiDefinition.java
new file mode 100644
index 0000000..68a0d79
--- /dev/null
+++ b/src/main/java/org/apache/usergrid/persistence/qakka/api/ApiDefinition.java
@@ -0,0 +1,32 @@
+package org.apache.usergrid.persistence.qakka.api;
+
+
+import io.swagger.annotations.*;
+
+@SwaggerDefinition(
+        info = @Info(
+                description = "Queue Management and Messages",
+                version = "v1.0",
+                title = "Apache Usergrid - Qakka API",
+                contact = @Contact(
+                        name = "Apache Usergrid project",
+                        email = "d...@usergrid.apache.org",
+                        url = "http://usergrid.apache.org";
+                ),
+                license = @License(
+                        name = "Apache 2.0",
+                        url = "http://www.apache.org/licenses/LICENSE-2.0";
+                )
+        ),
+        consumes = {"application/json", "application/xml"},
+        produces = {"application/json", "application/xml"},
+        schemes = {SwaggerDefinition.Scheme.HTTP, 
SwaggerDefinition.Scheme.HTTPS},
+        tags = {
+                @Tag(name = "Private", description = "Tag used to denote 
operations as private")
+        },
+        externalDocs = @ExternalDocs(value = "README", url = 
"https://github.com/apache/usergrid-qakka";)
+)
+/**
+ * Created by Dave Johnson (snoopd...@apache.org) on 11/30/16.
+ */
+public interface ApiDefinition {}

http://git-wip-us.apache.org/repos/asf/usergrid-qakka/blob/2513d0a6/src/main/java/org/apache/usergrid/persistence/qakka/api/ApiResponse.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/usergrid/persistence/qakka/api/ApiResponse.java 
b/src/main/java/org/apache/usergrid/persistence/qakka/api/ApiResponse.java
index c2c0910..0dffc8a 100644
--- a/src/main/java/org/apache/usergrid/persistence/qakka/api/ApiResponse.java
+++ b/src/main/java/org/apache/usergrid/persistence/qakka/api/ApiResponse.java
@@ -19,6 +19,8 @@
 
 package org.apache.usergrid.persistence.qakka.api;
 
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import org.apache.usergrid.persistence.qakka.core.Queue;
 import org.apache.usergrid.persistence.qakka.core.QueueMessage;
 
@@ -26,6 +28,7 @@ import javax.xml.bind.annotation.XmlRootElement;
 import java.util.Collection;
 
 
+@ApiModel(value="ApiResponse", description="Response returned by most Queue 
API calls.")
 @XmlRootElement
 public class ApiResponse {
 
@@ -34,6 +37,7 @@ public class ApiResponse {
     private Collection<Queue> queues;
     private Collection<QueueMessage> queueMessages;
 
+    @ApiModelProperty(value = "Queues returned but the call, or empty if not 
applicable.")
     public Collection<Queue> getQueues() {
         return queues;
     }
@@ -42,6 +46,7 @@ public class ApiResponse {
         this.queues = queues;
     }
 
+    @ApiModelProperty(value = "Queues Messages returned by the call, or empty 
if not applicable.")
     public Collection<QueueMessage> getQueueMessages() {
         return queueMessages;
     }
@@ -50,6 +55,7 @@ public class ApiResponse {
         this.queueMessages = queueMessages;
     }
 
+    @ApiModelProperty(value = "Count of Queues or QueueMessages returned by 
the call.")
     public Integer getCount() {
         return count;
     }
@@ -58,6 +64,7 @@ public class ApiResponse {
         this.count = count;
     }
 
+    @ApiModelProperty(value = "Informative message intended for client.")
     public String getMessage() {
         return message;
     }

http://git-wip-us.apache.org/repos/asf/usergrid-qakka/blob/2513d0a6/src/main/java/org/apache/usergrid/persistence/qakka/api/QueueResource.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/usergrid/persistence/qakka/api/QueueResource.java 
b/src/main/java/org/apache/usergrid/persistence/qakka/api/QueueResource.java
index 7d5599a..38fbf76 100644
--- a/src/main/java/org/apache/usergrid/persistence/qakka/api/QueueResource.java
+++ b/src/main/java/org/apache/usergrid/persistence/qakka/api/QueueResource.java
@@ -22,6 +22,10 @@ package org.apache.usergrid.persistence.qakka.api;
 import com.fasterxml.jackson.databind.util.ByteBufferBackedInputStream;
 import com.google.common.base.Preconditions;
 import com.google.common.io.ByteStreams;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponses;
 import org.apache.usergrid.persistence.qakka.URIStrategy;
 import org.apache.usergrid.persistence.qakka.core.*;
 import org.slf4j.Logger;
@@ -38,6 +42,7 @@ import java.util.List;
 import java.util.UUID;
 
 
+@Api(value="/queues", description = "Queue management, send, get and ack.")
 @Path("queues")
 public class QueueResource {
     private static final Logger logger = LoggerFactory.getLogger( 
QueueResource.class );
@@ -64,6 +69,11 @@ public class QueueResource {
     }
 
 
+    @ApiOperation(value = "Create new queue.", response=ApiResponse.class)
+    @ApiResponses(value = { 
+        @io.swagger.annotations.ApiResponse(code = 400, 
+                message = "No Queue object posted, or name field is missing"),
+    })
     @POST
     @Consumes({MediaType.APPLICATION_JSON})
     @Produces({MediaType.APPLICATION_JSON})
@@ -80,6 +90,11 @@ public class QueueResource {
     }
 
 
+    @ApiOperation(value = "Update Queue configuration.", 
response=ApiResponse.class)
+    @ApiResponses(value = {
+            @io.swagger.annotations.ApiResponse(code = 400,
+                    message = "No Queue object posted, or name field is 
missing"),
+    })
     @PUT
     @Path( "{queueName}/config" )
     @Consumes({MediaType.APPLICATION_JSON})
@@ -98,6 +113,11 @@ public class QueueResource {
     }
 
 
+    @ApiOperation(value = "Delete Queue.", response=ApiResponse.class)
+    @ApiResponses(value = {
+            @io.swagger.annotations.ApiResponse(code = 400,
+                    message = "Queue name or confirm flag missing."),
+    })
     @DELETE
     @Path( "{queueName}" )
     @Produces({MediaType.APPLICATION_JSON})
@@ -119,10 +139,16 @@ public class QueueResource {
     }
 
 
+    @ApiOperation(value = "Get Queue config.", response=ApiResponse.class)
+    @ApiResponses(value = {
+            @io.swagger.annotations.ApiResponse(code = 400,
+                    message = "Queue name or confirm flag missing."),
+    })
     @GET
     @Path( "{queueName}/config" )
     @Produces({MediaType.APPLICATION_JSON})
-    public Response getQueueConfig( @PathParam("queueName") String queueName) {
+    public Response getQueueConfig(
+            @ApiParam(value = "Name of Queue", required = true) 
@PathParam("queueName") String queueName) {
 
         Preconditions.checkArgument(!QakkaUtils.isNullOrEmpty(queueName), 
"Queue name is required");
 
@@ -136,25 +162,27 @@ public class QueueResource {
     }
 
 
+    @ApiOperation(value = "Get list of all Queues.", 
response=ApiResponse.class)
     @GET
     @Produces({MediaType.APPLICATION_JSON})
     public List<String> getListOfQueues() {
 
         // TODO: create design to handle large number of queues, e.g. paging 
and/or hierarchy of queues
-
         // TODO: create design to support multi-tenant usage, authentication, 
etc.
-
         return queueManager.getListOfQueues();
     }
 
 
-    @GET
-    @Path( "{queueName}/stats" )
-    @Produces({MediaType.APPLICATION_JSON})
-    public Response getQueueStats( @PathParam("queueName") String queueName) 
throws Exception {
-        // TODO: implement GET /queues/{queueName}/stats
-        throw new UnsupportedOperationException();
-    }
+//    @GET
+//    @Path( "{queueName}/stats" )
+//    @Produces({MediaType.APPLICATION_JSON})
+//    public Response getQueueStats(
+//            @ApiParam(value = "Name of Queue", required = true) 
@PathParam("queueName") String queueName) 
+//        throws Exception {
+//        
+//        // TODO: implement GET /queues/{queueName}/stats
+//        throw new UnsupportedOperationException();
+//    }
 
 
     Long convertDelayParameter(String delayParam) {
@@ -207,16 +235,25 @@ public class QueueResource {
      * @param expirationParam   Time (ms) after which message will expire (not 
yet supported)
      * @param messageBody       JSON payload in string form
      */
+    @ApiOperation(value = "Send Queue Message with a JSON payload.", 
response=ApiResponse.class) 
     @POST
     @Path( "{queueName}/messages" )
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
     public Response sendMessageJson(
-            @PathParam("queueName")                     String queueName,
-            @QueryParam("regions" )   @DefaultValue("") String regionsParam,
+            
+            @ApiParam(value = "Name of Queue", required = true)
+                @PathParam("queueName") String queueName,
+
+            @ApiParam(value = "Regions to which message is to be sent", 
required = false)
+                @QueryParam("regions" ) @DefaultValue("") String regionsParam,
+
             @QueryParam("delay")      @DefaultValue("") String delayParam,
             @QueryParam("expiration") @DefaultValue("") String expirationParam,
-                                                        String messageBody) 
throws Exception {
+            
+            @ApiParam(value = "Data to be send with Queue Message", required = 
true)                                               String messageBody) 
+            
+            throws Exception {
 
         return sendMessage( queueName, regionsParam, delayParam, 
expirationParam,
                 MediaType.APPLICATION_JSON, ByteBuffer.wrap( 
messageBody.getBytes() ) );
@@ -233,18 +270,30 @@ public class QueueResource {
      * @param actualContentType Content type of messageBody data (if not 
application/octet-stream)
      * @param messageBody       Binary data that is the payload of the queue 
message
      */
+    @ApiOperation(value = "Send Queue Message with a binary data (blob) 
payload.", response=ApiResponse.class) 
     @POST
     @Path( "{queueName}/messages" )
     @Consumes(MediaType.APPLICATION_OCTET_STREAM)
     @Produces(MediaType.APPLICATION_JSON)
     public Response sendMessageBinary(
-            @PathParam("queueName")                     String queueName,
-            @QueryParam("regions" )   @DefaultValue("") String regionsParam,
-            @QueryParam("delay")      @DefaultValue("") String delayParam,
+            
+            @ApiParam(value = "Name of Queue", required = true) 
+                @PathParam("queueName") String queueName,
+            
+            @ApiParam(value = "Regions to which message is to be sent", 
required = false)    
+                @QueryParam("regions" ) @DefaultValue("") String regionsParam,
+            
+            @QueryParam("delay") @DefaultValue("") String delayParam,
             @QueryParam("expiration") @DefaultValue("") String expirationParam,
-            @QueryParam("contentType")                  String 
actualContentType,
-                                                        byte[] messageBody) 
throws Exception {
-
+            
+            @ApiParam(value = "Content type of the data to be sent with Queue 
Message", required = true) 
+                @QueryParam("contentType") String actualContentType,
+            
+            @ApiParam(value = "Data to be send with Queue Message", required = 
true) 
+                byte[] messageBody) 
+            
+            throws Exception { 
+        
         String contentType = actualContentType != null ? actualContentType : 
MediaType.APPLICATION_OCTET_STREAM;
 
         return sendMessage( queueName, regionsParam, delayParam, 
expirationParam,
@@ -286,11 +335,22 @@ public class QueueResource {
     }
 
 
+    @ApiOperation(value = "Get next Queue Messages from a Queue", 
response=ApiResponse.class)
+    @ApiResponses(value = {
+            @io.swagger.annotations.ApiResponse(code = 400, message = "Invalid 
count parameter"),
+    })
     @GET
     @Path( "{queueName}/messages" )
     @Produces({MediaType.APPLICATION_JSON})
-    public Response getNextMessages( @PathParam("queueName") String queueName,
-                                     @QueryParam("count") @DefaultValue("1") 
String countParam) throws Exception {
+    public Response getNextMessages(
+            
+            @ApiParam(value = "Name of Queue", required = false)
+                @PathParam("queueName") String queueName,
+            
+            @ApiParam(value = "Number of messages to get", required = false)
+                @QueryParam("count") @DefaultValue("1") String countParam) 
+            
+            throws Exception {
 
         Preconditions.checkArgument( !QakkaUtils.isNullOrEmpty( queueName ), 
"Queue name is required" );
 
@@ -320,11 +380,23 @@ public class QueueResource {
     }
 
 
+    @ApiOperation(value = "Acknowledge that Queue Message has been 
processed.", response=ApiResponse.class)
+    @ApiResponses(value = {
+            @io.swagger.annotations.ApiResponse(code = 400, 
+                    message = "Queue Message ID invalid, or message not 
in-flight"),
+    })
     @DELETE
     @Path( "{queueName}/messages/{queueMessageId}" )
     @Produces({MediaType.APPLICATION_JSON})
-    public Response ackMessage( @PathParam("queueName") String queueName,
-                                @PathParam("queueMessageId") String 
queueMessageId) throws Exception {
+    public Response ackMessage(
+            
+            @ApiParam(value = "Name of Queue", required = true)
+                @PathParam("queueName") String queueName,
+            
+            @ApiParam(value = "ID of Queue Message to be acknowledged", 
required = true)
+                @PathParam("queueMessageId") String queueMessageId) 
+            
+            throws Exception {
 
         Preconditions.checkArgument( !QakkaUtils.isNullOrEmpty( queueName ), 
"Queue name is required" );
 
@@ -341,11 +413,20 @@ public class QueueResource {
     }
 
 
+    @ApiOperation(value = "Get data associated with a Queue Message.", 
response=ApiResponse.class)
+    @ApiResponses(value = {
+            @io.swagger.annotations.ApiResponse(code = 400, message = "Message 
ID invalid"),
+            @io.swagger.annotations.ApiResponse(code = 404, message = "Queue 
Message or data not found")
+    })
     @GET
     @Path( "{queueName}/data/{queueMessageId}" )
     public Response getMessageData(
-            @PathParam("queueName") String queueName,
-            @PathParam("queueMessageId") String queueMessageIdParam ) {
+            
+            @ApiParam(value = "Name of Queue", required = true)
+                @PathParam("queueName") String queueName,
+
+            @ApiParam(value = "ID of Queue Message for which data is to be 
returned", required = true)
+                @PathParam("queueMessageId") String queueMessageIdParam ) {
 
         Preconditions.checkArgument(!QakkaUtils.isNullOrEmpty(queueName), 
"Queue name is required");
 

http://git-wip-us.apache.org/repos/asf/usergrid-qakka/blob/2513d0a6/src/main/java/org/apache/usergrid/persistence/qakka/api/StatusResource.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/usergrid/persistence/qakka/api/StatusResource.java 
b/src/main/java/org/apache/usergrid/persistence/qakka/api/StatusResource.java
index 3067a5d..46a3476 100644
--- 
a/src/main/java/org/apache/usergrid/persistence/qakka/api/StatusResource.java
+++ 
b/src/main/java/org/apache/usergrid/persistence/qakka/api/StatusResource.java
@@ -21,6 +21,8 @@ package org.apache.usergrid.persistence.qakka.api;
 
 import com.codahale.metrics.Timer;
 import com.google.inject.servlet.RequestScoped;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import org.apache.usergrid.persistence.qakka.App;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -37,6 +39,7 @@ import java.util.HashMap;
 import java.util.SortedSet;
 
 
+@Api(value="/status", description = "Status end-point.")
 @Path("status")
 @RequestScoped
 public class StatusResource {
@@ -50,7 +53,8 @@ public class StatusResource {
         logger.info( "Constructed" );
     }
 
-
+    
+    @ApiOperation(value = "Status of webapp.")
     @GET
     @Produces( MediaType.APPLICATION_JSON )
     public Object status() {

http://git-wip-us.apache.org/repos/asf/usergrid-qakka/blob/2513d0a6/templates/markdown.hbs
----------------------------------------------------------------------
diff --git a/templates/markdown.hbs b/templates/markdown.hbs
new file mode 100644
index 0000000..0d9dd53
--- /dev/null
+++ b/templates/markdown.hbs
@@ -0,0 +1,105 @@
+#{{#info}}{{title}}
+
+
+{{description}}
+
+{{#contact}}
+[**Contact the developer**](mailto:{{email}})
+{{/contact}}
+
+**Version** {{version}}
+
+{{#license}}[**{{name}}**]({{url}}){{/license}}
+
+{{/info}}
+
+{{#if consumes}}**Consumes:** {{join consumes ", "}}{{/if}}
+
+{{#if produces}}**Produces:** {{join produces ", "}}{{/if}}
+
+{{#if securityDefinitions}}
+# Security Definitions
+{{/if}}
+{{> security}}
+
+# APIs
+
+{{#each paths}}
+## {{@key}}
+{{#this}}
+{{#get}}
+### GET
+{{> operation}}
+{{/get}}
+
+{{#put}}
+### PUT
+{{> operation}}
+{{/put}}
+
+{{#post}}
+### POST
+
+{{> operation}}
+
+{{/post}}
+
+{{#delete}}
+### DELETE
+{{> operation}}
+{{/delete}}
+
+{{#option}}
+### OPTION
+{{> operation}}
+{{/option}}
+
+{{#patch}}
+### PATCH
+{{> operation}}
+{{/patch}}
+
+{{#head}}
+### HEAD
+{{> operation}}
+{{/head}}
+
+{{/this}}
+{{/each}}
+
+# Definitions
+{{#each definitions}}
+## <a name="/definitions/{{key}}">{{@key}}</a>
+
+<p> {{description}} </p>
+
+<table border="1">
+    <tr>
+        <th>name</th>
+        <th>type</th>
+        <th>required</th>
+        <th>description</th>
+        <th>example</th>
+    </tr>
+    {{#each this.properties}}
+        <tr>
+            <td>{{@key}}</td>
+            <td>
+                {{#ifeq type "array"}}
+                {{#items.$ref}}
+                    {{type}}[<a href="{{items.$ref}}">{{basename 
items.$ref}}</a>]
+                {{/items.$ref}}
+                {{^items.$ref}}{{type}}[{{items.type}}]{{/items.$ref}}
+                {{else}}
+                    {{#$ref}}<a href="{{$ref}}">{{basename $ref}}</a>{{/$ref}}
+                    {{^$ref}}{{type}}{{#format}} 
({{format}}){{/format}}{{/$ref}}
+                {{/ifeq}}
+            </td>
+            
<td>{{#required}}required{{/required}}{{^required}}optional{{/required}}</td>
+            
<td>{{#description}}{{{description}}}{{/description}}{{^description}}-{{/description}}</td>
+            <td>{{example}}</td>
+        </tr>
+    {{/each}}
+</table>
+{{/each}}
+

http://git-wip-us.apache.org/repos/asf/usergrid-qakka/blob/2513d0a6/templates/operation.hbs
----------------------------------------------------------------------
diff --git a/templates/operation.hbs b/templates/operation.hbs
new file mode 100644
index 0000000..a581961
--- /dev/null
+++ b/templates/operation.hbs
@@ -0,0 +1,73 @@
+{{#deprecated}}-deprecated-{{/deprecated}}
+<a id="{{operationId}}">{{summary}}</a>
+
+{{description}}
+
+{{#if externalDocs.url}}{{externalDocs.description}}. [See external documents 
for more details]({{externalDocs.url}})
+{{/if}}
+
+{{#if security}}
+#### Security
+{{/if}}
+
+{{#security}}
+{{#each this}}
+* {{@key}}
+{{#this}}   * {{this}}
+{{/this}}
+{{/each}}
+{{/security}}
+
+#### Request
+
+{{#if consumes}}
+**Content-Type: ** {{join consumes ", "}}{{/if}}
+
+##### Parameters
+{{#if parameters}}
+<table border="1">
+    <tr>
+        <th>Name</th>
+        <th>Located in</th>
+        <th>Required</th>
+        <th>Description</th>
+        <th>Default</th>
+        <th>Schema</th>
+    </tr>
+{{/if}}
+
+{{#parameters}}
+<tr>
+    <th>{{name}}</th>
+    <td>{{in}}</td>
+    <td>{{#if required}}yes{{else}}no{{/if}}</td>
+    <td>{{description}}{{#if pattern}} (**Pattern**: `{{pattern}}`){{/if}}</td>
+    <td> - </td>
+{{#ifeq in "body"}}
+    <td>
+    {{#ifeq schema.type "array"}}Array[<a 
href="{{schema.items.$ref}}">{{basename schema.items.$ref}}</a>]{{/ifeq}}
+    {{#schema.$ref}}<a href="{{schema.$ref}}">{{basename schema.$ref}}</a> 
{{/schema.$ref}}
+    </td>
+{{else}}
+    {{#ifeq type "array"}}
+            <td>Array[{{items.type}}] ({{collectionFormat}})</td>
+    {{else}}
+            <td>{{type}} {{#format}}({{format}}){{/format}}</td>
+    {{/ifeq}}
+{{/ifeq}}
+</tr>
+{{/parameters}}
+{{#if parameters}}
+</table>
+{{/if}}
+
+
+#### Response
+
+{{#if produces}}**Content-Type: ** {{join produces ", "}}{{/if}}
+
+
+| Status Code | Reason      | Response Model |
+|-------------|-------------|----------------|
+{{#each responses}}| {{@key}}    | {{description}} | {{#schema.$ref}}<a 
href="{{schema.$ref}}">{{basename schema.$ref}}</a>{{/schema.$ref}}{{#ifeq 
schema.type "array"}}Array[<a href="{{schema.items.$ref}}">{{basename 
schema.items.$ref}}</a>]{{/ifeq}}{{^schema}} - {{/schema}}|
+{{/each}}

http://git-wip-us.apache.org/repos/asf/usergrid-qakka/blob/2513d0a6/templates/security.hbs
----------------------------------------------------------------------
diff --git a/templates/security.hbs b/templates/security.hbs
new file mode 100644
index 0000000..04f86e8
--- /dev/null
+++ b/templates/security.hbs
@@ -0,0 +1,88 @@
+{{#each securityDefinitions}}
+### {{@key}}
+{{#this}}
+{{#ifeq type "oauth2"}}
+<table>
+    <tr>
+        <th>type</th>
+        <th colspan="2">{{type}}</th>
+    </tr>
+{{#if description}}
+        <tr>
+            <th>description</th>
+            <th colspan="2">{{description}}</th>
+        </tr>
+{{/if}}
+{{#if authorizationUrl}}
+        <tr>
+            <th>authorizationUrl</th>
+            <th colspan="2">{{authorizationUrl}}</th>
+        </tr>
+{{/if}}
+{{#if flow}}
+        <tr>
+            <th>flow</th>
+            <th colspan="2">{{flow}}</th>
+        </tr>
+{{/if}}
+{{#if tokenUrl}}
+        <tr>
+            <th>tokenUrl</th>
+            <th colspan="2">{{tokenUrl}}</th>
+        </tr>
+{{/if}}
+{{#if scopes}}
+    <tr>
+        <td rowspan="3">scopes</td>
+{{#each scopes}}
+            <td>{{@key}}</td>
+            <td>{{this}}</td>
+        </tr>
+        <tr>
+{{/each}}
+    </tr>
+{{/if}}
+</table>
+{{/ifeq}}
+{{#ifeq type "apiKey"}}
+<table>
+    <tr>
+        <th>type</th>
+        <th colspan="2">{{type}}</th>
+    </tr>
+{{#if description}}
+        <tr>
+            <th>description</th>
+            <th colspan="2">{{description}}</th>
+        </tr>
+{{/if}}
+{{#if name}}
+        <tr>
+            <th>name</th>
+            <th colspan="2">{{name}}</th>
+        </tr>
+{{/if}}
+{{#if in}}
+        <tr>
+            <th>in</th>
+            <th colspan="2">{{in}}</th>
+        </tr>
+{{/if}}
+</table>
+{{/ifeq}}
+{{#ifeq type "basic"}}
+<table>
+    <tr>
+        <th>type</th>
+        <th colspan="2">{{type}}</th>
+    </tr>
+{{#if description}}
+        <tr>
+            <th>description</th>
+            <th colspan="2">{{description}}</th>
+        </tr>
+{{/if}}
+</table>
+{{/ifeq}}
+{{/this}}
+{{/each}}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid-qakka/blob/2513d0a6/templates/strapdown.html.hbs
----------------------------------------------------------------------
diff --git a/templates/strapdown.html.hbs b/templates/strapdown.html.hbs
new file mode 100644
index 0000000..ec02669
--- /dev/null
+++ b/templates/strapdown.html.hbs
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html>
+<title>API Document</title>
+
+<xmp theme="united" style="display:none;">
+{{>markdown}}
+</xmp>
+
+<script src="http://strapdownjs.com/v/0.2/strapdown.js";></script>
+</html>
\ No newline at end of file

Reply via email to