state.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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.PluginRuntimeInterface,
  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.CreatePlugin(
  22. tenant_id,
  23. user_id,
  24. identity,
  25. runtime.Type(),
  26. configuration,
  27. )
  28. if err != nil {
  29. return nil, nil, err
  30. }
  31. return plugin, installation, nil
  32. }
  33. func UninstallPlugin(
  34. tenant_id string,
  35. installation_id string,
  36. plugin_unique_identifier plugin_entities.PluginUniqueIdentifier,
  37. install_type plugin_entities.PluginRuntimeType,
  38. ) error {
  39. // delete the plugin from db
  40. _, err := curd.DeletePlugin(tenant_id, plugin_unique_identifier, installation_id)
  41. if err != nil {
  42. return err
  43. }
  44. // delete endpoints if plugin is not installed through remote
  45. if install_type != plugin_entities.PLUGIN_RUNTIME_TYPE_REMOTE {
  46. if err := db.DeleteByCondition(models.Endpoint{
  47. PluginID: plugin_unique_identifier.PluginID(),
  48. TenantID: tenant_id,
  49. }); err != nil {
  50. return err
  51. }
  52. }
  53. return nil
  54. }
  55. // setup a plugin to db,
  56. // returns the endpoint id
  57. func InstallEndpoint(
  58. plugin_id plugin_entities.PluginUniqueIdentifier,
  59. installation_id string,
  60. tenant_id string,
  61. user_id string,
  62. settings map[string]any,
  63. ) (string, error) {
  64. settings_json, err := json.Marshal(settings)
  65. if err != nil {
  66. return "", err
  67. }
  68. installation := &models.Endpoint{
  69. HookID: strings.RandomString(32),
  70. PluginID: plugin_id.PluginID(),
  71. TenantID: tenant_id,
  72. UserID: user_id,
  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. }