NOISSUE - Update entity sorting (#3076)

Signed-off-by: Musilah <nataleigh.nk@gmail.com>
Signed-off-by: musilah <nataleigh.nk@gmail.com>
This commit is contained in:
Nataly Musilah
2025-09-05 16:58:03 +03:00
committed by GitHub
parent 1efa8b5bce
commit c50221a042
11 changed files with 96 additions and 49 deletions
+1 -1
View File
@@ -75,7 +75,7 @@ const (
DefTotal = uint64(100)
DefOffset = 0
DefOrder = "updated_at"
DefDir = "asc"
DefDir = "desc"
DefLimit = 10
DefLevel = 0
DefStartLevel = 1
+14 -6
View File
@@ -1340,14 +1340,22 @@ func PageQuery(pm channels.Page) (string, error) {
}
func applyOrdering(emq string, pm channels.Page) string {
var orderBy string
switch pm.Order {
case "name", "created_at", "updated_at":
emq = fmt.Sprintf("%s ORDER BY %s", emq, pm.Order)
if pm.Dir == api.AscDir || pm.Dir == api.DescDir {
emq = fmt.Sprintf("%s %s", emq, pm.Dir)
}
case "name":
orderBy = "name"
case "created_at":
orderBy = "created_at"
case "updated_at":
orderBy = "COALESCE(updated_at, created_at)"
default:
return emq
}
return emq
if pm.Dir == api.AscDir || pm.Dir == api.DescDir {
return fmt.Sprintf("%s ORDER BY %s %s, id %s", emq, orderBy, pm.Dir, pm.Dir)
}
return fmt.Sprintf("%s ORDER BY %s", emq, orderBy)
}
func applyLimitOffset(query string) string {
+2 -3
View File
@@ -12,7 +12,6 @@ import (
"time"
chpostgres "github.com/absmach/supermq/channels/postgres"
"github.com/absmach/supermq/pkg/postgres"
pgclient "github.com/absmach/supermq/pkg/postgres"
"github.com/jmoiron/sqlx"
"github.com/ory/dockertest/v3"
@@ -22,7 +21,7 @@ import (
var (
db *sqlx.DB
database postgres.Database
database pgclient.Database
tracer = otel.Tracer("repo_tests")
)
@@ -84,7 +83,7 @@ func TestMain(m *testing.M) {
log.Fatalf("Could not setup test DB connection: %s", err)
}
database = postgres.NewDatabase(db, dbConfig, tracer)
database = pgclient.NewDatabase(db, dbConfig, tracer)
code := m.Run()
+16 -6
View File
@@ -1275,14 +1275,24 @@ func PageQuery(pm clients.Page) (string, error) {
}
func applyOrdering(emq string, pm clients.Page) string {
var orderBy string
switch pm.Order {
case "name", "identity", "created_at", "updated_at":
emq = fmt.Sprintf("%s ORDER BY %s", emq, pm.Order)
if pm.Dir == api.AscDir || pm.Dir == api.DescDir {
emq = fmt.Sprintf("%s %s", emq, pm.Dir)
}
case "name":
orderBy = "name"
case "identity":
orderBy = "identity"
case "created_at":
orderBy = "created_at"
case "updated_at":
orderBy = "COALESCE(updated_at, created_at)"
default:
return emq
}
return emq
if pm.Dir == api.AscDir || pm.Dir == api.DescDir {
return fmt.Sprintf("%s ORDER BY %s %s, id %s", emq, orderBy, pm.Dir, pm.Dir)
}
return fmt.Sprintf("%s ORDER BY %s", emq, orderBy)
}
func applyLimitOffset(query string) string {
+14 -6
View File
@@ -521,14 +521,22 @@ func (repo domainRepo) processRows(rows *sqlx.Rows) ([]domains.Domain, error) {
}
func applyOrdering(emq string, pm domains.Page) string {
var orderBy string
switch pm.Order {
case "name", "created_at", "updated_at":
emq = fmt.Sprintf("%s ORDER BY d.%s", emq, pm.Order)
if pm.Dir == api.AscDir || pm.Dir == api.DescDir {
emq = fmt.Sprintf("%s %s", emq, pm.Dir)
}
case "name":
orderBy = "d.name"
case "created_at":
orderBy = "d.created_at"
case "updated_at":
orderBy = "COALESCE(d.updated_at, d.created_at)"
default:
return emq
}
return emq
if pm.Dir == api.AscDir || pm.Dir == api.DescDir {
return fmt.Sprintf("%s ORDER BY %s %s, d.id %s", emq, orderBy, pm.Dir, pm.Dir)
}
return fmt.Sprintf("%s ORDER BY %s", emq, orderBy)
}
type dbDomain struct {
+1 -1
View File
@@ -288,7 +288,7 @@ func decodePageMeta(r *http.Request) (groups.PageMeta, error) {
if err != nil {
return groups.PageMeta{}, errors.Wrap(apiutil.ErrValidation, err)
}
dir, err := apiutil.ReadStringQuery(r, api.DirKey, api.DescDir)
dir, err := apiutil.ReadStringQuery(r, api.DirKey, api.DefDir)
if err != nil {
return groups.PageMeta{}, errors.Wrap(apiutil.ErrValidation, err)
}
+14 -4
View File
@@ -412,12 +412,22 @@ func (repo groupRepository) RetrieveAll(ctx context.Context, pm groups.PageMeta)
query := buildQuery(pm)
orderClause := ""
var orderBy string
switch pm.Order {
case "name", "created_at", "updated_at":
orderClause = fmt.Sprintf("ORDER BY g.%s", pm.Order)
if pm.Dir == api.AscDir || pm.Dir == api.DescDir {
orderClause = fmt.Sprintf("%s %s", orderClause, pm.Dir)
case "name":
orderBy = "g.name"
case "created_at":
orderBy = "g.created_at"
case "updated_at":
orderBy = "COALESCE(g.updated_at, g.created_at)"
}
if orderBy != "" {
dir := pm.Dir
if dir != api.AscDir && dir != api.DescDir {
dir = api.DescDir
}
orderClause = fmt.Sprintf("ORDER BY %s %s, g.id %s", orderBy, dir, dir)
}
q := fmt.Sprintf(`SELECT DISTINCT g.id, g.domain_id, tags, COALESCE(g.parent_id, '') AS parent_id, g.name, g.description,
+9 -9
View File
@@ -398,7 +398,7 @@ func TestListChannels(t *testing.T) {
channelsPageMeta: channels.Page{
Actions: []string{},
Order: "updated_at",
Dir: "asc",
Dir: "desc",
Offset: offset,
Limit: limit,
},
@@ -425,7 +425,7 @@ func TestListChannels(t *testing.T) {
channelsPageMeta: channels.Page{
Actions: []string{},
Order: "updated_at",
Dir: "asc",
Dir: "desc",
Offset: offset,
Limit: limit,
},
@@ -443,7 +443,7 @@ func TestListChannels(t *testing.T) {
channelsPageMeta: channels.Page{
Actions: []string{},
Order: "updated_at",
Dir: "asc",
Dir: "desc",
},
svcRes: channels.ChannelsPage{},
svcErr: nil,
@@ -459,7 +459,7 @@ func TestListChannels(t *testing.T) {
channelsPageMeta: channels.Page{
Actions: []string{},
Order: "updated_at",
Dir: "asc",
Dir: "desc",
Offset: offset,
Limit: 10,
},
@@ -487,7 +487,7 @@ func TestListChannels(t *testing.T) {
channelsPageMeta: channels.Page{
Actions: []string{},
Order: "updated_at",
Dir: "asc",
Dir: "desc",
},
svcRes: channels.ChannelsPage{},
svcErr: nil,
@@ -504,7 +504,7 @@ func TestListChannels(t *testing.T) {
channelsPageMeta: channels.Page{
Actions: []string{},
Order: "updated_at",
Dir: "asc",
Dir: "desc",
Offset: offset,
Limit: 1,
},
@@ -533,7 +533,7 @@ func TestListChannels(t *testing.T) {
channelsPageMeta: channels.Page{
Actions: []string{},
Order: "updated_at",
Dir: "asc",
Dir: "desc",
Offset: offset,
Limit: 10,
Metadata: channels.Metadata{"name": "client_89"},
@@ -565,7 +565,7 @@ func TestListChannels(t *testing.T) {
channelsPageMeta: channels.Page{
Actions: []string{},
Order: "updated_at",
Dir: "asc",
Dir: "desc",
},
svcRes: channels.ChannelsPage{},
svcErr: nil,
@@ -581,7 +581,7 @@ func TestListChannels(t *testing.T) {
channelsPageMeta: channels.Page{
Actions: []string{},
Order: "updated_at",
Dir: "asc",
Dir: "desc",
Offset: 0,
Limit: 10,
},
+8 -8
View File
@@ -363,7 +363,7 @@ func TestListClients(t *testing.T) {
svcReq: clients.Page{
Actions: []string{},
Order: "updated_at",
Dir: "asc",
Dir: "desc",
Offset: 0,
Limit: 100,
},
@@ -395,7 +395,7 @@ func TestListClients(t *testing.T) {
svcReq: clients.Page{
Actions: []string{},
Order: "updated_at",
Dir: "asc",
Dir: "desc",
Offset: 0,
Limit: 100,
},
@@ -415,7 +415,7 @@ func TestListClients(t *testing.T) {
svcReq: clients.Page{
Actions: []string{},
Order: "updated_at",
Dir: "asc",
Dir: "desc",
},
svcRes: clients.ClientsPage{},
svcErr: nil,
@@ -434,7 +434,7 @@ func TestListClients(t *testing.T) {
svcReq: clients.Page{
Actions: []string{},
Order: "updated_at",
Dir: "asc",
Dir: "desc",
},
svcRes: clients.ClientsPage{},
svcErr: nil,
@@ -453,7 +453,7 @@ func TestListClients(t *testing.T) {
svcReq: clients.Page{
Actions: []string{},
Order: "updated_at",
Dir: "asc",
Dir: "desc",
Offset: 0,
Limit: 100,
Status: clients.DisabledStatus,
@@ -488,7 +488,7 @@ func TestListClients(t *testing.T) {
svcReq: clients.Page{
Actions: []string{},
Order: "updated_at",
Dir: "asc",
Dir: "desc",
Offset: 0,
Limit: 100,
Tag: "tag1",
@@ -525,7 +525,7 @@ func TestListClients(t *testing.T) {
svcReq: clients.Page{
Actions: []string{},
Order: "updated_at",
Dir: "asc",
Dir: "desc",
},
svcRes: clients.ClientsPage{},
svcErr: nil,
@@ -543,7 +543,7 @@ func TestListClients(t *testing.T) {
svcReq: clients.Page{
Actions: []string{},
Order: "updated_at",
Dir: "asc",
Dir: "desc",
Offset: 0,
Limit: 100,
},
+2
View File
@@ -43,6 +43,8 @@ type MessagesPage struct {
type PageMetadata struct {
Offset uint64 `json:"offset"`
Limit uint64 `json:"limit"`
Order string `json:"order,omitempty"`
Dir string `json:"dir,omitempty"`
Subtopic string `json:"subtopic,omitempty"`
Publisher string `json:"publisher,omitempty"`
Protocol string `json:"protocol,omitempty"`
+15 -5
View File
@@ -119,11 +119,21 @@ func (repo *userRepo) RetrieveAll(ctx context.Context, pm users.Page) (users.Use
orderClause := ""
switch pm.Order {
case "first_name", "last_name", "username", "email", "created_at", "updated_at":
orderClause = fmt.Sprintf("ORDER BY u.%s", pm.Order)
if pm.Dir == api.AscDir || pm.Dir == api.DescDir {
orderClause = fmt.Sprintf("%s %s", orderClause, pm.Dir)
}
case "first_name":
orderClause = "ORDER BY u.first_name"
case "last_name":
orderClause = "ORDER BY u.last_name"
case "username":
orderClause = "ORDER BY u.username"
case "email":
orderClause = "ORDER BY u.email"
case "created_at":
orderClause = "ORDER BY u.created_at"
case "updated_at":
orderClause = "ORDER BY COALESCE(u.updated_at, u.created_at)"
}
if orderClause != "" && (pm.Dir == api.AscDir || pm.Dir == api.DescDir) {
orderClause = fmt.Sprintf("%s %s, u.id %s", orderClause, pm.Dir, pm.Dir)
}
q := fmt.Sprintf(`SELECT u.id, u.tags, u.email, u.metadata, u.status, u.role, u.first_name, u.last_name, u.username,