github.com/infraboard/keyauth@v0.8.1/apps/counter/impl/impl.go (about)

     1  package impl
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  
     7  	"go.mongodb.org/mongo-driver/bson"
     8  	"go.mongodb.org/mongo-driver/mongo"
     9  	"go.mongodb.org/mongo-driver/mongo/options"
    10  
    11  	"github.com/infraboard/keyauth/apps/counter"
    12  	"github.com/infraboard/keyauth/conf"
    13  	"github.com/infraboard/mcube/app"
    14  )
    15  
    16  var (
    17  	// Service 服务实例
    18  	svr = &service{}
    19  )
    20  
    21  type service struct {
    22  	col *mongo.Collection
    23  }
    24  
    25  func (s *service) Config() error {
    26  	db := conf.C().Mongo.GetDB()
    27  	dc := db.Collection("counter")
    28  
    29  	s.col = dc
    30  	return nil
    31  }
    32  
    33  func (s *service) GetNextSequenceValue(sequenceName string) (*counter.Count, error) {
    34  	result := s.col.FindOneAndUpdate(
    35  		context.TODO(),
    36  		bson.M{"_id": sequenceName},
    37  		bson.M{"$inc": bson.M{"value": 1}},
    38  		options.FindOneAndUpdate().SetUpsert(true),
    39  	)
    40  
    41  	count := counter.NewCount()
    42  	err := result.Decode(count)
    43  	if err != nil && err != mongo.ErrNoDocuments {
    44  		return nil, fmt.Errorf("counter decode error, %s", err)
    45  	}
    46  
    47  	count.Value++
    48  	return count, nil
    49  }
    50  
    51  func (s *service) Name() string {
    52  	return counter.AppName
    53  }
    54  
    55  func init() {
    56  	app.RegistryInternalApp(svr)
    57  }