From 27789f1798584c0480e9f4c362a4e909baff574e Mon Sep 17 00:00:00 2001 From: Alan Richardson Date: Fri, 17 Jul 2026 10:01:00 +0100 Subject: [PATCH] Allow API docs to hide Swagger UI link --- .../ThingifierApiDocumentationDefn.java | 10 ++++ .../RestApiDocumentationGenerator.java | 4 +- .../RestApiDocumentationGeneratorTest.java | 49 +++++++++++++++++++ 3 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 thingifier/src/test/java/uk/co/compendiumdev/thingifier/htmlgui/htmlgen/RestApiDocumentationGeneratorTest.java diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/docgen/ThingifierApiDocumentationDefn.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/docgen/ThingifierApiDocumentationDefn.java index 4a7527a1..4c02f7bd 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/docgen/ThingifierApiDocumentationDefn.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/api/docgen/ThingifierApiDocumentationDefn.java @@ -28,6 +28,7 @@ public class ThingifierApiDocumentationDefn { private String ogType = ""; private String twitterCard = ""; private String twitterSite = ""; + private boolean showSwaggerUiLink = true; private Map customHeadersForRoutesThatDoNotMatch; // todo: convert internal documentation to use a ThingifierApiDefn rather than a direct @@ -183,6 +184,15 @@ public ThingifierApiDocumentationDefn setTwitterSite(final String twitterSite) { return this; } + public boolean willShowSwaggerUiLink() { + return showSwaggerUiLink; + } + + public ThingifierApiDocumentationDefn setShowSwaggerUiLink(final boolean showSwaggerUiLink) { + this.showSwaggerUiLink = showSwaggerUiLink; + return this; + } + /** * Given a skeletal RoutingDefinition used to match the verb and the endpoint If * diff --git a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/htmlgui/htmlgen/RestApiDocumentationGenerator.java b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/htmlgui/htmlgen/RestApiDocumentationGenerator.java index 6087f026..68101e84 100644 --- a/thingifier/src/main/java/uk/co/compendiumdev/thingifier/htmlgui/htmlgen/RestApiDocumentationGenerator.java +++ b/thingifier/src/main/java/uk/co/compendiumdev/thingifier/htmlgui/htmlgen/RestApiDocumentationGenerator.java @@ -438,7 +438,9 @@ public String getApiDocumentation( } } - output.append(paragraph(href("Open Swagger UI", prependPath + "/docs/swagger-ui"))); + if (apiDocDefn.willShowSwaggerUiLink()) { + output.append(paragraph(href("Open Swagger UI", prependPath + "/docs/swagger-ui"))); + } output.append( paragraph(href("[download normal swagger file]", prependPath + "/docs/swagger"))); output.append( diff --git a/thingifier/src/test/java/uk/co/compendiumdev/thingifier/htmlgui/htmlgen/RestApiDocumentationGeneratorTest.java b/thingifier/src/test/java/uk/co/compendiumdev/thingifier/htmlgui/htmlgen/RestApiDocumentationGeneratorTest.java new file mode 100644 index 00000000..3a0067d0 --- /dev/null +++ b/thingifier/src/test/java/uk/co/compendiumdev/thingifier/htmlgui/htmlgen/RestApiDocumentationGeneratorTest.java @@ -0,0 +1,49 @@ +package uk.co.compendiumdev.thingifier.htmlgui.htmlgen; + +import java.util.List; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import uk.co.compendiumdev.thingifier.Thingifier; +import uk.co.compendiumdev.thingifier.api.docgen.ApiRoutingDefinition; +import uk.co.compendiumdev.thingifier.api.docgen.ThingifierApiDocumentationDefn; + +class RestApiDocumentationGeneratorTest { + + @Test + void apiDocumentationShowsSwaggerUiLinkByDefault() { + final Thingifier thingifier = new Thingifier(); + final ThingifierApiDocumentationDefn apiDocDefn = new ThingifierApiDocumentationDefn(); + + final String docs = + new RestApiDocumentationGenerator(thingifier, new DefaultGUIHTML()) + .getApiDocumentation( + new ApiRoutingDefinition(), + List.of(), + apiDocDefn, + "/mirror", + "https://example.com/mirror/docs"); + + Assertions.assertTrue(docs.contains("href='/mirror/docs/swagger-ui'")); + Assertions.assertTrue(docs.contains("Open Swagger UI")); + } + + @Test + void apiDocumentationCanHideSwaggerUiLink() { + final Thingifier thingifier = new Thingifier(); + final ThingifierApiDocumentationDefn apiDocDefn = + new ThingifierApiDocumentationDefn().setShowSwaggerUiLink(false); + + final String docs = + new RestApiDocumentationGenerator(thingifier, new DefaultGUIHTML()) + .getApiDocumentation( + new ApiRoutingDefinition(), + List.of(), + apiDocDefn, + "/mirror", + "https://example.com/mirror/docs"); + + Assertions.assertFalse(docs.contains("href='/mirror/docs/swagger-ui'")); + Assertions.assertFalse(docs.contains("Open Swagger UI")); + Assertions.assertTrue(docs.contains("href='/mirror/docs/swagger'")); + } +}