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 })) }