service.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package swagger_api
  2. import (
  3. "context"
  4. "fmt"
  5. //"git.ikuban.com/server/swagger-api/protoc-gen-openapiv2/generator"
  6. "git.ikuban.com/server/gnostic/protoc-gen-openapi/generator"
  7. "github.com/go-kratos/kratos/v2/api/metadata"
  8. "github.com/xmkuban/utils/utils"
  9. "google.golang.org/grpc"
  10. "google.golang.org/protobuf/compiler/protogen"
  11. "google.golang.org/protobuf/types/descriptorpb"
  12. "google.golang.org/protobuf/types/pluginpb"
  13. )
  14. // Service is service
  15. type Service struct {
  16. ser *metadata.Server
  17. serviceInfoMap map[string]grpc.ServiceInfo
  18. }
  19. // New service
  20. func New(srv *grpc.Server) *Service {
  21. return &Service{
  22. ser: metadata.NewServer(srv),
  23. }
  24. }
  25. // ListServices list services
  26. func (s *Service) ListServices(ctx context.Context, in *metadata.ListServicesRequest) (*metadata.ListServicesReply, error) {
  27. return s.ser.ListServices(ctx, &metadata.ListServicesRequest{})
  28. }
  29. // GetServiceOpenAPI get service open api
  30. func (s *Service) GetServiceOpenAPI(ctx context.Context, in *metadata.GetServiceDescRequest, onlyRPC bool) (string, error) {
  31. protoSet, err := s.ser.GetServiceDesc(ctx, in)
  32. if err != nil {
  33. return "", err
  34. }
  35. files := protoSet.FileDescSet.File
  36. newFiles := make([]*descriptorpb.FileDescriptorProto, 0)
  37. newFileMap := make(map[string]byte)
  38. for _, v := range files {
  39. if _, ok := newFileMap[v.GetName()]; !ok {
  40. newFiles = append(newFiles, v)
  41. newFileMap[v.GetName()] = 1
  42. }
  43. }
  44. files = newFiles
  45. var target string
  46. if len(files) == 0 {
  47. return "", fmt.Errorf("proto file is empty")
  48. }
  49. if files[len(files)-1].Name == nil {
  50. return "", fmt.Errorf("proto file's name is null")
  51. }
  52. target = *files[len(files)-1].Name
  53. req := new(pluginpb.CodeGeneratorRequest)
  54. req.FileToGenerate = []string{target}
  55. var para = ""
  56. req.Parameter = &para
  57. req.ProtoFile = files
  58. opts := protogen.Options{}
  59. plugin, err := opts.New(req)
  60. if err != nil {
  61. return "", err
  62. }
  63. plugin.SupportedFeatures = uint64(pluginpb.CodeGeneratorResponse_FEATURE_PROTO3_OPTIONAL)
  64. gen := generator.NewOpenAPIv3Generator(plugin, generator.Configuration{
  65. Version: utils.ToPointString("1.0"),
  66. Title: utils.ToPointString(""),
  67. Description: utils.ToPointString(""),
  68. Naming: utils.ToPointString("json"),
  69. FQSchemaNaming: utils.ToPointBool(true),
  70. EnumType: utils.ToPointString("integer"),
  71. CircularDepth: utils.ToPointInt(2),
  72. DefaultResponse: utils.ToPointBool(false),
  73. OutputMode: utils.ToPointString("merged"),
  74. }, plugin.Files)
  75. content, err := gen.RunV2()
  76. if err != nil {
  77. return "", err
  78. }
  79. return string(content), nil
  80. }