Recently I started building a repo with boilerplate code to facilitate creation of my future full-stack pet projects. Despite it's work in progress and always will be, as I'll continue to implement new features and tweak existing ones, I wanted to share it with the community.
Check out the GitHub repo I'm covering in this post:
anton-goncharov / kotlin-vue-surveys-demo
Boilerplate Kotlin+Vue fullstack application made with Spring, JWT, WebFlux, H2, JPA, RSocket. Implements sample surveying functionality.
Summary
It's a sample "surveys" application with the actors of two roles: coordinators and respondents. Coordinators are allowed to create & edit polls, then review response statistics. Respondents have read-only view with the only option to submit survey responses.
One of the key features is that the statistics data is refreshed in real time on a survey stats page 📊. It works by using Rsocket and Reactive Streams.
Concepts
This demo application showcases the following list of concepts:
Kotlin and Spring backend API development
I've started using Kotlin on new backend projects 2 years ago, and it's my first repository to have boilerplate code for full-stack apps with Kotlin. Here I'm using Kotlin in pretty much the same Spring setup as I would use Java.
Rapid CRUD bootstrapping using Spring Data REST
It's arguable whether Spring Data REST is a good fit for a production-ready project. On the other hand, it allows a rapid start having full-blown API implementation with sorting, paging and filtering for given entities 💁.
Any given controller can be extended with additional handlers or reimplemented from scratch as a separate custom REST endpoint.
Database migrations with Liquibase
Hibernate JPA auto schema creation was used during the development. After the first version of the schema had been finalized, I generated the Liquibase changelog from JPA entities and disabled ddl-auto by Hibernate.
To populate schema with some initial data (predefined users), there's sql script on classpath.
Security
JWT-based authentication with role-based access is showcased with tokens issued by the backend. ❗️ Such a setup must not be used in production, this functionality is only to demonstrate the flow. In a real solution, use IAM solution like Keycloak or 3rd party SaaS.
Reactive flow for live data streaming
After reading the official guide on Spring Webflux + RSocket I got an idea to implement some real-time streaming functionality to try Reactive Streams in a demo application setup.
The survey statistics page is implemented using rsocket.js, it reads the survey response stream data from a Kotlin Flow that is populated with data from R2DBC H2 reactive-ready driver. The charts are updated on a survey stats page in real time.
Building with Gradle
As a sidenote, I've never used Gradle before, always preferring Maven as a classic tool that makes more sense to me 😃. This was an interesting challenge to create something new with Gradle, especially writing the build script with Kotlin DSL since there're not many ready-to-use examples.
Tech Stack
🔸 Backend
- Kotlin 1.4
- Spring Boot 2.4.3 (JPA Data REST / Hibernate + Security + WebFlux)
- H2 Database with Liquibase database migrations
- Gradle
- JUnit 5
🔹 Frontend
- Vue.js 2 (with Vuex, Vue-router, Vue-image-upload)
- Bootstrap 4
- RSocket
- Apexcharts
Launching
🚀 To get it up and running follow the instructions from the GitHub repo.
Please reach me out if you have any questions or feedback. But keep in mind it's a boilerplate code withstanding permanent work in progress 🛠. Cheers!
Top comments (0)