package server
import (
"net/http"
"github.com/keys-pub/keys-ext/http/api"
"github.com/keys-pub/keys/dstore/events"
"github.com/labstack/echo/v4"
"github.com/pkg/errors"
)
func (s *Server) events(c echo.Context, path string, max int) (*api.EventsResponse, int, error) {
request := c.Request()
ctx := request.Context()
index, err := queryParamInt(c, "idx", 0)
if err != nil {
return nil, http.StatusBadRequest, err
}
limit, err := queryParamInt(c, "limit", 0)
if err != nil {
return nil, http.StatusBadRequest, err
}
if limit == 0 || limit > max {
limit = max
}
pdir := c.QueryParam("order")
if pdir == "" {
pdir = "asc"
}
var dir events.Direction
switch pdir {
case "asc":
dir = events.Ascending
case "desc":
dir = events.Descending
default:
return nil, http.StatusBadRequest, errors.Errorf("invalid order")
}
s.logger.Infof("Events %s (from=%d)", path, index)
iter, err := s.fi.Events(ctx, path, events.Index(int64(index)), events.Limit(int64(limit)), events.WithDirection(dir))
if err != nil {
return nil, http.StatusInternalServerError, err
}
defer iter.Release()
to := int64(index)
events := []*events.Event{}
for {
event, err := iter.Next()
if err != nil {
return nil, http.StatusInternalServerError, err
}
if event == nil {
break
}
events = append(events, event)
to = event.Index
}
s.logger.Infof("Events %s, got %d, (to=%d)", path, len(events), to)
return &api.EventsResponse{
Events: events,
Index: to,
}, http.StatusOK, nil
}