setup_endpoint.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. )
  12. func SetupEndpoint(
  13. tenant_id string,
  14. user_id string,
  15. plugin_unique_identifier plugin_entities.PluginUniqueIdentifier,
  16. settings map[string]any,
  17. ) *entities.Response {
  18. // try find plugin installation
  19. installation, err := db.GetOne[models.PluginInstallation](
  20. db.Equal("tenant_id", tenant_id),
  21. db.Equal("plugin_unique_identifier", plugin_unique_identifier.String()),
  22. )
  23. if err != nil {
  24. return entities.NewErrorResponse(-404, fmt.Sprintf("failed to find plugin installation: %v", err))
  25. }
  26. // try get plugin
  27. plugin, err := db.GetOne[models.Plugin](
  28. db.Equal("plugin_unique_identifier", plugin_unique_identifier.String()),
  29. )
  30. if err != nil {
  31. return entities.NewErrorResponse(-404, fmt.Sprintf("failed to find plugin: %v", err))
  32. }
  33. declaration, err := plugin.GetDeclaration()
  34. if err != nil {
  35. return entities.NewErrorResponse(-404, fmt.Sprintf("failed to get plugin declaration: %v", err))
  36. }
  37. if !declaration.Resource.Permission.AllowRegisterEndpoint() {
  38. return entities.NewErrorResponse(-403, "permission denied")
  39. }
  40. if declaration.Endpoint == nil {
  41. return entities.NewErrorResponse(-404, "plugin does not have an endpoint")
  42. }
  43. manager := plugin_manager.Manager()
  44. if manager == nil {
  45. return entities.NewErrorResponse(-500, "failed to get plugin manager")
  46. }
  47. // encrypt settings
  48. encrypted_settings, err := manager.BackwardsInvocation().InvokeEncrypt(
  49. &dify_invocation.InvokeEncryptRequest{
  50. BaseInvokeDifyRequest: dify_invocation.BaseInvokeDifyRequest{
  51. TenantId: tenant_id,
  52. UserId: user_id,
  53. Type: dify_invocation.INVOKE_TYPE_ENCRYPT,
  54. },
  55. InvokeEncryptSchema: dify_invocation.InvokeEncryptSchema{
  56. Opt: dify_invocation.ENCRYPT_OPT_ENCRYPT,
  57. Namespace: dify_invocation.ENCRYPT_NAMESPACE_ENDPOINT,
  58. Identity: installation.ID,
  59. Data: settings,
  60. Config: declaration.Endpoint.Settings,
  61. },
  62. },
  63. )
  64. if err != nil {
  65. return entities.NewErrorResponse(-500, fmt.Sprintf("failed to encrypt settings: %v", err))
  66. }
  67. _, err = install_service.InstallEndpoint(
  68. plugin_unique_identifier,
  69. installation.ID,
  70. tenant_id,
  71. user_id,
  72. encrypted_settings,
  73. )
  74. if err != nil {
  75. return entities.NewErrorResponse(-500, fmt.Sprintf("failed to setup endpoint: %v", err))
  76. }
  77. return entities.NewSuccessResponse(nil)
  78. }
  79. func RemoveEndpoint(endpoint_id string, tenant_id string) *entities.Response {
  80. endpoint, err := db.GetOne[models.Endpoint](
  81. db.Equal("endpoint_id", endpoint_id),
  82. db.Equal("tenant_id", tenant_id),
  83. )
  84. if err != nil {
  85. return entities.NewErrorResponse(-404, fmt.Sprintf("failed to find endpoint: %v", err))
  86. }
  87. err = install_service.UninstallEndpoint(&endpoint)
  88. if err != nil {
  89. return entities.NewErrorResponse(-500, fmt.Sprintf("failed to remove endpoint: %v", err))
  90. }
  91. return entities.NewSuccessResponse(nil)
  92. }