Skip to content
Open
Show file tree
Hide file tree
Changes from 76 commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
fe8f096
OpenAPI working VERY incomplete implementation
plyhun May 16, 2022
b43bf08
Merge branch 'dev' into openapi
plyhun May 16, 2022
d469f49
Type schema fill
plyhun May 16, 2022
a1b1035
Components filled
plyhun May 18, 2022
1d34be3
Security layer. Better type support.
plyhun May 23, 2022
a8cb827
Merge branch 'dev' into openapi
plyhun Jul 19, 2022
d81d41e
Off the System.outs
plyhun Jul 20, 2022
acf16f9
Changelog entry
plyhun Jul 20, 2022
8d339fa
Merge branch 'dev' into openapi
plyhun Jul 20, 2022
4363f1b
Merge branch 'dev' into openapi
plyhun Nov 7, 2022
6833808
Build fixes
plyhun Nov 7, 2022
38728dc
Improved result
plyhun Nov 16, 2022
a9c9aa6
Minor fixes
plyhun Nov 21, 2022
608d530
JRE 9+ Runtime fix
plyhun Jan 12, 2024
8a65b5e
Works
plyhun Jan 15, 2024
0980248
Merge branch 'dev' into openapi
plyhun Feb 12, 2025
28432e5
Java client generated, built and able to login
plyhun Feb 13, 2025
d8149a8
Correct spec types
plyhun Feb 13, 2025
39d4625
Merge branch 'dev' into openapi
plyhun Jan 28, 2026
0a03e37
Runtime based generation
plyhun Jan 30, 2026
a4416a4
Generates
plyhun Jan 30, 2026
7a5c1d8
Merge branch 'dev' into openapi
plyhun Feb 12, 2026
2d8c58f
Refactoring pt1
plyhun Feb 13, 2026
ed4bedd
REST API refactor + tests base
plyhun Feb 16, 2026
11dd4db
Tests base
plyhun Feb 16, 2026
42f271d
Use library
plyhun Feb 17, 2026
c68cb68
Refactor
plyhun Feb 17, 2026
29afff0
Compile time basic generation
plyhun Feb 19, 2026
edc6643
Docs
plyhun Feb 19, 2026
52bb1fc
Autogenerated test client base
plyhun Feb 19, 2026
efca8ce
Tests
plyhun Feb 20, 2026
6d50af4
Test infra fixes. Endpoint definitions mismatch fixes. OpenAPI test c…
plyhun Feb 24, 2026
3ce3eae
Security refactored
plyhun Feb 25, 2026
2f7c6db
Add missing APIs
plyhun Feb 26, 2026
b100562
Fixes
plyhun Mar 2, 2026
73f3f09
Refactoring. Binary handler tests work again
plyhun Mar 3, 2026
ffa52d3
Flip the plugins endpoint inclusion option
plyhun Mar 3, 2026
9f0c1c0
Merge branch 'dev' into openapi
plyhun Mar 3, 2026
795e27f
Changelog
plyhun Mar 3, 2026
257ebc0
Hide the violating endpoint from the generator
plyhun Mar 3, 2026
19ab557
Cleanup
plyhun Mar 3, 2026
49dda94
Generated client fixes
plyhun Mar 3, 2026
da23a95
More OpenAPI test client Impls and API definition fixes
plyhun Mar 4, 2026
eb2d4b8
Give each plugin an own OpenAPI
plyhun Mar 4, 2026
fcf0cd9
Fix the project blacklist
plyhun Mar 5, 2026
0e15615
Move plugin apis out
plyhun Mar 5, 2026
1895d80
Fix Jenkins
plyhun Mar 6, 2026
835e8e3
Properly add rest client test class key
plyhun Mar 6, 2026
83ed9c1
CI build fix
plyhun Mar 6, 2026
686a40a
Get back the old upsert logic
plyhun Mar 6, 2026
4c8808b
Regression fixes
plyhun Mar 6, 2026
b45d7bf
Simplify/cleanup the API
plyhun Mar 9, 2026
d9efe01
Support overridden mesh options
plyhun Mar 10, 2026
028246b
No extra models
plyhun Mar 10, 2026
3e08e97
Update usages of OpenAPI generator
plyhun Mar 11, 2026
10a7165
OpenAPI killswitch
plyhun Mar 11, 2026
d315832
Plugin routes are secured by default
plyhun Mar 11, 2026
395223c
Allow running skipping doc
plyhun Mar 12, 2026
09b7b49
Merge remote-tracking branch 'origin/dev' into f-gpu-2196
plyhun Mar 12, 2026
6d1acf3
Changelog actualized
plyhun Mar 13, 2026
e434bee
Make eventbus completely hidden to the OpenAPI
plyhun Mar 13, 2026
120daa1
Make the test assertion overridable
plyhun Mar 16, 2026
641a8d1
Missing dependency
plyhun Mar 16, 2026
2ee36ea
Spect validation fixes
plyhun Mar 16, 2026
3aec435
Tell apart update and upsert endpoints, as OpenAPI spec forbids it
plyhun Mar 19, 2026
6140b7f
Merge remote-tracking branch 'origin/dev' into f-gpu-2196
plyhun Mar 19, 2026
80b96ab
Regression
plyhun Mar 19, 2026
97ffd76
Regression
plyhun Mar 20, 2026
ae1ccb5
Regression
plyhun Mar 23, 2026
44bb346
Remove dead APIs. Minor fixes. Client impl.
plyhun Mar 23, 2026
bc56fc5
Add backOfficeAuth/cleanupSecret security schemes and noApiInfoPlugin…
lukas-smk Mar 24, 2026
b71cf8e
Revert "Add backOfficeAuth/cleanupSecret security schemes and noApiIn…
lukas-smk Mar 24, 2026
aaa6c8c
Test client almost done
plyhun Mar 24, 2026
12a13c7
Generated client fullfilled
plyhun Mar 24, 2026
bba08df
Generated client fixes
plyhun Mar 25, 2026
4e66222
Regression of the JsonSchema generation and the generated Java client
plyhun Mar 25, 2026
43222c9
Fix OpenAPI feature possibilities in references.asciidoc
plyhun Mar 25, 2026
2ed8220
OOM fix
plyhun Mar 27, 2026
43ea0a3
Upsert parameter
plyhun Mar 30, 2026
884c5df
Revert optional entity upsert
plyhun Mar 31, 2026
f986ead
Other fixes
plyhun Mar 31, 2026
edee7e9
Update Maven options and environment variables in Jenkinsfile
plyhun Apr 3, 2026
db6d019
Revert "Update Maven options and environment variables in Jenkinsfile"
plyhun Apr 7, 2026
2ad2d21
Merge branch 'dev' into f-gpu-2196
plyhun Apr 10, 2026
068101f
Fix the tests
plyhun Apr 9, 2026
8b9d361
Auth token test fix
plyhun Apr 10, 2026
836825c
Merge remote-tracking branch 'origin/dev' into f-gpu-2196
plyhun Apr 22, 2026
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
13 changes: 7 additions & 6 deletions Jenkinsfile.split
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ properties([
booleanParam(name: 'runUnstableTests', defaultValue: true, description: "Whether to run tests in failing group."),
booleanParam(name: 'runPerformanceTests', defaultValue: false, description: "Whether to run performance tests."),
booleanParam(name: 'runClusterTests', defaultValue: false, description: "Whether to run cluster tests."),
booleanParam(name: 'useOpenApiTestClient',defaultValue: false, description: "Whether to use an autogenerated OpenAPI OkHTTP 3 based REST client for the tests."),
booleanParam(name: 'runDeploy', defaultValue: false, description: "Whether to run the deploy steps."),
booleanParam(name: 'runDeployTesting', defaultValue: false, description: "Whether to run the testing deploy steps."),
booleanParam(name: 'runDocker', defaultValue: false, description: "Whether to run the docker steps."),
Expand Down Expand Up @@ -68,19 +69,19 @@ final def testPart(partName, current, branches) {
// prior to starting the tests, start the docker containers with the db and the testdb-manager
sh 'docker login -u $repoUsername -p $repoPassword docker.gentics.com'
if (Boolean.valueOf(params.testMaria)) {
sh "mvn -pl :mesh-database-connector-mariadb docker:start -Dskip.mariadb.tests=${noMariadb} "
sh "mvn -pl :mesh-database-connector-mariadb docker:start -Dskip.mariadb.tests=${noMariadb} "
}
// run the tests
withEnv(["TESTCONTAINERS_RYUK_DISABLED=true", "MESH_CONSISTENCY_CHECKS=" + (Boolean.valueOf(params.consistencyChecks) ? "true" : "false"), "MAVEN_OPTS=-Xmx1g -XX:MaxMetaspaceSize=128m "]) {
withEnv(["TESTCONTAINERS_RYUK_DISABLED=true", "MESH_CONSISTENCY_CHECKS=" + (Boolean.valueOf(params.consistencyChecks) ? "true" : "false"), "MAVEN_OPTS=-Xmx1g -XX:MaxMetaspaceSize=128m ", "MESH_REST_CLIENT_CLASS=" + (Boolean.valueOf(params.useOpenApiTestClient) ? "com.gentics.mesh.test.openapi.OpenAPIMeshRestClient" : "")]) {
sh ".jenkins/run-splits.sh includes-${postfix} ${jacoco} ${partName} ${partId}"
}
} finally {
// finally stop the docker containers
if (Boolean.valueOf(params.testMaria)) {
sh "mvn -pl :mesh-database-connector-mariadb docker:stop -Dskip.mariadb.tests=${noMariadb} "
sh "mvn -pl :mesh-database-connector-mariadb docker:stop -Dskip.mariadb.tests=${noMariadb} "
}
}
}
}
stash name: "jacoco" + current, includes: "**/jacoco-partial.exec", allowEmpty: true
} finally {
step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/*.xml'])
Expand Down Expand Up @@ -216,9 +217,9 @@ stage("Setup Build Environment") {
}
try {
withCredentials([usernamePassword(credentialsId: 'docker.gentics.com', usernameVariable: 'repoUsername', passwordVariable: 'repoPassword'),usernamePassword(credentialsId: 'gentics.gpg', usernameVariable: 'gpgKeyName', passwordVariable: 'gpgKeyPass')]) {
withEnv(["TESTCONTAINERS_RYUK_DISABLED=true", "MESH_CONSISTENCY_CHECKS=" + (Boolean.valueOf(params.consistencyChecks) ? "true" : "false")]) {
withEnv(["TESTCONTAINERS_RYUK_DISABLED=true", "MESH_CONSISTENCY_CHECKS=" + (Boolean.valueOf(params.consistencyChecks) ? "true" : "false"), "MESH_REST_CLIENT_CLASS=" + (Boolean.valueOf(params.useOpenApiTestClient) ? "com.gentics.mesh.test.openapi.OpenAPIMeshRestClient" : "")]) {
sh "mvn -fae -Dsurefire.excludedGroups=com.gentics.mesh.test.category.FailingTests,com.gentics.mesh.test.category.ClusterTests -Dmaven.javadoc.skip=true -Dskip.cluster.tests=true -Dmaven.test.failure.ignore=true -Dmesh.container.image.prefix=docker.gentics.com/ -Dskip.mariadb.tests=${noMariadb} -Dskip.hsqlmemory.tests=${noHsqldb} -B -U -e test"
}
}
}
} finally {
step([$class: 'JUnitResultArchiver', testResults: '**/target/surefire-reports/*.xml'])
Expand Down
49 changes: 49 additions & 0 deletions api/src/main/java/com/gentics/mesh/etc/config/Format.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.gentics.mesh.etc.config;

import org.apache.commons.lang3.StringUtils;

/**
* OpenAPI output format
*/
public enum Format {
/**
* Yaml
*/
YAML(0),
/**
* JSON
*/
JSON(1);

private final int level;

private Format(int level) {
this.level = level;
}

/**
* Get the filtering int value.
*
* @return
*/
public int getLevel() {
return level;
}

/**
* Safe parse string value
*
* @param format
* @param defaultValue
* @return
*/
public static Format parse(String format, Format defaultValue) {
if (StringUtils.isNotBlank(format)) {
switch (format.toUpperCase()) {
case "YAML": return YAML;
case "JSON": return JSON;
}
}
return defaultValue;
}
}
35 changes: 34 additions & 1 deletion api/src/main/java/com/gentics/mesh/etc/config/MeshOptions.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ public abstract class MeshOptions implements Option {
public static final String MESH_CLUSTER_INIT_ENV = "MESH_CLUSTER_INIT";
public static final String MESH_LOCK_PATH_ENV = "MESH_LOCK_PATH";
public static final String MESH_LIVE_PATH_ENV = "MESH_LIVE_PATH";
public static final String MESH_SERVE_OPENAPI_ENV = "MESH_SERVE_OPENAPI";
public static final String MESH_START_IN_READ_ONLY_ENV = "MESH_START_IN_READ_ONLY";
public static final String MESH_INITIAL_ADMIN_PASSWORD_ENV = "MESH_INITIAL_ADMIN_PASSWORD";
public static final String MESH_INITIAL_ADMIN_PASSWORD_FORCE_RESET_ENV = "MESH_INITIAL_ADMIN_PASSWORD_FORCE_RESET";
Expand Down Expand Up @@ -152,6 +153,10 @@ public abstract class MeshOptions implements Option {
@EnvironmentVariable(name = MESH_MIGRATION_TRIGGER_INTERVAL, description = "Override the migration trigger interval")
private long migrationTriggerInterval = DEFAULT_MIGRATION_TRIGGER_INTERVAL;

@JsonProperty(required = false)
@EnvironmentVariable(name = MESH_SERVE_OPENAPI_ENV, description = "Serve OpenAPI specification under `/openapi*` endpoints. Default: true")
private boolean serveOpenApi = true;

@JsonProperty(required = true)
@JsonPropertyDescription("GraphQL options.")
private GraphQLOptions graphQLOptions = new GraphQLOptions();
Expand Down Expand Up @@ -272,7 +277,6 @@ public MeshOptions setMonitoringOptions(MonitoringConfig monitoringOptions) {
return this;
}


/**
* Get the graphql options
* @return graphql options
Expand Down Expand Up @@ -544,6 +548,15 @@ public MeshOptions setPluginUseHttp2(boolean pluginUseHttp2) {
return this;
}

public boolean isServeOpenApi() {
return serveOpenApi;
}

@Setter
public void setServeOpenApi(boolean serveOpenApi) {
this.serveOpenApi = serveOpenApi;
}

@JsonIgnore
public abstract NativeQueryFiltering getNativeQueryFiltering();

Expand Down Expand Up @@ -608,4 +621,24 @@ public void validate(MeshOptions options) {
}

public abstract boolean hasDatabaseLevelCache();

/**
* Get default OpenAPI spec version
*
* @return
*/
public abstract Version getDefaultOpenAPIVersion();

/**
* Get default OpenAPI spec format
*
* @return
*/
public abstract Format getDefaultOpenAPIFormat();

/**
* Get the comma separated list of plugin, that should provide no API info. Can be null or empty.
* @return
*/
public abstract String getNoApiInfoPlugins();
}
69 changes: 69 additions & 0 deletions api/src/main/java/com/gentics/mesh/etc/config/Version.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package com.gentics.mesh.etc.config;

import org.apache.commons.lang3.StringUtils;

/**
* OpenAPI specification version
*/
public enum Version {

/**
* v3.0
*/
V30(0),
/**
* v3.1
*/
V31(1);

private final int level;

private Version(int level) {
this.level = level;
}

/**
* Get the filtering int value.
*
* @return
*/
public int getLevel() {
return level;
}

/**
* Safe parse string value
*
* @param version
* @param defaultValue
* @return
*/
public static Version parse(String version, Version defaultValue) {
if (StringUtils.isNotBlank(version)) {
switch (version.toUpperCase()) {
case "V30":
case "3.0":
return V30;
case "V31":
case "3.1":
return V31;
}
}
return defaultValue;
}

/**
* Pretty print the version
*
* @return
*/
public String pretty() {
switch(this) {
case V30:
return "3.0";
case V31:
return "3.1";
}
return null;
}
}
28 changes: 20 additions & 8 deletions bom/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@
<handlebars.version>4.3.1</handlebars.version>
<hsqldb.version>2.7.3</hsqldb.version>
<micrometer.version>1.15.5</micrometer.version>
<vertx.openapi.version>0.0.1-SNAPSHOT</vertx.openapi.version>
<okhttp.version>5.3.0</okhttp.version>
</properties>

<!-- IMPORTANT: Always keep dependencies in-sync with mesh-plugin-parent pom in order to avoid duplicate libraries in shaded plugin jars -->
Expand Down Expand Up @@ -108,6 +110,11 @@
<artifactId>commons-lang3</artifactId>
<version>3.18.0</version>
</dependency>
<dependency>
<groupId>com.gentics</groupId>
<artifactId>vertx-openapi</artifactId>
<version>${vertx.openapi.version}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
Expand All @@ -133,7 +140,12 @@
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp-jvm</artifactId>
<version>5.3.0</version>
<version>${okhttp.version}</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>logging-interceptor</artifactId>
<version>${okhttp.version}</version>
</dependency>
<!-- Manage the dependency of okhttp due to Vulnerability -->
<dependency>
Expand Down Expand Up @@ -172,7 +184,7 @@
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.9</version>
<version>2.10.1</version>
</dependency>

<!-- Tika -->
Expand Down Expand Up @@ -808,9 +820,9 @@
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
<version>3.2.0</version>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>com.squareup.inject</groupId>
Expand All @@ -833,9 +845,9 @@
<version>${hazelcast-hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-jcache</artifactId>
<version>${hibernate.version}</version>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-jcache</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate.orm</groupId>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
REST API: Along with existing RAML API definition, it is now possible to generate an OpenAPI (aka Swagger) specification for the Mesh REST API. For that, an endpoint `/openapi.yaml` has been provided.
Loading