service.go 3.0 KB

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