Giter Site home page Giter Site logo

lukismaster / vaportoopenapi Goto Github PK

View Code? Open in Web Editor NEW

This project forked from dankinsoid/vaportoopenapi

0.0 0.0 0.0 2.5 MB

OpenAPI specification generator for Vapor based Swift projects.

License: MIT License

JavaScript 0.16% Python 0.64% CSS 62.82% Swift 35.26% HTML 1.11%

vaportoopenapi's Introduction

VaporToOpenAPI

build

VaporToOpenAPI is a Swift library which can generate output compatible with OpenAPI version 3.0.1 from Vapor code. You can use generated file in Swagger UI.
The library is based on SwiftOpenAPI.

Usage

Base usage

  1. Set up a SwaggerUI page in your Vapor project downloading the dist folder and placing its content in the Public/Swagger directory.
  2. Describe all of your routes and register all controllers as described in Vapor docs. Add OpenAPI details to each route using the route.openAPI method.
  3. Add a route to return a SwaggerUI index.html. Or configure your middlewares to use 'index.html' as default page.
  4. Add a route to return an OpenAPIObject instance via the app.routes.openAPI method. Make sure the path of this route matches the swagger.json URL in your SwaggerUI page method.

All enums in your models must implement CaseIterable.

Advanced Usage

VaporToOpenAPI includes several advanced features that allow you to customize the generated OpenAPI documentation in various ways. Some of these features include:

  • openAPI: This method is used to add OpenAPI metadata to a single Vapor route. It takes a variety of parameters, such as a summary and description of the operation, request and response bodies, query parameters, and more.
    Here's an example of how you might use it to document a POST request:
routes.post("users") { req -> EventLoopFuture<User> in
    let user = try req.content.decode(User.self)
    return user.save(on: req.db).map { user }
}
.openAPI(
    summary: "Create User",
    description: "Create a new user with the provided data",
    body: .type(User.self),
    response: .type(User.self)
)
  • openAPI (on Routes): This method is used to generate an entire OpenAPI specification from your Vapor routes. It takes a variety of parameters, such as the title and description of your API, the available paths and operations, security requirements, and more.
// generate OpenAPI documentation
routes.get("Swagger", "swagger.json") { req in
  req.application.routes.openAPI(
    info: InfoObject(
      title: "Example API",
      description: "Example API description",
      version: "0.1.0",
    )
  )
}
.excludeFromOpenAPI()
  • response: This method is used to specify an additional response body for a Vapor route. It takes a variety of parameters, such as the status code, description, and response body type.
  • groupedOpenAPI: These methods are used to group Vapor routes together based on OpenAPI metadata, such as tags or security requirements.
    Here's an example of how you might use it to group routes with the same security requirements:
let routes = app.routes.groupedOpenAPI(auth: .apiKey())
  • groupedOpenAPIResponse: These methods are used to group Vapor routes together based on common response.

  • groupedOpenAPI(server:): These methods are used to group Vapor routes together based on common servers.

  • excludeFromOpenAPI: This method is used to exclude a Vapor route from the generated OpenAPI specification.

  • openAPINoAuth: This method is used to specify that an operation does not require any authentication.

  • openAPI(custom:): These methods are used to customize a specific aspect of the OpenAPI metadata for a Vapor route, such as a specific security scheme or callback.

  • operationID and operationRef: These properties are used to generate unique identifiers for OpenAPI operations and to create references to them in other parts of the specification.

Customizing OpenAPI schemas and parameters

You can customize OpenAPI schemas and parameters result by implementing OpenAPIDescriptable and OpenAPIType protocols.

  1. OpenAPIDescriptable protocol allows you to provide a custom description for the type and its properties. @OpenAPIAutoDescriptable macro implements this protocol with your comments.
import SwiftOpenAPI

@OpenAPIDescriptable
/// Login request body.
struct LoginBody: Codable {
    
    /// Username string.
    let username: String
    /// Password string. Encoded.
    let password: String
}

Manually:

struct LoginBody: Codable, OpenAPIDescriptable {
    
    let username: String
    let password: String
    
    static var openAPIDescription: OpenAPIDescriptionType? {
        OpenAPIDescription<CodingKeys>("Login request body.")
            .add(for: .username, "Username string.")
            .add(for: .password, "Password string. Encoded.")
    }
}
  1. OpenAPIType protocol allows you to provide a custom schema for the type.
import SwiftOpenAPI

struct Color: Codable, OpenAPIType {
    
    static var openAPISchema: SchemaObject {
        .string(format: "hex", description: "Color in hex format")
    }
}

Links

Links are one of the new features of OpenAPI 3.0. Using links, you can describe how various values returned by one operation can be used as input for other operations. To create a Link:

  1. create LinkKey type identifying some reusable parameter.
  2. specify the type in each route using the related parameter
enum PetID: LinkKey {
}
route.get("pet", use: getPet).openAPI(
  links: [
    Link(\Pet.id, in: .response): PetID.self
  ]
)

route.post("pet", ":petID", use: renamePer).openAPI(
  links: [
    Link("petID", in: .path): PetID.self
  ]
)

Short example

1. SwaggerUI page

Change url in swagger-initializer.js

window.onload = function() {
  //<editor-fold desc="Changeable Configuration Block">

  // the following lines will be replaced by docker/configurator, when it runs in a docker-container
  var jsonURL = document.location.origin + "/Swagger/swagger.json";
  window.ui = SwaggerUIBundle({
    url: jsonURL,
    dom_id: '#swagger-ui',
    deepLinking: true,
    presets: [
      SwaggerUIBundle.presets.apis,
      SwaggerUIStandalonePreset
    ],
    plugins: [
      SwaggerUIBundle.plugins.DownloadUrl
    ],
    layout: "StandaloneLayout"
  });

  //</editor-fold>
};

2. Routes

routes = routes
  .groupedOpenAPI(auth: .basic)
  .groupedOpenAPIResponse(
    statusCode: 400,
    body: .type(of: ErrorResponse())
  )

routes.post("login") { req in
  try await loginService.makeLoginRequest(
    query: req.query.decode(LoginQuery.self),
    content: req.content.decode(LoginRequestBody.self)
  )
}
.openAPI(
  summary: "Login",
  description: "Login request",
  query: .type(LoginQuery.self),
  headers: ["X-SOME_VALUE": .string],
  body: .type(LoginRequestBody.self),
  response: .type(LoginResponse.self),
  auth: .apiKey()
)

3. SwaggerUI page routing

FileMiddleware(publicDirectory: app.directory.publicDirectory, defaultFile: "index.html")

4. OpenAPIObject route

// generate OpenAPI documentation
routes.get("Swagger", "swagger.json") { req in
  req.application.routes.openAPI(
    info: InfoObject(
      title: "Example API",
      description: "Example API description",
      version: "0.1.0",
    )
  )
}
.excludeFromOpenAPI()

Installation

  1. Swift Package Manager

Create a Package.swift file.

// swift-tools-version:5.9
import PackageDescription

let package = Package(
  name: "SomeProject",
  dependencies: [
    .package(url: "https://github.com/dankinsoid/VaporToOpenAPI.git", from: "4.5.0")
  ],
  targets: [
    .target(name: "SomeProject", dependencies: ["VaporToOpenAPI"])
  ]
)
$ swift build

Contributing

Contributions to VaporToOpenAPI are welcome! If you find a bug or have a feature request, please raise an issue or submit

Author

dankinsoid, [email protected]

License

VaporToOpenAPI is available under the MIT license. See the LICENSE file for more info.

vaportoopenapi's People

Contributors

dankinsoid avatar robertomachorro avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.