Files
kompendium/docs/plugins/notarized_resources.md
2022-10-29 08:14:32 -04:00

1.9 KiB

The Ktor Resources API allows users to define their routes in a type-safe manner.

You can read more about it here.

Kompendium supports Ktor-Resources through an ancillary module kompendium-resources

Adding the Artifact

Prior to documenting your resources, you will need to add the artifact to your gradle build file.

dependencies {
  implementation("io.bkbn:kompendium-resources:$version")
}

Installing Plugin

Once you have installed the dependency, you can install the plugin. The NotarizedResources plugin is an application level plugin, and must be install after both the NotarizedApplication plugin and the Ktor Resources plugin.

private fun Application.mainModule() {
  install(Resources)
  install(NotarizedApplication()) {
    spec = baseSpec
  }
  install(NotarizedResources()) {
    resources = mapOf(
      Listing::class to NotarizedResources.ResourceMetadata(
        parameters = listOf(
          Parameter(
            name = "name",
            `in` = Parameter.Location.path,
            schema = TypeDefinition.STRING
          ),
          Parameter(
            name = "page",
            `in` = Parameter.Location.path,
            schema = TypeDefinition.INT
          )
        ),
        get = GetInfo.builder {
          summary("Get user by id")
          description("A very neat endpoint!")
          response {
            responseCode(HttpStatusCode.OK)
            responseType<ExampleResponse>()
            description("Will return whether or not the user is real 😱")
          }
        }
      ),
    )
  }
}

Here, the resources property is a map of KClass<*> to ResourceMetadata instance describing that resource. This metadata is functionally identical to how a standard NotarizedRoute is defined.

⚠️ If you try to map a class that is not annotated with the ktor @Resource annotation, you will get a runtime exception!