Skip to content

Commit

Permalink
feat: add 'yapi.no_update.description' to stop api description updates
Browse files Browse the repository at this point in the history
  • Loading branch information
tangcent committed Oct 12, 2024
1 parent bf67a5c commit 2e3bfaa
Show file tree
Hide file tree
Showing 35 changed files with 248 additions and 104 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.CommonDataKeys
import com.intellij.openapi.project.Project
import com.itangcent.idea.plugin.api.export.ExportDoc
import com.itangcent.idea.plugin.api.export.condition.markAsSimple
import com.itangcent.idea.plugin.condition.markAsSimple
import com.itangcent.idea.plugin.api.export.core.ClassExporter
import com.itangcent.idea.plugin.api.export.core.CompositeClassExporter
import com.itangcent.idea.plugin.api.export.core.ConfigurableMethodFilter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import com.itangcent.common.utils.*
import com.itangcent.http.RequestUtils
import com.itangcent.idea.plugin.api.ClassApiExporterHelper
import com.itangcent.idea.plugin.api.MethodInferHelper
import com.itangcent.idea.plugin.api.export.condition.ConditionOnDoc
import com.itangcent.idea.plugin.condition.ConditionOnDoc
import com.itangcent.idea.plugin.api.export.rule.RequestRuleWrap
import com.itangcent.idea.plugin.api.export.spring.SpringClassName
import com.itangcent.idea.plugin.settings.helper.IntelligentSettingsHelper
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import com.itangcent.common.utils.Extensible
import com.itangcent.common.utils.notNullOrBlank
import com.itangcent.common.utils.notNullOrEmpty
import com.itangcent.idea.condition.annotation.ConditionOnClass
import com.itangcent.idea.plugin.api.export.condition.ConditionOnSimple
import com.itangcent.idea.plugin.condition.ConditionOnSimple
import com.itangcent.idea.plugin.api.export.core.*
import com.itangcent.idea.plugin.api.export.spring.SpringRequestClassExporter
import com.itangcent.idea.plugin.condition.ConditionOnSetting
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ import com.itangcent.common.utils.notNullOrEmpty
import com.itangcent.idea.plugin.api.ClassApiExporterHelper
import com.itangcent.idea.plugin.api.MethodInferHelper
import com.itangcent.idea.plugin.api.export.Orders
import com.itangcent.idea.plugin.api.export.condition.ConditionOnDoc
import com.itangcent.idea.plugin.api.export.condition.ConditionOnSimple
import com.itangcent.idea.plugin.condition.ConditionOnDoc
import com.itangcent.idea.plugin.condition.ConditionOnSimple
import com.itangcent.idea.plugin.api.export.core.*
import com.itangcent.idea.plugin.api.export.core.LinkResolver
import com.itangcent.idea.plugin.condition.ConditionOnSetting
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import com.itangcent.common.model.URL
import com.itangcent.common.utils.notNullOrBlank
import com.itangcent.common.utils.safe
import com.itangcent.idea.plugin.api.export.Orders
import com.itangcent.idea.plugin.api.export.condition.ConditionOnSimple
import com.itangcent.idea.plugin.condition.ConditionOnSimple
import com.itangcent.idea.plugin.api.export.core.*
import com.itangcent.idea.plugin.api.export.generic.GenericClassExportRuleKeys.HTTP_METHOD
import com.itangcent.idea.plugin.api.export.generic.GenericClassExportRuleKeys.HTTP_PATH
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ import com.itangcent.common.logger.traceError
import com.itangcent.common.model.MethodDoc
import com.itangcent.idea.plugin.api.ClassApiExporterHelper
import com.itangcent.idea.plugin.api.export.Orders
import com.itangcent.idea.plugin.api.export.condition.ConditionOnDoc
import com.itangcent.idea.plugin.api.export.condition.ConditionOnSimple
import com.itangcent.idea.plugin.condition.ConditionOnDoc
import com.itangcent.idea.plugin.condition.ConditionOnSimple
import com.itangcent.idea.plugin.api.export.core.*
import com.itangcent.idea.plugin.condition.ConditionOnSetting
import com.itangcent.idea.plugin.settings.SettingBinder
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ import com.itangcent.common.logger.traceError
import com.itangcent.common.model.Request
import com.itangcent.idea.plugin.api.ClassApiExporterHelper
import com.itangcent.idea.plugin.api.export.Orders
import com.itangcent.idea.plugin.api.export.condition.ConditionOnDoc
import com.itangcent.idea.plugin.api.export.condition.ConditionOnSimple
import com.itangcent.idea.plugin.condition.ConditionOnDoc
import com.itangcent.idea.plugin.condition.ConditionOnSimple
import com.itangcent.idea.plugin.api.export.core.*
import com.itangcent.idea.plugin.condition.ConditionOnSetting
import com.itangcent.idea.psi.PsiMethodResource
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import com.itangcent.common.model.Request
import com.itangcent.common.model.URL
import com.itangcent.common.utils.notNullOrBlank
import com.itangcent.idea.condition.annotation.ConditionOnClass
import com.itangcent.idea.plugin.api.export.condition.ConditionOnSimple
import com.itangcent.idea.plugin.condition.ConditionOnSimple
import com.itangcent.idea.plugin.api.export.core.*
import com.itangcent.idea.plugin.condition.ConditionOnSetting
import com.itangcent.intellij.config.rule.computer
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,10 @@ import com.intellij.psi.PsiElement
import com.intellij.psi.PsiMethod
import com.itangcent.common.logger.traceError
import com.itangcent.common.model.Request
import com.itangcent.common.utils.stream
import com.itangcent.idea.condition.annotation.ConditionOnClass
import com.itangcent.idea.plugin.api.ClassApiExporterHelper
import com.itangcent.idea.plugin.api.export.condition.ConditionOnDoc
import com.itangcent.idea.plugin.api.export.condition.ConditionOnSimple
import com.itangcent.idea.plugin.condition.ConditionOnDoc
import com.itangcent.idea.plugin.condition.ConditionOnSimple
import com.itangcent.idea.plugin.api.export.core.ApiHelper
import com.itangcent.idea.plugin.api.export.core.ClassExportRuleKeys
import com.itangcent.idea.plugin.api.export.core.ClassExporter
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.itangcent.idea.plugin.api.export.postman

import com.itangcent.condition.Exclusion
import com.itangcent.idea.plugin.api.export.condition.ConditionOnChannel
import com.itangcent.idea.plugin.condition.ConditionOnChannel
import com.itangcent.idea.plugin.api.export.core.EasyApiConfigProvider
import com.itangcent.intellij.config.LocalFileSearchConfigProvider
import com.itangcent.order.Order
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.itangcent.idea.plugin.api.export.postman
import com.google.inject.Inject
import com.itangcent.common.model.*
import com.itangcent.common.utils.notNullOrBlank
import com.itangcent.idea.plugin.api.export.condition.ConditionOnChannel
import com.itangcent.idea.plugin.condition.ConditionOnChannel
import com.itangcent.idea.plugin.api.export.core.ExportContext
import com.itangcent.idea.plugin.api.export.core.MethodExportContext
import com.itangcent.idea.plugin.api.export.core.RequestBuilderListener
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,10 @@ import com.intellij.psi.PsiElement
import com.intellij.psi.PsiMethod
import com.itangcent.common.logger.traceError
import com.itangcent.common.model.Request
import com.itangcent.common.utils.stream
import com.itangcent.idea.condition.annotation.ConditionOnClass
import com.itangcent.idea.plugin.api.ClassApiExporterHelper
import com.itangcent.idea.plugin.api.export.condition.ConditionOnDoc
import com.itangcent.idea.plugin.api.export.condition.ConditionOnSimple
import com.itangcent.idea.plugin.condition.ConditionOnDoc
import com.itangcent.idea.plugin.condition.ConditionOnSimple
import com.itangcent.idea.plugin.api.export.core.ApiHelper
import com.itangcent.idea.plugin.api.export.core.ClassExportRuleKeys
import com.itangcent.idea.plugin.api.export.core.ClassExporter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import com.itangcent.common.model.Request
import com.itangcent.common.model.URL
import com.itangcent.common.utils.*
import com.itangcent.idea.condition.annotation.ConditionOnClass
import com.itangcent.idea.plugin.api.export.condition.ConditionOnSimple
import com.itangcent.idea.plugin.condition.ConditionOnSimple
import com.itangcent.idea.plugin.api.export.core.*
import com.itangcent.intellij.config.rule.computer
import com.itangcent.intellij.jvm.AnnotationHelper
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,12 +73,12 @@ open class DefaultYapiApiHelper : AbstractYapiApiHelper(), YapiApiHelper {
return jsonArray
}

private val saveInterceptor: YapiSaveInterceptor by lazy {
SpiCompositeLoader.loadComposite()
private val saveInterceptorList: Array<YapiSaveInterceptor> by lazy {
SpiCompositeLoader.load(actionContext)
}

override fun saveApiInfo(apiInfo: HashMap<String, Any?>): Boolean {
if (!saveInterceptor.beforeSaveApi(this, apiInfo)) {
if (saveInterceptorList.any { !it.beforeSaveApi(this, apiInfo) }) {
return false
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,20 +58,29 @@ fun YapiApiHelper.listApis(token: String, catId: String): JsonArray? {
}

fun YapiApiHelper.existed(apiInfo: HashMap<String, Any?>): Boolean {
val path = apiInfo["path"] ?: return false
val method = apiInfo["method"] ?: return false
val token = apiInfo["token"] as? String ?: return false
val projectId: String = this.getProjectIdByToken(token) ?: return false
val carts = this.findCarts(projectId, token) ?: return false
return this.findExistApi(apiInfo) != null
}

fun YapiApiHelper.findExistApi(apiInfo: HashMap<String, Any?>): JsonObject? {
val path = apiInfo["path"] as? String ?: return null
val method = apiInfo["method"] as? String ?: return null
val token = apiInfo["token"] as? String ?: return null
return this.findExistApi(token, path, method)
}

fun YapiApiHelper.findExistApi(token: String, path: String, method: String): JsonObject? {
val projectId: String = this.getProjectIdByToken(token) ?: return null
val carts = this.findCarts(projectId, token) ?: return null
for (cart in carts) {
val cart_id = (cart as? Map<*, *>)?.get("_id")?.toString() ?: continue
if (this.listApis(token, cart_id, null)?.any { api ->
api.sub("path")?.asString == path && api.sub("method")?.asString == method
} == true) {
return true
val catId = (cart as? Map<*, *>)?.get("_id")?.toString() ?: continue
val api = this.listApis(token, catId, null)?.find { api ->
api.sub("path")?.asString == path && api.sub("method")?.asString == method
}
if (api != null) {
return api as JsonObject
}
}
return false
return null
}

fun YapiApiHelper.getCartForFolder(folder: Folder, privateToken: String): CartInfo? {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.itangcent.idea.plugin.api.export.yapi

import com.itangcent.condition.Exclusion
import com.itangcent.idea.plugin.api.export.condition.ConditionOnChannel
import com.itangcent.idea.plugin.condition.ConditionOnChannel
import com.itangcent.idea.plugin.api.export.core.EasyApiConfigProvider
import com.itangcent.intellij.config.LocalFileSearchConfigProvider
import com.itangcent.order.Order
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import com.itangcent.common.model.Request
import com.itangcent.common.model.URL
import com.itangcent.common.utils.append
import com.itangcent.condition.Exclusion
import com.itangcent.idea.plugin.api.export.condition.ConditionOnChannel
import com.itangcent.idea.plugin.condition.ConditionOnChannel
import com.itangcent.idea.plugin.api.export.core.MethodExportContext
import com.itangcent.idea.plugin.api.export.core.addParam
import com.itangcent.idea.plugin.api.export.core.addPathParam
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.itangcent.idea.plugin.api.export.yapi
import com.google.inject.Inject
import com.itangcent.common.model.MethodDoc
import com.itangcent.common.model.Param
import com.itangcent.idea.plugin.api.export.condition.ConditionOnChannel
import com.itangcent.idea.plugin.condition.ConditionOnChannel
import com.itangcent.idea.plugin.api.export.core.ExportContext
import com.itangcent.idea.plugin.api.export.core.MethodDocBuilderListener
import com.itangcent.idea.plugin.api.export.core.MethodExportContext
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import com.google.inject.Inject
import com.itangcent.common.constant.Attrs
import com.itangcent.common.model.*
import com.itangcent.common.utils.*
import com.itangcent.idea.plugin.api.export.condition.ConditionOnChannel
import com.itangcent.idea.plugin.condition.ConditionOnChannel
import com.itangcent.idea.plugin.api.export.core.ExportContext
import com.itangcent.idea.plugin.api.export.core.MethodExportContext
import com.itangcent.idea.plugin.api.export.core.RequestBuilderListener
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ package com.itangcent.idea.plugin.api.export.yapi

import com.intellij.openapi.ui.Messages
import com.itangcent.common.concurrent.ValueHolder
import com.itangcent.idea.plugin.condition.ConditionOnConfig
import com.itangcent.idea.plugin.condition.ConditionOnSetting
import com.itangcent.idea.swing.MessagesHelper
import com.itangcent.intellij.context.ActionContext
import com.itangcent.intellij.extend.sub

/**
* Workflow interface that allows for customized yapi save action.
Expand Down Expand Up @@ -68,7 +70,8 @@ class AlwaysAskYapiSaveInterceptor : YapiSaveInterceptor {
val context = ActionContext.getContext() ?: return true
context.instance(MessagesHelper::class).showAskWithApplyAllDialog(
"The api [${apiInfo["title"]}] already existed in the project.\n" +
"Do you want update it?", arrayOf("Update", "Skip", "Cancel")) { ret, applyAll ->
"Do you want update it?", arrayOf("Update", "Skip", "Cancel")
) { ret, applyAll ->
if (ret == Messages.CANCEL) {
context.stop()
valueHolder.success(false)
Expand All @@ -91,3 +94,31 @@ class AlwaysAskYapiSaveInterceptor : YapiSaveInterceptor {
return valueHolder.value() ?: false
}
}

/**
* A [YapiSaveInterceptor] that prevents overwriting the existing description and markdown fields in YAPI when saving API details.
* Only works when the configuration "yapi.no_update.description" is set to true.
*/
@ConditionOnConfig("yapi.no_update.description", havingValue = "true")
class NoUpdateDescriptionYapiSaveInterceptor : YapiSaveInterceptor {
override fun beforeSaveApi(apiHelper: YapiApiHelper, apiInfo: HashMap<String, Any?>): Boolean {
recoverDescription(apiHelper, apiInfo)
return true
}

/**
* Retrieves the existing API information from YAPI and copies the description and markdown
* fields to the new API information to prevent them from being overwritten.
*/
private fun recoverDescription(apiHelper: YapiApiHelper, apiInfo: HashMap<String, Any?>) {
val existedApi = apiHelper.findExistApi(apiInfo) ?: return
val apiId = existedApi.sub("_id")?.asString ?: return
val existedApiInfo = apiHelper.getApiInfo(apiInfo["token"] as String, apiId)

val existedDescription = existedApiInfo.sub("desc")?.asString ?: ""
apiInfo["desc"] = existedDescription

val existedMarkdown = existedApiInfo.sub("markdown")?.asString ?: ""
apiInfo["markdown"] = existedMarkdown
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import com.itangcent.common.model.Request
import com.itangcent.common.model.URL
import com.itangcent.common.utils.append
import com.itangcent.condition.Exclusion
import com.itangcent.idea.plugin.api.export.condition.ConditionOnChannel
import com.itangcent.idea.plugin.condition.ConditionOnChannel
import com.itangcent.idea.plugin.api.export.core.MethodExportContext
import com.itangcent.idea.plugin.api.export.core.addParam
import com.itangcent.idea.plugin.api.export.core.addPathParam
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.itangcent.idea.plugin.api.export.condition
package com.itangcent.idea.plugin.condition

/**
* Conditional that only matches when exporting to the specified channel.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.itangcent.idea.plugin.condition

/**
* Conditional that only matches when the specified config is present.
* @param value the config key
*
* @author tangcent
* @date 2024/10/10
*/
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class ConditionOnConfig(vararg val value: String, val havingValue: String = "")
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.itangcent.idea.plugin.api.export.condition
package com.itangcent.idea.plugin.condition

/**
* Conditional that only matches when exporting the specified type of docs.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.itangcent.idea.plugin.api.export.condition
package com.itangcent.idea.plugin.condition

import com.itangcent.idea.plugin.api.export.condition.ConditionOnSimple.Companion.CACHE_NAME
import com.itangcent.idea.plugin.condition.ConditionOnSimple.Companion.CACHE_NAME
import com.itangcent.intellij.context.ActionContext

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.itangcent.idea.plugin.api.export.condition
package com.itangcent.idea.plugin.condition

import com.itangcent.condition.AnnotatedCondition
import com.itangcent.idea.plugin.api.export.ExportChannel
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.itangcent.idea.plugin.condition

import com.itangcent.common.utils.asBool
import com.itangcent.condition.AnnotatedCondition
import com.itangcent.intellij.config.ConfigReader
import com.itangcent.intellij.context.ActionContext

/**
* Condition that checks for [ConditionOnConfig].
*/
class OnConfigCondition : AnnotatedCondition<ConditionOnConfig>() {

override fun matches(actionContext: ActionContext, annotation: ConditionOnConfig): Boolean {
val valueChecker = getValueChecker(annotation.havingValue)
val configReader = actionContext.instance(ConfigReader::class)
annotation.value.forEach { property ->
if (!valueChecker(configReader.first(property))) {
return false
}
}
return true
}

private fun getValueChecker(havingValue: String): (Any?) -> Boolean {
if (havingValue == "") {
return { it.asBool() == true }
}
return { it?.toString() == havingValue }
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.itangcent.idea.plugin.api.export.condition
package com.itangcent.idea.plugin.condition

import com.itangcent.condition.AnnotatedCondition
import com.itangcent.idea.plugin.api.export.ExportDoc
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.itangcent.idea.plugin.api.export.condition
package com.itangcent.idea.plugin.condition

import com.itangcent.condition.AnnotatedCondition
import com.itangcent.intellij.context.ActionContext
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
com.itangcent.idea.condition.OnClassCondition
com.itangcent.idea.condition.OnMissingClassCondition
com.itangcent.idea.plugin.api.export.condition.OnChannelCondition
com.itangcent.idea.plugin.api.export.condition.OnDocCondition
com.itangcent.idea.plugin.api.export.condition.OnSimpleCondition
com.itangcent.idea.plugin.condition.OnSettingCondition
com.itangcent.idea.plugin.condition.OnChannelCondition
com.itangcent.idea.plugin.condition.OnDocCondition
com.itangcent.idea.plugin.condition.OnSimpleCondition
com.itangcent.idea.plugin.condition.OnSettingCondition
com.itangcent.idea.plugin.condition.OnConfigCondition
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
com.itangcent.idea.plugin.api.export.yapi.AlwaysUpdateYapiSaveInterceptor
com.itangcent.idea.plugin.api.export.yapi.NeverUpdateYapiSaveInterceptor
com.itangcent.idea.plugin.api.export.yapi.AlwaysAskYapiSaveInterceptor
com.itangcent.idea.plugin.api.export.yapi.NoUpdateDescriptionYapiSaveInterceptor
Loading

0 comments on commit 2e3bfaa

Please sign in to comment.