From c36cbae39148788ac5db81b97ae946c65d21a60b Mon Sep 17 00:00:00 2001 From: anton troyanov Date: Mon, 18 May 2020 13:33:52 +0300 Subject: [PATCH 1/3] Run go fmt --- adapter.go | 16 ++++++++-------- adapter_test.go | 22 +++++++++++----------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/adapter.go b/adapter.go index 3dd0092..0938645 100644 --- a/adapter.go +++ b/adapter.go @@ -236,18 +236,18 @@ func (a *Adapter) AddPolicy(sec string, ptype string, rule []string) error { // AddPolicies adds policy rules to the storage. func (a *Adapter) AddPolicies(sec string, ptype string, rules [][]string) error { var lines []*CasbinRule - for _,rule := range rules{ + for _, rule := range rules { line := savePolicyLine(ptype, rule) lines = append(lines, line) } - + err := a.db.RunInTransaction(func(tx *pg.Tx) error { _, err := tx.Model(&lines). - OnConflict("DO NOTHING"). - Insert() + OnConflict("DO NOTHING"). + Insert() return err }) - + return err } @@ -261,17 +261,17 @@ func (a *Adapter) RemovePolicy(sec string, ptype string, rule []string) error { // RemovePolicies removes policy rules from the storage. func (a *Adapter) RemovePolicies(sec string, ptype string, rules [][]string) error { var lines []*CasbinRule - for _,rule := range rules{ + for _, rule := range rules { line := savePolicyLine(ptype, rule) lines = append(lines, line) } err := a.db.RunInTransaction(func(tx *pg.Tx) error { _, err := tx.Model(&lines). - Delete() + Delete() return err }) - + return err } diff --git a/adapter_test.go b/adapter_test.go index c74aea0..2d599b7 100644 --- a/adapter_test.go +++ b/adapter_test.go @@ -120,17 +120,17 @@ func (s *AdapterTestSuite) TestAutoSave() { // The policy has a new rule: {"alice", "data1", "write"}. s.assertPolicy( [][]string{ - {"alice", "data1", "read"}, - {"bob", "data2", "write"}, - {"data2_admin", "data2", "read"}, - {"data2_admin", "data2", "write"}, - {"alice", "data1", "write"}, - {"bob", "data2", "read"}, - {"alice", "data2", "write"}, - {"alice", "data2", "read"}, - {"bob", "data1", "write"}, - {"bob", "data1", "read"}, - }, + {"alice", "data1", "read"}, + {"bob", "data2", "write"}, + {"data2_admin", "data2", "read"}, + {"data2_admin", "data2", "write"}, + {"alice", "data1", "write"}, + {"bob", "data2", "read"}, + {"alice", "data2", "write"}, + {"alice", "data2", "read"}, + {"bob", "data1", "write"}, + {"bob", "data1", "read"}, + }, s.e.GetPolicy(), ) From 7af908d54e9df23132676490299030259fe4db9e Mon Sep 17 00:00:00 2001 From: anton troyanov Date: Mon, 18 May 2020 13:39:51 +0300 Subject: [PATCH 2/3] Use model instead of handcrafted SQL query --- adapter.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adapter.go b/adapter.go index 0938645..93a7806 100644 --- a/adapter.go +++ b/adapter.go @@ -145,7 +145,7 @@ func (r *CasbinRule) String() string { func (a *Adapter) LoadPolicy(model model.Model) error { var lines []*CasbinRule - if _, err := a.db.Query(&lines, `SELECT * FROM casbin_rules`); err != nil { + if err := a.db.Model(&lines).Select(); err != nil { return err } From 2eea4794c6840522a6f9d9af89159251b0bbe49e Mon Sep 17 00:00:00 2001 From: anton troyanov Date: Mon, 18 May 2020 13:44:00 +0300 Subject: [PATCH 3/3] Add support for custom table name --- adapter.go | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/adapter.go b/adapter.go index 93a7806..98cd247 100644 --- a/adapter.go +++ b/adapter.go @@ -8,6 +8,7 @@ import ( "github.com/casbin/casbin/v2/persist" "github.com/go-pg/pg/v9" "github.com/go-pg/pg/v9/orm" + "github.com/go-pg/pg/v9/types" "github.com/mmcloughlin/meow" ) @@ -30,10 +31,13 @@ type Filter struct { // Adapter represents the github.com/go-pg/pg adapter for policy storage. type Adapter struct { - db *pg.DB - filtered bool + db *pg.DB + tableName string + filtered bool } +type Option func(a *Adapter) + // NewAdapter is the constructor for Adapter. // arg should be a PostgreS URL string or of type *pg.Options // The adapter will create a DB named "casbin" if it doesn't exist @@ -54,14 +58,31 @@ func NewAdapter(arg interface{}) (*Adapter, error) { // NewAdapterByDB creates new Adapter by using existing DB connection // creates table from CasbinRule struct if it doesn't exist -func NewAdapterByDB(db *pg.DB) (*Adapter, error) { +func NewAdapterByDB(db *pg.DB, opts ...Option) (*Adapter, error) { a := &Adapter{db: db} + for _, opt := range opts { + opt(a) + } + + if len(a.tableName) > 0 { + a.db.Model((*CasbinRule)(nil)).TableModel().Table().Name = a.tableName + a.db.Model((*CasbinRule)(nil)).TableModel().Table().FullName = (types.Safe)(a.tableName) + a.db.Model((*CasbinRule)(nil)).TableModel().Table().FullNameForSelects = (types.Safe)(a.tableName) + } + if err := a.createTableifNotExists(); err != nil { return nil, fmt.Errorf("pgadapter.NewAdapter: %v", err) } return a, nil } +// WithTableName can be used to pass custom table name for Casbin rules +func WithTableName(tableName string) Option { + return func(a *Adapter) { + a.tableName = tableName + } +} + func createCasbinDatabase(arg interface{}) (*pg.DB, error) { var opts *pg.Options var err error