feat: add scoped workflow instance queries and SDK pagination

This commit is contained in:
2026-09-18 08:34:45 +08:00
parent 17a8e0126c
commit 082898e705
33 changed files with 1598 additions and 18 deletions

View File

@@ -0,0 +1,75 @@
package httpserver
import (
"net/http"
"net/url"
"strconv"
"time"
"git.yuntuo.hk/k2safe/orbit/internal/fault"
core "git.yuntuo.hk/k2safe/orbit/model"
"git.yuntuo.hk/k2safe/orbit/platform/auth"
"git.yuntuo.hk/k2safe/orbit/weave/instance"
weave "git.yuntuo.hk/k2safe/orbit/weave/model"
)
func workflowListQuery(r *http.Request) (instance.ListInput, error) {
var in instance.ListInput
q, err := url.ParseQuery(r.URL.RawQuery)
if err != nil {
return in, fault.Invalid("invalid query encoding")
}
for k, v := range q {
if len(v) != 1 {
return in, fault.Invalid("duplicate query parameter")
}
switch k {
case "definition_id", "version", "state", "paused", "business_key", "created_from", "created_before", "limit", "cursor":
default:
return in, fault.Invalid("unknown query parameter")
}
if v[0] == "" {
return in, fault.Invalid("empty query parameter")
}
}
in.DefinitionID = core.ID(q.Get("definition_id"))
in.Version = q.Get("version")
in.State = weave.InstanceState(q.Get("state"))
in.BusinessKey = q.Get("business_key")
in.Cursor = q.Get("cursor")
if q.Has("limit") {
in.Limit, err = strconv.Atoi(q.Get("limit"))
if err != nil || in.Limit <= 0 {
return in, fault.Invalid("invalid limit")
}
}
if q.Has("paused") {
v := q.Get("paused")
if v != "true" && v != "false" {
return in, fault.Invalid("paused must be true or false")
}
b := v == "true"
in.Paused = &b
}
for name, field := range map[string]**time.Time{"created_from": &in.CreatedFrom, "created_before": &in.CreatedBefore} {
if !q.Has(name) {
continue
}
v, err := time.Parse(time.RFC3339Nano, q.Get(name))
if err != nil {
return in, fault.Invalid("invalid creation time bound")
}
*field = &v
}
return in, nil
}
func registerWorkflowQuery(mux *http.ServeMux, s *instance.Service) {
mux.HandleFunc("GET /v1/workflows", wrap(func(r *http.Request, t auth.Token) (any, int, error) {
in, err := workflowListQuery(r)
if err != nil {
return nil, 0, err
}
out, err := s.List(r.Context(), t, in)
return out, 200, err
}))
}