Skip to content

Commit 4608652

Browse files
feat: add name struct tag
1 parent 8614213 commit 4608652

File tree

3 files changed

+36
-16
lines changed

3 files changed

+36
-16
lines changed

rql/README.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ Frontend should send the parameters and operator like this schema to the backend
2121
},
2222
{ "name": "title", "operator": "like", "value": "xyz" }
2323
],
24-
"group_by": ["billing_plan_name"],
24+
"group_by": ["plan_name"],
2525
"offset": 20,
2626
"limit": 50,
2727
"search": "abcd",
@@ -38,12 +38,12 @@ The validation happens via stuct tags defined on your model. Example:
3838

3939
```golang
4040
type Organization struct {
41-
Id int `rql:"type=number,min=10,max=200"`
42-
BillingPlanName string `rql:"type=string"`
43-
CreatedAt time.Time `rql:"type=datetime"`
44-
MemberCount int `rql:"type=number"`
45-
Title string `rql:"type=string"`
46-
Enabled bool `rql:"type=bool"`
41+
Id int `rql:"name=id,type=number,min=10,max=200"`
42+
BillingPlanName string `rql:"name=plan_name,type=string"`
43+
CreatedAt time.Time `rql:"name=created_at,type=datetime"`
44+
MemberCount int `rql:"name=member_count,type=number"`
45+
Title string `rql:"name=title,type=string"`
46+
Enabled bool `rql:"name=enabled,type=bool"`
4747
}
4848

4949
```
@@ -102,9 +102,9 @@ Using this struct, a SQL query can be generated. Here is an example using `goqu`
102102
for _, sort_item := range userInput.Sort {
103103
switch sort_item.Order {
104104
case "asc":
105-
query = query.OrderAppend(goqu.C(sort_item.Key).Asc())
105+
query = query.OrderAppend(goqu.C(sort_item.Name).Asc())
106106
case "desc":
107-
query = query.OrderAppend(goqu.C(sort_item.Key).Desc())
107+
query = query.OrderAppend(goqu.C(sort_item.Name).Desc())
108108
default:
109109
}
110110
}

rql/parser.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,11 +142,31 @@ func validateStringType(filterItem Filter) error {
142142
}
143143

144144
func searchKeyInsideStruct(keyName string, val reflect.Value) int {
145+
normalizedKey := strings.ToLower(keyName)
146+
145147
for i := 0; i < val.NumField(); i++ {
146-
if strings.ToLower(val.Type().Field(i).Name) == strings.ToLower(keyName) {
148+
field := val.Type().Field(i)
149+
150+
// Check field name
151+
if strings.ToLower(field.Name) == normalizedKey {
147152
return i
148153
}
154+
155+
// Check rql tag
156+
if tag, ok := field.Tag.Lookup("rql"); ok {
157+
// Parse the tag string
158+
tagParts := strings.Split(tag, ",")
159+
for _, part := range tagParts {
160+
if strings.HasPrefix(part, "name=") {
161+
tagName := strings.TrimPrefix(part, "name=")
162+
if strings.ToLower(tagName) == normalizedKey {
163+
return i
164+
}
165+
}
166+
}
167+
}
149168
}
169+
150170
return -1
151171
}
152172

rql/parser_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ import (
66
)
77

88
type TestStruct struct {
9-
ID int32 `rql:"type=number"`
10-
Name string `rql:"type=string"`
11-
IsActive bool `rql:"type=bool"`
12-
CreatedAt time.Time `rql:"type=datetime"`
9+
ID int32 `rql:"name=id,type=number"`
10+
Name string `rql:"name=name,type=string"`
11+
IsActive bool `rql:"name=is_active,type=bool"`
12+
CreatedAt time.Time `rql:"name=created_at,type=datetime"`
1313
}
1414

1515
func TestValidateQuery(t *testing.T) {
@@ -25,8 +25,8 @@ func TestValidateQuery(t *testing.T) {
2525
Filters: []Filter{
2626
{Name: "ID", Operator: "eq", Value: 123},
2727
{Name: "Name", Operator: "like", Value: "test"},
28-
{Name: "IsActive", Operator: "eq", Value: true},
29-
{Name: "CreatedAt", Operator: "eq", Value: "2021-09-15T15:53:00Z"},
28+
{Name: "is_active", Operator: "eq", Value: true},
29+
{Name: "created_at", Operator: "eq", Value: "2021-09-15T15:53:00Z"},
3030
},
3131
Sort: []Sort{
3232
{Name: "ID", Order: "asc"},

0 commit comments

Comments
 (0)