Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(agora): create a spec-first REST API prototype in Java-Spring #2895

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions apps/agora/api-spring/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
SERVER_PORT=8086
39 changes: 39 additions & 0 deletions apps/agora/api-spring/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
.gradle
bin/
lib/*.jar
maven-legacy/
tmp/
log/

HELP.md
target/
!**/src/main/**/target/
!**/src/test/**/target/

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/

### VS Code ###
.vscode/
29 changes: 29 additions & 0 deletions apps/agora/api-spring/.openapi-generator-ignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# OpenAPI Generator Ignore
# Generated by openapi-generator https://github.com/openapitools/openapi-generator

# Use this file to prevent files from being overwritten by the generator.
# The patterns follow closely to .gitignore or .dockerignore.

# As an example, the C# client generator defines ApiClient.cs.
# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line:
# ApiClient.cs

# You can match any string of characters against a directory, file or extension with a single asterisk (*):
# foo/*/qux
# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux

# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
# foo/**/qux
# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux

# You can also negate patterns with an exclamation (!).
# For example, you can ignore all files in a docs folder with the file extension .md:
# docs/*.md
# Then explicitly reverse the ignore rule for a single file:
# !docs/README.md
pom.xml
README.md
**/application.properties
**/model/dto/*AllOf*.java
**/OpenApiGeneratorApplication.java
**/OpenApiGeneratorApplicationTests.java
52 changes: 52 additions & 0 deletions apps/agora/api-spring/.openapi-generator/FILES
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
src/main/java/org/sagebionetworks/agora/api/OpenApiGeneratorApplication.java
src/main/java/org/sagebionetworks/agora/api/RFC3339DateFormat.java
src/main/java/org/sagebionetworks/agora/api/api/ApiUtil.java
src/main/java/org/sagebionetworks/agora/api/api/BioDomainsApi.java
src/main/java/org/sagebionetworks/agora/api/api/BioDomainsApiController.java
src/main/java/org/sagebionetworks/agora/api/api/BioDomainsApiDelegate.java
src/main/java/org/sagebionetworks/agora/api/api/DataversionApi.java
src/main/java/org/sagebionetworks/agora/api/api/DataversionApiController.java
src/main/java/org/sagebionetworks/agora/api/api/DataversionApiDelegate.java
src/main/java/org/sagebionetworks/agora/api/api/DistributionApi.java
src/main/java/org/sagebionetworks/agora/api/api/DistributionApiController.java
src/main/java/org/sagebionetworks/agora/api/api/DistributionApiDelegate.java
src/main/java/org/sagebionetworks/agora/api/api/GenesApi.java
src/main/java/org/sagebionetworks/agora/api/api/GenesApiController.java
src/main/java/org/sagebionetworks/agora/api/api/GenesApiDelegate.java
src/main/java/org/sagebionetworks/agora/api/api/TeamsApi.java
src/main/java/org/sagebionetworks/agora/api/api/TeamsApiController.java
src/main/java/org/sagebionetworks/agora/api/api/TeamsApiDelegate.java
src/main/java/org/sagebionetworks/agora/api/configuration/HomeController.java
src/main/java/org/sagebionetworks/agora/api/configuration/SpringDocConfiguration.java
src/main/java/org/sagebionetworks/agora/api/model/dto/BasicErrorDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/BioDomainDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/BioDomainInfoDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/BioDomainsDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/DataversionDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/DistributionDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/DruggabilityDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/EnsemblInfoDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/ExperimentalValidationDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/GCTGeneDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/GCTGeneNominationsDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/GCTGeneTissueDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/GCTGenesListDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/GeneDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/MedianExpressionDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/NeuropathologicCorrelationDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/NominatedGenesListDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/OverallScoresDistributionDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/OverallScoresDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/ProteinDifferentialExpressionDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/ProteomicsDistributionDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/RnaDifferentialExpressionDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/RnaDistributionDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/SimilarGenesNetworkDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/SimilarGenesNetworkLinkDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/SimilarGenesNetworkNodeDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/TargetNominationDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/TeamDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/TeamMemberDto.java
src/main/java/org/sagebionetworks/agora/api/model/dto/TeamsListDto.java
src/main/resources/openapi.yaml
src/test/java/org/sagebionetworks/agora/api/OpenApiGeneratorApplicationTests.java
1 change: 1 addition & 0 deletions apps/agora/api-spring/.openapi-generator/VERSION
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
7.0.0
16 changes: 16 additions & 0 deletions apps/agora/api-spring/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
FROM ghcr.io/sage-bionetworks/agora-api-spring-base:local

USER root

RUN apt-get update -qq -y && export DEBIAN_FRONTEND=noninteractive \
&& apt-get install --no-install-recommends -qq -y \
curl jq \
&& apt-get -y autoclean \
&& apt-get -y autoremove \
&& rm -rf /var/lib/apt/lists/*

# Requires the environment variable SERVER_PORT at runtime
HEALTHCHECK --interval=2s --timeout=3s --retries=20 --start-period=5s \
CMD curl --fail --silent "localhost:${SERVER_PORT}/actuator/health/readiness" | jq '.status' | grep UP || exit 1

USER cnb
131 changes: 131 additions & 0 deletions apps/agora/api-spring/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
buildscript {
repositories {
mavenCentral()
}
}

plugins {
id 'io.spring.dependency-management' version "${springDependencyManagementVersion}"
id 'java'
id 'jvm-test-suite'
id 'org.springframework.boot' version "${springBootVersion}"
id 'jacoco'
id "org.sonarqube" version "${sonarqubeVersion}"
}

repositories {
mavenCentral()
mavenLocal()
}

testing {
suites {
test {
useJUnitJupiter()
}

integrationTest(JvmTestSuite) {
sources {
java {
srcDirs = ['src/integrationTest/java']
}
}
targets {
all {
testTask.configure {
shouldRunAfter(test)
}
}
}
}
}
}

dependencies {
annotationProcessor "org.projectlombok:lombok:${lombokVersion}"
compileOnly "org.projectlombok:lombok:${lombokVersion}"
implementation 'com.google.code.findbugs:jsr305:3.0.2'
implementation 'org.openapitools:jackson-databind-nullable:0.2.6'
implementation 'org.springdoc:springdoc-openapi-ui:1.7.0'
implementation "com.fasterxml.jackson.core:jackson-databind:${fasterxmlVersion}"
implementation "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:${fasterxmlVersion}"
implementation "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:${fasterxmlVersion}"
// implementation "org.sagebionetworks:util:${openchallengesVersion}"
implementation "org.springframework.boot:spring-boot-devtools:${springBootVersion}"
implementation "org.springframework.boot:spring-boot-starter-actuator:${springBootVersion}"
implementation "org.springframework.boot:spring-boot-starter-validation:${springBootVersion}"
implementation "org.springframework.boot:spring-boot-starter-web:${springBootVersion}"
implementation "org.springframework.boot:spring-boot-starter-data-mongodb:${springBootVersion}"
// implementation "org.springframework.cloud:spring-cloud-starter-netflix-eureka-client:${springCloudVersion}"
implementation "org.springframework.data:spring-data-commons:${springDataVersion}"
testImplementation 'org.assertj:assertj-core:3.23.1'
testImplementation "org.springframework.boot:spring-boot-starter-test:${springBootVersion}"

// Enable distributed tracing
// implementation "org.springframework.cloud:spring-cloud-starter-sleuth:${springCloudVersion}"
// implementation "org.springframework.cloud:spring-cloud-sleuth-zipkin:${springCloudVersion}"

// implementation "org.springframework.cloud:spring-cloud-starter-config:${springCloudVersion}"

// implementation 'io.micrometer:micrometer-registry-prometheus:1.10.4'
implementation 'com.squareup:pollexor:3.0.0'
}

group = 'org.sagebionetworks.agora'
version = '0.0.1-SNAPSHOT'

java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}

tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}

bootBuildImage {
imageName = "ghcr.io/sage-bionetworks/${project.name}-base:local"
}

test {
useJUnitPlatform()

testLogging.showStandardStreams = true

beforeTest { descriptor ->
logger.lifecycle("Running test: " + descriptor)
}

failFast = true

testLogging {
events("passed", "skipped", "failed")
}

finalizedBy jacocoTestReport
}

jacocoTestReport {
reports {
xml.required = true
}

afterEvaluate {
// A single star (*) selects files AND subdirectories.
// Exclude Java classes from the JaCoCo report. These files must be excluded from SonarCloud
// report separatedly (see SonarCloud config)
def autoGeneratedFiles = [
'**/api/*.*',
'**/configuration/EnumConverterConfiguration*.*',
'**/configuration/HomeController*.*',
'**/configuration/SpringDocConfiguration*.*',
'**/model/dto/**',
'**/RFC3339DateFormat.*'
]
classDirectories.setFrom(files(classDirectories.files.collect {
fileTree(dir: it, exclude: autoGeneratedFiles
)
}))
}
}
2 changes: 2 additions & 0 deletions apps/agora/api-spring/config/application-local.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
agora-api:
welcome-message: 'Welcome to the Agora API (local config).'
11 changes: 11 additions & 0 deletions apps/agora/api-spring/gradle.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Updating fasterxml to v2.15.3 results in an error (see #2373)
fasterxmlVersion=2.13.4
flywaydbVersion=9.4.0
hibernateSearchVersion=6.1.7.Final
lombokVersion=1.18.30
openchallengesVersion=0.0.1-SNAPSHOT
sonarqubeVersion=4.3.0.3225
springBootVersion=2.7.8
springCloudVersion=3.1.4
springDataVersion=2.7.7
springDependencyManagementVersion=1.0.14.RELEASE
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Loading
Loading