github.com/infraboard/keyauth@v0.8.1/apps/policy/impl/policy.go (about) 1 package impl 2 3 import ( 4 "context" 5 6 "github.com/infraboard/mcube/exception" 7 "go.mongodb.org/mongo-driver/mongo" 8 9 "github.com/infraboard/keyauth/apps/namespace" 10 "github.com/infraboard/keyauth/apps/policy" 11 "github.com/infraboard/keyauth/apps/role" 12 ) 13 14 func (s *service) CreatePolicy(ctx context.Context, req *policy.CreatePolicyRequest) ( 15 *policy.Policy, error) { 16 ins, err := policy.New(req) 17 if err != nil { 18 return nil, exception.NewBadRequest(err.Error()) 19 } 20 21 u, err := ins.CheckDependence(ctx, s.user, s.role, s.namespace) 22 if err != nil { 23 return nil, err 24 } 25 ins.UserType = u.Type 26 27 if _, err := s.col.InsertOne(context.TODO(), ins); err != nil { 28 return nil, exception.NewInternalServerError("inserted policy(%s) document error, %s", 29 ins.Id, err) 30 } 31 32 return ins, nil 33 } 34 35 func (s *service) QueryPolicy(ctx context.Context, req *policy.QueryPolicyRequest) ( 36 *policy.Set, error) { 37 r, err := newQueryPolicyRequest(req) 38 if err != nil { 39 return nil, err 40 } 41 42 if req.NamespaceId != "" { 43 _, err := s.namespace.DescribeNamespace(ctx, namespace.NewNewDescriptNamespaceRequestWithID(req.NamespaceId)) 44 if err != nil { 45 return nil, err 46 } 47 } 48 49 s.log.Debugf("query policy filter: %s", r.FindFilter()) 50 resp, err := s.col.Find(context.TODO(), r.FindFilter(), r.FindOptions()) 51 if err != nil { 52 return nil, exception.NewInternalServerError("find policy error, error is %s", err) 53 } 54 55 set := policy.NewPolicySet() 56 // 循环 57 for resp.Next(context.TODO()) { 58 ins := policy.NewDefaultPolicy() 59 if err := resp.Decode(ins); err != nil { 60 return nil, exception.NewInternalServerError("decode policy error, error is %s", err) 61 } 62 63 // 补充关联的角色信息 64 if req.WithRole { 65 descRole := role.NewDescribeRoleRequestWithID(ins.RoleId) 66 ins.Role, err = s.role.DescribeRole(ctx, descRole) 67 if err != nil { 68 return nil, err 69 } 70 } 71 72 // 关联空间信息 73 if req.WithNamespace && ins.NamespaceId != "" && ins.NamespaceId != "*" { 74 descNS := namespace.NewNewDescriptNamespaceRequestWithID(ins.NamespaceId) 75 ins.Namespace, err = s.namespace.DescribeNamespace(ctx, descNS) 76 if err != nil { 77 return nil, err 78 } 79 } 80 81 set.Add(ins) 82 } 83 84 // count 85 count, err := s.col.CountDocuments(context.TODO(), r.FindFilter()) 86 if err != nil { 87 return nil, exception.NewInternalServerError("get policy count error, error is %s", err) 88 } 89 set.Total = count 90 91 return set, nil 92 } 93 94 func (s *service) DescribePolicy(ctx context.Context, req *policy.DescribePolicyRequest) ( 95 *policy.Policy, error) { 96 r, err := newDescribePolicyRequest(req) 97 if err != nil { 98 return nil, err 99 } 100 101 ins := policy.NewDefaultPolicy() 102 s.log.Debugf("describe policy filter: %s", r.FindFilter()) 103 if err := s.col.FindOne(context.TODO(), r.FindFilter()).Decode(ins); err != nil { 104 if err == mongo.ErrNoDocuments { 105 return nil, exception.NewNotFound("policy %s not found", req) 106 } 107 108 return nil, exception.NewInternalServerError("find policy %s error, %s", req.Id, err) 109 } 110 111 return ins, nil 112 } 113 114 func (s *service) DeletePolicy(ctx context.Context, req *policy.DeletePolicyRequest) (*policy.Policy, error) { 115 descReq := policy.NewDescriptPolicyRequest() 116 descReq.Id = req.Id 117 p, err := s.DescribePolicy(ctx, descReq) 118 if err != nil { 119 return nil, err 120 } 121 122 r, err := newDeletePolicyRequest(req) 123 if err != nil { 124 return nil, err 125 } 126 127 _, err = s.col.DeleteOne(context.TODO(), r.FindFilter()) 128 if err != nil { 129 return nil, exception.NewInternalServerError("delete policy(%s) error, %s", req.Id, err) 130 } 131 132 return p, nil 133 }