diff --git a/api/v1/system.go b/api/v1/system.go index 3c8b2578..07e89403 100644 --- a/api/v1/system.go +++ b/api/v1/system.go @@ -82,10 +82,6 @@ func (s *APIV1Service) registerSystemRoutes(g *echo.Group) { } if hostUser != nil { systemStatus.Host = &User{ID: hostUser.ID} - // data desensitize - systemStatus.Host.OpenID = "" - systemStatus.Host.Email = "" - systemStatus.Host.AvatarURL = "" } systemSettingList, err := s.Store.ListSystemSettings(ctx, &store.FindSystemSetting{}) diff --git a/api/v2/acl.go b/api/v2/acl.go index 2dba3ea1..c4cf022b 100644 --- a/api/v2/acl.go +++ b/api/v2/acl.go @@ -28,8 +28,9 @@ const ( ) var authenticationAllowlistMethods = map[string]bool{ - "/memos.api.v2.UserService/GetUser": true, - "/memos.api.v2.MemoService/ListMemos": true, + "/memos.api.v2.SystemService/GetSystemInfo": true, + "/memos.api.v2.UserService/GetUser": true, + "/memos.api.v2.MemoService/ListMemos": true, } // IsAuthenticationAllowed returns whether the method is exempted from authentication. diff --git a/api/v2/system_service.go b/api/v2/system_service.go new file mode 100644 index 00000000..cd118c42 --- /dev/null +++ b/api/v2/system_service.go @@ -0,0 +1,55 @@ +package v2 + +import ( + "context" + "os" + + apiv2pb "github.com/usememos/memos/proto/gen/api/v2" + "github.com/usememos/memos/server/profile" + "github.com/usememos/memos/store" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +type SystemService struct { + apiv2pb.UnimplementedSystemServiceServer + + Profile *profile.Profile + Store *store.Store +} + +// NewSystemService creates a new SystemService. +func NewSystemService(profile *profile.Profile, store *store.Store) *SystemService { + return &SystemService{ + Profile: profile, + Store: store, + } +} + +func (s *SystemService) GetSystemInfo(ctx context.Context, _ *apiv2pb.GetSystemInfoRequest) (*apiv2pb.GetSystemInfoResponse, error) { + defaultSystemInfo := &apiv2pb.SystemInfo{} + + // Get the database size if the user is a host. + userIDPtr := ctx.Value(UserIDContextKey) + if userIDPtr != nil { + userID := userIDPtr.(int32) + user, err := s.Store.GetUser(ctx, &store.FindUser{ + ID: &userID, + }) + if err != nil { + return nil, status.Errorf(codes.Internal, "failed to get user: %v", err) + } + if user != nil && user.Role == store.RoleHost { + fi, err := os.Stat(s.Profile.DSN) + if err != nil { + return nil, status.Errorf(codes.Internal, "failed to get file info: %v", err) + } + defaultSystemInfo.DbSize = fi.Size() + } + } + + response := &apiv2pb.GetSystemInfoResponse{ + SystemInfo: defaultSystemInfo, + } + return response, nil +} diff --git a/api/v2/v2.go b/api/v2/v2.go index a8aaf63f..a2ba0832 100644 --- a/api/v2/v2.go +++ b/api/v2/v2.go @@ -29,6 +29,7 @@ func NewAPIV2Service(secret string, profile *profile.Profile, store *store.Store authProvider.AuthenticationInterceptor, ), ) + apiv2pb.RegisterSystemServiceServer(grpcServer, NewSystemService(profile, store)) apiv2pb.RegisterUserServiceServer(grpcServer, NewUserService(store)) apiv2pb.RegisterMemoServiceServer(grpcServer, NewMemoService(store)) apiv2pb.RegisterTagServiceServer(grpcServer, NewTagService(store)) @@ -60,6 +61,9 @@ func (s *APIV2Service) RegisterGateway(ctx context.Context, e *echo.Echo) error } 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 } diff --git a/proto/api/v2/system_service.proto b/proto/api/v2/system_service.proto new file mode 100644 index 00000000..d7682948 --- /dev/null +++ b/proto/api/v2/system_service.proto @@ -0,0 +1,29 @@ +syntax = "proto3"; + +package memos.api.v2; + +import "google/api/annotations.proto"; + +option go_package = "gen/api/v2"; + +service SystemService { + rpc GetSystemInfo(GetSystemInfoRequest) returns (GetSystemInfoResponse) { + option (google.api.http) = {get: "/api/v2/system/info"}; + } +} + +message SystemInfo { + string version = 1; + string mode = 2; + bool allow_registration = 3; + bool disable_password_login = 4; + string additional_script = 5; + string additional_style = 6; + int64 db_size = 7; +} + +message GetSystemInfoRequest {} + +message GetSystemInfoResponse { + SystemInfo system_info = 1; +} diff --git a/proto/gen/api/v2/README.md b/proto/gen/api/v2/README.md index 5765ba62..58389cdb 100644 --- a/proto/gen/api/v2/README.md +++ b/proto/gen/api/v2/README.md @@ -17,6 +17,13 @@ - [MemoService](#memos-api-v2-MemoService) +- [api/v2/system_service.proto](#api_v2_system_service-proto) + - [GetSystemInfoRequest](#memos-api-v2-GetSystemInfoRequest) + - [GetSystemInfoResponse](#memos-api-v2-GetSystemInfoResponse) + - [SystemInfo](#memos-api-v2-SystemInfo) + + - [SystemService](#memos-api-v2-SystemService) + - [api/v2/tag_service.proto](#api_v2_tag_service-proto) - [ListTagsRequest](#memos-api-v2-ListTagsRequest) - [ListTagsResponse](#memos-api-v2-ListTagsResponse) @@ -195,6 +202,78 @@ + +
+ +## api/v2/system_service.proto + + + + + +### GetSystemInfoRequest + + + + + + + + + +### GetSystemInfoResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| system_info | [SystemInfo](#memos-api-v2-SystemInfo) | | | + + + + + + + + +### SystemInfo + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| version | [string](#string) | | | +| mode | [string](#string) | | | +| allow_registration | [bool](#bool) | | | +| disable_password_login | [bool](#bool) | | | +| additional_script | [string](#string) | | | +| additional_style | [string](#string) | | | +| db_size | [int64](#int64) | | | + + + + + + + + + + + + + + +### SystemService + + +| Method Name | Request Type | Response Type | Description | +| ----------- | ------------ | ------------- | ------------| +| GetSystemInfo | [GetSystemInfoRequest](#memos-api-v2-GetSystemInfoRequest) | [GetSystemInfoResponse](#memos-api-v2-GetSystemInfoResponse) | | + + + + + diff --git a/proto/gen/api/v2/system_service.pb.go b/proto/gen/api/v2/system_service.pb.go new file mode 100644 index 00000000..5c5d98a4 --- /dev/null +++ b/proto/gen/api/v2/system_service.pb.go @@ -0,0 +1,348 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.31.0 +// protoc (unknown) +// source: api/v2/system_service.proto + +package apiv2 + +import ( + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type SystemInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` + Mode string `protobuf:"bytes,2,opt,name=mode,proto3" json:"mode,omitempty"` + AllowRegistration bool `protobuf:"varint,3,opt,name=allow_registration,json=allowRegistration,proto3" json:"allow_registration,omitempty"` + DisablePasswordLogin bool `protobuf:"varint,4,opt,name=disable_password_login,json=disablePasswordLogin,proto3" json:"disable_password_login,omitempty"` + AdditionalScript string `protobuf:"bytes,5,opt,name=additional_script,json=additionalScript,proto3" json:"additional_script,omitempty"` + AdditionalStyle string `protobuf:"bytes,6,opt,name=additional_style,json=additionalStyle,proto3" json:"additional_style,omitempty"` + DbSize int64 `protobuf:"varint,7,opt,name=db_size,json=dbSize,proto3" json:"db_size,omitempty"` +} + +func (x *SystemInfo) Reset() { + *x = SystemInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v2_system_service_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SystemInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SystemInfo) ProtoMessage() {} + +func (x *SystemInfo) ProtoReflect() protoreflect.Message { + mi := &file_api_v2_system_service_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SystemInfo.ProtoReflect.Descriptor instead. +func (*SystemInfo) Descriptor() ([]byte, []int) { + return file_api_v2_system_service_proto_rawDescGZIP(), []int{0} +} + +func (x *SystemInfo) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *SystemInfo) GetMode() string { + if x != nil { + return x.Mode + } + return "" +} + +func (x *SystemInfo) GetAllowRegistration() bool { + if x != nil { + return x.AllowRegistration + } + return false +} + +func (x *SystemInfo) GetDisablePasswordLogin() bool { + if x != nil { + return x.DisablePasswordLogin + } + return false +} + +func (x *SystemInfo) GetAdditionalScript() string { + if x != nil { + return x.AdditionalScript + } + return "" +} + +func (x *SystemInfo) GetAdditionalStyle() string { + if x != nil { + return x.AdditionalStyle + } + return "" +} + +func (x *SystemInfo) GetDbSize() int64 { + if x != nil { + return x.DbSize + } + return 0 +} + +type GetSystemInfoRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *GetSystemInfoRequest) Reset() { + *x = GetSystemInfoRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v2_system_service_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSystemInfoRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSystemInfoRequest) ProtoMessage() {} + +func (x *GetSystemInfoRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v2_system_service_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSystemInfoRequest.ProtoReflect.Descriptor instead. +func (*GetSystemInfoRequest) Descriptor() ([]byte, []int) { + return file_api_v2_system_service_proto_rawDescGZIP(), []int{1} +} + +type GetSystemInfoResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SystemInfo *SystemInfo `protobuf:"bytes,1,opt,name=system_info,json=systemInfo,proto3" json:"system_info,omitempty"` +} + +func (x *GetSystemInfoResponse) Reset() { + *x = GetSystemInfoResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v2_system_service_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSystemInfoResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSystemInfoResponse) ProtoMessage() {} + +func (x *GetSystemInfoResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v2_system_service_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetSystemInfoResponse.ProtoReflect.Descriptor instead. +func (*GetSystemInfoResponse) Descriptor() ([]byte, []int) { + return file_api_v2_system_service_proto_rawDescGZIP(), []int{2} +} + +func (x *GetSystemInfoResponse) GetSystemInfo() *SystemInfo { + if x != nil { + return x.SystemInfo + } + return nil +} + +var File_api_v2_system_service_proto protoreflect.FileDescriptor + +var file_api_v2_system_service_proto_rawDesc = []byte{ + 0x0a, 0x1b, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x6d, + 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x90, 0x02, 0x0a, 0x0a, 0x53, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, + 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x61, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x61, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x53, 0x74, + 0x79, 0x6c, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x62, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x64, 0x62, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x16, 0x0a, 0x14, + 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x52, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, + 0x0b, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x73, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x32, 0x86, 0x01, 0x0a, 0x0d, 0x53, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x75, 0x0a, 0x0d, 0x47, 0x65, + 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6d, 0x65, + 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x23, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, + 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x12, 0x13, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2f, 0x69, 0x6e, 0x66, + 0x6f, 0x42, 0xaa, 0x01, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x42, 0x12, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x30, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x75, 0x73, 0x65, 0x6d, 0x65, 0x6d, 0x6f, + 0x73, 0x2f, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x65, + 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x3b, 0x61, 0x70, 0x69, 0x76, 0x32, 0xa2, 0x02, + 0x03, 0x4d, 0x41, 0x58, 0xaa, 0x02, 0x0c, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x70, 0x69, + 0x2e, 0x56, 0x32, 0xca, 0x02, 0x0c, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x5c, 0x41, 0x70, 0x69, 0x5c, + 0x56, 0x32, 0xe2, 0x02, 0x18, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, + 0x32, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, + 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x32, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_api_v2_system_service_proto_rawDescOnce sync.Once + file_api_v2_system_service_proto_rawDescData = file_api_v2_system_service_proto_rawDesc +) + +func file_api_v2_system_service_proto_rawDescGZIP() []byte { + file_api_v2_system_service_proto_rawDescOnce.Do(func() { + file_api_v2_system_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_v2_system_service_proto_rawDescData) + }) + return file_api_v2_system_service_proto_rawDescData +} + +var file_api_v2_system_service_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_api_v2_system_service_proto_goTypes = []interface{}{ + (*SystemInfo)(nil), // 0: memos.api.v2.SystemInfo + (*GetSystemInfoRequest)(nil), // 1: memos.api.v2.GetSystemInfoRequest + (*GetSystemInfoResponse)(nil), // 2: memos.api.v2.GetSystemInfoResponse +} +var file_api_v2_system_service_proto_depIdxs = []int32{ + 0, // 0: memos.api.v2.GetSystemInfoResponse.system_info:type_name -> memos.api.v2.SystemInfo + 1, // 1: memos.api.v2.SystemService.GetSystemInfo:input_type -> memos.api.v2.GetSystemInfoRequest + 2, // 2: memos.api.v2.SystemService.GetSystemInfo:output_type -> memos.api.v2.GetSystemInfoResponse + 2, // [2:3] is the sub-list for method output_type + 1, // [1:2] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_api_v2_system_service_proto_init() } +func file_api_v2_system_service_proto_init() { + if File_api_v2_system_service_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_api_v2_system_service_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SystemInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v2_system_service_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetSystemInfoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v2_system_service_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetSystemInfoResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_api_v2_system_service_proto_rawDesc, + NumEnums: 0, + NumMessages: 3, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_api_v2_system_service_proto_goTypes, + DependencyIndexes: file_api_v2_system_service_proto_depIdxs, + MessageInfos: file_api_v2_system_service_proto_msgTypes, + }.Build() + File_api_v2_system_service_proto = out.File + file_api_v2_system_service_proto_rawDesc = nil + file_api_v2_system_service_proto_goTypes = nil + file_api_v2_system_service_proto_depIdxs = nil +} diff --git a/proto/gen/api/v2/system_service.pb.gw.go b/proto/gen/api/v2/system_service.pb.gw.go new file mode 100644 index 00000000..bd9182dd --- /dev/null +++ b/proto/gen/api/v2/system_service.pb.gw.go @@ -0,0 +1,155 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: api/v2/system_service.proto + +/* +Package apiv2 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package apiv2 + +import ( + "context" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = metadata.Join + +func request_SystemService_GetSystemInfo_0(ctx context.Context, marshaler runtime.Marshaler, client SystemServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetSystemInfoRequest + var metadata runtime.ServerMetadata + + msg, err := client.GetSystemInfo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_SystemService_GetSystemInfo_0(ctx context.Context, marshaler runtime.Marshaler, server SystemServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetSystemInfoRequest + var metadata runtime.ServerMetadata + + msg, err := server.GetSystemInfo(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterSystemServiceHandlerServer registers the http handlers for service SystemService to "mux". +// UnaryRPC :call SystemServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterSystemServiceHandlerFromEndpoint instead. +func RegisterSystemServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server SystemServiceServer) error { + + mux.Handle("GET", pattern_SystemService_GetSystemInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/memos.api.v2.SystemService/GetSystemInfo", runtime.WithHTTPPathPattern("/api/v2/system/info")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SystemService_GetSystemInfo_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_SystemService_GetSystemInfo_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterSystemServiceHandlerFromEndpoint is same as RegisterSystemServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterSystemServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.DialContext(ctx, endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterSystemServiceHandler(ctx, mux, conn) +} + +// RegisterSystemServiceHandler registers the http handlers for service SystemService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterSystemServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterSystemServiceHandlerClient(ctx, mux, NewSystemServiceClient(conn)) +} + +// RegisterSystemServiceHandlerClient registers the http handlers for service SystemService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "SystemServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "SystemServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "SystemServiceClient" to call the correct interceptors. +func RegisterSystemServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client SystemServiceClient) error { + + mux.Handle("GET", pattern_SystemService_GetSystemInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/memos.api.v2.SystemService/GetSystemInfo", runtime.WithHTTPPathPattern("/api/v2/system/info")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SystemService_GetSystemInfo_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_SystemService_GetSystemInfo_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_SystemService_GetSystemInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"api", "v2", "system", "info"}, "")) +) + +var ( + forward_SystemService_GetSystemInfo_0 = runtime.ForwardResponseMessage +) diff --git a/proto/gen/api/v2/system_service_grpc.pb.go b/proto/gen/api/v2/system_service_grpc.pb.go new file mode 100644 index 00000000..dfce22db --- /dev/null +++ b/proto/gen/api/v2/system_service_grpc.pb.go @@ -0,0 +1,109 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc (unknown) +// source: api/v2/system_service.proto + +package apiv2 + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + SystemService_GetSystemInfo_FullMethodName = "/memos.api.v2.SystemService/GetSystemInfo" +) + +// SystemServiceClient is the client API for SystemService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type SystemServiceClient interface { + GetSystemInfo(ctx context.Context, in *GetSystemInfoRequest, opts ...grpc.CallOption) (*GetSystemInfoResponse, error) +} + +type systemServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewSystemServiceClient(cc grpc.ClientConnInterface) SystemServiceClient { + return &systemServiceClient{cc} +} + +func (c *systemServiceClient) GetSystemInfo(ctx context.Context, in *GetSystemInfoRequest, opts ...grpc.CallOption) (*GetSystemInfoResponse, error) { + out := new(GetSystemInfoResponse) + err := c.cc.Invoke(ctx, SystemService_GetSystemInfo_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// SystemServiceServer is the server API for SystemService service. +// All implementations must embed UnimplementedSystemServiceServer +// for forward compatibility +type SystemServiceServer interface { + GetSystemInfo(context.Context, *GetSystemInfoRequest) (*GetSystemInfoResponse, error) + mustEmbedUnimplementedSystemServiceServer() +} + +// UnimplementedSystemServiceServer must be embedded to have forward compatible implementations. +type UnimplementedSystemServiceServer struct { +} + +func (UnimplementedSystemServiceServer) GetSystemInfo(context.Context, *GetSystemInfoRequest) (*GetSystemInfoResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetSystemInfo not implemented") +} +func (UnimplementedSystemServiceServer) mustEmbedUnimplementedSystemServiceServer() {} + +// UnsafeSystemServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to SystemServiceServer will +// result in compilation errors. +type UnsafeSystemServiceServer interface { + mustEmbedUnimplementedSystemServiceServer() +} + +func RegisterSystemServiceServer(s grpc.ServiceRegistrar, srv SystemServiceServer) { + s.RegisterService(&SystemService_ServiceDesc, srv) +} + +func _SystemService_GetSystemInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetSystemInfoRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SystemServiceServer).GetSystemInfo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SystemService_GetSystemInfo_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SystemServiceServer).GetSystemInfo(ctx, req.(*GetSystemInfoRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// SystemService_ServiceDesc is the grpc.ServiceDesc for SystemService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var SystemService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "memos.api.v2.SystemService", + HandlerType: (*SystemServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetSystemInfo", + Handler: _SystemService_GetSystemInfo_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "api/v2/system_service.proto", +} diff --git a/web/.prettierrc b/web/.prettierrc deleted file mode 100644 index 6e0dd686..00000000 --- a/web/.prettierrc +++ /dev/null @@ -1,8 +0,0 @@ -{ - "printWidth": 140, - "useTabs": false, - "semi": true, - "singleQuote": false, - "plugins": ["@ianvs/prettier-plugin-sort-imports"], - "importOrder": ["