From c93b1efbae3717e968473e6ea175bfdedae9fa19 Mon Sep 17 00:00:00 2001
From: Steven <stevenlgtm@gmail.com>
Date: Wed, 10 Apr 2024 20:05:17 +0800
Subject: [PATCH] chore: update workspace setting store

---
 proto/gen/store/README.md                     |  21 +-
 proto/gen/store/workspace_setting.pb.go       | 223 +++++++++++++-----
 proto/store/workspace_setting.proto           |  12 +-
 .../route/api/v2/workspace_setting_service.go |   6 +-
 store/db/mysql/workspace_setting.go           |   4 +-
 store/db/postgres/workspace_setting.go        |   4 +-
 store/db/sqlite/workspace_setting.go          |   4 +-
 store/migrator.go                             |   2 +-
 store/workspace_setting.go                    |   2 +-
 test/store/workspace_setting_test.go          |   4 +-
 10 files changed, 210 insertions(+), 72 deletions(-)

diff --git a/proto/gen/store/README.md b/proto/gen/store/README.md
index e8a4257e..ac67906f 100644
--- a/proto/gen/store/README.md
+++ b/proto/gen/store/README.md
@@ -38,6 +38,7 @@
   
 - [store/workspace_setting.proto](#store_workspace_setting-proto)
     - [WorkspaceGeneralSetting](#memos-store-WorkspaceGeneralSetting)
+    - [WorkspaceMemoRelatedSetting](#memos-store-WorkspaceMemoRelatedSetting)
     - [WorkspaceSetting](#memos-store-WorkspaceSetting)
   
     - [WorkspaceSettingKey](#memos-store-WorkspaceSettingKey)
@@ -457,6 +458,22 @@
 
 
 
+<a name="memos-store-WorkspaceMemoRelatedSetting"></a>
+
+### WorkspaceMemoRelatedSetting
+
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| disallow_public_visible | [bool](#bool) |  | disallow_public_share disallows set memo as public visible. |
+| display_with_update_time | [bool](#bool) |  | display_with_update_time orders and displays memo with update time. |
+
+
+
+
+
+
 <a name="memos-store-WorkspaceSetting"></a>
 
 ### WorkspaceSetting
@@ -466,7 +483,8 @@
 | Field | Type | Label | Description |
 | ----- | ---- | ----- | ----------- |
 | key | [WorkspaceSettingKey](#memos-store-WorkspaceSettingKey) |  |  |
-| general | [WorkspaceGeneralSetting](#memos-store-WorkspaceGeneralSetting) |  |  |
+| general_setting | [WorkspaceGeneralSetting](#memos-store-WorkspaceGeneralSetting) |  |  |
+| memo_related_setting | [WorkspaceMemoRelatedSetting](#memos-store-WorkspaceMemoRelatedSetting) |  |  |
 
 
 
@@ -484,6 +502,7 @@
 | ---- | ------ | ----------- |
 | WORKSPACE_SETTING_KEY_UNSPECIFIED | 0 |  |
 | WORKSPACE_SETTING_GENERAL | 1 | WORKSPACE_SETTING_GENERAL is the key for general settings. |
+| WORKSPACE_SETTING_MEMO_RELATED | 2 | WORKSPACE_SETTING_MEMO_RELATED is the key for memo related settings. |
 
 
  
diff --git a/proto/gen/store/workspace_setting.pb.go b/proto/gen/store/workspace_setting.pb.go
index be1c79c3..1e467dd0 100644
--- a/proto/gen/store/workspace_setting.pb.go
+++ b/proto/gen/store/workspace_setting.pb.go
@@ -26,6 +26,8 @@ const (
 	WorkspaceSettingKey_WORKSPACE_SETTING_KEY_UNSPECIFIED WorkspaceSettingKey = 0
 	// WORKSPACE_SETTING_GENERAL is the key for general settings.
 	WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL WorkspaceSettingKey = 1
+	// WORKSPACE_SETTING_MEMO_RELATED is the key for memo related settings.
+	WorkspaceSettingKey_WORKSPACE_SETTING_MEMO_RELATED WorkspaceSettingKey = 2
 )
 
 // Enum value maps for WorkspaceSettingKey.
@@ -33,10 +35,12 @@ var (
 	WorkspaceSettingKey_name = map[int32]string{
 		0: "WORKSPACE_SETTING_KEY_UNSPECIFIED",
 		1: "WORKSPACE_SETTING_GENERAL",
+		2: "WORKSPACE_SETTING_MEMO_RELATED",
 	}
 	WorkspaceSettingKey_value = map[string]int32{
 		"WORKSPACE_SETTING_KEY_UNSPECIFIED": 0,
 		"WORKSPACE_SETTING_GENERAL":         1,
+		"WORKSPACE_SETTING_MEMO_RELATED":    2,
 	}
 )
 
@@ -75,7 +79,8 @@ type WorkspaceSetting struct {
 	Key WorkspaceSettingKey `protobuf:"varint,1,opt,name=key,proto3,enum=memos.store.WorkspaceSettingKey" json:"key,omitempty"`
 	// Types that are assignable to Value:
 	//
-	//	*WorkspaceSetting_General
+	//	*WorkspaceSetting_GeneralSetting
+	//	*WorkspaceSetting_MemoRelatedSetting
 	Value isWorkspaceSetting_Value `protobuf_oneof:"value"`
 }
 
@@ -125,9 +130,16 @@ func (m *WorkspaceSetting) GetValue() isWorkspaceSetting_Value {
 	return nil
 }
 
-func (x *WorkspaceSetting) GetGeneral() *WorkspaceGeneralSetting {
-	if x, ok := x.GetValue().(*WorkspaceSetting_General); ok {
-		return x.General
+func (x *WorkspaceSetting) GetGeneralSetting() *WorkspaceGeneralSetting {
+	if x, ok := x.GetValue().(*WorkspaceSetting_GeneralSetting); ok {
+		return x.GeneralSetting
+	}
+	return nil
+}
+
+func (x *WorkspaceSetting) GetMemoRelatedSetting() *WorkspaceMemoRelatedSetting {
+	if x, ok := x.GetValue().(*WorkspaceSetting_MemoRelatedSetting); ok {
+		return x.MemoRelatedSetting
 	}
 	return nil
 }
@@ -136,11 +148,17 @@ type isWorkspaceSetting_Value interface {
 	isWorkspaceSetting_Value()
 }
 
-type WorkspaceSetting_General struct {
-	General *WorkspaceGeneralSetting `protobuf:"bytes,2,opt,name=general,proto3,oneof"`
+type WorkspaceSetting_GeneralSetting struct {
+	GeneralSetting *WorkspaceGeneralSetting `protobuf:"bytes,2,opt,name=general_setting,json=generalSetting,proto3,oneof"`
 }
 
-func (*WorkspaceSetting_General) isWorkspaceSetting_Value() {}
+type WorkspaceSetting_MemoRelatedSetting struct {
+	MemoRelatedSetting *WorkspaceMemoRelatedSetting `protobuf:"bytes,3,opt,name=memo_related_setting,json=memoRelatedSetting,proto3,oneof"`
+}
+
+func (*WorkspaceSetting_GeneralSetting) isWorkspaceSetting_Value() {}
+
+func (*WorkspaceSetting_MemoRelatedSetting) isWorkspaceSetting_Value() {}
 
 type WorkspaceGeneralSetting struct {
 	state         protoimpl.MessageState
@@ -226,53 +244,129 @@ func (x *WorkspaceGeneralSetting) GetAdditionalStyle() string {
 	return ""
 }
 
+type WorkspaceMemoRelatedSetting struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// disallow_public_share disallows set memo as public visible.
+	DisallowPublicVisible bool `protobuf:"varint,1,opt,name=disallow_public_visible,json=disallowPublicVisible,proto3" json:"disallow_public_visible,omitempty"`
+	// display_with_update_time orders and displays memo with update time.
+	DisplayWithUpdateTime bool `protobuf:"varint,2,opt,name=display_with_update_time,json=displayWithUpdateTime,proto3" json:"display_with_update_time,omitempty"`
+}
+
+func (x *WorkspaceMemoRelatedSetting) Reset() {
+	*x = WorkspaceMemoRelatedSetting{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_store_workspace_setting_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *WorkspaceMemoRelatedSetting) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*WorkspaceMemoRelatedSetting) ProtoMessage() {}
+
+func (x *WorkspaceMemoRelatedSetting) ProtoReflect() protoreflect.Message {
+	mi := &file_store_workspace_setting_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 WorkspaceMemoRelatedSetting.ProtoReflect.Descriptor instead.
+func (*WorkspaceMemoRelatedSetting) Descriptor() ([]byte, []int) {
+	return file_store_workspace_setting_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *WorkspaceMemoRelatedSetting) GetDisallowPublicVisible() bool {
+	if x != nil {
+		return x.DisallowPublicVisible
+	}
+	return false
+}
+
+func (x *WorkspaceMemoRelatedSetting) GetDisplayWithUpdateTime() bool {
+	if x != nil {
+		return x.DisplayWithUpdateTime
+	}
+	return false
+}
+
 var File_store_workspace_setting_proto protoreflect.FileDescriptor
 
 var file_store_workspace_setting_proto_rawDesc = []byte{
 	0x0a, 0x1d, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63,
 	0x65, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
-	0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x22, 0x91, 0x01, 0x0a,
+	0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x22, 0xfe, 0x01, 0x0a,
 	0x10, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e,
 	0x67, 0x12, 0x32, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20,
 	0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x57, 0x6f, 0x72,
 	0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79,
-	0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x40, 0x0a, 0x07, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x73,
-	0x74, 0x6f, 0x72, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x65,
-	0x6e, 0x65, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x07,
-	0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
-	0x22, 0xf5, 0x01, 0x0a, 0x17, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x65,
-	0x6e, 0x65, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x21, 0x0a, 0x0c,
-	0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x55, 0x72, 0x6c, 0x12,
-	0x27, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x69, 0x67, 0x6e,
-	0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c,
-	0x6f, 0x77, 0x53, 0x69, 0x67, 0x6e, 0x75, 0x70, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x69, 0x73, 0x61,
-	0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x6c, 0x6f,
-	0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x64, 0x69, 0x73, 0x61, 0x6c,
-	0x6c, 0x6f, 0x77, 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, 0x2a, 0x5b, 0x0a, 0x13, 0x57, 0x6f, 0x72, 0x6b,
-	0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x12,
-	0x25, 0x0a, 0x21, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54,
-	0x54, 0x49, 0x4e, 0x47, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49,
-	0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50,
-	0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x47, 0x45, 0x4e, 0x45,
-	0x52, 0x41, 0x4c, 0x10, 0x01, 0x42, 0xa0, 0x01, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x65,
-	0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x73,
-	0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f,
-	0x50, 0x01, 0x5a, 0x29, 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, 0x73, 0x74, 0x6f, 0x72, 0x65, 0xa2, 0x02, 0x03,
-	0x4d, 0x53, 0x58, 0xaa, 0x02, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x53, 0x74, 0x6f, 0x72,
-	0x65, 0xca, 0x02, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x5c, 0x53, 0x74, 0x6f, 0x72, 0x65, 0xe2,
-	0x02, 0x17, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x5c, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x5c, 0x47, 0x50,
-	0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0c, 0x4d, 0x65, 0x6d, 0x6f,
-	0x73, 0x3a, 0x3a, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4f, 0x0a, 0x0f, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c,
+	0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24,
+	0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x57, 0x6f, 0x72,
+	0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74,
+	0x74, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x0e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x53,
+	0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x5c, 0x0a, 0x14, 0x6d, 0x65, 0x6d, 0x6f, 0x5f, 0x72,
+	0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x6f,
+	0x72, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4d, 0x65, 0x6d, 0x6f,
+	0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x48, 0x00,
+	0x52, 0x12, 0x6d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x74,
+	0x74, 0x69, 0x6e, 0x67, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xf5, 0x01,
+	0x0a, 0x17, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x47, 0x65, 0x6e, 0x65, 0x72,
+	0x61, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x73,
+	0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x27, 0x0a, 0x0f,
+	0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x75, 0x70, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x53,
+	0x69, 0x67, 0x6e, 0x75, 0x70, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f,
+	0x77, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x6c, 0x6f, 0x67, 0x69, 0x6e,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77,
+	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, 0x22, 0x8e, 0x01, 0x0a, 0x1b, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70,
+	0x61, 0x63, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65,
+	0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x36, 0x0a, 0x17, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f,
+	0x77, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77,
+	0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x56, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x37, 0x0a,
+	0x18, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x75, 0x70,
+	0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52,
+	0x15, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x57, 0x69, 0x74, 0x68, 0x55, 0x70, 0x64, 0x61,
+	0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x2a, 0x7f, 0x0a, 0x13, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70,
+	0x61, 0x63, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x0a,
+	0x21, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49,
+	0x4e, 0x47, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49,
+	0x45, 0x44, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43,
+	0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x41,
+	0x4c, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45,
+	0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x4d, 0x45, 0x4d, 0x4f, 0x5f, 0x52, 0x45,
+	0x4c, 0x41, 0x54, 0x45, 0x44, 0x10, 0x02, 0x42, 0xa0, 0x01, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x2e,
+	0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x15, 0x57, 0x6f, 0x72,
+	0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f,
+	0x74, 0x6f, 0x50, 0x01, 0x5a, 0x29, 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, 0x73, 0x74, 0x6f, 0x72, 0x65, 0xa2,
+	0x02, 0x03, 0x4d, 0x53, 0x58, 0xaa, 0x02, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x53, 0x74,
+	0x6f, 0x72, 0x65, 0xca, 0x02, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x5c, 0x53, 0x74, 0x6f, 0x72,
+	0x65, 0xe2, 0x02, 0x17, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x5c, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x5c,
+	0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0c, 0x4d, 0x65,
+	0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x33,
 }
 
 var (
@@ -288,20 +382,22 @@ func file_store_workspace_setting_proto_rawDescGZIP() []byte {
 }
 
 var file_store_workspace_setting_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_store_workspace_setting_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
+var file_store_workspace_setting_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
 var file_store_workspace_setting_proto_goTypes = []interface{}{
-	(WorkspaceSettingKey)(0),        // 0: memos.store.WorkspaceSettingKey
-	(*WorkspaceSetting)(nil),        // 1: memos.store.WorkspaceSetting
-	(*WorkspaceGeneralSetting)(nil), // 2: memos.store.WorkspaceGeneralSetting
+	(WorkspaceSettingKey)(0),            // 0: memos.store.WorkspaceSettingKey
+	(*WorkspaceSetting)(nil),            // 1: memos.store.WorkspaceSetting
+	(*WorkspaceGeneralSetting)(nil),     // 2: memos.store.WorkspaceGeneralSetting
+	(*WorkspaceMemoRelatedSetting)(nil), // 3: memos.store.WorkspaceMemoRelatedSetting
 }
 var file_store_workspace_setting_proto_depIdxs = []int32{
 	0, // 0: memos.store.WorkspaceSetting.key:type_name -> memos.store.WorkspaceSettingKey
-	2, // 1: memos.store.WorkspaceSetting.general:type_name -> memos.store.WorkspaceGeneralSetting
-	2, // [2:2] is the sub-list for method output_type
-	2, // [2:2] is the sub-list for method input_type
-	2, // [2:2] is the sub-list for extension type_name
-	2, // [2:2] is the sub-list for extension extendee
-	0, // [0:2] is the sub-list for field type_name
+	2, // 1: memos.store.WorkspaceSetting.general_setting:type_name -> memos.store.WorkspaceGeneralSetting
+	3, // 2: memos.store.WorkspaceSetting.memo_related_setting:type_name -> memos.store.WorkspaceMemoRelatedSetting
+	3, // [3:3] is the sub-list for method output_type
+	3, // [3:3] is the sub-list for method input_type
+	3, // [3:3] is the sub-list for extension type_name
+	3, // [3:3] is the sub-list for extension extendee
+	0, // [0:3] is the sub-list for field type_name
 }
 
 func init() { file_store_workspace_setting_proto_init() }
@@ -334,9 +430,22 @@ func file_store_workspace_setting_proto_init() {
 				return nil
 			}
 		}
+		file_store_workspace_setting_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*WorkspaceMemoRelatedSetting); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 	}
 	file_store_workspace_setting_proto_msgTypes[0].OneofWrappers = []interface{}{
-		(*WorkspaceSetting_General)(nil),
+		(*WorkspaceSetting_GeneralSetting)(nil),
+		(*WorkspaceSetting_MemoRelatedSetting)(nil),
 	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
@@ -344,7 +453,7 @@ func file_store_workspace_setting_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_store_workspace_setting_proto_rawDesc,
 			NumEnums:      1,
-			NumMessages:   2,
+			NumMessages:   3,
 			NumExtensions: 0,
 			NumServices:   0,
 		},
diff --git a/proto/store/workspace_setting.proto b/proto/store/workspace_setting.proto
index 8d93d9a5..5320d2ef 100644
--- a/proto/store/workspace_setting.proto
+++ b/proto/store/workspace_setting.proto
@@ -8,12 +8,15 @@ enum WorkspaceSettingKey {
   WORKSPACE_SETTING_KEY_UNSPECIFIED = 0;
   // WORKSPACE_SETTING_GENERAL is the key for general settings.
   WORKSPACE_SETTING_GENERAL = 1;
+  // WORKSPACE_SETTING_MEMO_RELATED is the key for memo related settings.
+  WORKSPACE_SETTING_MEMO_RELATED = 2;
 }
 
 message WorkspaceSetting {
   WorkspaceSettingKey key = 1;
   oneof value {
-    WorkspaceGeneralSetting general = 2;
+    WorkspaceGeneralSetting general_setting = 2;
+    WorkspaceMemoRelatedSetting memo_related_setting = 3;
   }
 }
 
@@ -29,3 +32,10 @@ message WorkspaceGeneralSetting {
   // additional_style is the additional style.
   string additional_style = 6;
 }
+
+message WorkspaceMemoRelatedSetting {
+  // disallow_public_share disallows set memo as public visible.
+  bool disallow_public_visible = 1;
+  // display_with_update_time orders and displays memo with update time.
+  bool display_with_update_time = 2;
+}
diff --git a/server/route/api/v2/workspace_setting_service.go b/server/route/api/v2/workspace_setting_service.go
index 44a38d8d..310ed954 100644
--- a/server/route/api/v2/workspace_setting_service.go
+++ b/server/route/api/v2/workspace_setting_service.go
@@ -57,7 +57,7 @@ func convertWorkspaceSettingFromStore(setting *storepb.WorkspaceSetting) *apiv2p
 	return &apiv2pb.WorkspaceSetting{
 		Name: fmt.Sprintf("%s%s", WorkspaceSettingNamePrefix, setting.Key.String()),
 		Value: &apiv2pb.WorkspaceSetting_GeneralSetting{
-			GeneralSetting: convertWorkspaceGeneralSettingFromStore(setting.GetGeneral()),
+			GeneralSetting: convertWorkspaceGeneralSettingFromStore(setting.GetGeneralSetting()),
 		},
 	}
 }
@@ -66,8 +66,8 @@ func convertWorkspaceSettingToStore(setting *apiv2pb.WorkspaceSetting) *storepb.
 	settingKeyString, _ := ExtractWorkspaceSettingKeyFromName(setting.Name)
 	return &storepb.WorkspaceSetting{
 		Key: storepb.WorkspaceSettingKey(storepb.WorkspaceSettingKey_value[settingKeyString]),
-		Value: &storepb.WorkspaceSetting_General{
-			General: convertWorkspaceGeneralSettingToStore(setting.GetGeneralSetting()),
+		Value: &storepb.WorkspaceSetting_GeneralSetting{
+			GeneralSetting: convertWorkspaceGeneralSettingToStore(setting.GetGeneralSetting()),
 		},
 	}
 }
diff --git a/store/db/mysql/workspace_setting.go b/store/db/mysql/workspace_setting.go
index bcac51e2..2f986583 100644
--- a/store/db/mysql/workspace_setting.go
+++ b/store/db/mysql/workspace_setting.go
@@ -74,7 +74,7 @@ func (d *DB) UpsertWorkspaceSettingV1(ctx context.Context, upsert *storepb.Works
 		ON DUPLICATE KEY UPDATE value = ?`
 	var valueString string
 	if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL {
-		valueBytes, err := protojson.Marshal(upsert.GetGeneral())
+		valueBytes, err := protojson.Marshal(upsert.GetGeneralSetting())
 		if err != nil {
 			return nil, err
 		}
@@ -116,7 +116,7 @@ func (d *DB) ListWorkspaceSettingsV1(ctx context.Context, find *store.FindWorksp
 			if err := protojson.Unmarshal([]byte(valueString), generalSetting); err != nil {
 				return nil, err
 			}
-			workspaceSetting.Value = &storepb.WorkspaceSetting_General{General: generalSetting}
+			workspaceSetting.Value = &storepb.WorkspaceSetting_GeneralSetting{GeneralSetting: generalSetting}
 		} else {
 			// Skip unknown workspace setting key.
 			continue
diff --git a/store/db/postgres/workspace_setting.go b/store/db/postgres/workspace_setting.go
index c38778d8..45d24e4f 100644
--- a/store/db/postgres/workspace_setting.go
+++ b/store/db/postgres/workspace_setting.go
@@ -84,7 +84,7 @@ func (d *DB) UpsertWorkspaceSettingV1(ctx context.Context, upsert *storepb.Works
 		SET value = EXCLUDED.value`
 	var valueString string
 	if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL {
-		valueBytes, err := protojson.Marshal(upsert.GetGeneral())
+		valueBytes, err := protojson.Marshal(upsert.GetGeneralSetting())
 		if err != nil {
 			return nil, err
 		}
@@ -126,7 +126,7 @@ func (d *DB) ListWorkspaceSettingsV1(ctx context.Context, find *store.FindWorksp
 			if err := protojson.Unmarshal([]byte(valueString), generalSetting); err != nil {
 				return nil, err
 			}
-			workspaceSetting.Value = &storepb.WorkspaceSetting_General{General: generalSetting}
+			workspaceSetting.Value = &storepb.WorkspaceSetting_GeneralSetting{GeneralSetting: generalSetting}
 		} else {
 			// Skip unknown workspace setting key.
 			continue
diff --git a/store/db/sqlite/workspace_setting.go b/store/db/sqlite/workspace_setting.go
index a55eb014..3854e160 100644
--- a/store/db/sqlite/workspace_setting.go
+++ b/store/db/sqlite/workspace_setting.go
@@ -84,7 +84,7 @@ func (d *DB) UpsertWorkspaceSettingV1(ctx context.Context, upsert *storepb.Works
 		SET value = EXCLUDED.value`
 	var valueString string
 	if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL {
-		valueBytes, err := protojson.Marshal(upsert.GetGeneral())
+		valueBytes, err := protojson.Marshal(upsert.GetGeneralSetting())
 		if err != nil {
 			return nil, err
 		}
@@ -125,7 +125,7 @@ func (d *DB) ListWorkspaceSettingsV1(ctx context.Context, find *store.FindWorksp
 			if err := protojson.Unmarshal([]byte(valueString), generalSetting); err != nil {
 				return nil, err
 			}
-			workspaceSetting.Value = &storepb.WorkspaceSetting_General{General: generalSetting}
+			workspaceSetting.Value = &storepb.WorkspaceSetting_GeneralSetting{GeneralSetting: generalSetting}
 		} else {
 			// Skip unknown workspace setting key.
 			continue
diff --git a/store/migrator.go b/store/migrator.go
index fca734f3..2e2a37ed 100644
--- a/store/migrator.go
+++ b/store/migrator.go
@@ -52,7 +52,7 @@ func (s *Store) MigrateWorkspaceSetting(ctx context.Context) error {
 
 	if _, err := s.UpsertWorkspaceSettingV1(ctx, &storepb.WorkspaceSetting{
 		Key:   storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL,
-		Value: &storepb.WorkspaceSetting_General{General: workspaceGeneralSetting},
+		Value: &storepb.WorkspaceSetting_GeneralSetting{GeneralSetting: workspaceGeneralSetting},
 	}); err != nil {
 		return errors.Wrap(err, "failed to upsert workspace general setting")
 	}
diff --git a/store/workspace_setting.go b/store/workspace_setting.go
index 5747875e..7e77e309 100644
--- a/store/workspace_setting.go
+++ b/store/workspace_setting.go
@@ -123,7 +123,7 @@ func (s *Store) GetWorkspaceGeneralSetting(ctx context.Context) (*storepb.Worksp
 
 	workspaceGeneralSetting := &storepb.WorkspaceGeneralSetting{}
 	if workspaceSetting != nil {
-		workspaceGeneralSetting = workspaceSetting.GetGeneral()
+		workspaceGeneralSetting = workspaceSetting.GetGeneralSetting()
 	}
 	return workspaceGeneralSetting, nil
 }
diff --git a/test/store/workspace_setting_test.go b/test/store/workspace_setting_test.go
index d791c61d..0a241f92 100644
--- a/test/store/workspace_setting_test.go
+++ b/test/store/workspace_setting_test.go
@@ -15,8 +15,8 @@ func TestWorkspaceSettingV1Store(t *testing.T) {
 	ts := NewTestingStore(ctx, t)
 	workspaceSetting, err := ts.UpsertWorkspaceSettingV1(ctx, &storepb.WorkspaceSetting{
 		Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL,
-		Value: &storepb.WorkspaceSetting_General{
-			General: &storepb.WorkspaceGeneralSetting{
+		Value: &storepb.WorkspaceSetting_GeneralSetting{
+			GeneralSetting: &storepb.WorkspaceGeneralSetting{
 				DisallowSignup: true,
 			},
 		},