Skip to content
This repository has been archived by the owner on Oct 19, 2023. It is now read-only.

Commit

Permalink
Merge remote-tracking branch 'origin/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
Aliaksei Bialiauski authored and Aliaksei Bialiauski committed Dec 22, 2022
2 parents 2d0c569 + e1561a4 commit a8eda79
Show file tree
Hide file tree
Showing 19 changed files with 410 additions and 30 deletions.
49 changes: 24 additions & 25 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,49 +1,48 @@
plugins {
id 'groovy'
id 'org.springframework.boot' version '3.0.0'
id 'io.spring.dependency-management' version '1.1.0'
id 'groovy'
id 'org.springframework.boot' version '3.0.0'
id 'io.spring.dependency-management' version '1.1.0'
}

group = 'org.dothem'
version = '0.0.1'
sourceCompatibility = '17'

configurations {
compileOnly {
extendsFrom annotationProcessor
}
compileOnly {
extendsFrom annotationProcessor
}
}

repositories {
mavenCentral()
mavenCentral()
}

ext {
set('springBootAdminVersion', "3.0.0-M4")
set('springCloudVersion', "2022.0.0")
set('springBootAdminVersion', "3.0.0-M4")
set('springCloudVersion', "2022.0.0")
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-webflux'
implementation 'com.playtika.reactivefeign:feign-reactor-spring-cloud-starter:3.2.6'
implementation 'de.codecentric:spring-boot-admin-starter-server'
implementation 'org.apache.groovy:groovy'
implementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'io.projectreactor:reactor-test'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-webflux'
implementation 'de.codecentric:spring-boot-admin-starter-server'
implementation 'org.apache.groovy:groovy'
implementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'io.projectreactor:reactor-test'
}

dependencyManagement {
imports {
mavenBom "de.codecentric:spring-boot-admin-dependencies:${springBootAdminVersion}"
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
imports {
mavenBom "de.codecentric:spring-boot-admin-dependencies:${springBootAdminVersion}"
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}

tasks.named('test') {
useJUnitPlatform()
useJUnitPlatform()
}
14 changes: 14 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
version: '3.8'
services:
backlog-api:
restart: unless-stopped
environment:
- LOG_LEVEL=INFO
- GITHUB_TOKEN
- TODOIST_TOKEN
build:
context: .
dockerfile: Dockerfile
image: dothem-backlog:latest
ports:
- "8080:8080"
6 changes: 3 additions & 3 deletions src/main/groovy/org/dothem/backlog/BacklogApplication.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication
@SpringBootApplication
class BacklogApplication {

static void main(String[] args) {
SpringApplication.run(BacklogApplication, args)
}
static void main(String[] args) {
SpringApplication.run(BacklogApplication, args)
}
}
74 changes: 74 additions & 0 deletions src/main/groovy/org/dothem/backlog/api/BacklogApiController.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package org.dothem.backlog.api

import org.dothem.backlog.github.CreateGithubIssueRq
import org.dothem.backlog.github.GitHub
import org.dothem.backlog.todoist.CreateTodoistTaskRq
import org.dothem.backlog.todoist.Todoist
import org.dothem.backlog.todoist.TodoistProjectRs
import org.dothem.backlog.todoist.TodoistSectionRs
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.http.HttpStatus
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.ResponseStatus
import org.springframework.web.bind.annotation.RestController
import reactor.core.publisher.Flux
import reactor.core.publisher.Mono

/**
* @author Aliaksei Bialiauski (abialiauski@solvd.com)
* @since 1.0
*/
@RestController
@RequestMapping("/api/v1/backlog")
class BacklogApiController {

@Autowired
private Todoist todoist
@Autowired
private GitHub gh

@ResponseStatus(HttpStatus.OK)
@GetMapping("/todoist/projects")
Flux<TodoistProjectRs> projects() {
this.todoist.projects()
}

@ResponseStatus(HttpStatus.OK)
@GetMapping("/todoist/projects/{id}/sections")
Flux<TodoistSectionRs> sections(@PathVariable String id) {
this.todoist.sections(id)
}

@ResponseStatus(HttpStatus.CREATED)
@PostMapping
Flux<CreateTaskRs> createTask(@RequestBody CreateTaskRq request) {
this.gh.createIssue(
new CreateGithubIssueRq(
owner: request.owner,
repo: request.repo,
title: request.title,
body: request.body,
labels: request.labels
)
).zipWith(
this.todoist.createTask(
new CreateTodoistTaskRq(
content: request.title,
description: request.body,
projectId: request.projectId,
sectionId: request.sectionId,
priority: request.priority,
lang: request.lang,
due: request.due,
labels: request.labels
)
)
).flatMap(responses ->
Mono.just(new CreateTaskRs(github: responses.t1.url, todoist: responses.t2.url))
)
}
}
22 changes: 22 additions & 0 deletions src/main/groovy/org/dothem/backlog/api/CreateTaskRq.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package org.dothem.backlog.api

import com.fasterxml.jackson.annotation.JsonInclude

/**
* @author Aliaksei Bialiauski (abialiauski@solvd.com)
* @since 1.0
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
class CreateTaskRq {

String owner
String repo
String projectId
String sectionId
String title
String body
Integer priority
String due
String lang
String[] labels
}
14 changes: 14 additions & 0 deletions src/main/groovy/org/dothem/backlog/api/CreateTaskRs.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.dothem.backlog.api

import groovy.transform.TupleConstructor

/**
* @author Aliaksei Bialiauski (abialiauski@solvd.com)
* @since 1.0
*/
@TupleConstructor
class CreateTaskRs {

String github
String todoist
}
18 changes: 18 additions & 0 deletions src/main/groovy/org/dothem/backlog/api/WebClientConfig.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.dothem.backlog.api

import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.web.reactive.function.client.WebClient

/**
* @author Aliaksei Bialiauski (abialiauski@solvd.com)
* @since 1.0
*/
@Configuration
class WebClientConfig {

@Bean
WebClient web() {
WebClient.create()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.dothem.backlog.api.handler

import org.springframework.http.HttpStatus
import org.springframework.web.bind.annotation.ExceptionHandler
import org.springframework.web.bind.annotation.ResponseStatus
import org.springframework.web.bind.annotation.RestControllerAdvice
import org.springframework.web.server.ResponseStatusException

/**
* @author Aliaksei Bialiauski (abialiauski@solvd.com)
* @since 1.0
*/
@RestControllerAdvice
class BacklogApiExceptionHandler {

@ResponseStatus(HttpStatus.NOT_FOUND)
@ExceptionHandler(ResponseStatusException)
ResponseError handle(ResponseStatusException e) {
new ResponseError(message: e.message, code: 404)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.dothem.backlog.api.handler

import groovy.transform.TupleConstructor

/**
* @author Aliaksei Bialiauski (abialiauski@solvd.com)
* @since 1.0
*/
@TupleConstructor
class ResponseError {

String message
Integer code
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.dothem.backlog.github

import com.fasterxml.jackson.annotation.JsonProperty

/**
* @author Aliaksei Bialiauski (abialiauski@solvd.com)
* @since 1.0
*/
class CreateGitHubIssueRs {

@JsonProperty("html_url")
String url
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.dothem.backlog.github

import com.fasterxml.jackson.annotation.JsonInclude
import groovy.transform.TupleConstructor

/**
* @author Aliaksei Bialiauski (abialiauski@solvd.com)
* @since 1.0
*/
@TupleConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
class CreateGithubIssueRq {

String owner
String repo
String title
String body
String[] labels
}
34 changes: 34 additions & 0 deletions src/main/groovy/org/dothem/backlog/github/GitHub.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package org.dothem.backlog.github

import org.springframework.beans.factory.annotation.Autowired
import org.springframework.beans.factory.annotation.Value
import org.springframework.stereotype.Component
import org.springframework.web.reactive.function.client.WebClient
import reactor.core.publisher.Flux
import reactor.core.publisher.Mono

/**
* @author Aliaksei Bialiauski (abialiauski@solvd.com)
* @since 1.0
*/
@Component
class GitHub {

@Value('${backlog.github.token}')
private String token
@Value('${backlog.github.api-version}')
private String version
@Autowired
private WebClient web

Flux<CreateGitHubIssueRs> createIssue(CreateGithubIssueRq request) {
this.web.post()
.uri("https://api.github.com/repos/${request.owner}/${request.repo}/issues")
.header("Authorization", "Bearer ${this.token}")
.header("GitHub-Api-Version", "application/vnd.github+json")
.header("Accept", this.version)
.body(Mono.just(request), CreateGithubIssueRq)
.retrieve()
.bodyToFlux(CreateGitHubIssueRs)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.dothem.backlog.todoist

import com.fasterxml.jackson.annotation.JsonInclude
import com.fasterxml.jackson.annotation.JsonProperty
import groovy.transform.TupleConstructor

/**
* @author Aliaksei Bialiauski (abialiauski@solvd.com)
* @since 1.0
*/
@TupleConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
class CreateTodoistTaskRq {

String content
String description
@JsonProperty("project_id")
String projectId
@JsonProperty("section_id")
String sectionId
String priority
@JsonProperty("due_date")
String due
@JsonProperty("due_lang")
String lang
String[] labels
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package org.dothem.backlog.todoist

/**
* @author Aliaksei Bialiauski (abialiauski@solvd.com)
* @since 1.0
*/
class CreateTodoistTaskRs {

String url
}
Loading

0 comments on commit a8eda79

Please sign in to comment.