memos/api/v2/v2.go

132 lines
4.1 KiB
Go
Raw Normal View History

package v2
import (
"context"
"fmt"
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
2023-09-17 19:20:03 +08:00
"github.com/improbable-eng/grpc-web/go/grpcweb"
"github.com/labstack/echo/v4"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
2023-09-15 17:57:45 +08:00
"google.golang.org/grpc/reflection"
2023-09-17 22:55:13 +08:00
apiv2pb "github.com/usememos/memos/proto/gen/api/v2"
"github.com/usememos/memos/server/profile"
"github.com/usememos/memos/store"
)
type APIV2Service struct {
2023-10-27 09:07:35 +08:00
apiv2pb.UnimplementedSystemServiceServer
2023-12-01 09:13:32 +08:00
apiv2pb.UnimplementedAuthServiceServer
2023-10-27 09:07:35 +08:00
apiv2pb.UnimplementedUserServiceServer
apiv2pb.UnimplementedMemoServiceServer
apiv2pb.UnimplementedResourceServiceServer
apiv2pb.UnimplementedTagServiceServer
2023-10-27 09:01:17 +08:00
apiv2pb.UnimplementedInboxServiceServer
2023-10-28 00:21:53 +08:00
apiv2pb.UnimplementedActivityServiceServer
2023-11-24 23:04:36 +08:00
apiv2pb.UnimplementedWebhookServiceServer
2023-12-17 09:53:22 +08:00
apiv2pb.UnimplementedMarkdownServiceServer
2023-10-27 09:01:17 +08:00
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 {
2023-09-17 19:20:03 +08:00
grpc.EnableTracing = true
authProvider := NewGRPCAuthInterceptor(store, secret)
grpcServer := grpc.NewServer(
grpc.ChainUnaryInterceptor(
authProvider.AuthenticationInterceptor,
),
)
2023-10-27 09:01:17 +08:00
apiv2Service := &APIV2Service{
Secret: secret,
Profile: profile,
Store: store,
grpcServer: grpcServer,
grpcServerPort: grpcServerPort,
}
2023-10-27 09:07:35 +08:00
apiv2pb.RegisterSystemServiceServer(grpcServer, apiv2Service)
2023-12-01 09:13:32 +08:00
apiv2pb.RegisterAuthServiceServer(grpcServer, apiv2Service)
2023-10-27 09:07:35 +08:00
apiv2pb.RegisterUserServiceServer(grpcServer, apiv2Service)
apiv2pb.RegisterMemoServiceServer(grpcServer, apiv2Service)
apiv2pb.RegisterTagServiceServer(grpcServer, apiv2Service)
apiv2pb.RegisterResourceServiceServer(grpcServer, apiv2Service)
2023-10-27 09:01:17 +08:00
apiv2pb.RegisterInboxServiceServer(grpcServer, apiv2Service)
2023-10-28 00:21:53 +08:00
apiv2pb.RegisterActivityServiceServer(grpcServer, apiv2Service)
2023-11-24 23:04:36 +08:00
apiv2pb.RegisterWebhookServiceServer(grpcServer, apiv2Service)
2023-12-17 09:53:22 +08:00
apiv2pb.RegisterMarkdownServiceServer(grpcServer, apiv2Service)
2023-09-15 17:57:45 +08:00
reflection.Register(grpcServer)
2023-10-27 09:01:17 +08:00
return apiv2Service
}
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 := runtime.NewServeMux()
if err := apiv2pb.RegisterSystemServiceHandler(context.Background(), gwMux, conn); err != nil {
return err
}
2023-12-01 09:13:32 +08:00
if err := apiv2pb.RegisterAuthServiceHandler(context.Background(), gwMux, conn); err != nil {
return err
}
if err := apiv2pb.RegisterUserServiceHandler(context.Background(), gwMux, conn); err != nil {
return err
}
2023-08-05 19:51:32 +08:00
if err := apiv2pb.RegisterMemoServiceHandler(context.Background(), gwMux, conn); err != nil {
return err
}
if err := apiv2pb.RegisterTagServiceHandler(context.Background(), gwMux, conn); err != nil {
return err
}
2023-09-16 00:11:07 +08:00
if err := apiv2pb.RegisterResourceServiceHandler(context.Background(), gwMux, conn); err != nil {
return err
}
2023-10-27 09:01:17 +08:00
if err := apiv2pb.RegisterInboxServiceHandler(context.Background(), gwMux, conn); err != nil {
return err
}
2023-10-28 00:21:53 +08:00
if err := apiv2pb.RegisterActivityServiceHandler(context.Background(), gwMux, conn); err != nil {
return err
}
2023-11-24 23:04:36 +08:00
if err := apiv2pb.RegisterWebhookServiceHandler(context.Background(), gwMux, conn); err != nil {
return err
}
2023-12-17 09:53:22 +08:00
if err := apiv2pb.RegisterMarkdownServiceHandler(context.Background(), gwMux, conn); err != nil {
return err
}
e.Any("/api/v2/*", echo.WrapHandler(gwMux))
2023-09-17 19:20:03 +08:00
// 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
}