github.com/infraboard/keyauth@v0.8.1/apps/endpoint/impl/endpoint.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/endpoint" 11 "github.com/infraboard/keyauth/apps/micro" 12 "github.com/infraboard/keyauth/common/header" 13 ) 14 15 func (s *service) DescribeEndpoint(ctx context.Context, req *endpoint.DescribeEndpointRequest) ( 16 *endpoint.Endpoint, error) { 17 r, err := newDescribeEndpointRequest(req) 18 if err != nil { 19 return nil, err 20 } 21 22 ins := endpoint.NewDefaultEndpoint() 23 if err := s.col.FindOne(context.TODO(), r.FindFilter()).Decode(ins); err != nil { 24 if err == mongo.ErrNoDocuments { 25 return nil, exception.NewNotFound("endpoint %s not found", req) 26 } 27 28 return nil, exception.NewInternalServerError("find endpoint %s error, %s", req.Id, err) 29 } 30 31 return ins, nil 32 } 33 34 func (s *service) QueryEndpoints(ctx context.Context, req *endpoint.QueryEndpointRequest) ( 35 *endpoint.Set, error) { 36 r := newQueryEndpointRequest(req) 37 resp, err := s.col.Find(context.TODO(), r.FindFilter(), r.FindOptions()) 38 39 if err != nil { 40 return nil, exception.NewInternalServerError("find endpoint error, error is %s", err) 41 } 42 43 set := endpoint.NewEndpointSet() 44 // 循环 45 for resp.Next(context.TODO()) { 46 app := endpoint.NewDefaultEndpoint() 47 if err := resp.Decode(app); err != nil { 48 return nil, exception.NewInternalServerError("decode domain error, error is %s", err) 49 } 50 51 set.Add(app) 52 } 53 54 // count 55 count, err := s.col.CountDocuments(context.TODO(), r.FindFilter()) 56 if err != nil { 57 return nil, exception.NewInternalServerError("get device count error, error is %s", err) 58 } 59 set.Total = count 60 61 return set, nil 62 } 63 64 func (s *service) RegistryEndpoint(ctx context.Context, req *endpoint.RegistryRequest) (*endpoint.RegistryResponse, error) { 65 if req.ClientId == "" && req.ClientSecret == "" { 66 req.ClientId, req.ClientSecret = header.GetClientCredential(ctx) 67 } 68 69 if err := req.Validate(); err != nil { 70 return nil, exception.NewBadRequest(err.Error()) 71 } 72 73 // 查询该服务 74 svr, err := s.micro.DescribeService(ctx, micro.NewDescribeServiceRequestWithClientID(req.ClientId)) 75 if err != nil { 76 return nil, err 77 } 78 s.log.Debugf("service %s registry endpoints", svr.Name) 79 80 if err := svr.ValiateClientCredential(req.ClientSecret); err != nil { 81 return nil, err 82 } 83 84 // 生产该服务的Endpoint 85 endpoints := req.Endpoints(svr.Id) 86 87 // 更新已有的记录 88 news := make([]interface{}, 0, len(endpoints)) 89 for i := range endpoints { 90 if err := s.col.FindOneAndReplace(context.TODO(), bson.M{"_id": endpoints[i].Id}, endpoints[i]).Err(); err != nil { 91 if err == mongo.ErrNoDocuments { 92 news = append(news, endpoints[i]) 93 } else { 94 return nil, err 95 } 96 } 97 } 98 99 // 插入新增记录 100 if len(news) > 0 { 101 if _, err := s.col.InsertMany(context.TODO(), news); err != nil { 102 return nil, exception.NewInternalServerError("inserted a service document error, %s", err) 103 } 104 } 105 106 return endpoint.NewRegistryResponse("ok"), nil 107 } 108 109 func (s *service) DeleteEndpoint(ctx context.Context, req *endpoint.DeleteEndpointRequest) (*endpoint.Endpoint, error) { 110 result, err := s.col.DeleteOne(context.TODO(), bson.M{"service_id": req.ServiceId}) 111 if err != nil { 112 return nil, exception.NewInternalServerError("delete service(%s) endpoint error, %s", req.ServiceId, err) 113 } 114 115 s.log.Infof("delete service %s endpoint success, total count: %d", req.ServiceId, result.DeletedCount) 116 return nil, nil 117 }