Skip to content

Instantly share code, notes, and snippets.

@har07
Created June 12, 2020 09:28
Show Gist options
  • Save har07/a763e9e038a1dfc71d8c0494643b4056 to your computer and use it in GitHub Desktop.
Save har07/a763e9e038a1dfc71d8c0494643b4056 to your computer and use it in GitHub Desktop.
func filterGridParamsPostgre(params *query.GridParams) (state bool, fullQuery string, fullSorter string) {
var values []string
var query string
var sign string
var complementArg string
var connector string
var queries string
var fullQueries []string
var argument string
var sorter []string
if len(params.Sort) > 0 {
for _, srt := range params.Sort {
sorter = append(sorter, `data->`+`'`+srt.Field+`'`+" "+srt.Dir)
}
fullSorter = strings.Join(sorter, ",")
}
// if filter is not set, we might want all data to return
if params.HasFilter == false && len(params.Filter.Filters) == 0 {
return true, "", fullSorter
}
// if filter is set, but no actual filters, we might to return none
if params.HasFilter == true && len(params.Filter.Filters) == 0 {
return false, "", fullSorter
}
for _, gf := range params.Filter.Filters {
if len(gf.Filters) > 0 {
var parent string
parent = gf.Field
for _, gf := range gf.Filters {
switch gf.Operator {
case "eq":
queries = `data->` + `'` + parent + `'` + `->>` + `'` + gf.Field + `'` + `=` + `'` + gf.Value.(string) + `'`
fullQueries = append(fullQueries, queries)
case "contains":
queries = `data->` + `'` + parent + `'` + `->>` + `'` + gf.Field + `'` + `like` + `'%` + gf.Value.(string) + `%'`
fullQueries = append(fullQueries, queries)
case "neq":
queries = `data->` + `'` + parent + `'` + `->>` + `'` + gf.Field + `'` + `<>` + `'` + gf.Value.(string) + `'`
fullQueries = append(fullQueries, queries)
}
}
} else {
q, y, x, z := stateGridFilterPostgre(&gf, params)
complementArg = x
sign = y
query = q
connector = z
switch gf.Operator {
case "inarray":
switch val := gf.Value.(type) {
case string:
values = append(values, val)
case []string:
values = append(values, val...)
}
t, _ := json.Marshal(values)
argument = strings.Replace(string(t), `"`, "'", -1)
queries = query + sign + complementArg + argument
fullQueries = append(fullQueries, queries)
case "contains":
var subQuery string
subQuery = query + sign + complementArg + `'%` + gf.Value.(string) + `%'`
fullQueries = append(fullQueries, subQuery)
default:
var subQuery string
subQuery = query + sign + complementArg + `'` + gf.Value.(string) + `'`
fullQueries = append(fullQueries, subQuery)
/*
case "eq":
var subQuery string
subQuery = query + sign + complementArg + `'` + gf.Value.(string) + `'`
fullQueries = append(fullQueries, subQuery)
case "neq":
var subQuery string
subQuery = query + sign + complementArg + `'` + gf.Value.(string) + `'`
fullQueries = append(fullQueries, subQuery)
*/
}
}
}
fullQuery = "AND" + " (" + strings.Join(fullQueries, " "+connector+" ") + ")"
return true, fullQuery, fullSorter
}
func (h *PolicyHandler) listUsersGrid(c echo.Context) error {
tenant := c.Param("tenant")
id := c.Param("id")
gridParams := c.Get("gridParams").(*query.GridParams)
policy, err := h.PolicyStorage.GetPolicy(tenant, id)
if err != nil {
return response.JSONError(c, http.StatusBadRequest, err)
}
// because groups can contain users, we list users in groups too
groupMembers, _ := h.GroupStorage.GetGroupsMembers(tenant, policy.GroupIDs)
groupMembers, _ = array.AddElementStringArray(groupMembers, policy.UserIDs)
gridParams.HasFilter = true
// gridParams.Filter.Logic = "or"
// filter
// for _, v := range groupMembers {
// gf := &query.GridFilter{}
// gf.Field = "id"
// gf.Operator = "eq"
// gf.Value = v
// gridParams.Filter.Filters = append(gridParams.Filter.Filters, *gf)
// }
gridParams.Filter.Logic = "and"
gf := &query.GridFilter{
Field: "id",
Operator: "inarray",
}
var value []string
for _, v := range groupMembers {
value = append(value, v)
}
gf.Value = value
gridParams.Filter.Filters = append(gridParams.Filter.Filters, *gf)
data, count, err := h.ProfileStorage.GridProfiles(tenant, gridParams)
if err != nil {
return response.JSONError(c, http.StatusBadRequest, err)
}
return response.JSONGrid(c, http.StatusOK, data, len(data), count)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment