1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- package v2
- import (
- "context"
- "fmt"
- grpcRuntime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
- "github.com/improbable-eng/grpc-web/go/grpcweb"
- "github.com/labstack/echo/v4"
- "google.golang.org/grpc"
- "google.golang.org/grpc/credentials/insecure"
- "google.golang.org/grpc/reflection"
- apiv2pb "github.com/usememos/memos/proto/gen/api/v2"
- "github.com/usememos/memos/server/profile"
- "github.com/usememos/memos/store"
- )
- type APIV2Service struct {
- Secret string
- Profile *profile.Profile
- Store *store.Store
- grpcServer *grpc.Server
- grpcServerPort int
- }
- func NewAPIV2Service(secret string, profile *profile.Profile, store *store.Store, grpcServerPort int) *APIV2Service {
- grpc.EnableTracing = true
- authProvider := NewGRPCAuthInterceptor(store, secret)
- grpcServer := grpc.NewServer(
- grpc.ChainUnaryInterceptor(
- authProvider.AuthenticationInterceptor,
- ),
- )
- apiv2pb.RegisterSystemServiceServer(grpcServer, NewSystemService(profile, store))
- apiv2pb.RegisterUserServiceServer(grpcServer, NewUserService(store, secret))
- apiv2pb.RegisterMemoServiceServer(grpcServer, NewMemoService(store))
- apiv2pb.RegisterTagServiceServer(grpcServer, NewTagService(store))
- apiv2pb.RegisterResourceServiceServer(grpcServer, NewResourceService(store))
- reflection.Register(grpcServer)
- return &APIV2Service{
- Secret: secret,
- Profile: profile,
- Store: store,
- grpcServer: grpcServer,
- grpcServerPort: grpcServerPort,
- }
- }
- func (s *APIV2Service) GetGRPCServer() *grpc.Server {
- return s.grpcServer
- }
- // RegisterGateway registers the gRPC-Gateway with the given Echo instance.
- func (s *APIV2Service) RegisterGateway(ctx context.Context, e *echo.Echo) error {
- // Create a client connection to the gRPC Server we just started.
- // This is where the gRPC-Gateway proxies the requests.
- conn, err := grpc.DialContext(
- ctx,
- fmt.Sprintf(":%d", s.grpcServerPort),
- grpc.WithTransportCredentials(insecure.NewCredentials()),
- )
- if err != nil {
- return err
- }
- gwMux := grpcRuntime.NewServeMux()
- if err := apiv2pb.RegisterSystemServiceHandler(context.Background(), gwMux, conn); err != nil {
- return err
- }
- if err := apiv2pb.RegisterUserServiceHandler(context.Background(), gwMux, conn); err != nil {
- return err
- }
- if err := apiv2pb.RegisterMemoServiceHandler(context.Background(), gwMux, conn); err != nil {
- return err
- }
- if err := apiv2pb.RegisterTagServiceHandler(context.Background(), gwMux, conn); err != nil {
- return err
- }
- if err := apiv2pb.RegisterResourceServiceHandler(context.Background(), gwMux, conn); err != nil {
- return err
- }
- e.Any("/api/v2/*", echo.WrapHandler(gwMux))
- // GRPC web proxy.
- options := []grpcweb.Option{
- grpcweb.WithCorsForRegisteredEndpointsOnly(false),
- grpcweb.WithOriginFunc(func(origin string) bool {
- return true
- }),
- }
- wrappedGrpc := grpcweb.WrapServer(s.grpcServer, options...)
- e.Any("/memos.api.v2.*", echo.WrapHandler(wrappedGrpc))
- return nil
- }
|