From f21a1a5ecf3a4d1b84b66a502f35c521ab66b0f3 Mon Sep 17 00:00:00 2001 From: Umputun Date: Wed, 19 Dec 2018 22:54:31 -0600 Subject: [PATCH] add verified func to engine to get list of verified users --- backend/app/store/engine/bolt_accessor.go | 4 ++-- backend/app/store/engine/bolt_admin.go | 17 +++++++++++++++++ backend/app/store/engine/bolt_admin_test.go | 11 +++++++++++ backend/app/store/engine/engine.go | 1 + backend/app/store/engine/mongo.go | 17 ++++++++++++++++- backend/app/store/engine/mongo_test.go | 12 ++++++++++++ 6 files changed, 59 insertions(+), 3 deletions(-) diff --git a/backend/app/store/engine/bolt_accessor.go b/backend/app/store/engine/bolt_accessor.go index 1e14c79c..e4ca1384 100644 --- a/backend/app/store/engine/bolt_accessor.go +++ b/backend/app/store/engine/bolt_accessor.go @@ -7,8 +7,8 @@ import ( "strings" "time" - "github.com/coreos/bbolt" - "github.com/hashicorp/go-multierror" + bolt "github.com/coreos/bbolt" + multierror "github.com/hashicorp/go-multierror" "github.com/pkg/errors" "github.com/umputun/remark/backend/app/store" diff --git a/backend/app/store/engine/bolt_admin.go b/backend/app/store/engine/bolt_admin.go index 1c221d49..5f78b69a 100644 --- a/backend/app/store/engine/bolt_admin.go +++ b/backend/app/store/engine/bolt_admin.go @@ -320,3 +320,20 @@ func (b *BoltDB) IsVerified(siteID string, userID string) (verified bool) { }) return verified } + +// Verified returns list of verified userIDs +func (b *BoltDB) Verified(siteID string) (ids []string, err error) { + bdb, err := b.db(siteID) + if err != nil { + return nil, err + } + err = bdb.View(func(tx *bolt.Tx) error { + usersBkt := tx.Bucket([]byte(verifiedBucketName)) + _ = usersBkt.ForEach(func(k, _ []byte) error { + ids = append(ids, string(k)) + return nil + }) + return nil + }) + return ids, err +} diff --git a/backend/app/store/engine/bolt_admin_test.go b/backend/app/store/engine/bolt_admin_test.go index a46fc4a5..82318ec6 100644 --- a/backend/app/store/engine/bolt_admin_test.go +++ b/backend/app/store/engine/bolt_admin_test.go @@ -214,4 +214,15 @@ func TestBoltAdmin_Verified(t *testing.T) { assert.NoError(t, b.SetVerified("radio-t", "u1xyz", false)) assert.False(t, b.IsVerified("radio-t-bad", "u1"), "nothing verified on wrong site") + + assert.NoError(t, b.SetVerified("radio-t", "u1", true)) + assert.NoError(t, b.SetVerified("radio-t", "u2", true)) + assert.NoError(t, b.SetVerified("radio-t", "u3", false)) + + ids, err := b.Verified("radio-t") + assert.NoError(t, err) + assert.Equal(t, []string{"u1", "u2"}, ids, "verified 2 ids") + + ids, err = b.Verified("radio-t-bad") + assert.Error(t, err, "site \"radio-t-bad\" not found", "fail on wrong site") } diff --git a/backend/app/store/engine/engine.go b/backend/app/store/engine/engine.go index 8d150808..7355a91c 100644 --- a/backend/app/store/engine/engine.go +++ b/backend/app/store/engine/engine.go @@ -53,6 +53,7 @@ type Admin interface { IsReadOnly(locator store.Locator) bool // check if post read-only SetVerified(siteID string, userID string, status bool) error // set/reset verified flag IsVerified(siteID string, userID string) bool // check verified status + Verified(siteID string) ([]string, error) // list of verified user ids } const ( diff --git a/backend/app/store/engine/mongo.go b/backend/app/store/engine/mongo.go index a6e50833..587e7bda 100644 --- a/backend/app/store/engine/mongo.go +++ b/backend/app/store/engine/mongo.go @@ -6,7 +6,7 @@ import ( "github.com/globalsign/mgo" "github.com/globalsign/mgo/bson" "github.com/go-pkgz/mongo" - "github.com/hashicorp/go-multierror" + multierror "github.com/hashicorp/go-multierror" "github.com/pkg/errors" "github.com/umputun/remark/backend/app/store" @@ -221,6 +221,21 @@ func (m *Mongo) IsVerified(siteID string, userID string) (verified bool) { return err == nil && meta.Verified } +// Verified returns list of verified user IDs +func (m *Mongo) Verified(siteID string) (ids []string, err error) { + metas := []metaUser{} + err = m.conn.WithCustomCollection(mongoMetaUsers, func(coll *mgo.Collection) error { + return coll.Find(bson.M{"site": siteID, "verified": true}).All(&metas) + }) + if err != nil { + return nil, err + } + for _, m := range metas { + ids = append(ids, m.ID) + } + return ids, nil +} + // SetBlock blocks/unblocks user for given site. ttl defines for for how long, 0 - permanent // block uses blocksBucketName with key=userID and val=TTL+now func (m *Mongo) SetBlock(siteID string, userID string, status bool, ttl time.Duration) error { diff --git a/backend/app/store/engine/mongo_test.go b/backend/app/store/engine/mongo_test.go index 0d94745b..797d2e76 100644 --- a/backend/app/store/engine/mongo_test.go +++ b/backend/app/store/engine/mongo_test.go @@ -239,6 +239,18 @@ func TestMongo_Verified(t *testing.T) { assert.NoError(t, m.SetVerified("radio-t", "u1xyz", false)) assert.False(t, m.IsVerified("radio-t-bad", "u1"), "nothing verified on wrong site") + + assert.NoError(t, m.SetVerified("radio-t", "u1", true)) + assert.NoError(t, m.SetVerified("radio-t", "u2", true)) + assert.NoError(t, m.SetVerified("radio-t", "u3", false)) + + ids, err := m.Verified("radio-t") + assert.NoError(t, err) + assert.Equal(t, []string{"u1", "u2"}, ids, "verified 2 ids") + + ids, err = m.Verified("radio-t-bad") + assert.NoError(t, err) + assert.Equal(t, 0, len(ids)) } func TestMongo_GetForUser(t *testing.T) {