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

     1  package grpc
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/infraboard/mcube/exception"
     7  	"github.com/infraboard/mcube/http/request"
     8  	"github.com/infraboard/mcube/types/ftime"
     9  	"github.com/rs/xid"
    10  	"go.mongodb.org/mongo-driver/mongo"
    11  
    12  	"github.com/infraboard/keyauth/apps/department"
    13  	"github.com/infraboard/keyauth/apps/namespace"
    14  	"github.com/infraboard/keyauth/apps/policy"
    15  	"github.com/infraboard/keyauth/apps/role"
    16  )
    17  
    18  func (s *service) CreateNamespace(ctx context.Context, req *namespace.CreateNamespaceRequest) (
    19  	*namespace.Namespace, error) {
    20  	ins, err := s.newNamespace(ctx, req)
    21  	if err != nil {
    22  		return nil, err
    23  	}
    24  
    25  	if _, err := s.col.InsertOne(context.TODO(), ins); err != nil {
    26  		return nil, exception.NewInternalServerError("inserted namespace(%s) document error, %s",
    27  			ins.Name, err)
    28  	}
    29  
    30  	if err := s.updateNamespacePolicy(ctx, ins); err != nil {
    31  		return nil, err
    32  	}
    33  
    34  	return ins, nil
    35  }
    36  
    37  func (s *service) updateNamespacePolicy(ctx context.Context, ns *namespace.Namespace) error {
    38  	descR := role.NewDescribeRoleRequestWithName(role.AdminRoleName)
    39  	r, err := s.role.DescribeRole(ctx, descR)
    40  	if err != nil {
    41  		return err
    42  	}
    43  	pReq := policy.NewCreatePolicyRequest()
    44  	pReq.NamespaceId = ns.Id
    45  	pReq.RoleId = r.Id
    46  	pReq.Account = ns.Owner
    47  	pReq.Type = policy.PolicyType_BUILD_IN
    48  	_, err = s.policy.CreatePolicy(ctx, pReq)
    49  	if err != nil {
    50  		return err
    51  	}
    52  	return nil
    53  }
    54  
    55  func (s *service) QueryNamespace(ctx context.Context, req *namespace.QueryNamespaceRequest) (
    56  	*namespace.Set, error) {
    57  	r := newPaggingQuery(req)
    58  	set := namespace.NewNamespaceSet()
    59  
    60  	if req.Account != "" {
    61  		qp := policy.NewQueryPolicyRequest(request.NewPageRequest(policy.MaxUserPolicy, 1))
    62  		qp.Domain = req.Domain
    63  		qp.Account = req.Account
    64  		ps, err := s.policy.QueryPolicy(ctx, qp)
    65  		if err != nil {
    66  			return nil, err
    67  		}
    68  		nss, total := ps.GetNamespaceWithPage(req.Page)
    69  		r.AddNamespace(nss)
    70  		set.Total = total
    71  	}
    72  
    73  	resp, err := s.col.Find(context.TODO(), r.FindFilter(), r.FindOptions())
    74  
    75  	if err != nil {
    76  		return nil, exception.NewInternalServerError("find namespace error, error is %s", err)
    77  	}
    78  
    79  	// 循环
    80  	for resp.Next(context.TODO()) {
    81  		ins := namespace.NewDefaultNamespace()
    82  		if err := resp.Decode(ins); err != nil {
    83  			return nil, exception.NewInternalServerError("decode namespace error, error is %s", err)
    84  		}
    85  
    86  		// 补充用户的部门信息
    87  		if req.WithDepartment && ins.DepartmentId != "" {
    88  			descDepart := department.NewDescribeDepartmentRequestWithID(ins.DepartmentId)
    89  			descDepart.Domain = req.Domain
    90  			depart, err := s.depart.DescribeDepartment(ctx, descDepart)
    91  			if err != nil {
    92  				s.log.Errorf("get user department error, %s", err)
    93  			} else {
    94  				ins.Department = depart
    95  			}
    96  		}
    97  
    98  		set.Add(ins)
    99  	}
   100  
   101  	// count
   102  	if len(r.namespaces) == 0 {
   103  		count, err := s.col.CountDocuments(context.TODO(), r.FindFilter())
   104  		if err != nil {
   105  			return nil, exception.NewInternalServerError("get namespace count error, error is %s", err)
   106  		}
   107  		set.Total = count
   108  	}
   109  
   110  	return set, nil
   111  }
   112  
   113  func (s *service) DescribeNamespace(ctx context.Context, req *namespace.DescriptNamespaceRequest) (
   114  	*namespace.Namespace, error) {
   115  	r, err := newDescribeQuery(req)
   116  	if err != nil {
   117  		return nil, err
   118  	}
   119  
   120  	ins := namespace.NewDefaultNamespace()
   121  	if err := s.col.FindOne(context.TODO(), r.FindFilter()).Decode(ins); err != nil {
   122  		if err == mongo.ErrNoDocuments {
   123  			return nil, exception.NewNotFound("namespace %s not found", req)
   124  		}
   125  
   126  		return nil, exception.NewInternalServerError("find namespace %s error, %s", req.Id, err)
   127  	}
   128  
   129  	// 补充用户的部门信息
   130  	if req.WithDepartment && ins.DepartmentId != "" {
   131  		depart, err := s.depart.DescribeDepartment(ctx, department.NewDescribeDepartmentRequestWithID(ins.DepartmentId))
   132  		if err != nil {
   133  			s.log.Errorf("get user department error, %s", err)
   134  		} else {
   135  			ins.Department = depart
   136  		}
   137  	}
   138  
   139  	return ins, nil
   140  }
   141  
   142  func (s *service) DeleteNamespace(ctx context.Context, req *namespace.DeleteNamespaceRequest) (*namespace.Namespace, error) {
   143  	ns, err := s.DescribeNamespace(ctx, namespace.NewNewDescriptNamespaceRequestWithID(req.Id))
   144  	if err != nil {
   145  		return nil, err
   146  	}
   147  
   148  	r, err := newDeleteRequest(req)
   149  	if err != nil {
   150  		return nil, err
   151  	}
   152  
   153  	_, err = s.col.DeleteOne(context.TODO(), r.FindFilter())
   154  	if err != nil {
   155  		return nil, exception.NewInternalServerError("delete namespace(%s) error, %s", req.Id, err)
   156  	}
   157  
   158  	// 清除空间管理的所有策略
   159  	_, err = s.policy.DeletePolicy(ctx, policy.NewDeletePolicyRequestWithNamespaceID(req.Id))
   160  	if err != nil {
   161  		s.log.Errorf("delete namespace policy error, %s", err)
   162  	}
   163  
   164  	return ns, nil
   165  }
   166  
   167  // NewNamespace todo
   168  func (s *service) newNamespace(ctx context.Context, req *namespace.CreateNamespaceRequest) (*namespace.Namespace, error) {
   169  	if err := req.Validate(); err != nil {
   170  		return nil, exception.NewBadRequest(err.Error())
   171  	}
   172  
   173  	ins := &namespace.Namespace{
   174  		Id:           xid.New().String(),
   175  		Domain:       req.Domain,
   176  		CreateBy:     req.CreateBy,
   177  		CreateAt:     ftime.Now().Timestamp(),
   178  		UpdateAt:     ftime.Now().Timestamp(),
   179  		Enabled:      true,
   180  		DepartmentId: req.DepartmentId,
   181  		Name:         req.Name,
   182  		Picture:      req.Picture,
   183  		Owner:        req.Owner,
   184  		Description:  req.Description,
   185  	}
   186  
   187  	descD := department.NewDescribeDepartmentRequest()
   188  	descD.Id = req.DepartmentId
   189  	d, err := s.depart.DescribeDepartment(ctx, descD)
   190  	if err != nil {
   191  		return nil, err
   192  	}
   193  	// 部门负责人就是空间负责人
   194  	ins.Owner = d.Manager
   195  
   196  	return ins, nil
   197  }