Asynchronous web framework for Kotlin. Create REST APIs in Kotlin easily with automatic Swagger/OpenAPI doc generation

Overview

Zeko Rest API Framework

alt Zeko RestAPI Framework

Maven Central Apache License 2 Awesome Kotlin Badge

Zeko Rest API Framework is an asynchronous web framework written for Kotlin language. Create restful APIs in Kotlin easily with automatic Swagger/OpenAPI documentation generation. It is built on top of Vert.x event-driven toolkit and designed to be simple & fun to use.

This library is open source and available under the Apache 2.0 license. Please leave a star if you've found this library helpful!

Features

  • No configuration files, no XML or YAML, lightweight, easy to use
  • Event driven & non-blocking built on top of Vert.x 4.1.1
  • Fast startup & performance
  • Supports Kotlin coroutines
  • Automatic Swagger/OpenAPI doc generation for your RESTful API
  • Code generation via Kotlin kapt
  • Largely reflection-free, consumes little memory
  • Project creator included
  • Add endpoint validations easily
  • Run cron jobs easily!
  • Mail service with Sendgrid & Mandrill
  • Simple SQL builder & data mapper
  • Built with JVM 8, works fine with JVM 9/10 and above

Getting Started

This framework is very easy-to-use. After reading this short documentation, you will have learnt enough.

Or look at the example project straight away! It's simple enough!

The example project includes a project creator tool which is the quickest way to create a new project (accessible at /project/create endpoint)

Installation

Add this to your maven pom.xml

<dependency>
  <groupId>io.zeko</groupId>
  <artifactId>zeko-restapi</artifactId>
  <version>1.5.0</version>
</dependency>
<!-- Jasync Mysql driver if needed -->
<dependency>
   <groupId>com.github.jasync-sql</groupId>
   <artifactId>jasync-mysql</artifactId>
   <version>1.1.5</version>
</dependency>
<!-- Hikari Mysql connection pool if needed -->
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>3.4.3</version>
</dependency>
<!-- Vertx jdbc client if needed -->
<dependency>
    <groupId>io.vertx</groupId>
    <artifactId>vertx-jdbc-client</artifactId>
    <version>4.1.1</version>
</dependency>
<dependency>
    <groupId>org.jetbrains.kotlinx</groupId>
    <artifactId>kotlinx-coroutines-core</artifactId>
    <version>1.3.9</version>
</dependency>

Enable Annotation Processor

In order to get your zeko app up and running, you would need to add annotation preprocessor to your maven pom. This will automatically generates routes, cron and Swagger 2.0/OpenAPI documentation from your controllers. Set your kotlin.version accordingly for the KAPT to work.

<plugin>
    <artifactId>kotlin-maven-plugin</artifactId>
    <groupId>org.jetbrains.kotlin</groupId>
    <version>${kotlin.version}</version>

    <executions>
        <execution>
            <id>kapt</id>
            <goals>
                <goal>kapt</goal>
            </goals>
            <configuration>
                <sourceDirs>
                    <sourceDir>src/main/kotlin</sourceDir>
                </sourceDirs>

                <annotationProcessorPaths>
                    <annotationProcessorPath>
                        <groupId>io.zeko</groupId>
                        <artifactId>zeko-restapi</artifactId>
                        <version>1.1.5</version>
                    </annotationProcessorPath>
                </annotationProcessorPaths>

                <annotationProcessors>
                    <annotationProcessor>io.zeko.restapi.annotation.codegen.RouteSchemaGenerator</annotationProcessor>
                </annotationProcessors>

                <annotationProcessorArgs>
                    <processorArg>swagger.apiVersion=1.0</processorArg>
                    <processorArg>swagger.title=Simple Rest API</processorArg>
                    <processorArg>swagger.description=This is a simple RESTful API demo</processorArg>
                    <processorArg>swagger.host=localhost</processorArg>
                    <processorArg>swagger.basePath=/</processorArg>
                    <processorArg>swagger.sampleResultDir=${project.basedir}/api-results</processorArg>
                    <processorArg>swagger.outputFile=${project.basedir}/api-doc/swagger.json</processorArg>
                    <processorArg>swagger.cmpSchemaDir=${project.basedir}/api-schemas</processorArg>
                    <processorArg>default.produces=application/json</processorArg>
                    <processorArg>default.consumes=application/x-www-form-urlencoded</processorArg>
                </annotationProcessorArgs>
            </configuration>
        </execution>
        
        //.... other execution ...
    </executions>
</plugin>

Compile & Run

Compile and run your vertx app:

mvn clean compile vertx:run -Dvertx.verticle="io.zeko.restapi.examples.BootstrapVerticle"

You should see the following output during compilation, after you have created and annotated your endpoints in controller classes

[INFO] --- vertx-maven-plugin:1.0.18:initialize (vmp) @ simple-api ---
[INFO] 
[INFO] --- kotlin-maven-plugin:1.3.61:kapt (kapt) @ simple-api ---
[INFO] Note: Writing controller schema /Users/leng/Documents/zeko-restapi-example/target/generated-sources/kaptKotlin/compile/UserControllerSchema.kt
[INFO] Note: Writing route class /Users/leng/Documents/zeko-restapi-example/target/generated-sources/kaptKotlin/compile/GeneratedRoutes.kt
[INFO] Note: Writing swagger file to /Users/leng/Documents/zeko-restapi-example/api-doc/swagger.json
[INFO] Note: Writing cron class /Users/leng/Documents/zeko-restapi-example/target/generated-sources/kaptKotlin/compile/GeneratedCrons.kt
[INFO] 

Now you can view the swagger.json under the directory configured (swagger.outputFile) in any Swagger/OpenAPI UI tools or Postman

Bootstrapping

Zeko doesn't include a DI container, instead of reinventing the wheel, it is recommended to use something awesome like Koin or Dagger to manage your project's dependency injection. The following instructions will be using Koin DI framework.

Bootstrapping for Zeko rest framework is simple. If you would like to use the built-in SQL builder & client, you could follow the same structure as the example project

BootstrapVerticle.kt
KoinVerticleFactory.kt
DB.kt
AppDBLog.kt	
RestApiVerticle.kt

The 5 Kotlin classes above are crucial for the app to run.

BootstrapVerticle

BootstrapVerticle is the main entry file of the app. Setup your DI here with Koin for most things that are shared globally such as logger, DB pool, web client pool, JWT auth configs, mail service, etc.

DB class

DB class is written to setup database connection pool using Jasync, Hikari-CP or Vert.x JDBC client. From your repository class, access the DB object via Koin DI container:

class UserRepo(val vertx: Vertx) : KoinComponent {
    val db: DB by inject()

    suspend fun getActiveUser(id: Int): User? {
        var user: User? = null
        db.session().once { sess ->
            val sql = Query().fields("id", "first_name", "last_name", "email", "last_access_at")
                            .from("user")
                            .where(("id" eq id) and ("status" eq 1))
                            .limit(1).toSql()

            val rows = sess.query(sql, { User(it) }) as List<User>
            if (rows.isNotEmpty()) user = rows[0]
        }
        return user
    }
}

AppDBLog

During development logging the SQL and prepared statement's parameters will be really useful. In order to do so, call the setQueryLogger() method on DBSession after it is initialized. AppDBLog is a simple implementation of DBLogger interface which prints out the logs with vert.x Logger

val dbLogger = AppDBLog(logger).setParamsLogLevel(DBLogLevel.ALL)
JasyncDBSession(connPool, connPool.createConnection()).setQueryLogger(dbLogger) 

Implement your own DBLogger for more advanced usage.

RestApiVerticle

This would be the place where all the route and cronjob executions happen. You do not have to define all your endpoints route here manually. If they're annotated in the controllers, the routes code will be generated by Zeko KAPT.

Your would just need to bind the generated routes by calling:

bindRoutes("your.name.controllers.GeneratedRoutes", router, logger, true)
// Or less overhead
bindRoutes(your.name.controllers.GeneratedRoutes(vertx), router, logger, true)

If you have controller classes in different packages, then it is required to call bindRoutes multiple times:

bindRoutes("your.name.controllers.GeneratedRoutes", router, logger, true)
bindRoutes("his.controllers.GeneratedRoutes", router, logger, true)

The same applies to generated cron jobs

startCronJobs("my.example.jobs.GeneratedCrons", logger)
// Or
startCronJobs(my.example.jobs.GeneratedCrons(vertx, logger), logger)

Default error handler, which will output message with status code 500 if any exception is thrown. 503 for connection timeout if you use TimeoutHandler for the routes.

handleRuntimeError(router, logger)

Controllers

For any endpoint to work, you would need to create a class and extends ApiController.

import io.zeko.restapi.annotation.http.*
import io.zeko.restapi.annotation.Params
import io.zeko.restapi.core.controllers.ApiController
import io.zeko.restapi.core.validations.ValidateResult

@Routing("/user")     // <----- (1)
class UserController : ApiController {

    constructor(vertx: Vertx, logger: Logger, context: RoutingContext) : super(vertx, logger, context)

    @GetSuspend("/show-user/:user_id", "Show User profile data")    // <----- (2)
    @Params([    // <----- (3)
        "user_id => required, isInteger, min;1, max;99999999",
        "country => inArray;MY;SG;CN;US;JP;UK"
    ])
    suspend fun getUser(ctx: RoutingContext) {
        val res = validateInput()   // <----- (4)
        if (!res.success) {   // <----- (5)
            return
        }

        val uid = res.values["user_id"].toString().toInt()
        // val user = <call your business logic bla...>
        endJson(user)      // <----- (6)
    }
}
  1. This Routing annotation will add a prefix to the endpoint URL for the entire class. Thus, the final URI for getUser() will be /user/show-user/123

  2. GetSuspend defines an endpoint route, you should use @Get if it isn't a suspend function call. First parameter is the URI, second is the description which will be used to generate the Swagger documentation. List of routing annotations (add Suspend suffix if it is calling a suspend method):

     Get
     Post
     Delete
     Put
     Head
     Patch
     Options
     Routing // define your own
    
  3. Params indicates that the parameters this endpoint requires. It accepts an array of strings which is the rule definitions for the fields needed.

    The format can be explained as:

    "field_name => required, rule1, rule2;rule2_param, rule3_param;rule3_param"
    

    If required is not defined then the parameter would be optional. Each rule is separated by a comma (,) while the rule's parameters are separated by semi-colon (;)

    user_id => required, isInteger, min;1, max;99999999
    

    The rule definition above means that user_id field is required, should be an integer, minimum value of 1 and max of 99999999

  4. Calls the built in input validation which returns ValidateResult res.values contains of the parameter values in a hash map.

  5. Check if the the validation is successful. If it failed, by default, ApiController will output the errors in JSON format with status code 400.

    {
        "error_code": 400,
        "errors": {
            "user_id": [
                "User Id is not a valid integer value",
                "User Id minimum value is 1",
                "User Id maximum value is 99"
            ]
        }
    }
    

    You could override the status code and error messages by defining a different status code & error messages in the form of Map<String, String>.

    Refer to ValidationError.defaultMessages on how to define your custom Rule's error messages

     override fun inputErrorMessages() = ValidationError.defaultMessages
     override fun validateInput(statusCode: Int): ValidateResult = super.validateInput(422)
  6. endJson() will convert the entity or any other object to JSON with Content-Type as application/json and status code 200. Do remember to define your Jackson naming strategy in the bootstrap class

Validations

For the list of predefined rules, refer to keys of ValidationError.defaultMessages or RuleSet for all the rules method and its parameters.

Cron Jobs

Cron job would be similar to the controller routes. You would need to create a class and extends CronJob

package my.example.jobs

import io.vertx.core.json.Json
import io.zeko.restapi.annotation.cron.Cron
import io.zeko.restapi.annotation.cron.CronSuspend
import io.zeko.restapi.core.cron.CronJob

class UserCronJob(vertx: Vertx, logger: Logger) : CronJob(vertx, logger), KoinComponent {

    val userService: UserService by inject()

    @CronSuspend("*/2 * * * *")
    suspend fun showUser() {
        val user = userService.getProfileStatus(1)
        logger.info("Cron showUser " + Json.encode(user))
    }

    @Cron("*/1 * * * *")
    fun showUserNormal() {
        val uid = 1
        val user = User().apply {
            id = uid
            firstName = "I Am"
            lastName = "Mango"
        }
        logger.info("Cron showUserNormal " + Json.encode(user))
    }

}

@CronSuspend should be used on any suspend calls while @Cron should be used on method calls without Kotlin coroutine. The annotation accepts a string value which should be your good old UNIX cron expression

In the sample cron job above, showUser will be executed in every 2 minute, and showUserNormal in every 1 minute.

All cron jobs in the same package will be aggregated into a GeneratedCrons class during kapt phase.

Start the cron job from RestApiVerticle:

startCronJobs(my.example.jobs.GeneratedCrons(vertx, logger), logger)

Mail Service

The framework provides two mail service: Sendgird and Mandrill The mail service classes are using Vert.x web client to call the service APIs.

Example sending via SendGrid. First, create an instance of SendGridMail.

val webClient = SendGridMail.createSharedClient(vertx)
val sendGridConfig = MailConfig(
        "Your Api Key",
        "[email protected]", "Zeko",
        true, "[email protected]"  // this confines the service to send all mails to this Dev email address, useful in dev mode
)
val mailService = SendGridMail(webClient, sendGridConfig, get())

Call sendEmail() method to send out emails.

val tags = listOf("super-duber-app-with-zeko.com", "register")
val res: MailResponse = mailService.send(
        email, fullName,
        "Register Success",
        "<h2>Success!</h2><p>You are now a new member!</p>", 
        "Success! You are now a new member!",
        tags
)

Retries

It would be better if the email will be resent if the API call failed. The following code will retry to send email 3 more times if the first call failed with a 2 second delay interval.

mailService.retry(3, 2000) {
    it.send(email, fullName,
            "Register Success",
            "<h2>Success!</h2><p>You are now a new member!</p>", 
            "Success! You are now a new member!")
}

Circuit Breaker

API calls & email sending might fail, these faults can range in severity from a partial loss of connectivity to the complete failure of a service. For some mission critical tasks, you might want to send emails with a circuit breaker pattern.

To do so with the mail service in Zeko:

val mailCircuitBreaker = SendGridMail.createCircuitBreaker(vertx)

mailService.sendInCircuit(circuitBreaker, 
            email, fullName,
            "User Registration Success",
            "<h2>Success!</h2><p>You are now a new user!</p>",
            "Success! You are now a new user!")

Circuit breaker instance should be better shared and not created on every email send, put it into your DI container instead.

By default, the createCircuitBreaker() method creates a circuit breaker with name of "zeko.mail.sendgrid" (or "zeko.mail.mandrill" for MandrillMailService), along with max failures of 5, and 8 maximum retries. Change the behaviour by providing your own CircuitBreakerOptions

// Unlimited retries
val opt = CircuitBreakerOptions().apply { 
    maxFailures = 15
    maxRetries = 0
}
SendGridMail.createCircuitBreaker(vertx, "important.mailtask1", opt)

SQL Queries

Just use any sql builder libraries or refer to Zeko's SQL Builder

Data Mapper

DIY or refer to Zeko Data Mapper

Comments
  • Bump jackson-databind from 2.11.4 to 2.13.4.1

    Bump jackson-databind from 2.11.4 to 2.13.4.1

    Bumps jackson-databind from 2.11.4 to 2.13.4.1.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • Bump jackson-databind from 2.11.4 to 2.12.6.1

    Bump jackson-databind from 2.11.4 to 2.12.6.1

    Bumps jackson-databind from 2.11.4 to 2.12.6.1.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • Bump jackson-databind from 2.9.10.4 to 2.9.10.7

    Bump jackson-databind from 2.9.10.4 to 2.9.10.7

    Bumps jackson-databind from 2.9.10.4 to 2.9.10.7.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • Bump jackson-databind from 2.9.10.4 to 2.9.10.5

    Bump jackson-databind from 2.9.10.4 to 2.9.10.5

    Bumps jackson-databind from 2.9.10.4 to 2.9.10.5.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • Bump cron-utils from 9.0.2 to 9.1.3

    Bump cron-utils from 9.0.2 to 9.1.3

    Bumps cron-utils from 9.0.2 to 9.1.3.

    Release notes

    Sourced from cron-utils's releases.

    9.1.3

    Update cron definition to match Spring cron documentation. Remove dependency on Hibernate validation, to avoid security vulnerability. Many thanks to @pwntester!

    9.1.2

    Release 9.1.2 solves the following issues:

    We also enhanced handling of DST for next/past executions (#213), removed multiple slf4j bindings (#434), and avoided declaring Lombok as a transitive dependency (#437).

    Thanks to @jaguililla @natros @francisdb @benoitbb @albuhuba @lpbak @pangyikhei @lowell80 @LennyKarpel @Naxos84 @Blemicek @sbandler @IndeedSi @HongZhaoHua @littleYanzi @albertotn @edmeme @zhanxingcheng @zhanxingcheng @charchithere @barunhalderkolkata for reporting, discussing and providing solutions to the issues above!

    9.1.1

    In case of a cron urgency, call the 9.1.1 release 😄

    9.1.0

    For details regarding this release, please check milestone 9.1.0 Many thanks to @pangyikhei @rymsha @Eyal-Shalev @alsereda @melonhead901 @fi3te @skyline75489 @tudobmb @albertotn @albertotn @francisdb @marcoslarsen @Fantazjatyk @flamezealot @yangjiajun2014 @NikitaNovozhilovWork @alexshtin @mfateev @SJX516 @dimitripunch @pkoenig10 for reporting issues, contributing tests, documentation and fixes!

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump jackson-databind from 2.11.4 to 2.12.7.1

    Bump jackson-databind from 2.11.4 to 2.12.7.1

    Bumps jackson-databind from 2.11.4 to 2.12.7.1.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump cron-utils from 9.1.3 to 9.1.6

    Bump cron-utils from 9.1.3 to 9.1.6

    Bumps cron-utils from 9.1.3 to 9.1.6.

    Commits
    • d78d40b pom.xml -> 9.1.6
    • 9c73298 Update pom.xml towards JDK8, for a compatible release.
    • 528fcae Issue #493: update code towards one of the proposed solutions.
    • cfd2880 Merge pull request #494 from NielsDoucet/RCE-fix
    • d670750 Merge pull request #493 from pwntester/patch-1
    • 6f91560 Merge branch 'hibnico-fix-interval-mapping'
    • d95759b Fix mapping of interval for the day of week
    • 9c93c17 Resolve RCE vulnerability.
    • d7c6e3c Update CronValidator.java
    • 2cf9697 Merge pull request #492 from albertotn/description-italian
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
Releases(1.5.4)
Owner
Leng Sheng Hong
Leng Sheng Hong
A clean OpenAPI client generator for Kotlin multiplatform

kotlin-openapi-generator A not yet feature complete client generator. Features: generates 100% Kotlin multiplatform code does not generate any useless

Jakob K 5 Jun 6, 2022
Ktor OpenAPI Spec Generator

Kompendium What is Kompendium Kompendium is intended to be a minimally invasive OpenApi Specification generator for Ktor. Minimally invasive meaning t

Backbone 91 Jan 4, 2023
HQ OpenAPI Specification and Client & Server SDK Generators

HQ-API HQ OpenAPI Specification and Client & Server SDK Generators Cloning Github Repository Get access to Flocktory team in Github Adding a new SSH k

Flocktory Spain, S.L. 1 Sep 2, 2022
Web Container: A simple web container library for Android to help fellow developer to open WebView easily

WebContainer Description Web Container is a simple web container library for And

Achmad Ichsan Thaib 8 Nov 22, 2022
Webclient-kotlin-sample - An example of using the http web client to promote synchronous and asynchronous https calls

Web Client Consumer Kotlin Sample The project is an example of using the http we

null 1 May 1, 2022
This lib is the framework for dependency tasks, specially for the asynchronous tasks.

DependencyTask This lib is the framework for dependency tasks, specially for the asynchronous tasks. Backgroud Image that there is a progress with som

null 1 May 6, 2022
A study into creating a fully automatic FRC robot

AutoFRC This is a study into creating a fully automatic FRC robot. This process relies on several key algorithms: pose estiation: using the WpiLib Dif

null 1 Jun 29, 2022
An IoT based automatic alerting device that consists of laser and a precise Light Dependent Resistor to detect the laser which is employed to constantly monitor the fluid level

An IoT based automatic alerting device that consists of laser and a precise Light Dependent Resistor to detect the laser which is employed to constantly monitor the fluid level. When the fluid level is below the critical level which will be defined by laser, it will alert the patient through buzzer, nurses and doctors through mobile app and the …

null 0 Feb 12, 2022
In this Repo i create public apis to serve apps, like muslim apps using Spring, kotlin, and microservices

spring-freelance-apis-kotlin In this Repo i create public apis to serve apps, like muslim apps using Spring, kotlin, and microservices This repo for l

null 6 Feb 13, 2022
Documentation and implementations of a recursive procedural generation algorithm authored by Christopher Ravosa.

Recursive-Dungeon-Generation This repository contains implementations of a recursive algorithm, authored by Christopher Ravosa, for generating dungeon

Christopher Ravosa 1 Mar 30, 2022
Starter project to create a simple RESTful web service in Kotlin

Modified: Adding Koin for DI Using JWT for authentication and authorization Dropping proprietary FlyAway tool Single Page Application support Starter

null 1 Oct 23, 2021
High performance and fully asynchronous pulsar client with Kotlin and Vert.x

pulsarkt High performance pulsar client with Kotlin and Vert.x Features Basic Producer/Consumer API Partitioned topics Batching Chunking Compression T

null 1 Nov 5, 2021
Asynchronous Spring Initializr API wrapper for Kotlin/JVM

initializr-kt Asynchronous Spring Initializr API wrapper for Kotlin/JVM. This library provides the simplest DSL for initializing Spring Boot projects

Mikhail Titov 2 May 8, 2022
Execute asynchronous batch tasks with predefined or custom UI in Android.

AndroidBatchWorker Execute asynchronous batch tasks with predefined or custom UI in Android. Import Add JitPack repository to your project level build

Nowrose Muhammad Ragib 3 Nov 8, 2022
Jetpack Compose for Desktop and Web, a modern UI framework for Kotlin that makes building performant and beautiful user interfaces easy and enjoyable.

Jetpack Compose for Desktop and Web, a modern UI framework for Kotlin that makes building performant and beautiful user interfaces easy and enjoyable.

JetBrains 10k Jan 7, 2023
Kotlin microservices with REST, and gRPC using BFF pattern. This repository contains backend services. Everything is dockerized and ready to "Go" actually "Kotlin" :-)

Microservices Kotlin gRPC Deployed in EC2, Check it out! This repo contains microservices written in Kotlin with BFF pattern for performing CRUD opera

Oguzhan 18 Apr 21, 2022
Spring-kotlin - Learning API Rest with Kotlin, Spring and PostgreSQL

Kotlin, Spring, PostgreSQL and Liquibase Database Migrations Learning Kotlin for

Andre L S Ferreira 2 Feb 14, 2022
Demo Spting REST Service on Kotlin. Works with PostgreSQL via Spring Data. Data initialization provided by liquibase

Spring Boot REST API with Kotlin Spring Boot REST API service. Spring Data with PostgreSQL. Data initialization with Liquibase. Swagger UI Reference D

null 0 Jun 10, 2022
API Rest With Kotlin And Spring Boot

##API REST WITH KOTLIN AND SPRING BOOT GET Url: http://localhost:8080/customers Response (Status Code: 200 Ok) { "_embedded": { "customer

Felipe Baz 0 Nov 18, 2021