@@ -885,10 +885,10 @@ object OpenApi {
885885 finalSchemas
886886 }
887887
888- def generate (env : Env , version : Option [String ]): String = {
888+ def generate (env : Env , version : Option [String ], extensionGroup : Option [ String ] ): String = {
889889 // TODO: missing live metrics api
890890 // TODO: missing analytics api
891- if (env.isDev) {
891+ val finalDoc = if (env.isDev) {
892892 val additionalPathsFile = env.environment.resourceAsStream(" /schemas/additionalPaths.json" ).get
893893 val additionalPathsRaw = new String (additionalPathsFile.readAllBytes(), StandardCharsets .UTF_8 )
894894 val additionalPathsJson = Json .parse(additionalPathsRaw).asObject
@@ -978,5 +978,52 @@ object OpenApi {
978978 }
979979 )
980980 }
981+
982+ extensionGroup match {
983+ case None => finalDoc
984+ case Some (group) => {
985+ cache.getOrElseUpdate(
986+ group, {
987+
988+ env.logger.info(s " Compute sub openapi.json document for group: ' ${group}' " )
989+
990+ def findNeededComponents (js : JsValue ): Set [String ] = {
991+ js.stringify.split(" #/components/schemas/" ).map(str => str.split(""" """" ).head).toSet
992+ }
993+
994+ def buildFilteredComponentsSchema (initialObj : JsValue , componentsSchema : JsObject ): JsObject = {
995+ var previousNeededComponents : Set [String ] = Set .empty
996+ var previousComponents : JsValue = Json .obj(" paths" -> initialObj, " schemas" -> Json .obj())
997+ var run = true
998+ while (run) {
999+ val neededComponents = findNeededComponents(previousComponents)
1000+ if (neededComponents.size == previousNeededComponents.size) {
1001+ run = false
1002+ } else {
1003+ previousComponents = Json .obj(" paths" -> initialObj, " schemas" -> JsObject (componentsSchema.value.filter {
1004+ case (key, _) if neededComponents.contains(key) => true
1005+ case _ => false
1006+ }))
1007+ previousNeededComponents = neededComponents
1008+ }
1009+ }
1010+ previousComponents.select(" schemas" ).asObject
1011+ }
1012+
1013+ val json = Json .parse(finalDoc).asObject
1014+ val paths = json.select(" paths" ).asObject
1015+ val tags = json.select(" tags" ).asArray
1016+ val components = json.select(" components" ).asObject
1017+ val componentsSchema = json.select(" components" ).select(" schemas" ).asObject
1018+ val filteredPaths = JsObject (paths.value.filter(_._1.startsWith(s " /apis/ ${group}" )))
1019+ val filteredTags = JsArray (tags.value.filter(_.select(" name" ).asString.startsWith(group)))
1020+ val filteredComponentsSchema = buildFilteredComponentsSchema(filteredPaths, componentsSchema)
1021+ val customComponents = components ++ Json .obj(" schemas" -> filteredComponentsSchema)
1022+ val customDoc = json ++ Json .obj(" tags" -> filteredTags, " paths" -> filteredPaths, " components" -> customComponents)
1023+ customDoc.prettify
1024+ }
1025+ )
1026+ }
1027+ }
9811028 }
9821029}
0 commit comments