Skip to content
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@
* OpenAPI 3 / SpringDoc for the consolidated ID-Repository deployable.
* <p>
* Each former microservice keeps its own Swagger UI under the legacy public path prefix
* (same shape as pre-consolidation), instead of one grouped UI at {@code /swagger-ui/index.html}.
* (same shape as pre-consolidation). Every page lists all four definitions in the
* Swagger "Select a definition" dropdown, with the definition for that URL selected.
* </p>
* <p>
* Swagger UI static assets are served under each service prefix (e.g.
Expand Down Expand Up @@ -299,8 +300,10 @@ private static java.util.Optional<SwaggerMount> resolveMount(String requestUri)

private static String renderSwaggerHtml(SwaggerMount mount) {
String title = escape(mount.title());
// Absolute path under the same gateway prefix as this UI (not /v3/api-docs/group)
String apiDocs = escape(mount.apiDocsPath());
// urls (not a single url) is what shows Swagger UI's "Select a definition" dropdown.
// primaryName is this page's group, so /identity/swagger-ui still opens Identity.
String urls = swaggerDefinitionUrls();
String primaryName = escape(mount.title());
return """
<!DOCTYPE html>
<html lang="en">
Expand All @@ -317,9 +320,11 @@ private static String renderSwaggerHtml(SwaggerMount mount) {
<script>
window.onload = function() {
window.ui = SwaggerUIBundle({
url: '%s',
urls: %s,
'urls.primaryName': '%s',
dom_id: '#swagger-ui',
deepLinking: true,
queryConfigEnabled: true,
presets: [SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset],
plugins: [SwaggerUIBundle.plugins.DownloadUrl],
layout: 'StandaloneLayout',
Expand All @@ -330,7 +335,22 @@ private static String renderSwaggerHtml(SwaggerMount mount) {
</script>
</body>
</html>
""".formatted(title, apiDocs);
""".formatted(title, urls, primaryName);
}

/** Absolute api-docs paths so the dropdown works from any of the four Swagger pages. */
private static String swaggerDefinitionUrls() {
StringBuilder urls = new StringBuilder("[");
for (int i = 0; i < SWAGGER_MOUNTS.size(); i++) {
SwaggerMount mount = SWAGGER_MOUNTS.get(i);
if (i > 0) {
urls.append(',');
}
urls.append("{url:'").append(escape(mount.apiDocsPath()))
.append("',name:'").append(escape(mount.title())).append("'}");
}
urls.append(']');
return urls.toString();
}

private static String escape(String value) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ javax.persistence.jdbc.password=${mosip.credential.service.jdbc.password}
javax.persistence.jdbc.driver=${mosip.credential.service.jdbc.driver}
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect

# OpenAPI — per-service Swagger UI under each path prefix (IdRepoOpenApiConfig), not one grouped root UI
# OpenAPI — per-service Swagger UI under each path prefix (IdRepoOpenApiConfig).
# Each page's "Select a definition" lists all four; the URL you opened stays selected.
# Identity: /idrepository/v1/identity/swagger-ui/index.html → /idrepository/v1/identity/v3/api-docs
# VID: /idrepository/v1/swagger-ui/index.html → /idrepository/v1/v3/api-docs
# Cred: /v1/credentialservice/swagger-ui/index.html → /v1/credentialservice/v3/api-docs
Expand Down
Loading