state.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package install_service
  2. import (
  3. "encoding/json"
  4. "time"
  5. "github.com/langgenius/dify-plugin-daemon/internal/db"
  6. "github.com/langgenius/dify-plugin-daemon/internal/types/entities/plugin_entities"
  7. "github.com/langgenius/dify-plugin-daemon/internal/types/models"
  8. "github.com/langgenius/dify-plugin-daemon/internal/types/models/curd"
  9. "github.com/langgenius/dify-plugin-daemon/internal/utils/strings"
  10. )
  11. func InstallPlugin(
  12. tenant_id string,
  13. user_id string,
  14. runtime plugin_entities.PluginLifetime,
  15. ) (*models.Plugin, *models.PluginInstallation, error) {
  16. identity, err := runtime.Identity()
  17. if err != nil {
  18. return nil, nil, err
  19. }
  20. configuration := runtime.Configuration()
  21. plugin, installation, err := curd.InstallPlugin(
  22. tenant_id,
  23. identity,
  24. runtime.Type(),
  25. configuration,
  26. )
  27. if err != nil {
  28. return nil, nil, err
  29. }
  30. return plugin, installation, nil
  31. }
  32. func UninstallPlugin(
  33. tenant_id string,
  34. installation_id string,
  35. plugin_unique_identifier plugin_entities.PluginUniqueIdentifier,
  36. install_type plugin_entities.PluginRuntimeType,
  37. ) error {
  38. // delete the plugin from db
  39. _, err := curd.UninstallPlugin(tenant_id, plugin_unique_identifier, installation_id)
  40. if err != nil {
  41. return err
  42. }
  43. // delete endpoints if plugin is not installed through remote
  44. if install_type != plugin_entities.PLUGIN_RUNTIME_TYPE_REMOTE {
  45. if err := db.DeleteByCondition(models.Endpoint{
  46. PluginID: plugin_unique_identifier.PluginID(),
  47. TenantID: tenant_id,
  48. }); err != nil {
  49. return err
  50. }
  51. }
  52. return nil
  53. }
  54. // setup a plugin to db,
  55. // returns the endpoint id
  56. func InstallEndpoint(
  57. plugin_id plugin_entities.PluginUniqueIdentifier,
  58. installation_id string,
  59. tenant_id string,
  60. user_id string,
  61. settings map[string]any,
  62. ) (string, error) {
  63. settings_json, err := json.Marshal(settings)
  64. if err != nil {
  65. return "", err
  66. }
  67. installation := &models.Endpoint{
  68. HookID: strings.RandomString(32),
  69. PluginID: plugin_id.PluginID(),
  70. TenantID: tenant_id,
  71. UserID: user_id,
  72. Enabled: true,
  73. ExpiredAt: time.Now().Add(time.Hour * 24 * 365 * 10),
  74. Settings: string(settings_json),
  75. }
  76. if err := db.Create(&installation); err != nil {
  77. return "", err
  78. }
  79. return installation.HookID, nil
  80. }
  81. func GetEndpoint(
  82. tenant_id string, plugin_id string, installation_id string,
  83. ) (*models.Endpoint, error) {
  84. endpoint, err := db.GetOne[models.Endpoint](
  85. db.Equal("tenant_id", tenant_id),
  86. db.Equal("plugin_id", plugin_id),
  87. db.Equal("plugin_installation_id", installation_id),
  88. )
  89. if err != nil {
  90. return nil, err
  91. }
  92. return &endpoint, nil
  93. }
  94. // uninstalls a plugin from db
  95. func UninstallEndpoint(endpoint *models.Endpoint) error {
  96. return db.Delete(endpoint)
  97. }
  98. func EnabledEndpoint(endpoint *models.Endpoint) error {
  99. endpoint.Enabled = true
  100. return db.Update(endpoint)
  101. }
  102. func DisabledEndpoint(endpoint *models.Endpoint) error {
  103. endpoint.Enabled = false
  104. return db.Update(endpoint)
  105. }