| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 | 
							- package endpoint
 
- import (
 
- 	"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 endpoint
 
- type 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 创建健康检查Endpoint
 
- func 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
 
- 	}
 
- }
 
 
  |