Skip to content

Commit

Permalink
Rework query to be able to have any kind of query attributes
Browse files Browse the repository at this point in the history
  • Loading branch information
Kharonus committed May 24, 2024
1 parent 26788be commit 031375e
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 27 deletions.
52 changes: 35 additions & 17 deletions components/requests/query.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import (
)

type Query struct {
pageSize int
filters []Filter
filters []Filter
attributes map[string]string
}

type Filter struct {
Expand All @@ -27,29 +27,47 @@ func (filter Filter) String() string {
}

func (query Query) String() string {
var filtersQuery = ""
if len(query.filters) > 0 {
var fStr = make([]string, len(query.filters))
for idx, f := range query.filters {
fStr[idx] = f.String()
queryStr := filtersQueryAttribute(query.filters)
for key, value := range query.attributes {
if len(queryStr) > 0 {
queryStr += "&"
}
filtersString := fmt.Sprintf("[%s]", strings.Join(fStr, ","))
filtersQuery = fmt.Sprintf("&filters=%s", url.QueryEscape(filtersString))
queryStr += fmt.Sprintf("%s=%s", key, url.QueryEscape(value))
}

return fmt.Sprintf("pageSize=%d%s", query.pageSize, filtersQuery)
return queryStr
}

func NewQuery(filters []Filter) Query {
return Query{
pageSize: 100,
filters: filters,
func filtersQueryAttribute(filters []Filter) string {
if len(filters) == 0 {
return ""
}

var fStr = make([]string, len(filters))
for idx, f := range filters {
fStr[idx] = f.String()
}

filtersString := fmt.Sprintf("[%s]", strings.Join(fStr, ","))
return fmt.Sprintf("filters=%s", url.QueryEscape(filtersString))
}

func NewQuery(attributes map[string]string, filters []Filter) Query {
return Query{attributes: attributes, filters: filters}
}

func NewFilterQuery(filters []Filter) Query {
attributes := map[string]string{
"pageSize": "100",
}

return Query{attributes: attributes, filters: filters}
}

func NewPagedQuery(pageSize int, filters []Filter) Query {
return Query{
pageSize: pageSize,
filters: filters,
attributes := map[string]string{
"pageSize": fmt.Sprintf("%d", pageSize),
}

return Query{attributes: attributes, filters: filters}
}
55 changes: 49 additions & 6 deletions components/requests/query_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,16 @@ package requests_test
import (
"github.com/opf/openproject-cli/components/resources/notifications"
"github.com/opf/openproject-cli/components/resources/work_packages"
"strings"
"testing"

"github.com/opf/openproject-cli/components/requests"
)

func TestQuery_String_WithFilters(t *testing.T) {
expectedString := "pageSize=100&filters=%5B%7B%22readIAN%22%3A%7B%22operator%22%3A%22%3D%22%2C%22values%22%3A%5B%22f%22%5D%7D%7D%2C%7B%22reason%22%3A%7B%22operator%22%3A%22%3D%22%2C%22values%22%3A%5B%22assigned%22%5D%7D%7D%5D"
func TestFilterQuery_String_WithFilters(t *testing.T) {
expectedString := "filters=%5B%7B%22readIAN%22%3A%7B%22operator%22%3A%22%3D%22%2C%22values%22%3A%5B%22f%22%5D%7D%7D%2C%7B%22reason%22%3A%7B%22operator%22%3A%22%3D%22%2C%22values%22%3A%5B%22assigned%22%5D%7D%7D%5D&pageSize=100"

queryString := requests.NewQuery([]requests.Filter{
queryString := requests.NewFilterQuery([]requests.Filter{
notifications.ReadFilter(false),
notifications.ReasonFilter("assigned"),
}).String()
Expand All @@ -21,18 +22,18 @@ func TestQuery_String_WithFilters(t *testing.T) {
}
}

func TestQuery_String_WithoutFilters(t *testing.T) {
func TestFilterQuery_String_WithoutFilters(t *testing.T) {
expectedString := "pageSize=100"

queryString := requests.NewQuery([]requests.Filter{}).String()
queryString := requests.NewFilterQuery([]requests.Filter{}).String()

if queryString != expectedString {
t.Errorf("Expected %s, but got %s", expectedString, queryString)
}
}

func TestPagedQuery_String_WithFilters(t *testing.T) {
expectedString := "pageSize=-1&filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22%3D%22%2C%22values%22%3A%5B%221%22%2C%223%22%5D%7D%7D%5D"
expectedString := "filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22%3D%22%2C%22values%22%3A%5B%221%22%2C%223%22%5D%7D%7D%5D&pageSize=-1"

filters := []requests.Filter{
work_packages.StatusFilter("1,3"),
Expand All @@ -43,3 +44,45 @@ func TestPagedQuery_String_WithFilters(t *testing.T) {
t.Errorf("Expected %s, but got %s", expectedString, queryString)
}
}

func TestQuery_String(t *testing.T) {
attributes := map[string]string{
"pageSize": "20",
"includeSubprojects": "true",
"timestamps": "PT0S",
}

filters := []requests.Filter{
work_packages.StatusFilter("1,3"),
work_packages.TypeFilter("!1"),
}
queryString := requests.NewQuery(attributes, filters).String()

if strings.Count(queryString, "&") != 3 {
t.Errorf("Expected %s to contain 3 delimiter '&'.", queryString)
}

expected := "pageSize=20"
contained := strings.Contains(queryString, expected)
if !contained {
t.Errorf("Expected %s to contain %s", queryString, expected)
}

expected = "includeSubprojects=true"
contained = strings.Contains(queryString, expected)
if !contained {
t.Errorf("Expected %s to contain %s", queryString, expected)
}

expected = "timestamps=PT0S"
contained = strings.Contains(queryString, expected)
if !contained {
t.Errorf("Expected %s to contain %s", queryString, expected)
}

expected = "filters=%5B%7B%22status%22%3A%7B%22operator%22%3A%22%3D%22%2C%22values%22%3A%5B%221%22%2C%223%22%5D%7D%7D%2C%7B%22type%22%3A%7B%22operator%22%3A%22%21%22%2C%22values%22%3A%5B%221%22%5D%7D%7D%5D"
contained = strings.Contains(queryString, expected)
if !contained {
t.Errorf("Expected %s to contain %s", queryString, expected)
}
}
2 changes: 1 addition & 1 deletion components/resources/notifications/functions.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,6 @@ func generateQuery(reason string) *requests.Query {
filters = append(filters, ReasonFilter(reason))
}

query := requests.NewQuery(filters)
query := requests.NewFilterQuery(filters)
return &query
}
4 changes: 2 additions & 2 deletions components/resources/users/functions.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ func ByIds(ids []uint64) []*models.User {
var filters []requests.Filter
filters = append(filters, IdFilter(ids))

query := requests.NewQuery(filters)
query := requests.NewFilterQuery(filters)

requestUrl := paths.Principals()

Expand Down Expand Up @@ -61,7 +61,7 @@ func Search(input string) ([]*models.User, error) {
filters = append(filters, resources.TypeAheadFilter(input))
}

query := requests.NewQuery(filters)
query := requests.NewFilterQuery(filters)

response, err := requests.Get(paths.Principals(), &query)
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion components/resources/work_packages/read.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ func All(filterOptions *map[FilterOption]string) (*models.WorkPackageCollection,
}
}

query := requests.NewQuery(filters)
query := requests.NewFilterQuery(filters)

requestUrl := paths.WorkPackages()

Expand Down

0 comments on commit 031375e

Please sign in to comment.