setup_endpoint.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  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/db"
  6. "github.com/langgenius/dify-plugin-daemon/internal/service/install_service"
  7. "github.com/langgenius/dify-plugin-daemon/internal/types/entities"
  8. "github.com/langgenius/dify-plugin-daemon/internal/types/entities/plugin_entities"
  9. "github.com/langgenius/dify-plugin-daemon/internal/types/models"
  10. )
  11. func SetupEndpoint(
  12. tenant_id string,
  13. user_id string,
  14. plugin_unique_identifier plugin_entities.PluginUniqueIdentifier,
  15. settings map[string]any,
  16. ) *entities.Response {
  17. // try find plugin installation
  18. installation, err := db.GetOne[models.PluginInstallation](
  19. db.Equal("tenant_id", tenant_id),
  20. db.Equal("plugin_unique_identifier", plugin_unique_identifier.String()),
  21. )
  22. if err != nil {
  23. return entities.NewErrorResponse(-404, fmt.Sprintf("failed to find plugin installation: %v", err))
  24. }
  25. // try get plugin
  26. plugin, err := db.GetOne[models.Plugin](
  27. db.Equal("plugin_unique_identifier", plugin_unique_identifier.String()),
  28. )
  29. if err != nil {
  30. return entities.NewErrorResponse(-404, fmt.Sprintf("failed to find plugin: %v", err))
  31. }
  32. declaration, err := plugin.GetDeclaration()
  33. if err != nil {
  34. return entities.NewErrorResponse(-404, fmt.Sprintf("failed to get plugin declaration: %v", err))
  35. }
  36. if !declaration.Resource.Permission.AllowRegisterEndpoint() {
  37. return entities.NewErrorResponse(-403, "permission denied")
  38. }
  39. if declaration.Endpoint == nil {
  40. return entities.NewErrorResponse(-404, "plugin does not have an endpoint")
  41. }
  42. // encrypt settings
  43. encrypted_settings, err := dify_invocation.InvokeEncrypt(
  44. &dify_invocation.InvokeEncryptRequest{
  45. BaseInvokeDifyRequest: dify_invocation.BaseInvokeDifyRequest{
  46. TenantId: tenant_id,
  47. UserId: user_id,
  48. Type: dify_invocation.INVOKE_TYPE_ENCRYPT,
  49. },
  50. InvokeEncryptSchema: dify_invocation.InvokeEncryptSchema{
  51. Opt: dify_invocation.ENCRYPT_OPT_ENCRYPT,
  52. Namespace: dify_invocation.ENCRYPT_NAMESPACE_ENDPOINT,
  53. Identity: installation.ID,
  54. Data: settings,
  55. Config: declaration.Endpoint.Settings,
  56. },
  57. },
  58. )
  59. if err != nil {
  60. return entities.NewErrorResponse(-500, fmt.Sprintf("failed to encrypt settings: %v", err))
  61. }
  62. _, err = install_service.InstallEndpoint(
  63. plugin_unique_identifier,
  64. installation.ID,
  65. tenant_id,
  66. user_id,
  67. encrypted_settings,
  68. )
  69. if err != nil {
  70. return entities.NewErrorResponse(-500, fmt.Sprintf("failed to setup endpoint: %v", err))
  71. }
  72. return entities.NewSuccessResponse(nil)
  73. }
  74. func ListEndpoints(tenant_id string, page int, page_size int) *entities.Response {
  75. endpoints, err := db.GetAll[models.Endpoint](
  76. db.Equal("tenant_id", tenant_id),
  77. db.OrderBy("created_at", true),
  78. db.Page(page, page_size),
  79. )
  80. if err != nil {
  81. return entities.NewErrorResponse(-500, fmt.Sprintf("failed to list endpoints: %v", err))
  82. }
  83. // decrypt settings
  84. for i, endpoint := range endpoints {
  85. plugin_installation, err := db.GetOne[models.PluginInstallation](
  86. db.Equal("plugin_id", endpoint.PluginID),
  87. db.Equal("tenant_id", tenant_id),
  88. )
  89. if err != nil {
  90. return entities.NewErrorResponse(-404, fmt.Sprintf("failed to find plugin installation: %v", err))
  91. }
  92. plugin, err := db.GetOne[models.Plugin](
  93. db.Equal("plugin_unique_identifier", plugin_installation.PluginUniqueIdentifier),
  94. )
  95. if err != nil {
  96. return entities.NewErrorResponse(-404, fmt.Sprintf("failed to find plugin: %v", err))
  97. }
  98. plugin_declaration, err := plugin.GetDeclaration()
  99. if err != nil {
  100. return entities.NewErrorResponse(-404, fmt.Sprintf("failed to get plugin declaration: %v", err))
  101. }
  102. if plugin_declaration.Endpoint == nil {
  103. return entities.NewErrorResponse(-404, "plugin does not have an endpoint")
  104. }
  105. decrypted_settings, err := dify_invocation.InvokeEncrypt(&dify_invocation.InvokeEncryptRequest{
  106. BaseInvokeDifyRequest: dify_invocation.BaseInvokeDifyRequest{
  107. TenantId: tenant_id,
  108. UserId: "",
  109. Type: dify_invocation.INVOKE_TYPE_ENCRYPT,
  110. },
  111. InvokeEncryptSchema: dify_invocation.InvokeEncryptSchema{
  112. Opt: dify_invocation.ENCRYPT_OPT_DECRYPT,
  113. Namespace: dify_invocation.ENCRYPT_NAMESPACE_ENDPOINT,
  114. Identity: endpoint.ID,
  115. Data: endpoint.GetSettings(),
  116. Config: plugin_declaration.Endpoint.Settings,
  117. },
  118. })
  119. if err != nil {
  120. return entities.NewErrorResponse(-500, fmt.Sprintf("failed to decrypt settings: %v", err))
  121. }
  122. endpoint.SetSettings(decrypted_settings)
  123. endpoints[i] = endpoint
  124. }
  125. return entities.NewSuccessResponse(endpoints)
  126. }
  127. func RemoveEndpoint(endpoint_id string, tenant_id string) *entities.Response {
  128. endpoint, err := db.GetOne[models.Endpoint](
  129. db.Equal("endpoint_id", endpoint_id),
  130. db.Equal("tenant_id", tenant_id),
  131. )
  132. if err != nil {
  133. return entities.NewErrorResponse(-404, fmt.Sprintf("failed to find endpoint: %v", err))
  134. }
  135. err = install_service.UninstallEndpoint(&endpoint)
  136. if err != nil {
  137. return entities.NewErrorResponse(-500, fmt.Sprintf("failed to remove endpoint: %v", err))
  138. }
  139. return entities.NewSuccessResponse(nil)
  140. }