Simple service for logging Toggl Track entries in Jira Tempo.
The Toggl Track entry description should start with the Jira issue key for which time is being logged.
An optional description can then be provided using a delimiter which can be configured through WORKLOG_SERVICE_IMPL_CONFIG_DELIMITER, which defaults to a colon (:), e.g.:
<JiraIssueKey><:>?<description>?
The following environment variables should be provided:
TOGGL_TRACK_CLIENT_HTTP_CONFIG_HOST=""
TOGGL_TRACK_CLIENT_HTTP_CONFIG_API_KEY=""
TOGGL_TRACK_CLIENT_HTTP_CONFIG_TIME_ZONE=""
JIRA_CLIENT_HTTP_CONFIG_HOST=""
JIRA_CLIENT_HTTP_CONFIG_USER_EMAIL=""
JIRA_CLIENT_HTTP_CONFIG_API_KEY=""
TEMPO_CLIENT_HTTP_CONFIG_HOST=""
TEMPO_CLIENT_HTTP_CONFIG_API_KEY=""
TEMPO_CLIENT_HTTP_CONFIG_ACCOUNT_ID=""
Run the application from the ./backend directory through ./gradlew bootRun.
Interact with the application in one of the following ways:
- Through the API documented at http://localhost:8080/api/v1/docs
- Through Swagger UI at http://localhost:8080/api/v1/swagger-ui
Building an image can be done in one of two ways:
- For a local image, run
./gradlew jibDockerBuild --no-configuration-cache - To build an image and push it to the remote registry, run
./gradlew jib --no-configuration-cache
Generate the OpenApiDocs by running ./gradlew generateOpenApiDocs --no-configuration-cache.
The --no-configuration-cache flag is included because jib and OpenAPI Generator do not yet support configuration cache.
To interact with the application through the GUI exposed at http://localhost:8080, you first need to generate the corresponding files. Run the following command from the ./frontend directory using Node.js: npm install && npm run build. Then, start the backend as described above.
This application is an example of a reactive backend system build with Kotlin, Spring Boot and Gradle using the Ports and Adapters architecture. It uses H2 Database Engine for in-memory data storage.
The frontend uses basic HTML, CSS and TypeScript with Vite as the build tool.
This project is an experiment exploring Kotlin-specific features within the Spring Framework. Additionally, it aims to reduce annotation-based configuration in favor of explicit definitions.