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 }