| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 | package endpointimport (	"context"	"errors"	"github.com/go-kit/kit/endpoint"	"github.com/go-kit/kit/log"	. "github.com/longjoy/micro-go-course/section32/model"	"github.com/longjoy/micro-go-course/section32/service")// CalculateEndpoint define endpointtype OAuth2Endpoints struct {	IndexEndpoint 		endpoint.Endpoint	SampleEndpoint 		endpoint.Endpoint	AdminEndpoint		endpoint.Endpoint	HealthCheckEndpoint 		endpoint.Endpoint}func MakeOAuth2AuthorizationMiddleware(logger log.Logger) endpoint.Middleware {	return func(next endpoint.Endpoint) endpoint.Endpoint {		return func(ctx context.Context, request interface{}) (response interface{}, err error) {			if err, ok := ctx.Value(OAuth2ErrorKey).(error); ok{				return nil, err			}			if _, ok := ctx.Value(OAuth2DetailsKey).(*OAuth2Details); !ok{				return  nil, ErrInvalidUserRequest			}			return next(ctx, request)		}	}}func MakeAuthorityAuthorizationMiddleware(authority string, logger log.Logger) endpoint.Middleware  {	return func(next endpoint.Endpoint) endpoint.Endpoint {		return func(ctx context.Context, request interface{}) (response interface{}, err error) {			if err, ok := ctx.Value(OAuth2ErrorKey).(error); ok{				return nil, err			}			if details, ok := ctx.Value(OAuth2DetailsKey).(*OAuth2Details); !ok{				return  nil, ErrInvalidClientRequest			}else {				for _, value := range details.User.Authorities{					if value == authority{						return next(ctx, request)					}				}				return nil, ErrNotPermit			}		}	}}const (	OAuth2DetailsKey       = "OAuth2Details"	OAuth2ErrorKey         = "OAuth2Error")var (	ErrInvalidClientRequest = errors.New("invalid client message")	ErrInvalidUserRequest = errors.New("invalid user message")	ErrNotPermit = errors.New("not permit"))type IndexRequest struct {}type IndexResponse struct {	Result string `json:"result"`	Error string `json:"error"`}type SampleRequest struct {}type SampleResponse struct {	Result string `json:"result"`	Error string `json:"error"`}type AdminRequest struct {}type AdminResponse struct {	Result string `json:"result"`	Error string `json:"error"`}func MakeIndexEndpoint(svc service.Service) endpoint.Endpoint {	return func(ctx context.Context, request interface{}) (response interface{}, err error) {		result := svc.Index()		return &SampleResponse{			Result:result,		}, nil	}}func MakeSampleEndpoint(svc service.Service) endpoint.Endpoint {	return func(ctx context.Context, request interface{}) (response interface{}, err error) {		result := svc.Sample(ctx.Value(OAuth2DetailsKey).(*OAuth2Details).User.Username)		return &SampleResponse{			Result:result,		}, nil	}}func MakeAdminEndpoint(svc service.Service) endpoint.Endpoint {	return func(ctx context.Context, request interface{}) (response interface{}, err error) {		result := svc.Admin(ctx.Value(OAuth2DetailsKey).(*OAuth2Details).User.Username)		return &AdminResponse{			Result:result,		}, nil	}}// HealthRequest 健康检查请求结构type HealthRequest struct{}// HealthResponse 健康检查响应结构type HealthResponse struct {	Status bool `json:"status"`}// MakeHealthCheckEndpoint 创建健康检查Endpointfunc MakeHealthCheckEndpoint(svc service.Service) endpoint.Endpoint {	return func(ctx context.Context, request interface{}) (response interface{}, err error) {		status := svc.HealthCheck()		return HealthResponse{			Status:status,		}, nil	}}
 |