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

     1  package impl
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/infraboard/mcube/exception"
     7  	"go.mongodb.org/mongo-driver/bson"
     8  	"go.mongodb.org/mongo-driver/mongo"
     9  
    10  	"github.com/infraboard/keyauth/apps/tag"
    11  )
    12  
    13  func (s *service) CreateTag(ctx context.Context, req *tag.CreateTagRequest) (*tag.TagKey, error) {
    14  	t, err := tag.New(req)
    15  	if err != nil {
    16  		return nil, err
    17  	}
    18  
    19  	// insert key
    20  	if _, err := s.key.InsertOne(context.TODO(), t); err != nil {
    21  		return nil, exception.NewInternalServerError("inserted tag key(%s) document error, %s",
    22  			t.KeyName, err)
    23  	}
    24  
    25  	// insert values
    26  	values := []interface{}{}
    27  	for i := range t.Values {
    28  		values = append(values, t.Values[i])
    29  	}
    30  	if s.value.InsertMany(context.TODO(), values); err != nil {
    31  		return nil, exception.NewInternalServerError("inserted tag value(%s) document error, %s",
    32  			t.KeyName, err)
    33  	}
    34  
    35  	return t, nil
    36  }
    37  
    38  func (s *service) QueryTagKey(ctx context.Context, req *tag.QueryTagKeyRequest) (*tag.TagKeySet, error) {
    39  	query, err := newQueryTagKeyRequest(req)
    40  	if err != nil {
    41  		return nil, err
    42  	}
    43  
    44  	resp, err := s.key.Find(context.TODO(), query.FindFilter(), query.FindOptions())
    45  	if err != nil {
    46  		return nil, exception.NewInternalServerError("find role error, error is %s", err)
    47  	}
    48  
    49  	set := tag.NewTagKeySet()
    50  	// 循环
    51  	for resp.Next(context.TODO()) {
    52  		ins := tag.NewDefaultTagKey()
    53  		if err := resp.Decode(ins); err != nil {
    54  			return nil, exception.NewInternalServerError("decode role error, error is %s", err)
    55  		}
    56  		set.Add(ins)
    57  	}
    58  
    59  	// count
    60  	count, err := s.key.CountDocuments(context.TODO(), query.FindFilter())
    61  	if err != nil {
    62  		return nil, exception.NewInternalServerError("get tag key count error, error is %s", err)
    63  	}
    64  	set.Total = count
    65  
    66  	return set, nil
    67  }
    68  
    69  func (s *service) QueryTagValue(ctx context.Context, req *tag.QueryTagValueRequest) (*tag.TagValueSet, error) {
    70  	query, err := newQueryTagValueRequest(req)
    71  	if err != nil {
    72  		return nil, err
    73  	}
    74  
    75  	resp, err := s.value.Find(context.TODO(), query.FindFilter(), query.FindOptions())
    76  	if err != nil {
    77  		return nil, exception.NewInternalServerError("find role error, error is %s", err)
    78  	}
    79  
    80  	set := tag.NewTagValueSet()
    81  	// 循环
    82  	for resp.Next(context.TODO()) {
    83  		ins := tag.NewDefaultTagValue()
    84  		if err := resp.Decode(ins); err != nil {
    85  			return nil, exception.NewInternalServerError("decode role error, error is %s", err)
    86  		}
    87  		set.Add(ins)
    88  	}
    89  
    90  	// count
    91  	count, err := s.value.CountDocuments(context.TODO(), query.FindFilter())
    92  	if err != nil {
    93  		return nil, exception.NewInternalServerError("get tag key count error, error is %s", err)
    94  	}
    95  	set.Total = count
    96  	return set, nil
    97  }
    98  
    99  func (s *service) DescribeTag(ctx context.Context, req *tag.DescribeTagRequest) (*tag.TagKey, error) {
   100  	query, err := newDescribeTagRequest(req)
   101  	if err != nil {
   102  		return nil, err
   103  	}
   104  
   105  	ins := tag.NewDefaultTagKey()
   106  	if err := s.key.FindOne(context.TODO(), query.FindFilter()).Decode(ins); err != nil {
   107  		if err == mongo.ErrNoDocuments {
   108  			return nil, exception.NewNotFound("tag %s not found", req)
   109  		}
   110  
   111  		return nil, exception.NewInternalServerError("find tag %s error, %s", req, err)
   112  	}
   113  
   114  	return ins, nil
   115  }
   116  
   117  func (s *service) DeleteTag(ctx context.Context, req *tag.DeleteTagRequest) (*tag.TagKey, error) {
   118  	ins, err := s.DescribeTag(ctx, tag.NewDescribeTagRequestWithID(req.TagId))
   119  	if err != nil {
   120  		return nil, err
   121  	}
   122  
   123  	// switch ins.ScopeType {
   124  	// case tag.ScopeType_GLOBAL:
   125  	// 	if !tk.UserType.IsIn(types.UserType_SUPPER) {
   126  	// 		return nil, exception.NewBadRequest("only supper can delete global tag")
   127  	// 	}
   128  	// case tag.ScopeType_DOMAIN:
   129  	// 	if !tk.UserType.IsIn(types.UserType_SUPPER, types.UserType_DOMAIN_ADMIN) {
   130  	// 		return nil, exception.NewBadRequest("only domain admin can delete domain tag")
   131  	// 	}
   132  	// }
   133  
   134  	_, err = s.key.DeleteOne(context.TODO(), bson.M{"_id": req.TagId})
   135  	if err != nil {
   136  		return nil, exception.NewInternalServerError("delete tag(%s) error, %s", req.TagId, err)
   137  	}
   138  
   139  	// 清除tag 关联的值
   140  	_, err = s.value.DeleteMany(context.TODO(), bson.M{"key_id": req.TagId})
   141  	if err != nil {
   142  		s.log.Errorf("delete tag values error, %s", err)
   143  	}
   144  
   145  	return ins, nil
   146  }