diff --git a/obp-api/src/main/scala/code/api/v1_4_0/JSONFactory1_4_0.scala b/obp-api/src/main/scala/code/api/v1_4_0/JSONFactory1_4_0.scala index b9c284e7a..bf6b74580 100644 --- a/obp-api/src/main/scala/code/api/v1_4_0/JSONFactory1_4_0.scala +++ b/obp-api/src/main/scala/code/api/v1_4_0/JSONFactory1_4_0.scala @@ -408,7 +408,7 @@ object JSONFactory1_4_0 extends MdcLoggable{ if(findMatches.nonEmpty) { val urlParameters: List[String] = findMatches.toList.sorted - val parametersDescription: List[String] = urlParameters.map(prepareDescription) + val parametersDescription: List[String] = urlParameters.map(i => prepareDescription(i, Nil)) parametersDescription.mkString("\n\n\n**URL Parameters:**", "", "\n") } else { "" @@ -420,31 +420,44 @@ object JSONFactory1_4_0 extends MdcLoggable{ * @param parameter BANK_ID * @return [BANK_ID](/glossary#Bank.bank_id):gh.29.uk */ - def prepareDescription(parameter: String): String = { + def prepareDescription(parameter: String, types: List[(String, Boolean)]): String = { val glossaryItemTitle = getGlossaryItemTitle(parameter) val exampleFieldValue = getExampleFieldValue(parameter) + def boldIfMandatory() = { + types.exists(i => i._1 == parameter && i._2 == false) match { + case true => + s"**$parameter**" + case false => + s"$parameter" + } + } if(exampleFieldValue.contains(ExampleValue.NoExampleProvided)){ "" } else { s""" | - |* [${parameter}](/glossary#$glossaryItemTitle): $exampleFieldValue + |* [${boldIfMandatory()}](/glossary#$glossaryItemTitle): $exampleFieldValue | |""".stripMargin } } def prepareJsonFieldDescription(jsonBody: scala.Product, jsonType: String): String = { - - val jsonBodyJValue = jsonBody match { + jsonBody.productIterator + val (jsonBodyJValue: json.JValue, types) = jsonBody match { case JvalueCaseClass(jValue) => - jValue - case _ => decompose(jsonBody) + val types = Nil + (jValue, types) + case _ => + val types = jsonBody.getClass() + .getDeclaredFields().toList + .map(f => (f.getName(), f.getType().getCanonicalName().contains("Option"))) + (decompose(jsonBody), types) } val jsonBodyFields =JsonUtils.collectFieldNames(jsonBodyJValue).keySet.toList.sorted - val jsonFieldsDescription = jsonBodyFields.map(prepareDescription) + val jsonFieldsDescription = jsonBodyFields.map(i => prepareDescription(i, types)) val jsonTitleType = if (jsonType.contains("request")) "\n\n\n**JSON request body fields:**\n\n" else "\n\n\n**JSON response body fields:**\n\n" diff --git a/obp-api/src/test/scala/code/api/v1_4_0/JSONFactory1_4_0Test.scala b/obp-api/src/test/scala/code/api/v1_4_0/JSONFactory1_4_0Test.scala index 086d03340..5d54a1382 100644 --- a/obp-api/src/test/scala/code/api/v1_4_0/JSONFactory1_4_0Test.scala +++ b/obp-api/src/test/scala/code/api/v1_4_0/JSONFactory1_4_0Test.scala @@ -47,7 +47,7 @@ class JSONFactory1_4_0Test extends V140ServerSetup with DefaultUsers { feature("Test JSONFactory1_4_0") { scenario("prepareDescription should work well, extract the parameters from URL") { - val description = JSONFactory1_4_0.prepareDescription("BANK_ID") + val description = JSONFactory1_4_0.prepareDescription("BANK_ID", Nil) description.contains("[BANK_ID](/glossary#Bank.bank_id): gh.29.uk") should be (true) } diff --git a/obp-commons/src/main/scala/com/openbankproject/commons/util/JsonUtils.scala b/obp-commons/src/main/scala/com/openbankproject/commons/util/JsonUtils.scala index abdab4125..61208f53d 100644 --- a/obp-commons/src/main/scala/com/openbankproject/commons/util/JsonUtils.scala +++ b/obp-commons/src/main/scala/com/openbankproject/commons/util/JsonUtils.scala @@ -683,11 +683,16 @@ object JsonUtils { * @param jValue * @return */ - def collectFieldNames(jValue: JValue): Map[String, String] = { + def collectFieldNames(jValue: JValue, types: List[(String, Class[_])]): Map[String, String] = { val buffer = scala.collection.mutable.Map[String, String]() transformField(jValue){ case (jField, path) => - buffer += (jField.name -> jField.value.toString) + types.exists(i => jField.name == i._1 && i._2.getCanonicalName().contains("Option")) match { + case false => + buffer += (s"${jField.name}*" -> jField.value.toString) + case true => + buffer += (jField.name -> jField.value.toString) + } jField }