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 }