From 238f8969076eb59e3abc84ffa85a5d2654e4e6f2 Mon Sep 17 00:00:00 2001 From: boojack Date: Sat, 5 Aug 2023 21:30:23 +0800 Subject: [PATCH] feat: add system service (#2083) * feat: add system service * chore: update --- api/v1/system.go | 4 - api/v2/acl.go | 5 +- api/v2/system_service.go | 55 +++ api/v2/v2.go | 4 + proto/api/v2/system_service.proto | 29 ++ proto/gen/api/v2/README.md | 79 ++++ proto/gen/api/v2/system_service.pb.go | 348 ++++++++++++++++++ proto/gen/api/v2/system_service.pb.gw.go | 155 ++++++++ proto/gen/api/v2/system_service_grpc.pb.go | 109 ++++++ web/.prettierrc | 8 - web/.prettierrc.js | 8 + web/package.json | 4 +- web/pnpm-lock.yaml | 167 +++++++-- web/src/components/MemoResourceListView.tsx | 2 +- web/src/components/ResourceCover.tsx | 2 +- web/src/components/ResourceIcon.tsx | 2 +- web/src/components/ResourceItemDropdown.tsx | 2 +- web/src/components/Settings/SSOSection.tsx | 2 +- .../components/Settings/StorageSection.tsx | 2 +- web/src/components/Settings/SystemSection.tsx | 4 +- web/src/components/UserBanner.tsx | 2 +- web/src/main.tsx | 8 +- web/src/pages/DailyReview.tsx | 2 +- web/src/pages/ResourcesDashboard.tsx | 2 +- web/src/store/module/global.ts | 6 + 25 files changed, 940 insertions(+), 71 deletions(-) create mode 100644 api/v2/system_service.go create mode 100644 proto/api/v2/system_service.proto create mode 100644 proto/gen/api/v2/system_service.pb.go create mode 100644 proto/gen/api/v2/system_service.pb.gw.go create mode 100644 proto/gen/api/v2/system_service_grpc.pb.go delete mode 100644 web/.prettierrc create mode 100644 web/.prettierrc.js diff --git a/api/v1/system.go b/api/v1/system.go index 3c8b2578a..07e894030 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 2dba3ea14..c4cf022b8 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 000000000..cd118c423 --- /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 a8aaf63f8..a2ba08320 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 000000000..d76829481 --- /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 5765ba626..58389cdb7 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 @@ + +

Top

+ +## 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) | | + + + + +

Top

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 000000000..5c5d98a44 --- /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 000000000..bd9182dd2 --- /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 000000000..dfce22db8 --- /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 6e0dd6862..000000000 --- a/web/.prettierrc +++ /dev/null @@ -1,8 +0,0 @@ -{ - "printWidth": 140, - "useTabs": false, - "semi": true, - "singleQuote": false, - "plugins": ["@ianvs/prettier-plugin-sort-imports"], - "importOrder": ["", "", "^@/(.*)$", "^[./]", ".less$"] -} diff --git a/web/.prettierrc.js b/web/.prettierrc.js new file mode 100644 index 000000000..09a8189d1 --- /dev/null +++ b/web/.prettierrc.js @@ -0,0 +1,8 @@ +module.exports = { + printWidth: 140, + useTabs: false, + semi: true, + singleQuote: false, + plugins: [require.resolve("@trivago/prettier-plugin-sort-imports")], + importOrder: ["", "", "^@/((?!less).+)", "^[./]", "^(.+).less"], +}; diff --git a/web/package.json b/web/package.json index 2b1e84a3e..4fbfde12c 100644 --- a/web/package.json +++ b/web/package.json @@ -38,7 +38,7 @@ "zustand": "^4.3.6" }, "devDependencies": { - "@ianvs/prettier-plugin-sort-imports": "^4.1.0", + "@trivago/prettier-plugin-sort-imports": "^3.2.0", "@types/lodash-es": "^4.17.5", "@types/node": "^18.0.3", "@types/qs": "^6.9.7", @@ -57,7 +57,7 @@ "eslint-plugin-react": "^7.27.1", "less": "^4.1.1", "postcss": "^8.4.21", - "prettier": "2.5.1", + "prettier": "2.6.2", "terser": "^5.16.1", "typescript": "^5.0.4", "vite": "^4.2.1" diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 7928531e7..866bbada0 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -91,9 +91,9 @@ dependencies: version: 4.3.6(react@18.2.0) devDependencies: - '@ianvs/prettier-plugin-sort-imports': - specifier: ^4.1.0 - version: 4.1.0(prettier@2.5.1) + '@trivago/prettier-plugin-sort-imports': + specifier: ^3.2.0 + version: 3.2.0(prettier@2.6.2) '@types/lodash-es': specifier: ^4.17.5 version: 4.17.5 @@ -138,7 +138,7 @@ devDependencies: version: 8.6.0(eslint@8.46.0) eslint-plugin-prettier: specifier: ^4.2.1 - version: 4.2.1(eslint-config-prettier@8.6.0)(eslint@8.46.0)(prettier@2.5.1) + version: 4.2.1(eslint-config-prettier@8.6.0)(eslint@8.46.0)(prettier@2.6.2) eslint-plugin-react: specifier: ^7.27.1 version: 7.27.1(eslint@8.46.0) @@ -149,8 +149,8 @@ devDependencies: specifier: ^8.4.21 version: 8.4.21 prettier: - specifier: 2.5.1 - version: 2.5.1 + specifier: 2.6.2 + version: 2.6.2 terser: specifier: ^5.16.1 version: 5.16.1 @@ -174,6 +174,7 @@ packages: dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 + dev: false /@babel/code-frame@7.22.5: resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} @@ -185,6 +186,30 @@ packages: resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} engines: {node: '>=6.9.0'} + /@babel/core@7.13.10: + resolution: {integrity: sha512-bfIYcT0BdKeAZrovpMqX2Mx5NrgAckGbwT982AkdS5GNfn3KMGiprlBAtmBcFZRUmpaufS6WZFP8trvx8ptFDw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.5 + '@babel/generator': 7.22.9 + '@babel/helper-compilation-targets': 7.22.9(@babel/core@7.13.10) + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.13.10) + '@babel/helpers': 7.22.6 + '@babel/parser': 7.22.7 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.8(supports-color@5.5.0) + '@babel/types': 7.22.5 + convert-source-map: 1.9.0 + debug: 4.3.4(supports-color@5.5.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + lodash: 4.17.21 + semver: 6.3.1 + source-map: 0.5.7 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/core@7.22.9: resolution: {integrity: sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==} engines: {node: '>=6.9.0'} @@ -206,6 +231,15 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color + dev: false + + /@babel/generator@7.13.9: + resolution: {integrity: sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==} + dependencies: + '@babel/types': 7.22.5 + jsesc: 2.5.2 + source-map: 0.5.7 + dev: true /@babel/generator@7.22.9: resolution: {integrity: sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==} @@ -223,6 +257,20 @@ packages: '@babel/types': 7.22.5 dev: false + /@babel/helper-compilation-targets@7.22.9(@babel/core@7.13.10): + resolution: {integrity: sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/core': 7.13.10 + '@babel/helper-validator-option': 7.22.5 + browserslist: 4.21.10 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + /@babel/helper-compilation-targets@7.22.9(@babel/core@7.22.9): resolution: {integrity: sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==} engines: {node: '>=6.9.0'} @@ -235,6 +283,7 @@ packages: browserslist: 4.21.10 lru-cache: 5.1.1 semver: 6.3.1 + dev: false /@babel/helper-environment-visitor@7.22.5: resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} @@ -259,6 +308,20 @@ packages: dependencies: '@babel/types': 7.22.5 + /@babel/helper-module-transforms@7.22.9(@babel/core@7.13.10): + resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.13.10 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.5 + dev: true + /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.9): resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} engines: {node: '>=6.9.0'} @@ -271,6 +334,7 @@ packages: '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.5 + dev: false /@babel/helper-plugin-utils@7.22.5: resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} @@ -319,6 +383,14 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 + /@babel/parser@7.14.6: + resolution: {integrity: sha512-oG0ej7efjEXxb4UgE+klVx+3j4MVo+A2vCzm7OUN4CLo6WhQ+vSOD2yJ8m7B+DghObxtLxt3EfgMWpq+AsWehQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.22.5 + dev: true + /@babel/parser@7.22.7: resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==} engines: {node: '>=6.0.0'} @@ -351,6 +423,22 @@ packages: '@babel/parser': 7.22.7 '@babel/types': 7.22.5 + /@babel/traverse@7.13.0: + resolution: {integrity: sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ==} + dependencies: + '@babel/code-frame': 7.22.5 + '@babel/generator': 7.22.9 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 + debug: 4.3.4(supports-color@5.5.0) + globals: 11.12.0 + lodash: 4.17.21 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/traverse@7.22.8(supports-color@5.5.0): resolution: {integrity: sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==} engines: {node: '>=6.9.0'} @@ -368,6 +456,14 @@ packages: transitivePeerDependencies: - supports-color + /@babel/types@7.13.0: + resolution: {integrity: sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==} + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + lodash: 4.17.21 + to-fast-properties: 2.0.0 + dev: true + /@babel/types@7.22.5: resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} engines: {node: '>=6.9.0'} @@ -755,26 +851,6 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@ianvs/prettier-plugin-sort-imports@4.1.0(prettier@2.5.1): - resolution: {integrity: sha512-IAXeTLU24k6mRPa6mFbW1qZJ/j0m3OeH44wyijWyr+YqqdNtBnfHxAntOAATS9iDfrT01NesKGsdzqnXdDQa/A==} - peerDependencies: - '@vue/compiler-sfc': '>=3.0.0' - prettier: 2 || 3 - peerDependenciesMeta: - '@vue/compiler-sfc': - optional: true - dependencies: - '@babel/core': 7.22.9 - '@babel/generator': 7.22.9 - '@babel/parser': 7.22.7 - '@babel/traverse': 7.22.8(supports-color@5.5.0) - '@babel/types': 7.22.5 - prettier: 2.5.1 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - dev: true - /@jridgewell/gen-mapping@0.3.3: resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} @@ -1203,6 +1279,23 @@ packages: '@swc/core-win32-x64-msvc': 1.3.73 dev: true + /@trivago/prettier-plugin-sort-imports@3.2.0(prettier@2.6.2): + resolution: {integrity: sha512-DnwLe+z8t/dZX5xBbYZV1+C5STkyK/P6SSq3Nk6NXlJZsgvDZX2eN4ND7bMFgGV/NL/YChWzcNf6ziGba1ktQQ==} + peerDependencies: + prettier: 2.x + dependencies: + '@babel/core': 7.13.10 + '@babel/generator': 7.13.9 + '@babel/parser': 7.14.6 + '@babel/traverse': 7.13.0 + '@babel/types': 7.13.0 + javascript-natural-sort: 0.7.1 + lodash: 4.17.21 + prettier: 2.6.2 + transitivePeerDependencies: + - supports-color + dev: true + /@types/hoist-non-react-statics@3.3.1: resolution: {integrity: sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==} dependencies: @@ -2039,7 +2132,7 @@ packages: eslint: 8.46.0 dev: true - /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.6.0)(eslint@8.46.0)(prettier@2.5.1): + /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.6.0)(eslint@8.46.0)(prettier@2.6.2): resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -2052,7 +2145,7 @@ packages: dependencies: eslint: 8.46.0 eslint-config-prettier: 8.6.0(eslint@8.46.0) - prettier: 2.5.1 + prettier: 2.6.2 prettier-linter-helpers: 1.0.0 dev: true @@ -2710,6 +2803,10 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true + /javascript-natural-sort@0.7.1: + resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} + dev: true + /js-cookie@2.2.1: resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} dev: false @@ -2810,7 +2907,6 @@ packages: /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: false /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} @@ -3189,8 +3285,8 @@ packages: fast-diff: 1.3.0 dev: true - /prettier@2.5.1: - resolution: {integrity: sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==} + /prettier@2.6.2: + resolution: {integrity: sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==} engines: {node: '>=10.13.0'} hasBin: true dev: true @@ -3551,14 +3647,6 @@ packages: dependencies: lru-cache: 6.0.0 - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - /set-harmonic-interval@1.0.1: resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==} engines: {node: '>=6.9'} @@ -3612,7 +3700,6 @@ packages: /source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} - dev: false /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} diff --git a/web/src/components/MemoResourceListView.tsx b/web/src/components/MemoResourceListView.tsx index 20ed45111..fd6edcd29 100644 --- a/web/src/components/MemoResourceListView.tsx +++ b/web/src/components/MemoResourceListView.tsx @@ -1,9 +1,9 @@ import { ImageList, ImageListItem, useMediaQuery } from "@mui/material"; import { absolutifyLink } from "@/helpers/utils"; import { getResourceType, getResourceUrl } from "@/utils/resource"; -import SquareDiv from "./kit/SquareDiv"; import MemoResource from "./MemoResource"; import showPreviewImageDialog from "./PreviewImageDialog"; +import SquareDiv from "./kit/SquareDiv"; import "@/less/memo-resources.less"; interface Props { diff --git a/web/src/components/ResourceCover.tsx b/web/src/components/ResourceCover.tsx index d7ff04dae..02e560ad4 100644 --- a/web/src/components/ResourceCover.tsx +++ b/web/src/components/ResourceCover.tsx @@ -1,8 +1,8 @@ import React from "react"; import { getResourceType, getResourceUrl } from "@/utils/resource"; import Icon from "./Icon"; -import SquareDiv from "./kit/SquareDiv"; import showPreviewImageDialog from "./PreviewImageDialog"; +import SquareDiv from "./kit/SquareDiv"; import "@/less/resource-cover.less"; interface ResourceCoverProps { diff --git a/web/src/components/ResourceIcon.tsx b/web/src/components/ResourceIcon.tsx index 0b5d0b818..69b601170 100644 --- a/web/src/components/ResourceIcon.tsx +++ b/web/src/components/ResourceIcon.tsx @@ -1,8 +1,8 @@ import classNames from "classnames"; import { getResourceUrl } from "@/utils/resource"; import Icon from "./Icon"; -import SquareDiv from "./kit/SquareDiv"; import showPreviewImageDialog from "./PreviewImageDialog"; +import SquareDiv from "./kit/SquareDiv"; interface Props { className: string; diff --git a/web/src/components/ResourceItemDropdown.tsx b/web/src/components/ResourceItemDropdown.tsx index 17fcc3610..88e4caaaa 100644 --- a/web/src/components/ResourceItemDropdown.tsx +++ b/web/src/components/ResourceItemDropdown.tsx @@ -7,8 +7,8 @@ import { getResourceType, getResourceUrl } from "@/utils/resource"; import showChangeResourceFilenameDialog from "./ChangeResourceFilenameDialog"; import { showCommonDialog } from "./Dialog/CommonDialog"; import Icon from "./Icon"; -import Dropdown from "./kit/Dropdown"; import showPreviewImageDialog from "./PreviewImageDialog"; +import Dropdown from "./kit/Dropdown"; interface Props { resource: Resource; diff --git a/web/src/components/Settings/SSOSection.tsx b/web/src/components/Settings/SSOSection.tsx index 18e189715..ccafa66e6 100644 --- a/web/src/components/Settings/SSOSection.tsx +++ b/web/src/components/Settings/SSOSection.tsx @@ -6,8 +6,8 @@ import { useGlobalStore } from "@/store/module"; import { useTranslate } from "@/utils/i18n"; import showCreateIdentityProviderDialog from "../CreateIdentityProviderDialog"; import { showCommonDialog } from "../Dialog/CommonDialog"; -import Dropdown from "../kit/Dropdown"; import LearnMore from "../LearnMore"; +import Dropdown from "../kit/Dropdown"; interface State { disablePasswordLogin: boolean; diff --git a/web/src/components/Settings/StorageSection.tsx b/web/src/components/Settings/StorageSection.tsx index 183451dd7..757dea878 100644 --- a/web/src/components/Settings/StorageSection.tsx +++ b/web/src/components/Settings/StorageSection.tsx @@ -6,9 +6,9 @@ import { useGlobalStore } from "@/store/module"; import { useTranslate } from "@/utils/i18n"; import showCreateStorageServiceDialog from "../CreateStorageServiceDialog"; import { showCommonDialog } from "../Dialog/CommonDialog"; -import Dropdown from "../kit/Dropdown"; import LearnMore from "../LearnMore"; import showUpdateLocalStorageDialog from "../UpdateLocalStorageDialog"; +import Dropdown from "../kit/Dropdown"; const StorageSection = () => { const t = useTranslate(); diff --git a/web/src/components/Settings/SystemSection.tsx b/web/src/components/Settings/SystemSection.tsx index c5e475436..9891bdaa6 100644 --- a/web/src/components/Settings/SystemSection.tsx +++ b/web/src/components/Settings/SystemSection.tsx @@ -5,12 +5,12 @@ import * as api from "@/helpers/api"; import { formatBytes } from "@/helpers/utils"; import { useGlobalStore } from "@/store/module"; import { useTranslate } from "@/utils/i18n"; +import { showCommonDialog } from "../Dialog/CommonDialog"; +import showDisablePasswordLoginDialog from "../DisablePasswordLoginDialog"; import Icon from "../Icon"; import LearnMore from "../LearnMore"; import showUpdateCustomizedProfileDialog from "../UpdateCustomizedProfileDialog"; import "@/less/settings/system-section.less"; -import { showCommonDialog } from "../Dialog/CommonDialog"; -import showDisablePasswordLoginDialog from "../DisablePasswordLoginDialog"; interface State { dbSize: number; diff --git a/web/src/components/UserBanner.tsx b/web/src/components/UserBanner.tsx index 120177a1e..3a2728c9c 100644 --- a/web/src/components/UserBanner.tsx +++ b/web/src/components/UserBanner.tsx @@ -4,8 +4,8 @@ import { useGlobalStore, useUserStore } from "@/store/module"; import { useTranslate } from "@/utils/i18n"; import showAboutSiteDialog from "./AboutSiteDialog"; import Icon from "./Icon"; -import Dropdown from "./kit/Dropdown"; import UserAvatar from "./UserAvatar"; +import Dropdown from "./kit/Dropdown"; const UserBanner = () => { const t = useTranslate(); diff --git a/web/src/main.tsx b/web/src/main.tsx index 1bf4b38c7..375bea98b 100644 --- a/web/src/main.tsx +++ b/web/src/main.tsx @@ -2,13 +2,13 @@ import { CssVarsProvider } from "@mui/joy"; import { createRoot } from "react-dom/client"; import { Provider } from "react-redux"; import App from "./App"; -import store from "./store"; -import theme from "./theme"; +import "./css/global.css"; +import "./css/tailwind.css"; import "./helpers/polyfill"; import "./i18n"; import "./less/code-highlight.less"; -import "./css/global.css"; -import "./css/tailwind.css"; +import store from "./store"; +import theme from "./theme"; const container = document.getElementById("root"); const root = createRoot(container as HTMLElement); diff --git a/web/src/pages/DailyReview.tsx b/web/src/pages/DailyReview.tsx index 1b663b0f5..00df16cb6 100644 --- a/web/src/pages/DailyReview.tsx +++ b/web/src/pages/DailyReview.tsx @@ -5,9 +5,9 @@ import toast from "react-hot-toast"; import DailyMemo from "@/components/DailyMemo"; import Empty from "@/components/Empty"; import Icon from "@/components/Icon"; -import DatePicker from "@/components/kit/DatePicker"; import MobileHeader from "@/components/MobileHeader"; import showPreviewImageDialog from "@/components/PreviewImageDialog"; +import DatePicker from "@/components/kit/DatePicker"; import { DAILY_TIMESTAMP, DEFAULT_MEMO_LIMIT } from "@/helpers/consts"; import { convertToMillis, getDateStampByDate, getNormalizedDateString, getTimeStampByDate, isFutureDate } from "@/helpers/datetime"; import useToggle from "@/hooks/useToggle"; diff --git a/web/src/pages/ResourcesDashboard.tsx b/web/src/pages/ResourcesDashboard.tsx index 70c857f0a..1b2785d98 100644 --- a/web/src/pages/ResourcesDashboard.tsx +++ b/web/src/pages/ResourcesDashboard.tsx @@ -5,11 +5,11 @@ import showCreateResourceDialog from "@/components/CreateResourceDialog"; import { showCommonDialog } from "@/components/Dialog/CommonDialog"; import Empty from "@/components/Empty"; import Icon from "@/components/Icon"; -import Dropdown from "@/components/kit/Dropdown"; import MobileHeader from "@/components/MobileHeader"; import ResourceCard from "@/components/ResourceCard"; import ResourceItem from "@/components/ResourceItem"; import ResourceSearchBar from "@/components/ResourceSearchBar"; +import Dropdown from "@/components/kit/Dropdown"; import { DEFAULT_MEMO_LIMIT } from "@/helpers/consts"; import useEvent from "@/hooks/useEvent"; import useLoading from "@/hooks/useLoading"; diff --git a/web/src/store/module/global.ts b/web/src/store/module/global.ts index 6d903761b..5cc422374 100644 --- a/web/src/store/module/global.ts +++ b/web/src/store/module/global.ts @@ -1,3 +1,4 @@ +import axios from "axios"; import * as api from "@/helpers/api"; import storage from "@/helpers/storage"; import i18n from "@/i18n"; @@ -74,6 +75,11 @@ export const useGlobalStore = () => { }, fetchSystemStatus: async () => { const { data: systemStatus } = await api.getSystemStatus(); + // TODO: update this when api v2 is ready. + const { + data: { systemInfo }, + } = await axios.get("/api/v2/system/info"); + systemStatus.dbSize = Number(systemInfo.dbSize); store.dispatch(setGlobalState({ systemStatus: systemStatus })); return systemStatus; },