Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions channels/postgres/channels.go
Original file line number Diff line number Diff line change
Expand Up @@ -1340,22 +1340,22 @@ func PageQuery(pm channels.Page) (string, error) {
}

func applyOrdering(emq string, pm channels.Page) string {
var orderBy string
col := "COALESCE(c.updated_at, c.created_at)"
switch pm.Order {
case "name":
orderBy = "name"
col = "c.name"
case "created_at":
orderBy = "created_at"
case "updated_at":
orderBy = "COALESCE(updated_at, created_at)"
default:
return emq
col = "c.created_at"
case "updated_at", "":
col = "COALESCE(c.updated_at, c.created_at)"
}

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)
dir := pm.Dir
if dir != api.AscDir && dir != api.DescDir {
dir = api.DescDir
}
return fmt.Sprintf("%s ORDER BY %s", emq, orderBy)

return fmt.Sprintf("%s ORDER BY %s %s, c.id %s", emq, col, dir, dir)
}

func applyLimitOffset(query string) string {
Expand Down
12 changes: 12 additions & 0 deletions channels/postgres/channels_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -576,6 +576,8 @@ func TestRetrieveAll(t *testing.T) {
Page: channels.Page{
Offset: 0,
Limit: 10,
Order: "created_at",
Dir: "asc",
},
},
response: channels.ChannelsPage{
Expand All @@ -594,6 +596,8 @@ func TestRetrieveAll(t *testing.T) {
Page: channels.Page{
Offset: 10,
Limit: 10,
Order: "created_at",
Dir: "asc",
},
},
response: channels.ChannelsPage{
Expand All @@ -612,6 +616,8 @@ func TestRetrieveAll(t *testing.T) {
Page: channels.Page{
Offset: 0,
Limit: 50,
Order: "created_at",
Dir: "asc",
},
},
response: channels.ChannelsPage{
Expand All @@ -630,6 +636,8 @@ func TestRetrieveAll(t *testing.T) {
Page: channels.Page{
Offset: 50,
Limit: 50,
Order: "created_at",
Dir: "asc",
},
},
response: channels.ChannelsPage{
Expand All @@ -648,6 +656,8 @@ func TestRetrieveAll(t *testing.T) {
Page: channels.Page{
Offset: 1000,
Limit: 50,
Order: "created_at",
Dir: "desc",
},
},
response: channels.ChannelsPage{
Expand All @@ -666,6 +676,8 @@ func TestRetrieveAll(t *testing.T) {
Page: channels.Page{
Offset: 170,
Limit: 50,
Order: "created_at",
Dir: "asc",
},
},
response: channels.ChannelsPage{
Expand Down
31 changes: 18 additions & 13 deletions domains/postgres/domains.go
Original file line number Diff line number Diff line change
Expand Up @@ -256,9 +256,13 @@ func (repo domainRepo) RetrieveAllDomainsByIDs(ctx context.Context, pm domains.P
return domains.DomainsPage{}, errors.Wrap(repoerr.ErrFailedOpDB, err)
}

q = `SELECT d.id as id, d.name as name, d.tags as tags, d.route as route, d.metadata as metadata, d.created_at as created_at, d.updated_at as updated_at, d.updated_by as updated_by, d.created_by as created_by, d.status as status
FROM domains d`
q = fmt.Sprintf("%s %s LIMIT %d OFFSET %d;", q, query, pm.Limit, pm.Offset)
baseQ := `SELECT d.id as id, d.name as name, d.tags as tags, d.route as route, d.metadata as metadata,
d.created_at as created_at, d.updated_at as updated_at, d.updated_by as updated_by,
d.created_by as created_by, d.status as status FROM domains d`

squery := applyOrdering(query, pm)

q = fmt.Sprintf("%s %s LIMIT %d OFFSET %d;", baseQ, squery, pm.Limit, pm.Offset)

dbPage, err := toDBDomainsPage(pm)
if err != nil {
Expand Down Expand Up @@ -521,22 +525,23 @@ func (repo domainRepo) processRows(rows *sqlx.Rows) ([]domains.Domain, error) {
}

func applyOrdering(emq string, pm domains.Page) string {
var orderBy string
col := "COALESCE(d.updated_at, d.created_at)"

switch pm.Order {
case "name":
orderBy = "d.name"
col = "d.name"
case "created_at":
orderBy = "d.created_at"
case "updated_at":
orderBy = "COALESCE(d.updated_at, d.created_at)"
default:
return emq
col = "d.created_at"
case "updated_at", "":
col = "COALESCE(d.updated_at, d.created_at)"
}

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)
dir := pm.Dir
if dir != api.AscDir && dir != api.DescDir {
dir = api.DescDir
}
return fmt.Sprintf("%s ORDER BY %s", emq, orderBy)

return fmt.Sprintf("%s ORDER BY %s %s, d.id %s", emq, col, dir, dir)
}

type dbDomain struct {
Expand Down
20 changes: 20 additions & 0 deletions domains/postgres/domains_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,7 @@ func TestRetrieveAllByIDs(t *testing.T) {
CreatedBy: userID,
UpdatedBy: userID,
Status: domains.EnabledStatus,
CreatedAt: time.Now().UTC().Truncate(time.Millisecond),
}
if i%5 == 0 {
domain.Status = domains.DisabledStatus
Expand All @@ -310,6 +311,8 @@ func TestRetrieveAllByIDs(t *testing.T) {
Offset: 0,
Limit: 10,
IDs: []string{items[1].ID, items[2].ID},
Order: "created_at",
Dir: "asc",
},
response: domains.DomainsPage{
Total: 2,
Expand Down Expand Up @@ -369,6 +372,8 @@ func TestRetrieveAllByIDs(t *testing.T) {
Limit: 10,
IDs: []string{items[0].ID, items[1].ID},
Status: 5,
Order: "created_at",
Dir: "asc",
},
response: domains.DomainsPage{
Total: 2,
Expand Down Expand Up @@ -402,6 +407,8 @@ func TestRetrieveAllByIDs(t *testing.T) {
"test": "test",
},
Status: domains.EnabledStatus,
Order: "created_at",
Dir: "asc",
},
response: domains.DomainsPage{
Total: 2,
Expand Down Expand Up @@ -702,6 +709,7 @@ func TestListDomains(t *testing.T) {
CreatedBy: userID,
UpdatedBy: userID,
Status: domains.EnabledStatus,
CreatedAt: time.Now().UTC().Truncate(time.Millisecond),
}
if i%5 == 0 {
domain.Status = domains.DisabledStatus
Expand All @@ -726,6 +734,8 @@ func TestListDomains(t *testing.T) {
Offset: 0,
Limit: 10,
Status: domains.AllStatus,
Order: "created_at",
Dir: "asc",
},
response: domains.DomainsPage{
Total: 10,
Expand All @@ -741,6 +751,8 @@ func TestListDomains(t *testing.T) {
Offset: 0,
Limit: 10,
Status: domains.EnabledStatus,
Order: "created_at",
Dir: "asc",
},
response: domains.DomainsPage{
Total: 8,
Expand All @@ -757,6 +769,8 @@ func TestListDomains(t *testing.T) {
Limit: 10,
Name: items[0].Name,
Status: domains.AllStatus,
Order: "created_at",
Dir: "asc",
},
response: domains.DomainsPage{
Total: 1,
Expand All @@ -772,6 +786,8 @@ func TestListDomains(t *testing.T) {
Offset: 0,
Limit: 10,
Status: domains.DisabledStatus,
Order: "created_at",
Dir: "asc",
},
response: domains.DomainsPage{
Total: 2,
Expand All @@ -788,6 +804,8 @@ func TestListDomains(t *testing.T) {
Limit: 10,
Tag: "admin",
Status: domains.AllStatus,
Order: "created_at",
Dir: "asc",
},
response: domains.DomainsPage{
Total: 2,
Expand Down Expand Up @@ -822,6 +840,8 @@ func TestListDomains(t *testing.T) {
"test1": "test1",
},
Status: domains.AllStatus,
Order: "created_at",
Dir: "asc",
},
response: domains.DomainsPage{
Total: 2,
Expand Down
116 changes: 56 additions & 60 deletions groups/postgres/groups.go
Original file line number Diff line number Diff line change
Expand Up @@ -430,7 +430,7 @@ func (repo groupRepository) RetrieveAll(ctx context.Context, pm groups.PageMeta)
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,
q := fmt.Sprintf(`SELECT g.id, g.domain_id, tags, COALESCE(g.parent_id, '') AS parent_id, g.name, g.description,
g.metadata, g.created_at, g.updated_at, g.updated_by, g.status FROM groups g %s %s LIMIT :limit OFFSET :offset;`, query, orderClause)

dbPageMeta, err := toDBGroupPageMeta(pm)
Expand All @@ -454,7 +454,7 @@ func (repo groupRepository) RetrieveAll(ctx context.Context, pm groups.PageMeta)

cq := fmt.Sprintf(` SELECT COUNT(*) AS total_count
FROM (
SELECT DISTINCT g.id, g.domain_id, COALESCE(g.parent_id, '') AS parent_id, g.name, g.tags, g.description,
SELECT g.id, g.domain_id, COALESCE(g.parent_id, '') AS parent_id, g.name, g.tags, g.description,
g.metadata, g.created_at, g.updated_at, g.updated_by, g.status FROM groups g %s
) AS subquery;
`, query)
Expand Down Expand Up @@ -849,37 +849,54 @@ func (repo groupRepository) RetrieveUserGroups(ctx context.Context, domainID, us

func (repo groupRepository) retrieveGroups(ctx context.Context, domainID, userID, query string, pm groups.PageMeta) (groups.Page, error) {
baseQuery := repo.userGroupsBaseQuery(domainID, userID)

orderClause := ""
var orderBy string
switch pm.Order {
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(`%s
SELECT
g.id,
g.name,
g.domain_id,
COALESCE(g.parent_id, '') AS parent_id,
g.description,
g.tags,
g.metadata,
g.created_at,
g.updated_at,
g.updated_by,
g.status,
g.path as path,
g.role_id,
g.role_name,
g.actions,
g.access_type,
g.access_provider_id,
g.access_provider_role_id,
g.access_provider_role_name,
g.access_provider_role_actions
FROM
final_groups g
%s
ORDER BY
g.created_at
LIMIT :limit
OFFSET :offset;
`,
baseQuery, query)
SELECT
g.id,
g.name,
g.domain_id,
COALESCE(g.parent_id, '') AS parent_id,
g.description,
g.tags,
g.metadata,
g.created_at,
g.updated_at,
g.updated_by,
g.status,
g.path as path,
g.role_id,
g.role_name,
g.actions,
g.access_type,
g.access_provider_id,
g.access_provider_role_id,
g.access_provider_role_name,
g.access_provider_role_actions
FROM final_groups g
%s
%s
LIMIT :limit OFFSET :offset;`,
baseQuery, query, orderClause)

dbPageMeta, err := toDBGroupPageMeta(pm)
if err != nil {
return groups.Page{}, errors.Wrap(repoerr.ErrFailedToRetrieveAllGroups, err)
Expand All @@ -900,34 +917,13 @@ func (repo groupRepository) retrieveGroups(ctx context.Context, domainID, userID
}

cq := fmt.Sprintf(`%s
SELECT COUNT(*) AS total_count
FROM (
SELECT
g.id,
g.name,
g.domain_id,
COALESCE(g.parent_id, '') AS parent_id,
g.description,
g.tags,
g.metadata,
g.created_at,
g.updated_at,
g.updated_by,
g.status,
g.path as path,
g.role_id,
g.role_name,
g.actions,
g.access_type,
g.access_provider_id,
g.access_provider_role_id,
g.access_provider_role_name,
g.access_provider_role_actions
FROM
final_groups g
%s
) AS subquery;
`, baseQuery, query)
SELECT COUNT(*) AS total_count
FROM (
SELECT g.id
FROM final_groups g
%s
) AS subquery;`,
baseQuery, query)

total, err := postgres.Total(ctx, repo.db, cq, dbPageMeta)
if err != nil {
Expand Down
Loading
Loading