Template backend project with following technologies.
- Kotlin (v1.3. Target JVM 11.x)
- Ktor
- Koin
- MySQL + Exposed
- KotlinTest
- Mockk
- Gradle
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
- 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
- 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
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
- 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.