endpoint.go 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package server
  2. import (
  3. "errors"
  4. "time"
  5. "github.com/gin-gonic/gin"
  6. "github.com/langgenius/dify-plugin-daemon/internal/db"
  7. "github.com/langgenius/dify-plugin-daemon/internal/service"
  8. "github.com/langgenius/dify-plugin-daemon/internal/types/app"
  9. "github.com/langgenius/dify-plugin-daemon/internal/types/exception"
  10. "github.com/langgenius/dify-plugin-daemon/internal/types/models"
  11. "github.com/langgenius/dify-plugin-daemon/internal/utils/log"
  12. "github.com/langgenius/dify-plugin-daemon/pkg/entities/plugin_entities"
  13. )
  14. // DifyPlugin supports register and use endpoint to improve the plugin's functionality
  15. // you can use it to do some magics, looking forward to your imagination, Ciallo~(∠·ω< )⌒
  16. // - Yeuoly
  17. // EndpointHandler is a function type that can be used to handle endpoint requests
  18. type EndpointHandler func(ctx *gin.Context, hookId string, maxExecutionTime time.Duration, path string)
  19. func (app *App) Endpoint(config *app.Config) func(c *gin.Context) {
  20. return func(c *gin.Context) {
  21. hookId := c.Param("hook_id")
  22. path := c.Param("path")
  23. if app.endpointHandler != nil {
  24. app.endpointHandler(c, hookId, time.Duration(config.PluginMaxExecutionTimeout)*time.Second, path)
  25. } else {
  26. app.EndpointHandler(c, hookId, time.Duration(config.PluginMaxExecutionTimeout)*time.Second, path)
  27. }
  28. }
  29. }
  30. func (app *App) EndpointHandler(ctx *gin.Context, hookId string, maxExecutionTime time.Duration, path string) {
  31. endpoint, err := db.GetOne[models.Endpoint](
  32. db.Equal("hook_id", hookId),
  33. )
  34. if err == db.ErrDatabaseNotFound {
  35. ctx.JSON(404, exception.BadRequestError(errors.New("endpoint not found")).ToResponse())
  36. return
  37. }
  38. if err != nil {
  39. log.Error("get endpoint error %v", err)
  40. ctx.JSON(500, exception.InternalServerError(errors.New("internal server error")).ToResponse())
  41. return
  42. }
  43. // get plugin installation
  44. pluginInstallation, err := db.GetOne[models.PluginInstallation](
  45. db.Equal("plugin_id", endpoint.PluginID),
  46. db.Equal("tenant_id", endpoint.TenantID),
  47. )
  48. if err != nil {
  49. ctx.JSON(404, exception.BadRequestError(errors.New("plugin installation not found")).ToResponse())
  50. return
  51. }
  52. pluginUniqueIdentifier, err := plugin_entities.NewPluginUniqueIdentifier(
  53. pluginInstallation.PluginUniqueIdentifier,
  54. )
  55. if err != nil {
  56. ctx.JSON(400, exception.UniqueIdentifierError(
  57. errors.New("invalid plugin unique identifier"),
  58. ).ToResponse())
  59. return
  60. }
  61. // check if plugin exists in current node
  62. if ok, originalError := app.cluster.IsPluginOnCurrentNode(pluginUniqueIdentifier); !ok {
  63. app.redirectPluginInvokeByPluginIdentifier(ctx, pluginUniqueIdentifier, originalError)
  64. } else {
  65. service.Endpoint(ctx, &endpoint, &pluginInstallation, maxExecutionTime, path)
  66. }
  67. }