Skip to content

Commit

Permalink
Merge pull request #10 from panapol-p/feat-module-count
Browse files Browse the repository at this point in the history
[feat] Module counter
  • Loading branch information
panapol-p authored Jul 4, 2022
2 parents 52fab63 + c06d453 commit 563fa0e
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 0 deletions.
31 changes: 31 additions & 0 deletions gate.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,23 @@ func (g Gate) AssignRoleToUser(domain, role, user string) error {
return err
}

func (g Gate) CountModule(domain string) map[string]int {
roles := g.GetRoles(domain)
counter := make(map[string]int)
moduleRole := make(map[string][]string)
for _, role := range roles {
modules := g.GetModuleRelatedByRole(domain, role)
moduleRole[role] = modules
}
users := g.GetAllUsersRole(domain)
for _, user := range users {
for _, module := range moduleRole[user.Role] {
counter[module]++
}
}
return counter
}

func (g Gate) RevokeRoleToUser(domain, role, user string) error {
_, err := g.E.RemoveGroupingPolicy(user, role, domain)
return err
Expand All @@ -119,3 +136,17 @@ func (g Gate) Load() error {
func (g Gate) Save() error {
return g.E.SavePolicy()
}

func (g Gate) GetModuleRelatedByRole(domain, role string) []string {
var modules []string
mapModules := map[string]struct{}{}
policies := g.E.GetFilteredPolicy(0, role, domain, "", "")
for _, policy := range policies {
moduleName := policy[2]
if _, ok := mapModules[moduleName]; !ok {
mapModules[moduleName] = struct{}{}
modules = append(modules, moduleName)
}
}
return modules
}
66 changes: 66 additions & 0 deletions gate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ func TestGate_GetAllUsersRole(t *testing.T) {
{"alice", "admin"},
{"bob", "reader"},
{"foo", "visitor"},
{"chalet", "visitor"},
}
assert.Equal(t, expectedD1, u1)

Expand All @@ -37,13 +38,15 @@ func TestGate_GetAllUsersRole(t *testing.T) {
{"alice", "reader2"},
{"bob", "admin"},
{"foo", "visitor2"},
{"chalet", "visitor2"},
}
assert.Equal(t, expectedD2, u2)

u3 := g.GetAllUsersRole("domain3")
expectedD3 := []UserRole{
{"alice", "visitor3"},
{"bob", "reader3"},
{"chalet", "reader3"},
{"foo", "admin"},
}
assert.Equal(t, expectedD3, u3)
Expand Down Expand Up @@ -268,3 +271,66 @@ func TestGate_AddPolicy(t *testing.T) {
err = g.Load()
assert.NoError(t, err)
}

func TestGate_CountModule(t *testing.T) {
a := fileadapter.NewAdapter("./testdata/rbac_with_domains_policy.csv")
g, err := NewGate(a)
assert.NoError(t, err)

c := g.CountModule("domain1")
assert.NoError(t, err)
expect := map[string]int{
"data2": 1,
"data3": 2,
}
assert.Equal(t, expect, c)

c = g.CountModule("domain2")
assert.NoError(t, err)
expect = map[string]int{
"data2": 1,
}
assert.Equal(t, expect, c)

c = g.CountModule("domain3")
assert.NoError(t, err)
expect = map[string]int{
"data2": 2,
"data3": 1,
}
assert.Equal(t, expect, c)

c = g.CountModule("domain5")
assert.NoError(t, err)
expect = map[string]int{}
assert.Equal(t, expect, c)
}

func TestGate_GetModuleRelatedByRole(t *testing.T) {
a := fileadapter.NewAdapter("./testdata/rbac_with_domains_policy.csv")
g, err := NewGate(a)
assert.NoError(t, err)

m := g.GetModuleRelatedByRole("domain1", "reader")
assert.NoError(t, err)
expect := []string{"data2"}
assert.Equal(t, expect, m)

m = g.GetModuleRelatedByRole("domain1", "visitor")
assert.NoError(t, err)
expect = []string{"data3"}
assert.Equal(t, expect, m)

m = g.GetModuleRelatedByRole("domain1", "writer")
assert.NoError(t, err)
expect = []string{"data1"}
assert.Equal(t, expect, m)

m = g.GetModuleRelatedByRole("domain1", "writer2")
assert.NoError(t, err)
assert.Nil(t, m)

m = g.GetModuleRelatedByRole("domain5", "writer2")
assert.NoError(t, err)
assert.Nil(t, m)
}
3 changes: 3 additions & 0 deletions testdata/rbac_with_domains_policy.csv
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,12 @@ p, Observer3, domain3, data3, view
g, alice, admin, domain1
g, bob, reader, domain1
g, foo, visitor, domain1
g, chalet, visitor, domain1
g, alice, reader2, domain2
g, bob, admin, domain2
g, foo, visitor2, domain2
g, chalet, visitor2, domain2
g, alice, visitor3, domain3
g, bob, reader3, domain3
g, chalet, reader3, domain3
g, foo, admin, domain3

0 comments on commit 563fa0e

Please sign in to comment.