diff --git a/proto/gen/store/user_setting.pb.go b/proto/gen/store/user_setting.pb.go index 8246a42d6..e710a9faa 100644 --- a/proto/gen/store/user_setting.pb.go +++ b/proto/gen/store/user_setting.pb.go @@ -22,85 +22,75 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -type UserSettingKey int32 +type UserSetting_Key int32 const ( - UserSettingKey_USER_SETTING_KEY_UNSPECIFIED UserSettingKey = 0 + UserSetting_KEY_UNSPECIFIED UserSetting_Key = 0 + // General user settings. + UserSetting_GENERAL UserSetting_Key = 1 + // User authentication sessions. + UserSetting_SESSIONS UserSetting_Key = 2 // Access tokens for the user. - UserSettingKey_ACCESS_TOKENS UserSettingKey = 1 - // The locale of the user. - UserSettingKey_LOCALE UserSettingKey = 2 - // The appearance of the user. - UserSettingKey_APPEARANCE UserSettingKey = 3 - // The visibility of the memo. - UserSettingKey_MEMO_VISIBILITY UserSettingKey = 4 + UserSetting_ACCESS_TOKENS UserSetting_Key = 3 // The shortcuts of the user. - UserSettingKey_SHORTCUTS UserSettingKey = 5 - // User authentication sessions. - UserSettingKey_SESSIONS UserSettingKey = 6 + UserSetting_SHORTCUTS UserSetting_Key = 4 ) -// Enum value maps for UserSettingKey. +// Enum value maps for UserSetting_Key. var ( - UserSettingKey_name = map[int32]string{ - 0: "USER_SETTING_KEY_UNSPECIFIED", - 1: "ACCESS_TOKENS", - 2: "LOCALE", - 3: "APPEARANCE", - 4: "MEMO_VISIBILITY", - 5: "SHORTCUTS", - 6: "SESSIONS", - } - UserSettingKey_value = map[string]int32{ - "USER_SETTING_KEY_UNSPECIFIED": 0, - "ACCESS_TOKENS": 1, - "LOCALE": 2, - "APPEARANCE": 3, - "MEMO_VISIBILITY": 4, - "SHORTCUTS": 5, - "SESSIONS": 6, + UserSetting_Key_name = map[int32]string{ + 0: "KEY_UNSPECIFIED", + 1: "GENERAL", + 2: "SESSIONS", + 3: "ACCESS_TOKENS", + 4: "SHORTCUTS", + } + UserSetting_Key_value = map[string]int32{ + "KEY_UNSPECIFIED": 0, + "GENERAL": 1, + "SESSIONS": 2, + "ACCESS_TOKENS": 3, + "SHORTCUTS": 4, } ) -func (x UserSettingKey) Enum() *UserSettingKey { - p := new(UserSettingKey) +func (x UserSetting_Key) Enum() *UserSetting_Key { + p := new(UserSetting_Key) *p = x return p } -func (x UserSettingKey) String() string { +func (x UserSetting_Key) String() string { return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } -func (UserSettingKey) Descriptor() protoreflect.EnumDescriptor { +func (UserSetting_Key) Descriptor() protoreflect.EnumDescriptor { return file_store_user_setting_proto_enumTypes[0].Descriptor() } -func (UserSettingKey) Type() protoreflect.EnumType { +func (UserSetting_Key) Type() protoreflect.EnumType { return &file_store_user_setting_proto_enumTypes[0] } -func (x UserSettingKey) Number() protoreflect.EnumNumber { +func (x UserSetting_Key) Number() protoreflect.EnumNumber { return protoreflect.EnumNumber(x) } -// Deprecated: Use UserSettingKey.Descriptor instead. -func (UserSettingKey) EnumDescriptor() ([]byte, []int) { - return file_store_user_setting_proto_rawDescGZIP(), []int{0} +// Deprecated: Use UserSetting_Key.Descriptor instead. +func (UserSetting_Key) EnumDescriptor() ([]byte, []int) { + return file_store_user_setting_proto_rawDescGZIP(), []int{0, 0} } type UserSetting struct { state protoimpl.MessageState `protogen:"open.v1"` UserId int32 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` - Key UserSettingKey `protobuf:"varint,2,opt,name=key,proto3,enum=memos.store.UserSettingKey" json:"key,omitempty"` + Key UserSetting_Key `protobuf:"varint,2,opt,name=key,proto3,enum=memos.store.UserSetting_Key" json:"key,omitempty"` // Types that are valid to be assigned to Value: // + // *UserSetting_General + // *UserSetting_Sessions // *UserSetting_AccessTokens - // *UserSetting_Locale - // *UserSetting_Appearance - // *UserSetting_MemoVisibility // *UserSetting_Shortcuts - // *UserSetting_Sessions Value isUserSetting_Value `protobuf_oneof:"value"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -143,11 +133,11 @@ func (x *UserSetting) GetUserId() int32 { return 0 } -func (x *UserSetting) GetKey() UserSettingKey { +func (x *UserSetting) GetKey() UserSetting_Key { if x != nil { return x.Key } - return UserSettingKey_USER_SETTING_KEY_UNSPECIFIED + return UserSetting_KEY_UNSPECIFIED } func (x *UserSetting) GetValue() isUserSetting_Value { @@ -157,40 +147,31 @@ func (x *UserSetting) GetValue() isUserSetting_Value { return nil } -func (x *UserSetting) GetAccessTokens() *AccessTokensUserSetting { +func (x *UserSetting) GetGeneral() *GeneralUserSetting { if x != nil { - if x, ok := x.Value.(*UserSetting_AccessTokens); ok { - return x.AccessTokens + if x, ok := x.Value.(*UserSetting_General); ok { + return x.General } } return nil } -func (x *UserSetting) GetLocale() string { - if x != nil { - if x, ok := x.Value.(*UserSetting_Locale); ok { - return x.Locale - } - } - return "" -} - -func (x *UserSetting) GetAppearance() string { +func (x *UserSetting) GetSessions() *SessionsUserSetting { if x != nil { - if x, ok := x.Value.(*UserSetting_Appearance); ok { - return x.Appearance + if x, ok := x.Value.(*UserSetting_Sessions); ok { + return x.Sessions } } - return "" + return nil } -func (x *UserSetting) GetMemoVisibility() string { +func (x *UserSetting) GetAccessTokens() *AccessTokensUserSetting { if x != nil { - if x, ok := x.Value.(*UserSetting_MemoVisibility); ok { - return x.MemoVisibility + if x, ok := x.Value.(*UserSetting_AccessTokens); ok { + return x.AccessTokens } } - return "" + return nil } func (x *UserSetting) GetShortcuts() *ShortcutsUserSetting { @@ -202,76 +183,60 @@ func (x *UserSetting) GetShortcuts() *ShortcutsUserSetting { return nil } -func (x *UserSetting) GetSessions() *SessionsUserSetting { - if x != nil { - if x, ok := x.Value.(*UserSetting_Sessions); ok { - return x.Sessions - } - } - return nil -} - type isUserSetting_Value interface { isUserSetting_Value() } -type UserSetting_AccessTokens struct { - AccessTokens *AccessTokensUserSetting `protobuf:"bytes,3,opt,name=access_tokens,json=accessTokens,proto3,oneof"` -} - -type UserSetting_Locale struct { - Locale string `protobuf:"bytes,4,opt,name=locale,proto3,oneof"` +type UserSetting_General struct { + General *GeneralUserSetting `protobuf:"bytes,3,opt,name=general,proto3,oneof"` } -type UserSetting_Appearance struct { - Appearance string `protobuf:"bytes,5,opt,name=appearance,proto3,oneof"` +type UserSetting_Sessions struct { + Sessions *SessionsUserSetting `protobuf:"bytes,4,opt,name=sessions,proto3,oneof"` } -type UserSetting_MemoVisibility struct { - MemoVisibility string `protobuf:"bytes,6,opt,name=memo_visibility,json=memoVisibility,proto3,oneof"` +type UserSetting_AccessTokens struct { + AccessTokens *AccessTokensUserSetting `protobuf:"bytes,5,opt,name=access_tokens,json=accessTokens,proto3,oneof"` } type UserSetting_Shortcuts struct { - Shortcuts *ShortcutsUserSetting `protobuf:"bytes,7,opt,name=shortcuts,proto3,oneof"` + Shortcuts *ShortcutsUserSetting `protobuf:"bytes,6,opt,name=shortcuts,proto3,oneof"` } -type UserSetting_Sessions struct { - Sessions *SessionsUserSetting `protobuf:"bytes,8,opt,name=sessions,proto3,oneof"` -} - -func (*UserSetting_AccessTokens) isUserSetting_Value() {} +func (*UserSetting_General) isUserSetting_Value() {} -func (*UserSetting_Locale) isUserSetting_Value() {} - -func (*UserSetting_Appearance) isUserSetting_Value() {} +func (*UserSetting_Sessions) isUserSetting_Value() {} -func (*UserSetting_MemoVisibility) isUserSetting_Value() {} +func (*UserSetting_AccessTokens) isUserSetting_Value() {} func (*UserSetting_Shortcuts) isUserSetting_Value() {} -func (*UserSetting_Sessions) isUserSetting_Value() {} - -type AccessTokensUserSetting struct { - state protoimpl.MessageState `protogen:"open.v1"` - AccessTokens []*AccessTokensUserSetting_AccessToken `protobuf:"bytes,1,rep,name=access_tokens,json=accessTokens,proto3" json:"access_tokens,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *AccessTokensUserSetting) Reset() { - *x = AccessTokensUserSetting{} +type GeneralUserSetting struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The user's locale. + Locale string `protobuf:"bytes,1,opt,name=locale,proto3" json:"locale,omitempty"` + // The user's appearance setting. + Appearance string `protobuf:"bytes,2,opt,name=appearance,proto3" json:"appearance,omitempty"` + // The user's memo visibility setting. + MemoVisibility string `protobuf:"bytes,3,opt,name=memo_visibility,json=memoVisibility,proto3" json:"memo_visibility,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GeneralUserSetting) Reset() { + *x = GeneralUserSetting{} mi := &file_store_user_setting_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *AccessTokensUserSetting) String() string { +func (x *GeneralUserSetting) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AccessTokensUserSetting) ProtoMessage() {} +func (*GeneralUserSetting) ProtoMessage() {} -func (x *AccessTokensUserSetting) ProtoReflect() protoreflect.Message { +func (x *GeneralUserSetting) ProtoReflect() protoreflect.Message { mi := &file_store_user_setting_proto_msgTypes[1] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -283,60 +248,30 @@ func (x *AccessTokensUserSetting) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AccessTokensUserSetting.ProtoReflect.Descriptor instead. -func (*AccessTokensUserSetting) Descriptor() ([]byte, []int) { +// Deprecated: Use GeneralUserSetting.ProtoReflect.Descriptor instead. +func (*GeneralUserSetting) Descriptor() ([]byte, []int) { return file_store_user_setting_proto_rawDescGZIP(), []int{1} } -func (x *AccessTokensUserSetting) GetAccessTokens() []*AccessTokensUserSetting_AccessToken { +func (x *GeneralUserSetting) GetLocale() string { if x != nil { - return x.AccessTokens + return x.Locale } - return nil -} - -type ShortcutsUserSetting struct { - state protoimpl.MessageState `protogen:"open.v1"` - Shortcuts []*ShortcutsUserSetting_Shortcut `protobuf:"bytes,1,rep,name=shortcuts,proto3" json:"shortcuts,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *ShortcutsUserSetting) Reset() { - *x = ShortcutsUserSetting{} - mi := &file_store_user_setting_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ShortcutsUserSetting) String() string { - return protoimpl.X.MessageStringOf(x) + return "" } -func (*ShortcutsUserSetting) ProtoMessage() {} - -func (x *ShortcutsUserSetting) ProtoReflect() protoreflect.Message { - mi := &file_store_user_setting_proto_msgTypes[2] +func (x *GeneralUserSetting) GetAppearance() string { if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms + return x.Appearance } - return mi.MessageOf(x) -} - -// Deprecated: Use ShortcutsUserSetting.ProtoReflect.Descriptor instead. -func (*ShortcutsUserSetting) Descriptor() ([]byte, []int) { - return file_store_user_setting_proto_rawDescGZIP(), []int{2} + return "" } -func (x *ShortcutsUserSetting) GetShortcuts() []*ShortcutsUserSetting_Shortcut { +func (x *GeneralUserSetting) GetMemoVisibility() string { if x != nil { - return x.Shortcuts + return x.MemoVisibility } - return nil + return "" } type SessionsUserSetting struct { @@ -348,7 +283,7 @@ type SessionsUserSetting struct { func (x *SessionsUserSetting) Reset() { *x = SessionsUserSetting{} - mi := &file_store_user_setting_proto_msgTypes[3] + mi := &file_store_user_setting_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -360,7 +295,7 @@ func (x *SessionsUserSetting) String() string { func (*SessionsUserSetting) ProtoMessage() {} func (x *SessionsUserSetting) ProtoReflect() protoreflect.Message { - mi := &file_store_user_setting_proto_msgTypes[3] + mi := &file_store_user_setting_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -373,7 +308,7 @@ func (x *SessionsUserSetting) ProtoReflect() protoreflect.Message { // Deprecated: Use SessionsUserSetting.ProtoReflect.Descriptor instead. func (*SessionsUserSetting) Descriptor() ([]byte, []int) { - return file_store_user_setting_proto_rawDescGZIP(), []int{3} + return file_store_user_setting_proto_rawDescGZIP(), []int{2} } func (x *SessionsUserSetting) GetSessions() []*SessionsUserSetting_Session { @@ -383,32 +318,28 @@ func (x *SessionsUserSetting) GetSessions() []*SessionsUserSetting_Session { return nil } -type AccessTokensUserSetting_AccessToken struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The access token is a JWT token. - // Including expiration time, issuer, etc. - AccessToken string `protobuf:"bytes,1,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"` - // A description for the access token. - Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` +type AccessTokensUserSetting struct { + state protoimpl.MessageState `protogen:"open.v1"` + AccessTokens []*AccessTokensUserSetting_AccessToken `protobuf:"bytes,1,rep,name=access_tokens,json=accessTokens,proto3" json:"access_tokens,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *AccessTokensUserSetting_AccessToken) Reset() { - *x = AccessTokensUserSetting_AccessToken{} - mi := &file_store_user_setting_proto_msgTypes[4] +func (x *AccessTokensUserSetting) Reset() { + *x = AccessTokensUserSetting{} + mi := &file_store_user_setting_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *AccessTokensUserSetting_AccessToken) String() string { +func (x *AccessTokensUserSetting) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AccessTokensUserSetting_AccessToken) ProtoMessage() {} +func (*AccessTokensUserSetting) ProtoMessage() {} -func (x *AccessTokensUserSetting_AccessToken) ProtoReflect() protoreflect.Message { - mi := &file_store_user_setting_proto_msgTypes[4] +func (x *AccessTokensUserSetting) ProtoReflect() protoreflect.Message { + mi := &file_store_user_setting_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -419,49 +350,40 @@ func (x *AccessTokensUserSetting_AccessToken) ProtoReflect() protoreflect.Messag return mi.MessageOf(x) } -// Deprecated: Use AccessTokensUserSetting_AccessToken.ProtoReflect.Descriptor instead. -func (*AccessTokensUserSetting_AccessToken) Descriptor() ([]byte, []int) { - return file_store_user_setting_proto_rawDescGZIP(), []int{1, 0} -} - -func (x *AccessTokensUserSetting_AccessToken) GetAccessToken() string { - if x != nil { - return x.AccessToken - } - return "" +// Deprecated: Use AccessTokensUserSetting.ProtoReflect.Descriptor instead. +func (*AccessTokensUserSetting) Descriptor() ([]byte, []int) { + return file_store_user_setting_proto_rawDescGZIP(), []int{3} } -func (x *AccessTokensUserSetting_AccessToken) GetDescription() string { +func (x *AccessTokensUserSetting) GetAccessTokens() []*AccessTokensUserSetting_AccessToken { if x != nil { - return x.Description + return x.AccessTokens } - return "" + return nil } -type ShortcutsUserSetting_Shortcut struct { - state protoimpl.MessageState `protogen:"open.v1"` - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` - Filter string `protobuf:"bytes,3,opt,name=filter,proto3" json:"filter,omitempty"` +type ShortcutsUserSetting struct { + state protoimpl.MessageState `protogen:"open.v1"` + Shortcuts []*ShortcutsUserSetting_Shortcut `protobuf:"bytes,1,rep,name=shortcuts,proto3" json:"shortcuts,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *ShortcutsUserSetting_Shortcut) Reset() { - *x = ShortcutsUserSetting_Shortcut{} - mi := &file_store_user_setting_proto_msgTypes[5] +func (x *ShortcutsUserSetting) Reset() { + *x = ShortcutsUserSetting{} + mi := &file_store_user_setting_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ShortcutsUserSetting_Shortcut) String() string { +func (x *ShortcutsUserSetting) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ShortcutsUserSetting_Shortcut) ProtoMessage() {} +func (*ShortcutsUserSetting) ProtoMessage() {} -func (x *ShortcutsUserSetting_Shortcut) ProtoReflect() protoreflect.Message { - mi := &file_store_user_setting_proto_msgTypes[5] +func (x *ShortcutsUserSetting) ProtoReflect() protoreflect.Message { + mi := &file_store_user_setting_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -472,30 +394,16 @@ func (x *ShortcutsUserSetting_Shortcut) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ShortcutsUserSetting_Shortcut.ProtoReflect.Descriptor instead. -func (*ShortcutsUserSetting_Shortcut) Descriptor() ([]byte, []int) { - return file_store_user_setting_proto_rawDescGZIP(), []int{2, 0} -} - -func (x *ShortcutsUserSetting_Shortcut) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *ShortcutsUserSetting_Shortcut) GetTitle() string { - if x != nil { - return x.Title - } - return "" +// Deprecated: Use ShortcutsUserSetting.ProtoReflect.Descriptor instead. +func (*ShortcutsUserSetting) Descriptor() ([]byte, []int) { + return file_store_user_setting_proto_rawDescGZIP(), []int{4} } -func (x *ShortcutsUserSetting_Shortcut) GetFilter() string { +func (x *ShortcutsUserSetting) GetShortcuts() []*ShortcutsUserSetting_Shortcut { if x != nil { - return x.Filter + return x.Shortcuts } - return "" + return nil } type SessionsUserSetting_Session struct { @@ -516,7 +424,7 @@ type SessionsUserSetting_Session struct { func (x *SessionsUserSetting_Session) Reset() { *x = SessionsUserSetting_Session{} - mi := &file_store_user_setting_proto_msgTypes[6] + mi := &file_store_user_setting_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -528,7 +436,7 @@ func (x *SessionsUserSetting_Session) String() string { func (*SessionsUserSetting_Session) ProtoMessage() {} func (x *SessionsUserSetting_Session) ProtoReflect() protoreflect.Message { - mi := &file_store_user_setting_proto_msgTypes[6] + mi := &file_store_user_setting_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -541,7 +449,7 @@ func (x *SessionsUserSetting_Session) ProtoReflect() protoreflect.Message { // Deprecated: Use SessionsUserSetting_Session.ProtoReflect.Descriptor instead. func (*SessionsUserSetting_Session) Descriptor() ([]byte, []int) { - return file_store_user_setting_proto_rawDescGZIP(), []int{3, 0} + return file_store_user_setting_proto_rawDescGZIP(), []int{2, 0} } func (x *SessionsUserSetting_Session) GetSessionId() string { @@ -597,7 +505,7 @@ type SessionsUserSetting_ClientInfo struct { func (x *SessionsUserSetting_ClientInfo) Reset() { *x = SessionsUserSetting_ClientInfo{} - mi := &file_store_user_setting_proto_msgTypes[7] + mi := &file_store_user_setting_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -609,7 +517,7 @@ func (x *SessionsUserSetting_ClientInfo) String() string { func (*SessionsUserSetting_ClientInfo) ProtoMessage() {} func (x *SessionsUserSetting_ClientInfo) ProtoReflect() protoreflect.Message { - mi := &file_store_user_setting_proto_msgTypes[7] + mi := &file_store_user_setting_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -622,7 +530,7 @@ func (x *SessionsUserSetting_ClientInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use SessionsUserSetting_ClientInfo.ProtoReflect.Descriptor instead. func (*SessionsUserSetting_ClientInfo) Descriptor() ([]byte, []int) { - return file_store_user_setting_proto_rawDescGZIP(), []int{3, 1} + return file_store_user_setting_proto_rawDescGZIP(), []int{2, 1} } func (x *SessionsUserSetting_ClientInfo) GetUserAgent() string { @@ -660,34 +568,146 @@ func (x *SessionsUserSetting_ClientInfo) GetBrowser() string { return "" } +type AccessTokensUserSetting_AccessToken struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The access token is a JWT token. + // Including expiration time, issuer, etc. + AccessToken string `protobuf:"bytes,1,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"` + // A description for the access token. + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AccessTokensUserSetting_AccessToken) Reset() { + *x = AccessTokensUserSetting_AccessToken{} + mi := &file_store_user_setting_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AccessTokensUserSetting_AccessToken) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AccessTokensUserSetting_AccessToken) ProtoMessage() {} + +func (x *AccessTokensUserSetting_AccessToken) ProtoReflect() protoreflect.Message { + mi := &file_store_user_setting_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AccessTokensUserSetting_AccessToken.ProtoReflect.Descriptor instead. +func (*AccessTokensUserSetting_AccessToken) Descriptor() ([]byte, []int) { + return file_store_user_setting_proto_rawDescGZIP(), []int{3, 0} +} + +func (x *AccessTokensUserSetting_AccessToken) GetAccessToken() string { + if x != nil { + return x.AccessToken + } + return "" +} + +func (x *AccessTokensUserSetting_AccessToken) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +type ShortcutsUserSetting_Shortcut struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` + Filter string `protobuf:"bytes,3,opt,name=filter,proto3" json:"filter,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ShortcutsUserSetting_Shortcut) Reset() { + *x = ShortcutsUserSetting_Shortcut{} + mi := &file_store_user_setting_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ShortcutsUserSetting_Shortcut) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ShortcutsUserSetting_Shortcut) ProtoMessage() {} + +func (x *ShortcutsUserSetting_Shortcut) ProtoReflect() protoreflect.Message { + mi := &file_store_user_setting_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ShortcutsUserSetting_Shortcut.ProtoReflect.Descriptor instead. +func (*ShortcutsUserSetting_Shortcut) Descriptor() ([]byte, []int) { + return file_store_user_setting_proto_rawDescGZIP(), []int{4, 0} +} + +func (x *ShortcutsUserSetting_Shortcut) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *ShortcutsUserSetting_Shortcut) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *ShortcutsUserSetting_Shortcut) GetFilter() string { + if x != nil { + return x.Filter + } + return "" +} + var File_store_user_setting_proto protoreflect.FileDescriptor const file_store_user_setting_proto_rawDesc = "" + "\n" + - "\x18store/user_setting.proto\x12\vmemos.store\x1a\x1fgoogle/protobuf/timestamp.proto\"\x95\x03\n" + + "\x18store/user_setting.proto\x12\vmemos.store\x1a\x1fgoogle/protobuf/timestamp.proto\"\xc5\x03\n" + "\vUserSetting\x12\x17\n" + - "\auser_id\x18\x01 \x01(\x05R\x06userId\x12-\n" + - "\x03key\x18\x02 \x01(\x0e2\x1b.memos.store.UserSettingKeyR\x03key\x12K\n" + - "\raccess_tokens\x18\x03 \x01(\v2$.memos.store.AccessTokensUserSettingH\x00R\faccessTokens\x12\x18\n" + - "\x06locale\x18\x04 \x01(\tH\x00R\x06locale\x12 \n" + + "\auser_id\x18\x01 \x01(\x05R\x06userId\x12.\n" + + "\x03key\x18\x02 \x01(\x0e2\x1c.memos.store.UserSetting.KeyR\x03key\x12;\n" + + "\ageneral\x18\x03 \x01(\v2\x1f.memos.store.GeneralUserSettingH\x00R\ageneral\x12>\n" + + "\bsessions\x18\x04 \x01(\v2 .memos.store.SessionsUserSettingH\x00R\bsessions\x12K\n" + + "\raccess_tokens\x18\x05 \x01(\v2$.memos.store.AccessTokensUserSettingH\x00R\faccessTokens\x12A\n" + + "\tshortcuts\x18\x06 \x01(\v2!.memos.store.ShortcutsUserSettingH\x00R\tshortcuts\"W\n" + + "\x03Key\x12\x13\n" + + "\x0fKEY_UNSPECIFIED\x10\x00\x12\v\n" + + "\aGENERAL\x10\x01\x12\f\n" + + "\bSESSIONS\x10\x02\x12\x11\n" + + "\rACCESS_TOKENS\x10\x03\x12\r\n" + + "\tSHORTCUTS\x10\x04B\a\n" + + "\x05value\"u\n" + + "\x12GeneralUserSetting\x12\x16\n" + + "\x06locale\x18\x01 \x01(\tR\x06locale\x12\x1e\n" + "\n" + - "appearance\x18\x05 \x01(\tH\x00R\n" + - "appearance\x12)\n" + - "\x0fmemo_visibility\x18\x06 \x01(\tH\x00R\x0ememoVisibility\x12A\n" + - "\tshortcuts\x18\a \x01(\v2!.memos.store.ShortcutsUserSettingH\x00R\tshortcuts\x12>\n" + - "\bsessions\x18\b \x01(\v2 .memos.store.SessionsUserSettingH\x00R\bsessionsB\a\n" + - "\x05value\"\xc4\x01\n" + - "\x17AccessTokensUserSetting\x12U\n" + - "\raccess_tokens\x18\x01 \x03(\v20.memos.store.AccessTokensUserSetting.AccessTokenR\faccessTokens\x1aR\n" + - "\vAccessToken\x12!\n" + - "\faccess_token\x18\x01 \x01(\tR\vaccessToken\x12 \n" + - "\vdescription\x18\x02 \x01(\tR\vdescription\"\xaa\x01\n" + - "\x14ShortcutsUserSetting\x12H\n" + - "\tshortcuts\x18\x01 \x03(\v2*.memos.store.ShortcutsUserSetting.ShortcutR\tshortcuts\x1aH\n" + - "\bShortcut\x12\x0e\n" + - "\x02id\x18\x01 \x01(\tR\x02id\x12\x14\n" + - "\x05title\x18\x02 \x01(\tR\x05title\x12\x16\n" + - "\x06filter\x18\x03 \x01(\tR\x06filter\"\xb0\x04\n" + + "appearance\x18\x02 \x01(\tR\n" + + "appearance\x12'\n" + + "\x0fmemo_visibility\x18\x03 \x01(\tR\x0ememoVisibility\"\xb0\x04\n" + "\x13SessionsUserSetting\x12D\n" + "\bsessions\x18\x01 \x03(\v2(.memos.store.SessionsUserSetting.SessionR\bsessions\x1a\xba\x02\n" + "\aSession\x12\x1d\n" + @@ -709,17 +729,18 @@ const file_store_user_setting_proto_rawDesc = "" + "\vdevice_type\x18\x03 \x01(\tR\n" + "deviceType\x12\x0e\n" + "\x02os\x18\x04 \x01(\tR\x02os\x12\x18\n" + - "\abrowser\x18\x05 \x01(\tR\abrowser*\x93\x01\n" + - "\x0eUserSettingKey\x12 \n" + - "\x1cUSER_SETTING_KEY_UNSPECIFIED\x10\x00\x12\x11\n" + - "\rACCESS_TOKENS\x10\x01\x12\n" + - "\n" + - "\x06LOCALE\x10\x02\x12\x0e\n" + - "\n" + - "APPEARANCE\x10\x03\x12\x13\n" + - "\x0fMEMO_VISIBILITY\x10\x04\x12\r\n" + - "\tSHORTCUTS\x10\x05\x12\f\n" + - "\bSESSIONS\x10\x06B\x9b\x01\n" + + "\abrowser\x18\x05 \x01(\tR\abrowser\"\xc4\x01\n" + + "\x17AccessTokensUserSetting\x12U\n" + + "\raccess_tokens\x18\x01 \x03(\v20.memos.store.AccessTokensUserSetting.AccessTokenR\faccessTokens\x1aR\n" + + "\vAccessToken\x12!\n" + + "\faccess_token\x18\x01 \x01(\tR\vaccessToken\x12 \n" + + "\vdescription\x18\x02 \x01(\tR\vdescription\"\xaa\x01\n" + + "\x14ShortcutsUserSetting\x12H\n" + + "\tshortcuts\x18\x01 \x03(\v2*.memos.store.ShortcutsUserSetting.ShortcutR\tshortcuts\x1aH\n" + + "\bShortcut\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x14\n" + + "\x05title\x18\x02 \x01(\tR\x05title\x12\x16\n" + + "\x06filter\x18\x03 \x01(\tR\x06filterB\x9b\x01\n" + "\x0fcom.memos.storeB\x10UserSettingProtoP\x01Z)github.com/usememos/memos/proto/gen/store\xa2\x02\x03MSX\xaa\x02\vMemos.Store\xca\x02\vMemos\\Store\xe2\x02\x17Memos\\Store\\GPBMetadata\xea\x02\fMemos::Storeb\x06proto3" var ( @@ -735,36 +756,38 @@ func file_store_user_setting_proto_rawDescGZIP() []byte { } var file_store_user_setting_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_store_user_setting_proto_msgTypes = make([]protoimpl.MessageInfo, 8) +var file_store_user_setting_proto_msgTypes = make([]protoimpl.MessageInfo, 9) var file_store_user_setting_proto_goTypes = []any{ - (UserSettingKey)(0), // 0: memos.store.UserSettingKey + (UserSetting_Key)(0), // 0: memos.store.UserSetting.Key (*UserSetting)(nil), // 1: memos.store.UserSetting - (*AccessTokensUserSetting)(nil), // 2: memos.store.AccessTokensUserSetting - (*ShortcutsUserSetting)(nil), // 3: memos.store.ShortcutsUserSetting - (*SessionsUserSetting)(nil), // 4: memos.store.SessionsUserSetting - (*AccessTokensUserSetting_AccessToken)(nil), // 5: memos.store.AccessTokensUserSetting.AccessToken - (*ShortcutsUserSetting_Shortcut)(nil), // 6: memos.store.ShortcutsUserSetting.Shortcut - (*SessionsUserSetting_Session)(nil), // 7: memos.store.SessionsUserSetting.Session - (*SessionsUserSetting_ClientInfo)(nil), // 8: memos.store.SessionsUserSetting.ClientInfo - (*timestamppb.Timestamp)(nil), // 9: google.protobuf.Timestamp + (*GeneralUserSetting)(nil), // 2: memos.store.GeneralUserSetting + (*SessionsUserSetting)(nil), // 3: memos.store.SessionsUserSetting + (*AccessTokensUserSetting)(nil), // 4: memos.store.AccessTokensUserSetting + (*ShortcutsUserSetting)(nil), // 5: memos.store.ShortcutsUserSetting + (*SessionsUserSetting_Session)(nil), // 6: memos.store.SessionsUserSetting.Session + (*SessionsUserSetting_ClientInfo)(nil), // 7: memos.store.SessionsUserSetting.ClientInfo + (*AccessTokensUserSetting_AccessToken)(nil), // 8: memos.store.AccessTokensUserSetting.AccessToken + (*ShortcutsUserSetting_Shortcut)(nil), // 9: memos.store.ShortcutsUserSetting.Shortcut + (*timestamppb.Timestamp)(nil), // 10: google.protobuf.Timestamp } var file_store_user_setting_proto_depIdxs = []int32{ - 0, // 0: memos.store.UserSetting.key:type_name -> memos.store.UserSettingKey - 2, // 1: memos.store.UserSetting.access_tokens:type_name -> memos.store.AccessTokensUserSetting - 3, // 2: memos.store.UserSetting.shortcuts:type_name -> memos.store.ShortcutsUserSetting - 4, // 3: memos.store.UserSetting.sessions:type_name -> memos.store.SessionsUserSetting - 5, // 4: memos.store.AccessTokensUserSetting.access_tokens:type_name -> memos.store.AccessTokensUserSetting.AccessToken - 6, // 5: memos.store.ShortcutsUserSetting.shortcuts:type_name -> memos.store.ShortcutsUserSetting.Shortcut - 7, // 6: memos.store.SessionsUserSetting.sessions:type_name -> memos.store.SessionsUserSetting.Session - 9, // 7: memos.store.SessionsUserSetting.Session.create_time:type_name -> google.protobuf.Timestamp - 9, // 8: memos.store.SessionsUserSetting.Session.expire_time:type_name -> google.protobuf.Timestamp - 9, // 9: memos.store.SessionsUserSetting.Session.last_accessed_time:type_name -> google.protobuf.Timestamp - 8, // 10: memos.store.SessionsUserSetting.Session.client_info:type_name -> memos.store.SessionsUserSetting.ClientInfo - 11, // [11:11] is the sub-list for method output_type - 11, // [11:11] is the sub-list for method input_type - 11, // [11:11] is the sub-list for extension type_name - 11, // [11:11] is the sub-list for extension extendee - 0, // [0:11] is the sub-list for field type_name + 0, // 0: memos.store.UserSetting.key:type_name -> memos.store.UserSetting.Key + 2, // 1: memos.store.UserSetting.general:type_name -> memos.store.GeneralUserSetting + 3, // 2: memos.store.UserSetting.sessions:type_name -> memos.store.SessionsUserSetting + 4, // 3: memos.store.UserSetting.access_tokens:type_name -> memos.store.AccessTokensUserSetting + 5, // 4: memos.store.UserSetting.shortcuts:type_name -> memos.store.ShortcutsUserSetting + 6, // 5: memos.store.SessionsUserSetting.sessions:type_name -> memos.store.SessionsUserSetting.Session + 8, // 6: memos.store.AccessTokensUserSetting.access_tokens:type_name -> memos.store.AccessTokensUserSetting.AccessToken + 9, // 7: memos.store.ShortcutsUserSetting.shortcuts:type_name -> memos.store.ShortcutsUserSetting.Shortcut + 10, // 8: memos.store.SessionsUserSetting.Session.create_time:type_name -> google.protobuf.Timestamp + 10, // 9: memos.store.SessionsUserSetting.Session.expire_time:type_name -> google.protobuf.Timestamp + 10, // 10: memos.store.SessionsUserSetting.Session.last_accessed_time:type_name -> google.protobuf.Timestamp + 7, // 11: memos.store.SessionsUserSetting.Session.client_info:type_name -> memos.store.SessionsUserSetting.ClientInfo + 12, // [12:12] is the sub-list for method output_type + 12, // [12:12] is the sub-list for method input_type + 12, // [12:12] is the sub-list for extension type_name + 12, // [12:12] is the sub-list for extension extendee + 0, // [0:12] is the sub-list for field type_name } func init() { file_store_user_setting_proto_init() } @@ -773,12 +796,10 @@ func file_store_user_setting_proto_init() { return } file_store_user_setting_proto_msgTypes[0].OneofWrappers = []any{ + (*UserSetting_General)(nil), + (*UserSetting_Sessions)(nil), (*UserSetting_AccessTokens)(nil), - (*UserSetting_Locale)(nil), - (*UserSetting_Appearance)(nil), - (*UserSetting_MemoVisibility)(nil), (*UserSetting_Shortcuts)(nil), - (*UserSetting_Sessions)(nil), } type x struct{} out := protoimpl.TypeBuilder{ @@ -786,7 +807,7 @@ func file_store_user_setting_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_store_user_setting_proto_rawDesc), len(file_store_user_setting_proto_rawDesc)), NumEnums: 1, - NumMessages: 8, + NumMessages: 9, NumExtensions: 0, NumServices: 0, }, diff --git a/proto/store/user_setting.proto b/proto/store/user_setting.proto index 0deb56cd8..4f519909b 100644 --- a/proto/store/user_setting.proto +++ b/proto/store/user_setting.proto @@ -6,53 +6,38 @@ import "google/protobuf/timestamp.proto"; option go_package = "gen/store"; -enum UserSettingKey { - USER_SETTING_KEY_UNSPECIFIED = 0; - // Access tokens for the user. - ACCESS_TOKENS = 1; - // The locale of the user. - LOCALE = 2; - // The appearance of the user. - APPEARANCE = 3; - // The visibility of the memo. - MEMO_VISIBILITY = 4; - // The shortcuts of the user. - SHORTCUTS = 5; - // User authentication sessions. - SESSIONS = 6; -} - message UserSetting { - int32 user_id = 1; - UserSettingKey key = 2; - oneof value { - AccessTokensUserSetting access_tokens = 3; - string locale = 4; - string appearance = 5; - string memo_visibility = 6; - ShortcutsUserSetting shortcuts = 7; - SessionsUserSetting sessions = 8; + enum Key { + KEY_UNSPECIFIED = 0; + // General user settings. + GENERAL = 1; + // User authentication sessions. + SESSIONS = 2; + // Access tokens for the user. + ACCESS_TOKENS = 3; + // The shortcuts of the user. + SHORTCUTS = 4; } -} -message AccessTokensUserSetting { - message AccessToken { - // The access token is a JWT token. - // Including expiration time, issuer, etc. - string access_token = 1; - // A description for the access token. - string description = 2; + int32 user_id = 1; + + Key key = 2; + + oneof value { + GeneralUserSetting general = 3; + SessionsUserSetting sessions = 4; + AccessTokensUserSetting access_tokens = 5; + ShortcutsUserSetting shortcuts = 6; } - repeated AccessToken access_tokens = 1; } -message ShortcutsUserSetting { - message Shortcut { - string id = 1; - string title = 2; - string filter = 3; - } - repeated Shortcut shortcuts = 1; +message GeneralUserSetting { + // The user's locale. + string locale = 1; + // The user's appearance setting. + string appearance = 2; + // The user's memo visibility setting. + string memo_visibility = 3; } message SessionsUserSetting { @@ -84,3 +69,23 @@ message SessionsUserSetting { repeated Session sessions = 1; } + +message AccessTokensUserSetting { + message AccessToken { + // The access token is a JWT token. + // Including expiration time, issuer, etc. + string access_token = 1; + // A description for the access token. + string description = 2; + } + repeated AccessToken access_tokens = 1; +} + +message ShortcutsUserSetting { + message Shortcut { + string id = 1; + string title = 2; + string filter = 3; + } + repeated Shortcut shortcuts = 1; +} diff --git a/server/router/api/v1/shortcut_service.go b/server/router/api/v1/shortcut_service.go index 9fbb8c762..e0146e505 100644 --- a/server/router/api/v1/shortcut_service.go +++ b/server/router/api/v1/shortcut_service.go @@ -59,7 +59,7 @@ func (s *APIV1Service) ListShortcuts(ctx context.Context, request *v1pb.ListShor userSetting, err := s.Store.GetUserSetting(ctx, &store.FindUserSetting{ UserID: &userID, - Key: storepb.UserSettingKey_SHORTCUTS, + Key: storepb.UserSetting_SHORTCUTS, }) if err != nil { return nil, err @@ -101,7 +101,7 @@ func (s *APIV1Service) GetShortcut(ctx context.Context, request *v1pb.GetShortcu userSetting, err := s.Store.GetUserSetting(ctx, &store.FindUserSetting{ UserID: &userID, - Key: storepb.UserSettingKey_SHORTCUTS, + Key: storepb.UserSetting_SHORTCUTS, }) if err != nil { return nil, err @@ -159,7 +159,7 @@ func (s *APIV1Service) CreateShortcut(ctx context.Context, request *v1pb.CreateS userSetting, err := s.Store.GetUserSetting(ctx, &store.FindUserSetting{ UserID: &userID, - Key: storepb.UserSettingKey_SHORTCUTS, + Key: storepb.UserSetting_SHORTCUTS, }) if err != nil { return nil, err @@ -167,7 +167,7 @@ func (s *APIV1Service) CreateShortcut(ctx context.Context, request *v1pb.CreateS if userSetting == nil { userSetting = &storepb.UserSetting{ UserId: userID, - Key: storepb.UserSettingKey_SHORTCUTS, + Key: storepb.UserSetting_SHORTCUTS, Value: &storepb.UserSetting_Shortcuts{ Shortcuts: &storepb.ShortcutsUserSetting{ Shortcuts: []*storepb.ShortcutsUserSetting_Shortcut{}, @@ -215,7 +215,7 @@ func (s *APIV1Service) UpdateShortcut(ctx context.Context, request *v1pb.UpdateS userSetting, err := s.Store.GetUserSetting(ctx, &store.FindUserSetting{ UserID: &userID, - Key: storepb.UserSettingKey_SHORTCUTS, + Key: storepb.UserSetting_SHORTCUTS, }) if err != nil { return nil, err @@ -284,7 +284,7 @@ func (s *APIV1Service) DeleteShortcut(ctx context.Context, request *v1pb.DeleteS userSetting, err := s.Store.GetUserSetting(ctx, &store.FindUserSetting{ UserID: &userID, - Key: storepb.UserSettingKey_SHORTCUTS, + Key: storepb.UserSetting_SHORTCUTS, }) if err != nil { return nil, err diff --git a/server/router/api/v1/user_service.go b/server/router/api/v1/user_service.go index 16175e620..9482cd8c0 100644 --- a/server/router/api/v1/user_service.go +++ b/server/router/api/v1/user_service.go @@ -364,12 +364,13 @@ func (s *APIV1Service) GetUserSetting(ctx context.Context, request *v1pb.GetUser userSettingMessage.Name = fmt.Sprintf("users/%d", userID) for _, setting := range userSettings { - if setting.Key == storepb.UserSettingKey_LOCALE { - userSettingMessage.Locale = setting.GetLocale() - } else if setting.Key == storepb.UserSettingKey_APPEARANCE { - userSettingMessage.Appearance = setting.GetAppearance() - } else if setting.Key == storepb.UserSettingKey_MEMO_VISIBILITY { - userSettingMessage.MemoVisibility = setting.GetMemoVisibility() + if setting.Key == storepb.UserSetting_GENERAL { + general := setting.GetGeneral() + if general != nil { + userSettingMessage.Locale = general.Locale + userSettingMessage.Appearance = general.Appearance + userSettingMessage.MemoVisibility = general.MemoVisibility + } } } return userSettingMessage, nil @@ -396,42 +397,55 @@ func (s *APIV1Service) UpdateUserSetting(ctx context.Context, request *v1pb.Upda return nil, status.Errorf(codes.InvalidArgument, "update mask is empty") } + // Get the current general setting + existingGeneralSetting, err := s.Store.GetUserSetting(ctx, &store.FindUserSetting{ + UserID: &userID, + Key: storepb.UserSetting_GENERAL, + }) + if err != nil { + return nil, status.Errorf(codes.Internal, "failed to get existing general setting: %v", err) + } + + // Create or update the general setting + generalSetting := &storepb.GeneralUserSetting{ + Locale: "en", + Appearance: "system", + MemoVisibility: "PRIVATE", + } + + // If there's an existing setting, use its values as defaults + if existingGeneralSetting != nil && existingGeneralSetting.GetGeneral() != nil { + existing := existingGeneralSetting.GetGeneral() + generalSetting.Locale = existing.Locale + generalSetting.Appearance = existing.Appearance + generalSetting.MemoVisibility = existing.MemoVisibility + } + + // Apply updates based on the update mask for _, field := range request.UpdateMask.Paths { - if field == "locale" { - if _, err := s.Store.UpsertUserSetting(ctx, &storepb.UserSetting{ - UserId: userID, - Key: storepb.UserSettingKey_LOCALE, - Value: &storepb.UserSetting_Locale{ - Locale: request.Setting.Locale, - }, - }); err != nil { - return nil, status.Errorf(codes.Internal, "failed to upsert user setting: %v", err) - } - } else if field == "appearance" { - if _, err := s.Store.UpsertUserSetting(ctx, &storepb.UserSetting{ - UserId: userID, - Key: storepb.UserSettingKey_APPEARANCE, - Value: &storepb.UserSetting_Appearance{ - Appearance: request.Setting.Appearance, - }, - }); err != nil { - return nil, status.Errorf(codes.Internal, "failed to upsert user setting: %v", err) - } - } else if field == "memo_visibility" { - if _, err := s.Store.UpsertUserSetting(ctx, &storepb.UserSetting{ - UserId: userID, - Key: storepb.UserSettingKey_MEMO_VISIBILITY, - Value: &storepb.UserSetting_MemoVisibility{ - MemoVisibility: request.Setting.MemoVisibility, - }, - }); err != nil { - return nil, status.Errorf(codes.Internal, "failed to upsert user setting: %v", err) - } - } else { + switch field { + case "locale": + generalSetting.Locale = request.Setting.Locale + case "appearance": + generalSetting.Appearance = request.Setting.Appearance + case "memo_visibility": + generalSetting.MemoVisibility = request.Setting.MemoVisibility + default: return nil, status.Errorf(codes.InvalidArgument, "invalid update path: %s", field) } } + // Upsert the general setting + if _, err := s.Store.UpsertUserSetting(ctx, &storepb.UserSetting{ + UserId: userID, + Key: storepb.UserSetting_GENERAL, + Value: &storepb.UserSetting_General{ + General: generalSetting, + }, + }); err != nil { + return nil, status.Errorf(codes.Internal, "failed to upsert user setting: %v", err) + } + return s.GetUserSetting(ctx, &v1pb.GetUserSettingRequest{Name: request.Setting.Name}) } @@ -595,7 +609,7 @@ func (s *APIV1Service) DeleteUserAccessToken(ctx context.Context, request *v1pb. } if _, err := s.Store.UpsertUserSetting(ctx, &storepb.UserSetting{ UserId: currentUser.ID, - Key: storepb.UserSettingKey_ACCESS_TOKENS, + Key: storepb.UserSetting_ACCESS_TOKENS, Value: &storepb.UserSetting_AccessTokens{ AccessTokens: &storepb.AccessTokensUserSetting{ AccessTokens: updatedUserAccessTokens, @@ -722,7 +736,7 @@ func (s *APIV1Service) UpsertAccessTokenToStore(ctx context.Context, user *store if _, err := s.Store.UpsertUserSetting(ctx, &storepb.UserSetting{ UserId: user.ID, - Key: storepb.UserSettingKey_ACCESS_TOKENS, + Key: storepb.UserSetting_ACCESS_TOKENS, Value: &storepb.UserSetting_AccessTokens{ AccessTokens: &storepb.AccessTokensUserSetting{ AccessTokens: userAccessTokens, diff --git a/store/db/mysql/user_setting.go b/store/db/mysql/user_setting.go index e43eb51c8..d51228ba6 100644 --- a/store/db/mysql/user_setting.go +++ b/store/db/mysql/user_setting.go @@ -19,7 +19,7 @@ func (d *DB) UpsertUserSetting(ctx context.Context, upsert *store.UserSetting) ( func (d *DB) ListUserSettings(ctx context.Context, find *store.FindUserSetting) ([]*store.UserSetting, error) { where, args := []string{"1 = 1"}, []any{} - if v := find.Key; v != storepb.UserSettingKey_USER_SETTING_KEY_UNSPECIFIED { + if v := find.Key; v != storepb.UserSetting_KEY_UNSPECIFIED { where, args = append(where, "`key` = ?"), append(args, v.String()) } if v := find.UserID; v != nil { @@ -44,7 +44,7 @@ func (d *DB) ListUserSettings(ctx context.Context, find *store.FindUserSetting) ); err != nil { return nil, err } - userSetting.Key = storepb.UserSettingKey(storepb.UserSettingKey_value[keyString]) + userSetting.Key = storepb.UserSetting_Key(storepb.UserSetting_Key_value[keyString]) userSettingList = append(userSettingList, userSetting) } diff --git a/store/db/postgres/user_setting.go b/store/db/postgres/user_setting.go index 18c964de0..04aec63a0 100644 --- a/store/db/postgres/user_setting.go +++ b/store/db/postgres/user_setting.go @@ -26,7 +26,7 @@ func (d *DB) UpsertUserSetting(ctx context.Context, upsert *store.UserSetting) ( func (d *DB) ListUserSettings(ctx context.Context, find *store.FindUserSetting) ([]*store.UserSetting, error) { where, args := []string{"1 = 1"}, []any{} - if v := find.Key; v != storepb.UserSettingKey_USER_SETTING_KEY_UNSPECIFIED { + if v := find.Key; v != storepb.UserSetting_KEY_UNSPECIFIED { where, args = append(where, "key = "+placeholder(len(args)+1)), append(args, v.String()) } if v := find.UserID; v != nil { @@ -57,7 +57,7 @@ func (d *DB) ListUserSettings(ctx context.Context, find *store.FindUserSetting) ); err != nil { return nil, err } - userSetting.Key = storepb.UserSettingKey(storepb.UserSettingKey_value[keyString]) + userSetting.Key = storepb.UserSetting_Key(storepb.UserSetting_Key_value[keyString]) userSettingList = append(userSettingList, userSetting) } diff --git a/store/db/sqlite/user_setting.go b/store/db/sqlite/user_setting.go index cd219a614..c6ca6f3f0 100644 --- a/store/db/sqlite/user_setting.go +++ b/store/db/sqlite/user_setting.go @@ -26,7 +26,7 @@ func (d *DB) UpsertUserSetting(ctx context.Context, upsert *store.UserSetting) ( func (d *DB) ListUserSettings(ctx context.Context, find *store.FindUserSetting) ([]*store.UserSetting, error) { where, args := []string{"1 = 1"}, []any{} - if v := find.Key; v != storepb.UserSettingKey_USER_SETTING_KEY_UNSPECIFIED { + if v := find.Key; v != storepb.UserSetting_KEY_UNSPECIFIED { where, args = append(where, "key = ?"), append(args, v.String()) } if v := find.UserID; v != nil { @@ -57,7 +57,7 @@ func (d *DB) ListUserSettings(ctx context.Context, find *store.FindUserSetting) ); err != nil { return nil, err } - userSetting.Key = storepb.UserSettingKey(storepb.UserSettingKey_value[keyString]) + userSetting.Key = storepb.UserSetting_Key(storepb.UserSetting_Key_value[keyString]) userSettingList = append(userSettingList, userSetting) } if err := rows.Err(); err != nil { diff --git a/store/test/user_setting_test.go b/store/test/user_setting_test.go index f8cac1cf2..ce954ac5c 100644 --- a/store/test/user_setting_test.go +++ b/store/test/user_setting_test.go @@ -17,8 +17,8 @@ func TestUserSettingStore(t *testing.T) { require.NoError(t, err) _, err = ts.UpsertUserSetting(ctx, &storepb.UserSetting{ UserId: user.ID, - Key: storepb.UserSettingKey_LOCALE, - Value: &storepb.UserSetting_Locale{Locale: "en"}, + Key: storepb.UserSetting_GENERAL, + Value: &storepb.UserSetting_General{General: &storepb.GeneralUserSetting{Locale: "en"}}, }) require.NoError(t, err) list, err := ts.ListUserSettings(ctx, &store.FindUserSetting{}) diff --git a/store/user_setting.go b/store/user_setting.go index 7536a1d9b..3cfbdfca3 100644 --- a/store/user_setting.go +++ b/store/user_setting.go @@ -12,13 +12,13 @@ import ( type UserSetting struct { UserID int32 - Key storepb.UserSettingKey + Key storepb.UserSetting_Key Value string } type FindUserSetting struct { UserID *int32 - Key storepb.UserSettingKey + Key storepb.UserSetting_Key } func (s *Store) UpsertUserSetting(ctx context.Context, upsert *storepb.UserSetting) (*storepb.UserSetting, error) { @@ -93,7 +93,7 @@ func (s *Store) GetUserSetting(ctx context.Context, find *FindUserSetting) (*sto func (s *Store) GetUserAccessTokens(ctx context.Context, userID int32) ([]*storepb.AccessTokensUserSetting_AccessToken, error) { userSetting, err := s.GetUserSetting(ctx, &FindUserSetting{ UserID: &userID, - Key: storepb.UserSettingKey_ACCESS_TOKENS, + Key: storepb.UserSetting_ACCESS_TOKENS, }) if err != nil { return nil, err @@ -122,7 +122,7 @@ func (s *Store) RemoveUserAccessToken(ctx context.Context, userID int32, token s _, err = s.UpsertUserSetting(ctx, &storepb.UserSetting{ UserId: userID, - Key: storepb.UserSettingKey_ACCESS_TOKENS, + Key: storepb.UserSetting_ACCESS_TOKENS, Value: &storepb.UserSetting_AccessTokens{ AccessTokens: &storepb.AccessTokensUserSetting{ AccessTokens: newAccessTokens, @@ -137,7 +137,7 @@ func (s *Store) RemoveUserAccessToken(ctx context.Context, userID int32, token s func (s *Store) GetUserSessions(ctx context.Context, userID int32) ([]*storepb.SessionsUserSetting_Session, error) { userSetting, err := s.GetUserSetting(ctx, &FindUserSetting{ UserID: &userID, - Key: storepb.UserSettingKey_SESSIONS, + Key: storepb.UserSetting_SESSIONS, }) if err != nil { return nil, err @@ -166,7 +166,7 @@ func (s *Store) RemoveUserSession(ctx context.Context, userID int32, sessionID s _, err = s.UpsertUserSetting(ctx, &storepb.UserSetting{ UserId: userID, - Key: storepb.UserSettingKey_SESSIONS, + Key: storepb.UserSetting_SESSIONS, Value: &storepb.UserSetting_Sessions{ Sessions: &storepb.SessionsUserSetting{ Sessions: newSessions, @@ -203,7 +203,7 @@ func (s *Store) AddUserSession(ctx context.Context, userID int32, session *store _, err = s.UpsertUserSetting(ctx, &storepb.UserSetting{ UserId: userID, - Key: storepb.UserSettingKey_SESSIONS, + Key: storepb.UserSetting_SESSIONS, Value: &storepb.UserSetting_Sessions{ Sessions: &storepb.SessionsUserSetting{ Sessions: updatedSessions, @@ -230,7 +230,7 @@ func (s *Store) UpdateUserSessionLastAccessed(ctx context.Context, userID int32, _, err = s.UpsertUserSetting(ctx, &storepb.UserSetting{ UserId: userID, - Key: storepb.UserSettingKey_SESSIONS, + Key: storepb.UserSetting_SESSIONS, Value: &storepb.UserSetting_Sessions{ Sessions: &storepb.SessionsUserSetting{ Sessions: sessions, @@ -248,30 +248,30 @@ func convertUserSettingFromRaw(raw *UserSetting) (*storepb.UserSetting, error) { } switch raw.Key { - case storepb.UserSettingKey_ACCESS_TOKENS: + case storepb.UserSetting_ACCESS_TOKENS: accessTokensUserSetting := &storepb.AccessTokensUserSetting{} if err := protojsonUnmarshaler.Unmarshal([]byte(raw.Value), accessTokensUserSetting); err != nil { return nil, err } userSetting.Value = &storepb.UserSetting_AccessTokens{AccessTokens: accessTokensUserSetting} - case storepb.UserSettingKey_SESSIONS: + case storepb.UserSetting_SESSIONS: sessionsUserSetting := &storepb.SessionsUserSetting{} if err := protojsonUnmarshaler.Unmarshal([]byte(raw.Value), sessionsUserSetting); err != nil { return nil, err } userSetting.Value = &storepb.UserSetting_Sessions{Sessions: sessionsUserSetting} - case storepb.UserSettingKey_SHORTCUTS: + case storepb.UserSetting_SHORTCUTS: shortcutsUserSetting := &storepb.ShortcutsUserSetting{} if err := protojsonUnmarshaler.Unmarshal([]byte(raw.Value), shortcutsUserSetting); err != nil { return nil, err } userSetting.Value = &storepb.UserSetting_Shortcuts{Shortcuts: shortcutsUserSetting} - case storepb.UserSettingKey_LOCALE: - userSetting.Value = &storepb.UserSetting_Locale{Locale: raw.Value} - case storepb.UserSettingKey_APPEARANCE: - userSetting.Value = &storepb.UserSetting_Appearance{Appearance: raw.Value} - case storepb.UserSettingKey_MEMO_VISIBILITY: - userSetting.Value = &storepb.UserSetting_MemoVisibility{MemoVisibility: raw.Value} + case storepb.UserSetting_GENERAL: + generalUserSetting := &storepb.GeneralUserSetting{} + if err := protojsonUnmarshaler.Unmarshal([]byte(raw.Value), generalUserSetting); err != nil { + return nil, err + } + userSetting.Value = &storepb.UserSetting_General{General: generalUserSetting} default: return nil, nil } @@ -285,33 +285,34 @@ func convertUserSettingToRaw(userSetting *storepb.UserSetting) (*UserSetting, er } switch userSetting.Key { - case storepb.UserSettingKey_ACCESS_TOKENS: + case storepb.UserSetting_ACCESS_TOKENS: accessTokensUserSetting := userSetting.GetAccessTokens() value, err := protojson.Marshal(accessTokensUserSetting) if err != nil { return nil, err } raw.Value = string(value) - case storepb.UserSettingKey_SESSIONS: + case storepb.UserSetting_SESSIONS: sessionsUserSetting := userSetting.GetSessions() value, err := protojson.Marshal(sessionsUserSetting) if err != nil { return nil, err } raw.Value = string(value) - case storepb.UserSettingKey_SHORTCUTS: + case storepb.UserSetting_SHORTCUTS: shortcutsUserSetting := userSetting.GetShortcuts() value, err := protojson.Marshal(shortcutsUserSetting) if err != nil { return nil, err } raw.Value = string(value) - case storepb.UserSettingKey_LOCALE: - raw.Value = userSetting.GetLocale() - case storepb.UserSettingKey_APPEARANCE: - raw.Value = userSetting.GetAppearance() - case storepb.UserSettingKey_MEMO_VISIBILITY: - raw.Value = userSetting.GetMemoVisibility() + case storepb.UserSetting_GENERAL: + generalUserSetting := userSetting.GetGeneral() + value, err := protojson.Marshal(generalUserSetting) + if err != nil { + return nil, err + } + raw.Value = string(value) default: return nil, errors.Errorf("unsupported user setting key: %v", userSetting.Key) }