state.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package install_service
  2. import (
  3. "time"
  4. "github.com/langgenius/dify-plugin-daemon/internal/db"
  5. "github.com/langgenius/dify-plugin-daemon/internal/types/entities/plugin_entities"
  6. "github.com/langgenius/dify-plugin-daemon/internal/types/models"
  7. "github.com/langgenius/dify-plugin-daemon/internal/types/models/curd"
  8. "github.com/langgenius/dify-plugin-daemon/internal/utils/strings"
  9. "gorm.io/gorm"
  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. func InstallEndpoint(
  56. plugin_id plugin_entities.PluginUniqueIdentifier,
  57. installation_id string,
  58. tenant_id string,
  59. user_id string,
  60. name string,
  61. settings map[string]any,
  62. ) (*models.Endpoint, error) {
  63. installation := &models.Endpoint{
  64. HookID: strings.RandomString(32),
  65. PluginID: plugin_id.PluginID(),
  66. TenantID: tenant_id,
  67. UserID: user_id,
  68. Name: name,
  69. Enabled: true,
  70. ExpiredAt: time.Date(2050, 1, 1, 0, 0, 0, 0, time.UTC),
  71. Settings: settings,
  72. }
  73. if err := db.WithTransaction(func(tx *gorm.DB) error {
  74. if err := db.Create(&installation, tx); err != nil {
  75. return err
  76. }
  77. return db.Run(
  78. db.WithTransactionContext(tx),
  79. db.Model(models.PluginInstallation{}),
  80. db.Equal("plugin_id", installation.PluginID),
  81. db.Equal("tenant_id", installation.TenantID),
  82. db.Inc(map[string]int{
  83. "endpoints_setups": 1,
  84. "endpoints_active": 1,
  85. }),
  86. )
  87. }); err != nil {
  88. return nil, err
  89. }
  90. return installation, nil
  91. }
  92. func GetEndpoint(
  93. tenant_id string, plugin_id string, installation_id string,
  94. ) (*models.Endpoint, error) {
  95. endpoint, err := db.GetOne[models.Endpoint](
  96. db.Equal("tenant_id", tenant_id),
  97. db.Equal("plugin_id", plugin_id),
  98. db.Equal("plugin_installation_id", installation_id),
  99. )
  100. if err != nil {
  101. return nil, err
  102. }
  103. return &endpoint, nil
  104. }
  105. // uninstalls a plugin from db
  106. func UninstallEndpoint(endpoint *models.Endpoint) error {
  107. return db.WithTransaction(func(tx *gorm.DB) error {
  108. if err := db.Delete(endpoint, tx); err != nil {
  109. return err
  110. }
  111. // update the plugin installation
  112. return db.Run(
  113. db.WithTransactionContext(tx),
  114. db.Model(models.PluginInstallation{}),
  115. db.Equal("plugin_id", endpoint.PluginID),
  116. db.Equal("tenant_id", endpoint.TenantID),
  117. db.Dec(map[string]int{
  118. "endpoints_active": 1,
  119. "endpoints_setups": 1,
  120. }),
  121. )
  122. })
  123. }
  124. func EnabledEndpoint(endpoint *models.Endpoint) error {
  125. if endpoint.Enabled {
  126. return nil
  127. }
  128. return db.WithTransaction(func(tx *gorm.DB) error {
  129. endpoint.Enabled = true
  130. if err := db.Update(endpoint, tx); err != nil {
  131. return err
  132. }
  133. // update the plugin installation
  134. return db.Run(
  135. db.WithTransactionContext(tx),
  136. db.Model(models.PluginInstallation{}),
  137. db.Equal("plugin_id", endpoint.PluginID),
  138. db.Equal("tenant_id", endpoint.TenantID),
  139. db.Inc(map[string]int{
  140. "endpoints_active": 1,
  141. }),
  142. )
  143. })
  144. }
  145. func DisabledEndpoint(endpoint *models.Endpoint) error {
  146. if !endpoint.Enabled {
  147. return nil
  148. }
  149. return db.WithTransaction(func(tx *gorm.DB) error {
  150. endpoint.Enabled = false
  151. if err := db.Update(endpoint, tx); err != nil {
  152. return err
  153. }
  154. // update the plugin installation
  155. return db.Run(
  156. db.WithTransactionContext(tx),
  157. db.Model(models.PluginInstallation{}),
  158. db.Equal("plugin_id", endpoint.PluginID),
  159. db.Equal("tenant_id", endpoint.TenantID),
  160. db.Dec(map[string]int{
  161. "endpoints_active": 1,
  162. }),
  163. )
  164. })
  165. }
  166. func UpdateEndpoint(endpoint *models.Endpoint, name string, settings map[string]any) error {
  167. endpoint.Name = name
  168. endpoint.Settings = settings
  169. return db.Update(endpoint)
  170. }