2024-02-20 23:02:01 +08:00
|
|
|
package v2
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"google.golang.org/grpc/codes"
|
|
|
|
"google.golang.org/grpc/status"
|
|
|
|
|
|
|
|
apiv2pb "github.com/usememos/memos/proto/gen/api/v2"
|
|
|
|
storepb "github.com/usememos/memos/proto/gen/store"
|
|
|
|
"github.com/usememos/memos/store"
|
|
|
|
)
|
|
|
|
|
2024-04-12 08:36:02 +08:00
|
|
|
func (s *APIV2Service) ListWorkspaceSettings(ctx context.Context, _ *apiv2pb.ListWorkspaceSettingsRequest) (*apiv2pb.ListWorkspaceSettingsResponse, error) {
|
2024-04-17 08:56:52 +08:00
|
|
|
workspaceSettings, err := s.Store.ListWorkspaceSettings(ctx, &store.FindWorkspaceSetting{})
|
2024-04-12 08:32:54 +08:00
|
|
|
if err != nil {
|
|
|
|
return nil, status.Errorf(codes.Internal, "failed to get workspace setting: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
response := &apiv2pb.ListWorkspaceSettingsResponse{
|
|
|
|
Settings: []*apiv2pb.WorkspaceSetting{},
|
|
|
|
}
|
|
|
|
for _, workspaceSetting := range workspaceSettings {
|
|
|
|
if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_BASIC {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
response.Settings = append(response.Settings, convertWorkspaceSettingFromStore(workspaceSetting))
|
|
|
|
}
|
|
|
|
return response, nil
|
|
|
|
}
|
|
|
|
|
2024-02-20 23:02:01 +08:00
|
|
|
func (s *APIV2Service) GetWorkspaceSetting(ctx context.Context, request *apiv2pb.GetWorkspaceSettingRequest) (*apiv2pb.GetWorkspaceSettingResponse, error) {
|
|
|
|
settingKeyString, err := ExtractWorkspaceSettingKeyFromName(request.Name)
|
|
|
|
if err != nil {
|
|
|
|
return nil, status.Errorf(codes.InvalidArgument, "invalid workspace setting name: %v", err)
|
|
|
|
}
|
|
|
|
settingKey := storepb.WorkspaceSettingKey(storepb.WorkspaceSettingKey_value[settingKeyString])
|
2024-04-17 08:56:52 +08:00
|
|
|
workspaceSetting, err := s.Store.GetWorkspaceSetting(ctx, &store.FindWorkspaceSetting{
|
2024-04-10 22:31:55 +08:00
|
|
|
Name: settingKey.String(),
|
2024-02-20 23:02:01 +08:00
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return nil, status.Errorf(codes.Internal, "failed to get workspace setting: %v", err)
|
|
|
|
}
|
|
|
|
if workspaceSetting == nil {
|
|
|
|
return nil, status.Errorf(codes.NotFound, "workspace setting not found")
|
|
|
|
}
|
|
|
|
|
|
|
|
return &apiv2pb.GetWorkspaceSettingResponse{
|
|
|
|
Setting: convertWorkspaceSettingFromStore(workspaceSetting),
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *APIV2Service) SetWorkspaceSetting(ctx context.Context, request *apiv2pb.SetWorkspaceSettingRequest) (*apiv2pb.SetWorkspaceSettingResponse, error) {
|
2024-03-17 19:18:45 +08:00
|
|
|
if s.Profile.Mode == "demo" {
|
|
|
|
return nil, status.Errorf(codes.InvalidArgument, "setting workspace setting is not allowed in demo mode")
|
|
|
|
}
|
|
|
|
|
2024-02-20 23:02:01 +08:00
|
|
|
user, err := getCurrentUser(ctx, s.Store)
|
|
|
|
if err != nil {
|
|
|
|
return nil, status.Errorf(codes.Internal, "failed to get current user: %v", err)
|
|
|
|
}
|
|
|
|
if user.Role != store.RoleHost {
|
|
|
|
return nil, status.Errorf(codes.PermissionDenied, "permission denied")
|
|
|
|
}
|
|
|
|
|
2024-04-17 08:56:52 +08:00
|
|
|
if _, err := s.Store.UpsertWorkspaceSetting(ctx, convertWorkspaceSettingToStore(request.Setting)); err != nil {
|
2024-02-20 23:02:01 +08:00
|
|
|
return nil, status.Errorf(codes.Internal, "failed to upsert workspace setting: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return &apiv2pb.SetWorkspaceSettingResponse{}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func convertWorkspaceSettingFromStore(setting *storepb.WorkspaceSetting) *apiv2pb.WorkspaceSetting {
|
2024-04-10 23:01:01 +08:00
|
|
|
workspaceSetting := &apiv2pb.WorkspaceSetting{
|
2024-02-20 23:02:01 +08:00
|
|
|
Name: fmt.Sprintf("%s%s", WorkspaceSettingNamePrefix, setting.Key.String()),
|
2024-04-10 23:01:01 +08:00
|
|
|
}
|
|
|
|
switch setting.Value.(type) {
|
|
|
|
case *storepb.WorkspaceSetting_GeneralSetting:
|
|
|
|
workspaceSetting.Value = &apiv2pb.WorkspaceSetting_GeneralSetting{
|
2024-04-10 20:05:17 +08:00
|
|
|
GeneralSetting: convertWorkspaceGeneralSettingFromStore(setting.GetGeneralSetting()),
|
2024-04-10 23:01:01 +08:00
|
|
|
}
|
|
|
|
case *storepb.WorkspaceSetting_StorageSetting:
|
|
|
|
workspaceSetting.Value = &apiv2pb.WorkspaceSetting_StorageSetting{
|
|
|
|
StorageSetting: convertWorkspaceStorageSettingFromStore(setting.GetStorageSetting()),
|
|
|
|
}
|
|
|
|
case *storepb.WorkspaceSetting_MemoRelatedSetting:
|
|
|
|
workspaceSetting.Value = &apiv2pb.WorkspaceSetting_MemoRelatedSetting{
|
|
|
|
MemoRelatedSetting: convertWorkspaceMemoRelatedSettingFromStore(setting.GetMemoRelatedSetting()),
|
|
|
|
}
|
2024-02-20 23:02:01 +08:00
|
|
|
}
|
2024-04-10 23:01:01 +08:00
|
|
|
return workspaceSetting
|
2024-02-20 23:02:01 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func convertWorkspaceSettingToStore(setting *apiv2pb.WorkspaceSetting) *storepb.WorkspaceSetting {
|
|
|
|
settingKeyString, _ := ExtractWorkspaceSettingKeyFromName(setting.Name)
|
2024-04-10 23:01:01 +08:00
|
|
|
workspaceSetting := &storepb.WorkspaceSetting{
|
2024-02-20 23:02:01 +08:00
|
|
|
Key: storepb.WorkspaceSettingKey(storepb.WorkspaceSettingKey_value[settingKeyString]),
|
2024-04-10 20:05:17 +08:00
|
|
|
Value: &storepb.WorkspaceSetting_GeneralSetting{
|
|
|
|
GeneralSetting: convertWorkspaceGeneralSettingToStore(setting.GetGeneralSetting()),
|
2024-02-20 23:02:01 +08:00
|
|
|
},
|
|
|
|
}
|
2024-04-10 23:01:01 +08:00
|
|
|
switch workspaceSetting.Key {
|
|
|
|
case storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL:
|
|
|
|
workspaceSetting.Value = &storepb.WorkspaceSetting_GeneralSetting{
|
|
|
|
GeneralSetting: convertWorkspaceGeneralSettingToStore(setting.GetGeneralSetting()),
|
|
|
|
}
|
|
|
|
case storepb.WorkspaceSettingKey_WORKSPACE_SETTING_STORAGE:
|
|
|
|
workspaceSetting.Value = &storepb.WorkspaceSetting_StorageSetting{
|
|
|
|
StorageSetting: convertWorkspaceStorageSettingToStore(setting.GetStorageSetting()),
|
|
|
|
}
|
|
|
|
case storepb.WorkspaceSettingKey_WORKSPACE_SETTING_MEMO_RELATED:
|
|
|
|
workspaceSetting.Value = &storepb.WorkspaceSetting_MemoRelatedSetting{
|
|
|
|
MemoRelatedSetting: convertWorkspaceMemoRelatedSettingToStore(setting.GetMemoRelatedSetting()),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return workspaceSetting
|
2024-02-20 23:02:01 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func convertWorkspaceGeneralSettingFromStore(setting *storepb.WorkspaceGeneralSetting) *apiv2pb.WorkspaceGeneralSetting {
|
|
|
|
if setting == nil {
|
|
|
|
return nil
|
|
|
|
}
|
2024-04-12 08:32:54 +08:00
|
|
|
generalSetting := &apiv2pb.WorkspaceGeneralSetting{
|
2024-02-20 23:02:01 +08:00
|
|
|
InstanceUrl: setting.InstanceUrl,
|
|
|
|
DisallowSignup: setting.DisallowSignup,
|
|
|
|
DisallowPasswordLogin: setting.DisallowPasswordLogin,
|
|
|
|
AdditionalScript: setting.AdditionalScript,
|
|
|
|
AdditionalStyle: setting.AdditionalStyle,
|
|
|
|
}
|
2024-04-12 08:32:54 +08:00
|
|
|
if setting.CustomProfile != nil {
|
|
|
|
generalSetting.CustomProfile = &apiv2pb.WorkspaceCustomProfile{
|
|
|
|
Title: setting.CustomProfile.Title,
|
|
|
|
Description: setting.CustomProfile.Description,
|
|
|
|
LogoUrl: setting.CustomProfile.LogoUrl,
|
|
|
|
Locale: setting.CustomProfile.Locale,
|
|
|
|
Appearance: setting.CustomProfile.Appearance,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return generalSetting
|
2024-02-20 23:02:01 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
func convertWorkspaceGeneralSettingToStore(setting *apiv2pb.WorkspaceGeneralSetting) *storepb.WorkspaceGeneralSetting {
|
|
|
|
if setting == nil {
|
|
|
|
return nil
|
|
|
|
}
|
2024-04-12 08:32:54 +08:00
|
|
|
generalSetting := &storepb.WorkspaceGeneralSetting{
|
2024-02-20 23:02:01 +08:00
|
|
|
InstanceUrl: setting.InstanceUrl,
|
|
|
|
DisallowSignup: setting.DisallowSignup,
|
|
|
|
DisallowPasswordLogin: setting.DisallowPasswordLogin,
|
|
|
|
AdditionalScript: setting.AdditionalScript,
|
|
|
|
AdditionalStyle: setting.AdditionalStyle,
|
|
|
|
}
|
2024-04-12 08:32:54 +08:00
|
|
|
if setting.CustomProfile != nil {
|
|
|
|
generalSetting.CustomProfile = &storepb.WorkspaceCustomProfile{
|
|
|
|
Title: setting.CustomProfile.Title,
|
|
|
|
Description: setting.CustomProfile.Description,
|
|
|
|
LogoUrl: setting.CustomProfile.LogoUrl,
|
|
|
|
Locale: setting.CustomProfile.Locale,
|
|
|
|
Appearance: setting.CustomProfile.Appearance,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return generalSetting
|
2024-02-20 23:02:01 +08:00
|
|
|
}
|
2024-04-10 23:01:01 +08:00
|
|
|
|
|
|
|
func convertWorkspaceStorageSettingFromStore(setting *storepb.WorkspaceStorageSetting) *apiv2pb.WorkspaceStorageSetting {
|
|
|
|
if setting == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return &apiv2pb.WorkspaceStorageSetting{
|
2024-04-13 02:08:35 +08:00
|
|
|
StorageType: apiv2pb.WorkspaceStorageSetting_StorageType(setting.StorageType),
|
|
|
|
LocalStoragePathTemplate: setting.LocalStoragePathTemplate,
|
|
|
|
UploadSizeLimitMb: setting.UploadSizeLimitMb,
|
|
|
|
ActivedExternalStorageId: setting.ActivedExternalStorageId,
|
2024-04-10 23:01:01 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func convertWorkspaceStorageSettingToStore(setting *apiv2pb.WorkspaceStorageSetting) *storepb.WorkspaceStorageSetting {
|
|
|
|
if setting == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return &storepb.WorkspaceStorageSetting{
|
2024-04-13 02:08:35 +08:00
|
|
|
StorageType: storepb.WorkspaceStorageSetting_StorageType(setting.StorageType),
|
|
|
|
LocalStoragePathTemplate: setting.LocalStoragePathTemplate,
|
|
|
|
UploadSizeLimitMb: setting.UploadSizeLimitMb,
|
|
|
|
ActivedExternalStorageId: setting.ActivedExternalStorageId,
|
2024-04-10 23:01:01 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func convertWorkspaceMemoRelatedSettingFromStore(setting *storepb.WorkspaceMemoRelatedSetting) *apiv2pb.WorkspaceMemoRelatedSetting {
|
|
|
|
if setting == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return &apiv2pb.WorkspaceMemoRelatedSetting{
|
|
|
|
DisallowPublicVisible: setting.DisallowPublicVisible,
|
|
|
|
DisplayWithUpdateTime: setting.DisplayWithUpdateTime,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func convertWorkspaceMemoRelatedSettingToStore(setting *apiv2pb.WorkspaceMemoRelatedSetting) *storepb.WorkspaceMemoRelatedSetting {
|
|
|
|
if setting == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return &storepb.WorkspaceMemoRelatedSetting{
|
|
|
|
DisallowPublicVisible: setting.DisallowPublicVisible,
|
|
|
|
DisplayWithUpdateTime: setting.DisplayWithUpdateTime,
|
|
|
|
}
|
|
|
|
}
|