Skip to content

Commit 73217e4

Browse files
authored
Resolves pagination issues (#99)
1 parent 6c915d1 commit 73217e4

File tree

7 files changed

+94
-122
lines changed

7 files changed

+94
-122
lines changed

Gopkg.lock

Lines changed: 7 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

manager/memory/manager_memory.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"sync"
1919

2020
. "github.com/ory/ladon"
21+
"github.com/ory/pagination"
2122
"github.com/pkg/errors"
2223
)
2324

@@ -46,17 +47,14 @@ func (m *MemoryManager) Update(policy Policy) error {
4647
func (m *MemoryManager) GetAll(limit, offset int64) (Policies, error) {
4748
ps := make(Policies, len(m.Policies))
4849
i := 0
50+
4951
for _, p := range m.Policies {
5052
ps[i] = p
5153
i++
5254
}
5355

54-
if offset+limit > int64(len(m.Policies)) {
55-
limit = int64(len(m.Policies))
56-
offset = 0
57-
}
58-
59-
return ps[offset:limit], nil
56+
start, end := pagination.Index(int(limit), int(offset), len(ps))
57+
return ps[start:end], nil
6058
}
6159

6260
// Create a new pollicy to MemoryManager.

manager/sql/manager_sql.go

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -278,11 +278,25 @@ LEFT JOIN ladon_subject as subject ON rs.subject = subject.id
278278
LEFT JOIN ladon_action as action ON ra.action = action.id
279279
LEFT JOIN ladon_resource as resource ON rr.resource = resource.id
280280
281-
`
281+
WHERE p.id=?`
282+
283+
var getAllQuery = `SELECT
284+
p.id, p.effect, p.conditions, p.description,
285+
subject.template as subject, resource.template as resource, action.template as action
286+
FROM
287+
(SELECT * from ladon_policy ORDER BY id LIMIT ? OFFSET ?) as p
288+
289+
LEFT JOIN ladon_policy_subject_rel as rs ON rs.policy = p.id
290+
LEFT JOIN ladon_policy_action_rel as ra ON ra.policy = p.id
291+
LEFT JOIN ladon_policy_resource_rel as rr ON rr.policy = p.id
292+
293+
LEFT JOIN ladon_subject as subject ON rs.subject = subject.id
294+
LEFT JOIN ladon_action as action ON ra.action = action.id
295+
LEFT JOIN ladon_resource as resource ON rr.resource = resource.id`
282296

283297
// GetAll returns all policies
284298
func (s *SQLManager) GetAll(limit, offset int64) (Policies, error) {
285-
query := s.db.Rebind(getQuery + "ORDER BY p.id LIMIT ? OFFSET ?")
299+
query := s.db.Rebind(getAllQuery)
286300

287301
rows, err := s.db.Query(query, limit, offset)
288302
if err != nil {
@@ -295,7 +309,7 @@ func (s *SQLManager) GetAll(limit, offset int64) (Policies, error) {
295309

296310
// Get retrieves a policy.
297311
func (s *SQLManager) Get(id string) (Policy, error) {
298-
query := s.db.Rebind(getQuery + "WHERE p.id=?")
312+
query := s.db.Rebind(getQuery)
299313

300314
rows, err := s.db.Query(query, id)
301315
if err == sql.ErrNoRows {

manager_all_test.go

Lines changed: 52 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"github.com/ory/ladon/integration"
2626
. "github.com/ory/ladon/manager/memory"
2727
. "github.com/ory/ladon/manager/sql"
28+
"github.com/stretchr/testify/require"
2829
)
2930

3031
var managers = map[string]Manager{}
@@ -78,14 +79,56 @@ func connectMySQL(wg *sync.WaitGroup) {
7879
}
7980
}
8081

81-
func TestGetErrors(t *testing.T) {
82-
for k, s := range managers {
83-
t.Run("manager="+k, TestHelperGetErrors(s))
84-
}
85-
}
82+
func TestManagers(t *testing.T) {
83+
t.Run("type=get errors", func(t *testing.T) {
84+
for k, s := range managers {
85+
t.Run("manager="+k, TestHelperGetErrors(s))
86+
}
87+
})
8688

87-
func TestCreateGetDelete(t *testing.T) {
88-
for k, s := range managers {
89-
t.Run(fmt.Sprintf("manager=%s", k), TestHelperCreateGetDelete(s))
90-
}
89+
t.Run("type=CRUD", func(t *testing.T) {
90+
for k, s := range managers {
91+
t.Run(fmt.Sprintf("manager=%s", k), TestHelperCreateGetDelete(s))
92+
}
93+
})
94+
95+
t.Run("type=find", func(t *testing.T) {
96+
for k, s := range map[string]Manager{
97+
"postgres": managers["postgres"],
98+
"mysql": managers["mysql"],
99+
} {
100+
t.Run(fmt.Sprintf("manager=%s", k), TestHelperFindPoliciesForSubject(k, s))
101+
}
102+
})
103+
104+
t.Run("type=migrate 6 to 7", func(t *testing.T) {
105+
for k, s := range map[string]ManagerMigrator{
106+
"postgres": migrators["postgres"],
107+
"mysql": migrators["mysql"],
108+
} {
109+
t.Run(fmt.Sprintf("manager=%s", k), func(t *testing.T) {
110+
111+
// This create part is only necessary to populate the data store with some values. If you
112+
// migrate you won't need this
113+
for _, c := range TestManagerPolicies {
114+
t.Run(fmt.Sprintf("create=%s", k), func(t *testing.T) {
115+
require.NoError(t, s.Create(c))
116+
})
117+
}
118+
119+
require.NoError(t, s.Migrate())
120+
121+
for _, c := range TestManagerPolicies {
122+
t.Run(fmt.Sprintf("fetch=%s", k), func(t *testing.T) {
123+
get, err := s.GetManager().Get(c.GetID())
124+
require.NoError(t, err)
125+
126+
AssertPolicyEqual(t, c, get)
127+
128+
require.NoError(t, s.GetManager().Delete(c.GetID()))
129+
})
130+
}
131+
})
132+
}
133+
})
91134
}

manager_sql_test.go

Lines changed: 0 additions & 34 deletions
This file was deleted.

manager_test_helper.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,6 @@ func TestHelperGetErrors(s Manager) func(t *testing.T) {
300300

301301
func TestHelperCreateGetDelete(s Manager) func(t *testing.T) {
302302
return func(t *testing.T) {
303-
304303
for i, c := range TestManagerPolicies {
305304
t.Run(fmt.Sprintf("case=%d/id=%s/type=create", i, c.GetID()), func(t *testing.T) {
306305
_, err := s.Get(c.GetID())
@@ -334,10 +333,24 @@ func TestHelperCreateGetDelete(s Manager) func(t *testing.T) {
334333
}
335334

336335
t.Run("type=query-all", func(t *testing.T) {
336+
count := int64(len(TestManagerPolicies))
337+
337338
pols, err := s.GetAll(100, 0)
338339
require.NoError(t, err)
339340
assert.Len(t, pols, len(TestManagerPolicies))
340341

342+
pols4, err := s.GetAll(1, 0)
343+
require.NoError(t, err)
344+
assert.Len(t, pols4, 1)
345+
346+
pols2, err := s.GetAll(100, count-1)
347+
require.NoError(t, err)
348+
assert.Len(t, pols2, 1)
349+
350+
pols3, err := s.GetAll(100, count)
351+
require.NoError(t, err)
352+
assert.Len(t, pols3, 0)
353+
341354
found := map[string]int{}
342355
for _, got := range pols {
343356
for _, expect := range TestManagerPolicies {
@@ -360,6 +373,5 @@ func TestHelperCreateGetDelete(s Manager) func(t *testing.T) {
360373
assert.Error(t, err)
361374
})
362375
}
363-
364376
}
365377
}

xxx_manager_sql_migrator_test.go

Lines changed: 0 additions & 67 deletions
This file was deleted.

0 commit comments

Comments
 (0)