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  }