bugfix/use the locale instead of languageParam

This commit is contained in:
hongwei 2023-02-27 16:11:30 +01:00
parent 795d70ee86
commit 410f961670
5 changed files with 41 additions and 64 deletions

View File

@ -24,8 +24,7 @@ import code.util.Helper.MdcLoggable
import com.github.dwickern.macros.NameOf.nameOf
import com.openbankproject.commons.model.{BankId, ListResult, User}
import com.openbankproject.commons.model.enums.ContentParam.{ALL, DYNAMIC, STATIC}
import com.openbankproject.commons.model.enums.LanguageParam._
import com.openbankproject.commons.model.enums.{ContentParam, LanguageParam}
import com.openbankproject.commons.model.enums.{ContentParam}
import com.openbankproject.commons.util.ApiStandards._
import com.openbankproject.commons.util.{ApiVersion, ScannedApiVersion}
import com.tesobe.CacheKeyFromArguments
@ -238,7 +237,7 @@ trait ResourceDocsAPIMethods extends MdcLoggable with APIMethods220 with APIMeth
private def getStaticResourceDocsObpCached(requestedApiVersionString : String,
resourceDocTags: Option[List[ResourceDocTag]],
partialFunctionNames: Option[List[String]],
languageParam: Option[LanguageParam],
locale: Option[String],
contentParam: Option[ContentParam],
cacheModifierParam: Option[String],
isVersion4OrHigher:Boolean
@ -255,7 +254,7 @@ trait ResourceDocsAPIMethods extends MdcLoggable with APIMethods220 with APIMeth
logger.debug(s"Generating OBP Resource Docs requestedApiVersion is $requestedApiVersionString")
val requestedApiVersion = ApiVersionUtils.valueOf(requestedApiVersionString)
val resourceDocJson = resourceDocsToResourceDocJson(getResourceDocsList(requestedApiVersion), resourceDocTags, partialFunctionNames, isVersion4OrHigher, languageParam)
val resourceDocJson = resourceDocsToResourceDocJson(getResourceDocsList(requestedApiVersion), resourceDocTags, partialFunctionNames, isVersion4OrHigher, locale)
resourceDocJson.map(resourceDocsJsonToJsonResponse)
}
}
@ -272,7 +271,7 @@ trait ResourceDocsAPIMethods extends MdcLoggable with APIMethods220 with APIMeth
private def getAllResourceDocsObpCached(requestedApiVersionString : String,
resourceDocTags: Option[List[ResourceDocTag]],
partialFunctionNames: Option[List[String]],
languageParam: Option[LanguageParam],
locale: Option[String],
contentParam: Option[ContentParam],
cacheModifierParam: Option[String],
isVersion4OrHigher:Boolean
@ -319,7 +318,7 @@ trait ResourceDocsAPIMethods extends MdcLoggable with APIMethods220 with APIMeth
val allDocs = staticDocs.map( _ ++ filteredDocs)
val resourceDocJson = resourceDocsToResourceDocJson(allDocs, resourceDocTags, partialFunctionNames, isVersion4OrHigher, languageParam)
val resourceDocJson = resourceDocsToResourceDocJson(allDocs, resourceDocTags, partialFunctionNames, isVersion4OrHigher, locale)
resourceDocJson.map(resourceDocsJsonToJsonResponse)
}
}
@ -328,7 +327,7 @@ trait ResourceDocsAPIMethods extends MdcLoggable with APIMethods220 with APIMeth
private def getResourceDocsObpDynamicCached(
resourceDocTags: Option[List[ResourceDocTag]],
partialFunctionNames: Option[List[String]],
languageParam: Option[LanguageParam],
locale: Option[String],
contentParam: Option[ContentParam],
cacheModifierParam: Option[String],
bankId:Option[String],
@ -363,7 +362,7 @@ trait ResourceDocsAPIMethods extends MdcLoggable with APIMethods220 with APIMeth
case None => dynamicDocs
}
val resourceDocJson = resourceDocsToResourceDocJson(Some(filteredDocs), resourceDocTags, partialFunctionNames, isVersion4OrHigher, languageParam)
val resourceDocJson = resourceDocsToResourceDocJson(Some(filteredDocs), resourceDocTags, partialFunctionNames, isVersion4OrHigher, locale)
resourceDocJson.map(resourceDocsJsonToJsonResponse)
}}}
@ -373,14 +372,14 @@ trait ResourceDocsAPIMethods extends MdcLoggable with APIMethods220 with APIMeth
resourceDocTags: Option[List[ResourceDocTag]],
partialFunctionNames: Option[List[String]],
isVersion4OrHigher:Boolean,
languageParam: Option[LanguageParam]): Option[ResourceDocsJson] = {
locale: Option[String]): Option[ResourceDocsJson] = {
for {
resourceDocs <- rd
} yield {
// Filter
val rdFiltered = ResourceDocsAPIMethodsUtil.filterResourceDocs(resourceDocs, resourceDocTags, partialFunctionNames)
// Format the data as json
JSONFactory1_4_0.createResourceDocsJson(rdFiltered, isVersion4OrHigher, languageParam)
JSONFactory1_4_0.createResourceDocsJson(rdFiltered, isVersion4OrHigher, locale)
}
}
@ -444,7 +443,7 @@ trait ResourceDocsAPIMethods extends MdcLoggable with APIMethods220 with APIMeth
| You may filter this endpoint using the 'content' url parameter, e.g. ?content=dynamic
| if set content=dynamic, only show dynamic endpoints, if content=static, only show the static endpoints. if omit this parameter, we will show all the endpoints.
|
| You may need some other language resource docs, now we support en and zh , e.g. ?language=zh
| You may need some other language resource docs, now we support i18n language tag , e.g. ?locale=zh_CN
|
| You can filter with api-collection-id, but api-collection-id can not be used with others together. If api-collection-id is used in URL, it will ignore all other parameters.
|
@ -456,7 +455,7 @@ trait ResourceDocsAPIMethods extends MdcLoggable with APIMethods220 with APIMeth
|${getObpApiRoot}/v4.0.0$endpointBankIdPath/resource-docs/v4.0.0/obp
|${getObpApiRoot}/v4.0.0$endpointBankIdPath/resource-docs/v4.0.0/obp?tags=Account,Bank
|${getObpApiRoot}/v4.0.0$endpointBankIdPath/resource-docs/v4.0.0/obp?functions=getBanks,bankById
|${getObpApiRoot}/v4.0.0$endpointBankIdPath/resource-docs/v4.0.0/obp?language=zh
|${getObpApiRoot}/v4.0.0$endpointBankIdPath/resource-docs/v4.0.0/obp?locale=zh_CN
|${getObpApiRoot}/v4.0.0$endpointBankIdPath/resource-docs/v4.0.0/obp?content=static,dynamic,all
|${getObpApiRoot}/v4.0.0$endpointBankIdPath/resource-docs/v4.0.0/obp?api-collection-id=4e866c86-60c3-4268-a221-cb0bbf1ad221
|${getObpApiRoot}/v4.0.0$endpointBankIdPath/resource-docs/v4.0.0/obp?cache-modifier=3141592653
@ -494,9 +493,9 @@ trait ResourceDocsAPIMethods extends MdcLoggable with APIMethods220 with APIMeth
// Note: description uses html markup because original markdown doesn't easily support "_" and there are multiple versions of markdown.
def getResourceDocsObp : OBPEndpoint = {
case "resource-docs" :: requestedApiVersionString :: "obp" :: Nil JsonGet _ => {
val (tags, partialFunctions, languageParam, contentParam, apiCollectionIdParam, cacheModifierParam) = ResourceDocsAPIMethodsUtil.getParams()
val (tags, partialFunctions, locale, contentParam, apiCollectionIdParam, cacheModifierParam) = ResourceDocsAPIMethodsUtil.getParams()
cc =>
getApiLevelResourceDocs(cc,requestedApiVersionString, tags, partialFunctions, languageParam, contentParam, apiCollectionIdParam, cacheModifierParam, false, false)
getApiLevelResourceDocs(cc,requestedApiVersionString, tags, partialFunctions, locale, contentParam, apiCollectionIdParam, cacheModifierParam, false, false)
}
}
@ -517,9 +516,9 @@ trait ResourceDocsAPIMethods extends MdcLoggable with APIMethods220 with APIMeth
def getResourceDocsObpV400 : OBPEndpoint = {
case "resource-docs" :: requestedApiVersionString :: "obp" :: Nil JsonGet _ => {
val (tags, partialFunctions, languageParam, contentParam, apiCollectionIdParam, cacheModifierParam) = ResourceDocsAPIMethodsUtil.getParams()
val (tags, partialFunctions, locale, contentParam, apiCollectionIdParam, cacheModifierParam) = ResourceDocsAPIMethodsUtil.getParams()
cc =>
getApiLevelResourceDocs(cc,requestedApiVersionString, tags, partialFunctions, languageParam, contentParam, apiCollectionIdParam, cacheModifierParam, true, false)
getApiLevelResourceDocs(cc,requestedApiVersionString, tags, partialFunctions, locale, contentParam, apiCollectionIdParam, cacheModifierParam, true, false)
}
}
@ -540,13 +539,13 @@ trait ResourceDocsAPIMethods extends MdcLoggable with APIMethods220 with APIMeth
//
// def getStaticResourceDocsObp : OBPEndpoint = {
// case "static-resource-docs" :: requestedApiVersionString :: "obp" :: Nil JsonGet _ => {
// val (tags, partialFunctions, languageParam, contentParam, apiCollectionIdParam, cacheModifierParam) = ResourceDocsAPIMethodsUtil.getParams()
// val (tags, partialFunctions, locale, contentParam, apiCollectionIdParam, cacheModifierParam) = ResourceDocsAPIMethodsUtil.getParams()
// cc =>
// getApiLevelResourceDocs(
// cc,requestedApiVersionString,
// tags,
// partialFunctions,
// languageParam,
// locale,
// Some(ContentParam.STATIC) ,//Note: here it set to default STATIC value.
// apiCollectionIdParam,
// cacheModifierParam,
@ -563,7 +562,7 @@ trait ResourceDocsAPIMethods extends MdcLoggable with APIMethods220 with APIMeth
requestedApiVersionString: String,
tags: Option[List[ResourceDocTag]],
partialFunctions: Option[List[String]],
languageParam: Option[LanguageParam],
locale: Option[String],
contentParam: Option[ContentParam],
apiCollectionIdParam: Option[String],
cacheModifierParam: Option[String],
@ -585,24 +584,24 @@ trait ResourceDocsAPIMethods extends MdcLoggable with APIMethods220 with APIMeth
}
requestedApiVersion <- NewStyle.function.tryons(s"$InvalidApiVersionString $requestedApiVersionString", 400, callContext) {ApiVersionUtils.valueOf(requestedApiVersionString)}
_ <- Helper.booleanToFuture(s"$ApiVersionNotSupported $requestedApiVersionString", 400, callContext)(versionIsAllowed(requestedApiVersion))
json <- languageParam match {
case Some(ZH) => Future(getChineseVersionResourceDocs)
json <- locale match {
case _ if(locale.isDefined && locale.get.toLowerCase.contains("zh")) => Future(getChineseVersionResourceDocs)
case _ if (apiCollectionIdParam.isDefined) =>
val operationIds = MappedApiCollectionEndpointsProvider.getApiCollectionEndpoints(apiCollectionIdParam.getOrElse("")).map(_.operationId).map(getObpFormatOperationId)
val resourceDocs = ResourceDoc.getResourceDocs(operationIds)
val resourceDocsJson = JSONFactory1_4_0.createResourceDocsJson(resourceDocs, isVersion4OrHigher, languageParam)
val resourceDocsJson = JSONFactory1_4_0.createResourceDocsJson(resourceDocs, isVersion4OrHigher, locale)
val resourceDocsJsonJValue = Full(resourceDocsJsonToJsonResponse(resourceDocsJson))
Future(resourceDocsJsonJValue.map(successJsonResponse(_)))
case _ =>
contentParam match {
case Some(DYNAMIC) =>
val dynamicDocs: Box[JValue] = getResourceDocsObpDynamicCached(tags, partialFunctions, languageParam, contentParam, cacheModifierParam, None, isVersion4OrHigher)
val dynamicDocs: Box[JValue] = getResourceDocsObpDynamicCached(tags, partialFunctions, locale, contentParam, cacheModifierParam, None, isVersion4OrHigher)
Future(dynamicDocs.map(successJsonResponse(_)))
case Some(STATIC) =>
val staticDocs: Box[JValue] = getStaticResourceDocsObpCached(requestedApiVersionString, tags, partialFunctions, languageParam, contentParam, cacheModifierParam, isVersion4OrHigher)
val staticDocs: Box[JValue] = getStaticResourceDocsObpCached(requestedApiVersionString, tags, partialFunctions, locale, contentParam, cacheModifierParam, isVersion4OrHigher)
Future(staticDocs.map(successJsonResponse(_)))
case _ =>
val docs: Box[JValue] = getAllResourceDocsObpCached(requestedApiVersionString, tags, partialFunctions, languageParam, contentParam, cacheModifierParam, isVersion4OrHigher)
val docs: Box[JValue] = getAllResourceDocsObpCached(requestedApiVersionString, tags, partialFunctions, locale, contentParam, cacheModifierParam, isVersion4OrHigher)
Future(docs.map(successJsonResponse(_)))
}
}
@ -630,7 +629,7 @@ trait ResourceDocsAPIMethods extends MdcLoggable with APIMethods220 with APIMeth
// Note: description uses html markup because original markdown doesn't easily support "_" and there are multiple versions of markdown.
def getBankLevelDynamicResourceDocsObp : OBPEndpoint = {
case "banks" :: bankId :: "resource-docs" :: requestedApiVersionString :: "obp" :: Nil JsonGet _ => {
val (tags, partialFunctions, languageParam, contentParam, apiCollectionIdParam, cacheModifierParam) = ResourceDocsAPIMethodsUtil.getParams()
val (tags, partialFunctions, locale, contentParam, apiCollectionIdParam, cacheModifierParam) = ResourceDocsAPIMethodsUtil.getParams()
cc =>
for {
(u: Box[User], callContext: Option[CallContext]) <- resourceDocsRequireRole match {
@ -647,7 +646,7 @@ trait ResourceDocsAPIMethods extends MdcLoggable with APIMethods220 with APIMeth
}
requestedApiVersion <- NewStyle.function.tryons(s"$InvalidApiVersionString $requestedApiVersionString", 400, callContext) {ApiVersionUtils.valueOf(requestedApiVersionString)}
json <- NewStyle.function.tryons(s"$UnknownError Can not create dynamic resource docs.", 400, callContext) {
getResourceDocsObpDynamicCached(tags, partialFunctions, languageParam, contentParam, cacheModifierParam, Some(bankId), false).map(successJsonResponse(_)).get
getResourceDocsObpDynamicCached(tags, partialFunctions, locale, contentParam, cacheModifierParam, Some(bankId), false).map(successJsonResponse(_)).get
}
} yield {
(Full(json), HttpCode.`200`(callContext))
@ -695,7 +694,7 @@ trait ResourceDocsAPIMethods extends MdcLoggable with APIMethods220 with APIMeth
case "resource-docs" :: requestedApiVersionString :: "swagger" :: Nil JsonGet _ => {
cc =>{
for {
(resourceDocTags, partialFunctions, languageParam, contentParam, apiCollectionIdParam, cacheModifierParam) <- tryo(ResourceDocsAPIMethodsUtil.getParams())
(resourceDocTags, partialFunctions, locale, contentParam, apiCollectionIdParam, cacheModifierParam) <- tryo(ResourceDocsAPIMethodsUtil.getParams())
requestedApiVersion <- tryo(ApiVersionUtils.valueOf(requestedApiVersionString)) ?~! s"$InvalidApiVersionString Current Version is $requestedApiVersionString"
_ <- booleanToBox(versionIsAllowed(requestedApiVersion), s"$ApiVersionNotSupported Current Version is $requestedApiVersionString")
staticJson <- getResourceDocsSwaggerCached(requestedApiVersionString, resourceDocTags, partialFunctions)
@ -927,13 +926,6 @@ object ResourceDocsAPIMethodsUtil extends MdcLoggable{
case _ => Empty
}
def stringToLanguageParam (x: String) : Option[LanguageParam] = x.toLowerCase match {
case "en" => Some(EN)
case "zh" => Some(ZH)
case "es" | "es_ES" => Some(ES)
case _ => Empty
}
def stringToContentParam (x: String) : Option[ContentParam] = x.toLowerCase match {
case "dynamic" => Some(DYNAMIC)
case "static" => Some(STATIC)
@ -941,7 +933,7 @@ object ResourceDocsAPIMethodsUtil extends MdcLoggable{
case _ => None
}
def getParams() : (Option[List[ResourceDocTag]], Option[List[String]], Option[LanguageParam], Option[ContentParam], Option[String], Option[String]) = {
def getParams() : (Option[List[ResourceDocTag]], Option[List[String]], Option[String], Option[ContentParam], Option[String], Option[String]) = {
val rawTagsParam = S.param("tags")
@ -989,12 +981,8 @@ object ResourceDocsAPIMethodsUtil extends MdcLoggable{
}
logger.debug(s"partialFunctionNames is $partialFunctionNames")
// So we can produce a reduced list of resource docs to prevent manual editing of swagger files.
val languageParam = for {
x <- S.param("language").or(S.param(PARAM_LOCALE))
y <- stringToLanguageParam(x)
} yield y
logger.debug(s"languageParam is $languageParam")
val locale = S.param(PARAM_LOCALE).or(S.param("language")) // we used language before, so keep it there.
logger.debug(s"locale is $locale")
// So we can produce a reduced list of resource docs to prevent manual editing of swagger files.
val contentParam = for {
@ -1013,7 +1001,7 @@ object ResourceDocsAPIMethodsUtil extends MdcLoggable{
} yield x
logger.debug(s"cacheModifierParam is $cacheModifierParam")
(tags, partialFunctionNames, languageParam, contentParam, apiCollectionIdParam, cacheModifierParam)
(tags, partialFunctionNames, locale, contentParam, apiCollectionIdParam, cacheModifierParam)
}

View File

@ -5,7 +5,6 @@ import code.api.Constant.PARAM_LOCALE
import java.util.{Date, Locale}
import code.webuiprops.MappedWebUiPropsProvider.getWebUiPropsValue
import com.openbankproject.commons.model.enums.LanguageParam
import net.liftweb.common.Full
import net.liftweb.http.S
import net.liftweb.http.provider.HTTPCookie
@ -49,8 +48,8 @@ object I18NUtil {
}
object ResourceDocTranslation {
def summary(operationId: String, language: Option[LanguageParam], default: String): String = {
language match {
def summary(operationId: String, locale: Option[String], default: String): String = {
locale match {
case Some(locale) =>
val webUiKey = s"webui_resource_doc_operation_id_${operationId}_summary_${locale}"
getWebUiPropsValue(webUiKey, default)
@ -58,7 +57,7 @@ object I18NUtil {
default
}
}
def description(operationId: String, language: Option[LanguageParam], default: String): String = {
def description(operationId: String, language: Option[String], default: String): String = {
language match {
case Some(locale) =>
val webUiKey = s"webui_resource_doc_operation_id_${operationId}_description_${locale}"

View File

@ -23,9 +23,6 @@ import code.util.Helper.MdcLoggable
import org.apache.commons.lang3.StringUtils
import java.util.concurrent.ConcurrentHashMap
import java.util.regex.Pattern
import com.openbankproject.commons.model.enums.LanguageParam
import java.lang.reflect.Field
object JSONFactory1_4_0 extends MdcLoggable{
@ -519,7 +516,7 @@ object JSONFactory1_4_0 extends MdcLoggable{
private val createResourceDocJsonMemo = new ConcurrentHashMap[ResourceDoc, ResourceDocJson]
def createResourceDocJson(rd: ResourceDoc, isVersion4OrHigher:Boolean, languageParam: Option[LanguageParam]) : ResourceDocJson = {
def createResourceDocJson(rd: ResourceDoc, isVersion4OrHigher:Boolean, locale: Option[String]) : ResourceDocJson = {
// We MUST recompute all resource doc values due to translation via Web UI props
val endpointTags = getAllEndpointTagsBox(rd.operationId).map(endpointTag =>ResourceDocTag(endpointTag.tagName))
val resourceDocUpdatedTags: ResourceDoc = rd.copy(tags = endpointTags++ rd.tags)
@ -558,12 +555,12 @@ object JSONFactory1_4_0 extends MdcLoggable{
val resourceDocDescription = I18NUtil.ResourceDocTranslation.description(
resourceDocUpdatedTags.operationId,
languageParam,
locale,
resourceDocUpdatedTags.description.stripMargin.trim
)
val description = resourceDocDescription ++ fieldsDescription
val summary = resourceDocUpdatedTags.summary.replaceFirst("""\.(\s*)$""", "$1") // remove the ending dot in summary
val translatedSummary = I18NUtil.ResourceDocTranslation.summary(resourceDocUpdatedTags.operationId, languageParam, summary)
val translatedSummary = I18NUtil.ResourceDocTranslation.summary(resourceDocUpdatedTags.operationId, locale, summary)
ResourceDocJson(
operation_id = resourceDocUpdatedTags.operationId,
@ -590,14 +587,14 @@ object JSONFactory1_4_0 extends MdcLoggable{
})
}
def createResourceDocsJson(resourceDocList: List[ResourceDoc], isVersion4OrHigher:Boolean, languageParam: Option[LanguageParam]) : ResourceDocsJson = {
def createResourceDocsJson(resourceDocList: List[ResourceDoc], isVersion4OrHigher:Boolean, locale: Option[String]) : ResourceDocsJson = {
if(isVersion4OrHigher){
ResourceDocsJson(
resourceDocList.map(createResourceDocJson(_,isVersion4OrHigher, languageParam)),
resourceDocList.map(createResourceDocJson(_,isVersion4OrHigher, locale)),
meta=Some(ResourceDocMeta(new Date(), resourceDocList.length))
)
} else {
ResourceDocsJson(resourceDocList.map(createResourceDocJson(_,false, languageParam)))
ResourceDocsJson(resourceDocList.map(createResourceDocJson(_,false, locale)))
}
}

View File

@ -3238,7 +3238,7 @@ trait APIMethods310 {
lazy val getMessageDocsSwagger: OBPEndpoint = {
case "message-docs" :: restConnectorVersion ::"swagger2.0" :: Nil JsonGet _ => {
val (resourceDocTags, partialFunctions, languageParam, contentParam, apiCollectionIdParam, cacheModifierParam) = ResourceDocsAPIMethodsUtil.getParams()
val (resourceDocTags, partialFunctions, locale, contentParam, apiCollectionIdParam, cacheModifierParam) = ResourceDocsAPIMethodsUtil.getParams()
cc => {
for {
(_, callContext) <- anonymousAccess(cc)

View File

@ -189,13 +189,6 @@ object DynamicEntityOperation extends OBPEnumeration[DynamicEntityOperation] {
object DELETE extends Value
}
sealed trait LanguageParam extends EnumValue
object LanguageParam extends OBPEnumeration[LanguageParam] {
object EN extends Value
object ES extends Value
object ZH extends Value
}
sealed trait ContentParam extends EnumValue
object ContentParam extends OBPEnumeration[ContentParam] {
object DYNAMIC extends Value