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  }