v1.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package v1
  2. import (
  3. "context"
  4. "fmt"
  5. "math"
  6. "github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
  7. "github.com/improbable-eng/grpc-web/go/grpcweb"
  8. "github.com/labstack/echo/v4"
  9. "github.com/labstack/echo/v4/middleware"
  10. "google.golang.org/grpc"
  11. "google.golang.org/grpc/credentials/insecure"
  12. "google.golang.org/grpc/reflection"
  13. v1pb "github.com/usememos/memos/proto/gen/api/v1"
  14. "github.com/usememos/memos/server/profile"
  15. "github.com/usememos/memos/store"
  16. )
  17. type APIV1Service struct {
  18. v1pb.UnimplementedWorkspaceServiceServer
  19. v1pb.UnimplementedWorkspaceSettingServiceServer
  20. v1pb.UnimplementedAuthServiceServer
  21. v1pb.UnimplementedUserServiceServer
  22. v1pb.UnimplementedMemoServiceServer
  23. v1pb.UnimplementedResourceServiceServer
  24. v1pb.UnimplementedInboxServiceServer
  25. v1pb.UnimplementedActivityServiceServer
  26. v1pb.UnimplementedWebhookServiceServer
  27. v1pb.UnimplementedMarkdownServiceServer
  28. v1pb.UnimplementedIdentityProviderServiceServer
  29. Secret string
  30. Profile *profile.Profile
  31. Store *store.Store
  32. grpcServer *grpc.Server
  33. }
  34. func NewAPIV1Service(secret string, profile *profile.Profile, store *store.Store, grpcServer *grpc.Server) *APIV1Service {
  35. grpc.EnableTracing = true
  36. apiv1Service := &APIV1Service{
  37. Secret: secret,
  38. Profile: profile,
  39. Store: store,
  40. grpcServer: grpcServer,
  41. }
  42. v1pb.RegisterWorkspaceServiceServer(grpcServer, apiv1Service)
  43. v1pb.RegisterWorkspaceSettingServiceServer(grpcServer, apiv1Service)
  44. v1pb.RegisterAuthServiceServer(grpcServer, apiv1Service)
  45. v1pb.RegisterUserServiceServer(grpcServer, apiv1Service)
  46. v1pb.RegisterMemoServiceServer(grpcServer, apiv1Service)
  47. v1pb.RegisterResourceServiceServer(grpcServer, apiv1Service)
  48. v1pb.RegisterInboxServiceServer(grpcServer, apiv1Service)
  49. v1pb.RegisterActivityServiceServer(grpcServer, apiv1Service)
  50. v1pb.RegisterWebhookServiceServer(grpcServer, apiv1Service)
  51. v1pb.RegisterMarkdownServiceServer(grpcServer, apiv1Service)
  52. v1pb.RegisterIdentityProviderServiceServer(grpcServer, apiv1Service)
  53. reflection.Register(grpcServer)
  54. return apiv1Service
  55. }
  56. // RegisterGateway registers the gRPC-Gateway with the given Echo instance.
  57. func (s *APIV1Service) RegisterGateway(ctx context.Context, echoServer *echo.Echo) error {
  58. conn, err := grpc.NewClient(
  59. fmt.Sprintf("%s:%d", s.Profile.Addr, s.Profile.Port),
  60. grpc.WithTransportCredentials(insecure.NewCredentials()),
  61. grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(math.MaxInt32)),
  62. )
  63. if err != nil {
  64. return err
  65. }
  66. gwMux := runtime.NewServeMux()
  67. if err := v1pb.RegisterWorkspaceServiceHandler(ctx, gwMux, conn); err != nil {
  68. return err
  69. }
  70. if err := v1pb.RegisterWorkspaceSettingServiceHandler(ctx, gwMux, conn); err != nil {
  71. return err
  72. }
  73. if err := v1pb.RegisterAuthServiceHandler(ctx, gwMux, conn); err != nil {
  74. return err
  75. }
  76. if err := v1pb.RegisterUserServiceHandler(ctx, gwMux, conn); err != nil {
  77. return err
  78. }
  79. if err := v1pb.RegisterMemoServiceHandler(ctx, gwMux, conn); err != nil {
  80. return err
  81. }
  82. if err := v1pb.RegisterResourceServiceHandler(ctx, gwMux, conn); err != nil {
  83. return err
  84. }
  85. if err := v1pb.RegisterInboxServiceHandler(ctx, gwMux, conn); err != nil {
  86. return err
  87. }
  88. if err := v1pb.RegisterActivityServiceHandler(ctx, gwMux, conn); err != nil {
  89. return err
  90. }
  91. if err := v1pb.RegisterWebhookServiceHandler(ctx, gwMux, conn); err != nil {
  92. return err
  93. }
  94. if err := v1pb.RegisterMarkdownServiceHandler(ctx, gwMux, conn); err != nil {
  95. return err
  96. }
  97. if err := v1pb.RegisterIdentityProviderServiceHandler(ctx, gwMux, conn); err != nil {
  98. return err
  99. }
  100. gwGroup := echoServer.Group("")
  101. gwGroup.Use(middleware.CORS())
  102. handler := echo.WrapHandler(gwMux)
  103. gwGroup.Any("/api/v1/*", handler)
  104. gwGroup.Any("/file/*", handler)
  105. // GRPC web proxy.
  106. options := []grpcweb.Option{
  107. grpcweb.WithCorsForRegisteredEndpointsOnly(false),
  108. grpcweb.WithOriginFunc(func(_ string) bool {
  109. return true
  110. }),
  111. }
  112. wrappedGrpc := grpcweb.WrapServer(s.grpcServer, options...)
  113. echoServer.Any("/memos.api.v1.*", echo.WrapHandler(wrappedGrpc))
  114. return nil
  115. }