setup_endpoint.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. package service
  2. import (
  3. "fmt"
  4. "github.com/langgenius/dify-plugin-daemon/internal/core/dify_invocation"
  5. "github.com/langgenius/dify-plugin-daemon/internal/core/plugin_manager"
  6. "github.com/langgenius/dify-plugin-daemon/internal/db"
  7. "github.com/langgenius/dify-plugin-daemon/internal/service/install_service"
  8. "github.com/langgenius/dify-plugin-daemon/internal/types/entities"
  9. "github.com/langgenius/dify-plugin-daemon/internal/types/entities/plugin_entities"
  10. "github.com/langgenius/dify-plugin-daemon/internal/types/models"
  11. "github.com/langgenius/dify-plugin-daemon/internal/utils/encryption"
  12. )
  13. func SetupEndpoint(
  14. tenant_id string,
  15. user_id string,
  16. plugin_unique_identifier plugin_entities.PluginUniqueIdentifier,
  17. settings map[string]any,
  18. ) *entities.Response {
  19. // try find plugin installation
  20. installation, err := db.GetOne[models.PluginInstallation](
  21. db.Equal("tenant_id", tenant_id),
  22. db.Equal("plugin_unique_identifier", plugin_unique_identifier.String()),
  23. )
  24. if err != nil {
  25. return entities.NewErrorResponse(-404, fmt.Sprintf("failed to find plugin installation: %v", err))
  26. }
  27. // try get plugin
  28. plugin, err := db.GetOne[models.Plugin](
  29. db.Equal("plugin_unique_identifier", plugin_unique_identifier.String()),
  30. )
  31. if err != nil {
  32. return entities.NewErrorResponse(-404, fmt.Sprintf("failed to find plugin: %v", err))
  33. }
  34. declaration := plugin.Declaration
  35. if !declaration.Resource.Permission.AllowRegisterEndpoint() {
  36. return entities.NewErrorResponse(-403, "permission denied")
  37. }
  38. endpoint, err := install_service.InstallEndpoint(
  39. plugin_unique_identifier,
  40. installation.ID,
  41. tenant_id,
  42. user_id,
  43. map[string]any{},
  44. )
  45. if err != nil {
  46. return entities.NewErrorResponse(-500, fmt.Sprintf("failed to setup endpoint: %v", err))
  47. }
  48. if declaration.Endpoint == nil {
  49. return entities.NewErrorResponse(-404, "plugin does not have an endpoint")
  50. }
  51. manager := plugin_manager.Manager()
  52. if manager == nil {
  53. return entities.NewErrorResponse(-500, "failed to get plugin manager")
  54. }
  55. // encrypt settings
  56. encrypted_settings, err := manager.BackwardsInvocation().InvokeEncrypt(
  57. &dify_invocation.InvokeEncryptRequest{
  58. BaseInvokeDifyRequest: dify_invocation.BaseInvokeDifyRequest{
  59. TenantId: tenant_id,
  60. UserId: user_id,
  61. Type: dify_invocation.INVOKE_TYPE_ENCRYPT,
  62. },
  63. InvokeEncryptSchema: dify_invocation.InvokeEncryptSchema{
  64. Opt: dify_invocation.ENCRYPT_OPT_ENCRYPT,
  65. Namespace: dify_invocation.ENCRYPT_NAMESPACE_ENDPOINT,
  66. Identity: endpoint.ID,
  67. Data: settings,
  68. Config: declaration.Endpoint.Settings,
  69. },
  70. },
  71. )
  72. if err != nil {
  73. return entities.NewErrorResponse(-500, fmt.Sprintf("failed to encrypt settings: %v", err))
  74. }
  75. if err := install_service.UpdateEndpoint(endpoint, encrypted_settings); err != nil {
  76. return entities.NewErrorResponse(-500, fmt.Sprintf("failed to update endpoint: %v", err))
  77. }
  78. return entities.NewSuccessResponse(nil)
  79. }
  80. func RemoveEndpoint(endpoint_id string, tenant_id string) *entities.Response {
  81. endpoint, err := db.GetOne[models.Endpoint](
  82. db.Equal("endpoint_id", endpoint_id),
  83. db.Equal("tenant_id", tenant_id),
  84. )
  85. if err != nil {
  86. return entities.NewErrorResponse(-404, fmt.Sprintf("failed to find endpoint: %v", err))
  87. }
  88. err = install_service.UninstallEndpoint(&endpoint)
  89. if err != nil {
  90. return entities.NewErrorResponse(-500, fmt.Sprintf("failed to remove endpoint: %v", err))
  91. }
  92. return entities.NewSuccessResponse(nil)
  93. }
  94. func UpdateEndpoint(endpoint_id string, tenant_id string, user_id string, settings map[string]any) *entities.Response {
  95. // get endpoint
  96. endpoint, err := db.GetOne[models.Endpoint](
  97. db.Equal("id", endpoint_id),
  98. db.Equal("tenant_id", tenant_id),
  99. )
  100. if err != nil {
  101. return entities.NewErrorResponse(-404, fmt.Sprintf("failed to find endpoint: %v", err))
  102. }
  103. // get plugin installation
  104. installation, err := db.GetOne[models.PluginInstallation](
  105. db.Equal("plugin_id", endpoint.PluginID),
  106. db.Equal("tenant_id", tenant_id),
  107. )
  108. if err != nil {
  109. return entities.NewErrorResponse(-404, fmt.Sprintf("failed to find plugin installation: %v", err))
  110. }
  111. // get plugin
  112. plugin, err := db.GetOne[models.Plugin](
  113. db.Equal("plugin_unique_identifier", installation.PluginUniqueIdentifier),
  114. )
  115. if err != nil {
  116. return entities.NewErrorResponse(-404, fmt.Sprintf("failed to find plugin: %v", err))
  117. }
  118. if plugin.Declaration.Endpoint == nil {
  119. return entities.NewErrorResponse(-404, "plugin does not have an endpoint")
  120. }
  121. // decrypt original settings
  122. manager := plugin_manager.Manager()
  123. if manager == nil {
  124. return entities.NewErrorResponse(-500, "failed to get plugin manager")
  125. }
  126. original_settings, err := manager.BackwardsInvocation().InvokeEncrypt(
  127. &dify_invocation.InvokeEncryptRequest{
  128. BaseInvokeDifyRequest: dify_invocation.BaseInvokeDifyRequest{
  129. TenantId: tenant_id,
  130. UserId: user_id,
  131. Type: dify_invocation.INVOKE_TYPE_ENCRYPT,
  132. },
  133. InvokeEncryptSchema: dify_invocation.InvokeEncryptSchema{
  134. Opt: dify_invocation.ENCRYPT_OPT_DECRYPT,
  135. Namespace: dify_invocation.ENCRYPT_NAMESPACE_ENDPOINT,
  136. Identity: installation.ID,
  137. Data: endpoint.GetSettings(),
  138. Config: plugin.Declaration.Endpoint.Settings,
  139. },
  140. },
  141. )
  142. if err != nil {
  143. return entities.NewErrorResponse(-500, fmt.Sprintf("failed to decrypt settings: %v", err))
  144. }
  145. masked_settings := encryption.MaskConfigCredentials(original_settings, plugin.Declaration.Endpoint.Settings)
  146. // check if settings is changed, replace the value is the same as masked_settings
  147. for setting_name, value := range settings {
  148. if masked_settings[setting_name] != value {
  149. settings[setting_name] = original_settings[setting_name]
  150. }
  151. }
  152. // encrypt settings
  153. encrypted_settings, err := manager.BackwardsInvocation().InvokeEncrypt(
  154. &dify_invocation.InvokeEncryptRequest{
  155. BaseInvokeDifyRequest: dify_invocation.BaseInvokeDifyRequest{
  156. TenantId: tenant_id,
  157. UserId: user_id,
  158. Type: dify_invocation.INVOKE_TYPE_ENCRYPT,
  159. },
  160. InvokeEncryptSchema: dify_invocation.InvokeEncryptSchema{
  161. Opt: dify_invocation.ENCRYPT_OPT_ENCRYPT,
  162. Namespace: dify_invocation.ENCRYPT_NAMESPACE_ENDPOINT,
  163. Identity: endpoint.ID,
  164. Data: settings,
  165. Config: plugin.Declaration.Endpoint.Settings,
  166. },
  167. },
  168. )
  169. if err != nil {
  170. return entities.NewErrorResponse(-500, fmt.Sprintf("failed to encrypt settings: %v", err))
  171. }
  172. // update endpoint
  173. if err := install_service.UpdateEndpoint(&endpoint, encrypted_settings); err != nil {
  174. return entities.NewErrorResponse(-500, fmt.Sprintf("failed to update endpoint: %v", err))
  175. }
  176. return entities.NewSuccessResponse(nil)
  177. }