Kotlin Backend Template

About

Template backend project with following technologies.

Technology Stack

Directory Structure

Main structure is relying on what's generated by Ktor plugin for IntelliJ

Root 
├── build : for gradle output
├── out : also for gradle output 
├── resources : setting files 
│ ├── application.conf : setting file for Ktor
├── docker-compose
│   ├── mongo
│   └── mysql
├── gradle
│   └── wrapper 
├── src: source code
│   ├── auth
│   ├── dao
│   ├── database
│   ├── exception
│   ├── init
│   ├── koin
│   ├── domain
│   ├── repository
│   ├── routes
│   ├── service
│   ├── usecase
│   ├── util
│   └── Application.kt: Ktor Main
└── test: test code
    ├── database: database connection managers for test
    ├── e2e: end to end test
    ├── io
    │ └──  kotlintest
    │   └── provided
    │    └── kotlinTestConfig.kt : config file for KotlinTest (https://github.com/kotlintest/kotlintest/blob/master/doc/reference.md#project-config)
    └── unit: unit test

Local Setup

  1. Setup local MySQL with docker-compose
cd path/to/your/project/root

docker-compose -f ./docker-compose/mysql/docker-compose.yml -f ./docker-compose/mysql/env-dev.yml -p db_templatepj up -d
  1. Run
# serve at localhost:8080
DB_USER=root DB_NAME=templatepj DB_HOST=localhost DB_PASSWORD=mypassword;./gradlew run

4. You get it!
http://localhost:8080/ping

Run Test

cd path/to/your/project/root

# Run test db
docker-compose -f ./docker-compose/mysql/docker-compose.yml -f ./docker-compose/mysql/env-test.yml -p db_templatepj up -d

./gradlew test

Code Architecture

  • DDD
  • There are layers as following.
controller -> usecase -> repository -> dao (or something else to reach out any resources)
  • UseCase layer intend to set a transaction.