state.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  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/models"
  6. "github.com/langgenius/dify-plugin-daemon/internal/types/models/curd"
  7. "github.com/langgenius/dify-plugin-daemon/internal/utils/cache/helper"
  8. "github.com/langgenius/dify-plugin-daemon/internal/utils/strings"
  9. "github.com/langgenius/dify-plugin-daemon/pkg/entities/plugin_entities"
  10. "gorm.io/gorm"
  11. )
  12. func InstallPlugin(
  13. tenant_id string,
  14. user_id string,
  15. runtime plugin_entities.PluginLifetime,
  16. source string,
  17. meta map[string]any,
  18. ) (*models.Plugin, *models.PluginInstallation, error) {
  19. identity, err := runtime.Identity()
  20. if err != nil {
  21. return nil, nil, err
  22. }
  23. configuration := runtime.Configuration()
  24. plugin, installation, err := curd.InstallPlugin(
  25. tenant_id,
  26. identity,
  27. runtime.Type(),
  28. configuration,
  29. source,
  30. meta,
  31. )
  32. if err != nil {
  33. return nil, nil, err
  34. }
  35. return plugin, installation, nil
  36. }
  37. func UninstallPlugin(
  38. tenant_id string,
  39. installation_id string,
  40. plugin_unique_identifier plugin_entities.PluginUniqueIdentifier,
  41. install_type plugin_entities.PluginRuntimeType,
  42. ) error {
  43. // get declaration
  44. declaration, err := helper.CombinedGetPluginDeclaration(
  45. plugin_unique_identifier,
  46. install_type,
  47. )
  48. if err != nil {
  49. return err
  50. }
  51. // delete the plugin from db
  52. _, err = curd.UninstallPlugin(tenant_id, plugin_unique_identifier, installation_id, declaration)
  53. if err != nil {
  54. return err
  55. }
  56. // delete endpoints if plugin is not installed through remote
  57. if install_type != plugin_entities.PLUGIN_RUNTIME_TYPE_REMOTE {
  58. if err := db.DeleteByCondition(models.Endpoint{
  59. PluginID: plugin_unique_identifier.PluginID(),
  60. TenantID: tenant_id,
  61. }); err != nil {
  62. return err
  63. }
  64. }
  65. return nil
  66. }
  67. // setup a plugin to db,
  68. func InstallEndpoint(
  69. plugin_id plugin_entities.PluginUniqueIdentifier,
  70. installation_id string,
  71. tenant_id string,
  72. user_id string,
  73. name string,
  74. settings map[string]any,
  75. ) (*models.Endpoint, error) {
  76. installation := &models.Endpoint{
  77. HookID: strings.RandomLowercaseString(16),
  78. PluginID: plugin_id.PluginID(),
  79. TenantID: tenant_id,
  80. UserID: user_id,
  81. Name: name,
  82. Enabled: true,
  83. ExpiredAt: time.Date(2050, 1, 1, 0, 0, 0, 0, time.UTC),
  84. Settings: settings,
  85. }
  86. if err := db.WithTransaction(func(tx *gorm.DB) error {
  87. if err := db.Create(&installation, tx); err != nil {
  88. return err
  89. }
  90. return db.Run(
  91. db.WithTransactionContext(tx),
  92. db.Model(models.PluginInstallation{}),
  93. db.Equal("plugin_id", installation.PluginID),
  94. db.Equal("tenant_id", installation.TenantID),
  95. db.Inc(map[string]int{
  96. "endpoints_setups": 1,
  97. "endpoints_active": 1,
  98. }),
  99. )
  100. }); err != nil {
  101. return nil, err
  102. }
  103. return installation, nil
  104. }
  105. func GetEndpoint(
  106. tenant_id string, plugin_id string, installation_id string,
  107. ) (*models.Endpoint, error) {
  108. endpoint, err := db.GetOne[models.Endpoint](
  109. db.Equal("tenant_id", tenant_id),
  110. db.Equal("plugin_id", plugin_id),
  111. db.Equal("plugin_installation_id", installation_id),
  112. )
  113. if err != nil {
  114. return nil, err
  115. }
  116. return &endpoint, nil
  117. }
  118. // uninstalls a plugin from db
  119. func UninstallEndpoint(endpoint *models.Endpoint) error {
  120. _ = db.DeleteCache[models.Endpoint](&db.DeleteCachePayload[models.Endpoint]{
  121. Delete: func() error {
  122. return nil
  123. },
  124. CacheKey: []db.KeyValuePair{
  125. {Key: "hook_id", Val: endpoint.HookID},
  126. },
  127. })
  128. return db.WithTransaction(func(tx *gorm.DB) error {
  129. if err := db.Delete(endpoint, tx); err != nil {
  130. return err
  131. }
  132. // update the plugin installation
  133. return db.Run(
  134. db.WithTransactionContext(tx),
  135. db.Model(models.PluginInstallation{}),
  136. db.Equal("plugin_id", endpoint.PluginID),
  137. db.Equal("tenant_id", endpoint.TenantID),
  138. db.Dec(map[string]int{
  139. "endpoints_active": 1,
  140. "endpoints_setups": 1,
  141. }),
  142. )
  143. })
  144. }
  145. func EnabledEndpoint(endpoint_id string, tenant_id string) error {
  146. return db.WithTransaction(func(tx *gorm.DB) error {
  147. endpoint, err := db.GetOne[models.Endpoint](
  148. db.WithTransactionContext(tx),
  149. db.Equal("id", endpoint_id),
  150. db.Equal("tenant_id", tenant_id),
  151. db.WLock(),
  152. )
  153. if err != nil {
  154. return err
  155. }
  156. if endpoint.Enabled {
  157. return nil
  158. }
  159. endpoint.Enabled = true
  160. if err := db.Update(endpoint, tx); err != nil {
  161. return err
  162. }
  163. // update the plugin installation
  164. return db.Run(
  165. db.WithTransactionContext(tx),
  166. db.Model(models.PluginInstallation{}),
  167. db.Equal("plugin_id", endpoint.PluginID),
  168. db.Equal("tenant_id", endpoint.TenantID),
  169. db.Inc(map[string]int{
  170. "endpoints_active": 1,
  171. }),
  172. )
  173. })
  174. }
  175. func DisabledEndpoint(endpoint_id string, tenant_id string) error {
  176. return db.WithTransaction(func(tx *gorm.DB) error {
  177. endpoint, err := db.GetOne[models.Endpoint](
  178. db.WithTransactionContext(tx),
  179. db.Equal("id", endpoint_id),
  180. db.Equal("tenant_id", tenant_id),
  181. db.WLock(),
  182. )
  183. if err != nil {
  184. return err
  185. }
  186. if !endpoint.Enabled {
  187. return nil
  188. }
  189. _ = db.DeleteCache[models.Endpoint](&db.DeleteCachePayload[models.Endpoint]{
  190. Delete: func() error {
  191. return nil
  192. },
  193. CacheKey: []db.KeyValuePair{
  194. {Key: "hook_id", Val: endpoint.HookID},
  195. },
  196. })
  197. endpoint.Enabled = false
  198. if err := db.Update(endpoint, tx); err != nil {
  199. return err
  200. }
  201. // update the plugin installation
  202. return db.Run(
  203. db.WithTransactionContext(tx),
  204. db.Model(models.PluginInstallation{}),
  205. db.Equal("plugin_id", endpoint.PluginID),
  206. db.Equal("tenant_id", endpoint.TenantID),
  207. db.Dec(map[string]int{
  208. "endpoints_active": 1,
  209. }),
  210. )
  211. })
  212. }
  213. func UpdateEndpoint(endpoint *models.Endpoint, name string, settings map[string]any) error {
  214. endpoint.Name = name
  215. endpoint.Settings = settings
  216. return db.Update(endpoint)
  217. }