Files
openserp/core/server.go

77 lines
1.6 KiB
Go
Raw Normal View History

2023-06-23 04:08:00 +03:00
package core
import (
2023-06-28 22:20:19 +03:00
"context"
2023-06-25 20:41:47 +03:00
"errors"
2023-06-23 04:08:00 +03:00
"fmt"
"strings"
"github.com/gofiber/fiber/v2"
"github.com/sirupsen/logrus"
2023-06-28 22:20:19 +03:00
"golang.org/x/time/rate"
2023-06-23 04:08:00 +03:00
)
type SearchEngine interface {
Search(Query) ([]SearchResult, error)
IsInitialized() bool
Name() string
2023-06-28 22:20:19 +03:00
GetRateLimiter() *rate.Limiter
2023-06-23 04:08:00 +03:00
}
type Server struct {
app *fiber.App
addr string
}
func NewServer(host string, port int, searchEngines ...SearchEngine) *Server {
addr := fmt.Sprintf("%s:%d", host, port)
serv := Server{
app: fiber.New(),
addr: addr,
}
for _, engine := range searchEngines {
locEngine := engine
2023-06-28 22:20:19 +03:00
limiter := engine.GetRateLimiter()
2023-06-23 04:08:00 +03:00
serv.app.Get(fmt.Sprintf("/%s/search", strings.ToLower(locEngine.Name())), func(c *fiber.Ctx) error {
q := Query{}
err := q.InitFromContext(c)
if err != nil {
logrus.Errorf("Error while setting %s query: %s", locEngine.Name(), err)
return err
}
2023-06-28 22:20:19 +03:00
err = limiter.Wait(context.Background())
if err != nil {
logrus.Errorf("Ratelimiter error during %s query: %s", locEngine.Name(), err)
}
2023-06-23 04:08:00 +03:00
res, err := locEngine.Search(q)
if err != nil {
2023-06-25 20:41:47 +03:00
switch err {
case ErrCaptcha:
err = errors.New(fmt.Sprintf("Captcha found, please stop sending requests for a while\n%s", err))
case ErrSearchTimeout:
err = errors.New(fmt.Sprintf("Error: %s\nProbably need to update CSS selector", err))
2023-06-25 20:41:47 +03:00
}
2023-06-23 04:08:00 +03:00
logrus.Errorf("Error during %s search: %s", locEngine.Name(), err)
return fiber.NewError(fiber.StatusServiceUnavailable, err.Error())
2023-06-23 04:08:00 +03:00
}
return c.JSON(res)
})
}
return &serv
}
func (s *Server) Listen() error {
return s.app.Listen(s.addr)
}
func (s *Server) Shutdown() error {
return s.app.Shutdown()
}