diff --git a/frontend/web/src/components/setting/PreferenceSection.tsx b/frontend/web/src/components/setting/PreferenceSection.tsx index 7b02b25..755425e 100644 --- a/frontend/web/src/components/setting/PreferenceSection.tsx +++ b/frontend/web/src/components/setting/PreferenceSection.tsx @@ -8,8 +8,8 @@ const PreferenceSection: React.FC = () => { const { t } = useTranslation(); const userStore = useUserStore(); const userSetting = userStore.getCurrentUserSetting(); - const language = userSetting.locale; - const colorTheme = userSetting.colorTheme; + const language = userSetting.general?.locale || "EN"; + const colorTheme = userSetting.general?.colorTheme || "SYSTEM"; const languageOptions = [ { @@ -49,9 +49,12 @@ const PreferenceSection: React.FC = () => { await userStore.updateUserSetting( { ...userSetting, - locale: locale, + general: { + ...userSetting.general, + locale: locale, + }, } as UserSetting, - ["locale"], + ["general"], ); }; @@ -59,9 +62,12 @@ const PreferenceSection: React.FC = () => { await userStore.updateUserSetting( { ...userSetting, - colorTheme: colorTheme, + general: { + ...userSetting.general, + colorTheme: colorTheme, + }, } as UserSetting, - ["color_theme"], + ["general"], ); }; diff --git a/frontend/web/src/i18n.ts b/frontend/web/src/i18n.ts index b8fda42..c355c1e 100644 --- a/frontend/web/src/i18n.ts +++ b/frontend/web/src/i18n.ts @@ -7,21 +7,21 @@ import zh from "../../locales/zh.json"; i18n.use(initReactI18next).init({ resources: { - en: { + EN: { translation: en, }, - zh: { + ZH: { translation: zh, }, - fr: { + FR: { translation: fr, }, - ja: { + JA: { translation: ja, }, }, - lng: "en", - fallbackLng: "en", + lng: "EN", + fallbackLng: "EN", }); export default i18n; diff --git a/frontend/web/src/layouts/Root.tsx b/frontend/web/src/layouts/Root.tsx index b2e9fc2..f1e84ec 100644 --- a/frontend/web/src/layouts/Root.tsx +++ b/frontend/web/src/layouts/Root.tsx @@ -1,5 +1,4 @@ import { useColorScheme } from "@mui/joy"; -import { isEqual } from "lodash-es"; import { useEffect } from "react"; import { useTranslation } from "react-i18next"; import { Outlet } from "react-router-dom"; @@ -34,19 +33,11 @@ const Root: React.FC = () => { return; } - if (isEqual(currentUserSetting.locale, "ZH")) { - i18n.changeLanguage("zh"); - } else if (isEqual(currentUserSetting.locale, "FR")) { - i18n.changeLanguage("fr"); - } else if (isEqual(currentUserSetting.locale, "JA")) { - i18n.changeLanguage("ja"); - } else { - i18n.changeLanguage("en"); - } + i18n.changeLanguage(currentUserSetting.general?.locale || "en"); - if (currentUserSetting.colorTheme === "LIGHT") { + if (currentUserSetting.general?.colorTheme === "LIGHT") { setMode("light"); - } else if (currentUserSetting.colorTheme === "DARK") { + } else if (currentUserSetting.general?.colorTheme === "DARK") { setMode("dark"); } else { setMode("system"); diff --git a/frontend/web/src/stores/user.ts b/frontend/web/src/stores/user.ts index 063506d..a3f3a94 100644 --- a/frontend/web/src/stores/user.ts +++ b/frontend/web/src/stores/user.ts @@ -129,6 +129,11 @@ const useUserStore = create()((set, get) => ({ updateMask, }) ).userSetting as UserSetting; + console.log("1", { + id: userId, + userSetting, + updateMask, + }); const userSettingMap = get().userSettingMapById; userSettingMap[userId] = updatedUserSetting; set(userSettingMap); diff --git a/proto/api/v1/user_setting_service.proto b/proto/api/v1/user_setting_service.proto index 34b31a9..54ddca5 100644 --- a/proto/api/v1/user_setting_service.proto +++ b/proto/api/v1/user_setting_service.proto @@ -28,11 +28,12 @@ message UserSetting { // id is the user id. int32 id = 1; - // locale is the user locale. - string locale = 2; + UserSettingGeneral general = 2; +} - // color_theme is the user color theme. - string color_theme = 3; +message UserSettingGeneral { + string locale = 1; + string color_theme = 2; } message GetUserSettingRequest { diff --git a/proto/gen/api/v1/README.md b/proto/gen/api/v1/README.md index 2d1d58e..9ab05a1 100644 --- a/proto/gen/api/v1/README.md +++ b/proto/gen/api/v1/README.md @@ -98,6 +98,7 @@ - [UpdateUserSettingRequest](#slash-api-v1-UpdateUserSettingRequest) - [UpdateUserSettingResponse](#slash-api-v1-UpdateUserSettingResponse) - [UserSetting](#slash-api-v1-UserSetting) + - [UserSettingGeneral](#slash-api-v1-UserSettingGeneral) - [UserSettingService](#slash-api-v1-UserSettingService) @@ -1323,8 +1324,23 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | id | [int32](#int32) | | id is the user id. | -| locale | [string](#string) | | locale is the user locale. | -| color_theme | [string](#string) | | color_theme is the user color theme. | +| general | [UserSettingGeneral](#slash-api-v1-UserSettingGeneral) | | | + + + + + + + + +### UserSettingGeneral + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| locale | [string](#string) | | | +| color_theme | [string](#string) | | | diff --git a/proto/gen/api/v1/user_setting_service.pb.go b/proto/gen/api/v1/user_setting_service.pb.go index 623fd10..693bff6 100644 --- a/proto/gen/api/v1/user_setting_service.pb.go +++ b/proto/gen/api/v1/user_setting_service.pb.go @@ -28,11 +28,8 @@ type UserSetting struct { unknownFields protoimpl.UnknownFields // id is the user id. - Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` - // locale is the user locale. - Locale string `protobuf:"bytes,2,opt,name=locale,proto3" json:"locale,omitempty"` - // color_theme is the user color theme. - ColorTheme string `protobuf:"bytes,3,opt,name=color_theme,json=colorTheme,proto3" json:"color_theme,omitempty"` + Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + General *UserSettingGeneral `protobuf:"bytes,2,opt,name=general,proto3" json:"general,omitempty"` } func (x *UserSetting) Reset() { @@ -74,14 +71,62 @@ func (x *UserSetting) GetId() int32 { return 0 } -func (x *UserSetting) GetLocale() string { +func (x *UserSetting) GetGeneral() *UserSettingGeneral { + if x != nil { + return x.General + } + return nil +} + +type UserSettingGeneral struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Locale string `protobuf:"bytes,1,opt,name=locale,proto3" json:"locale,omitempty"` + ColorTheme string `protobuf:"bytes,2,opt,name=color_theme,json=colorTheme,proto3" json:"color_theme,omitempty"` +} + +func (x *UserSettingGeneral) Reset() { + *x = UserSettingGeneral{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_user_setting_service_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserSettingGeneral) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserSettingGeneral) ProtoMessage() {} + +func (x *UserSettingGeneral) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_user_setting_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 UserSettingGeneral.ProtoReflect.Descriptor instead. +func (*UserSettingGeneral) Descriptor() ([]byte, []int) { + return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{1} +} + +func (x *UserSettingGeneral) GetLocale() string { if x != nil { return x.Locale } return "" } -func (x *UserSetting) GetColorTheme() string { +func (x *UserSettingGeneral) GetColorTheme() string { if x != nil { return x.ColorTheme } @@ -100,7 +145,7 @@ type GetUserSettingRequest struct { func (x *GetUserSettingRequest) Reset() { *x = GetUserSettingRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_user_setting_service_proto_msgTypes[1] + mi := &file_api_v1_user_setting_service_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -113,7 +158,7 @@ func (x *GetUserSettingRequest) String() string { func (*GetUserSettingRequest) ProtoMessage() {} func (x *GetUserSettingRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_user_setting_service_proto_msgTypes[1] + mi := &file_api_v1_user_setting_service_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -126,7 +171,7 @@ func (x *GetUserSettingRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUserSettingRequest.ProtoReflect.Descriptor instead. func (*GetUserSettingRequest) Descriptor() ([]byte, []int) { - return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{1} + return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{2} } func (x *GetUserSettingRequest) GetId() int32 { @@ -147,7 +192,7 @@ type GetUserSettingResponse struct { func (x *GetUserSettingResponse) Reset() { *x = GetUserSettingResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_user_setting_service_proto_msgTypes[2] + mi := &file_api_v1_user_setting_service_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -160,7 +205,7 @@ func (x *GetUserSettingResponse) String() string { func (*GetUserSettingResponse) ProtoMessage() {} func (x *GetUserSettingResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_user_setting_service_proto_msgTypes[2] + mi := &file_api_v1_user_setting_service_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -173,7 +218,7 @@ func (x *GetUserSettingResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUserSettingResponse.ProtoReflect.Descriptor instead. func (*GetUserSettingResponse) Descriptor() ([]byte, []int) { - return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{2} + return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{3} } func (x *GetUserSettingResponse) GetUserSetting() *UserSetting { @@ -199,7 +244,7 @@ type UpdateUserSettingRequest struct { func (x *UpdateUserSettingRequest) Reset() { *x = UpdateUserSettingRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_user_setting_service_proto_msgTypes[3] + mi := &file_api_v1_user_setting_service_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -212,7 +257,7 @@ func (x *UpdateUserSettingRequest) String() string { func (*UpdateUserSettingRequest) ProtoMessage() {} func (x *UpdateUserSettingRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_user_setting_service_proto_msgTypes[3] + mi := &file_api_v1_user_setting_service_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -225,7 +270,7 @@ func (x *UpdateUserSettingRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateUserSettingRequest.ProtoReflect.Descriptor instead. func (*UpdateUserSettingRequest) Descriptor() ([]byte, []int) { - return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{3} + return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{4} } func (x *UpdateUserSettingRequest) GetId() int32 { @@ -260,7 +305,7 @@ type UpdateUserSettingResponse struct { func (x *UpdateUserSettingResponse) Reset() { *x = UpdateUserSettingResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_user_setting_service_proto_msgTypes[4] + mi := &file_api_v1_user_setting_service_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -273,7 +318,7 @@ func (x *UpdateUserSettingResponse) String() string { func (*UpdateUserSettingResponse) ProtoMessage() {} func (x *UpdateUserSettingResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_user_setting_service_proto_msgTypes[4] + mi := &file_api_v1_user_setting_service_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -286,7 +331,7 @@ func (x *UpdateUserSettingResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateUserSettingResponse.ProtoReflect.Descriptor instead. func (*UpdateUserSettingResponse) Descriptor() ([]byte, []int) { - return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{4} + return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{5} } func (x *UpdateUserSettingResponse) GetUserSetting() *UserSetting { @@ -307,70 +352,75 @@ var file_api_v1_user_setting_service_proto_rawDesc = []byte{ 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, - 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x56, 0x0a, 0x0b, 0x55, 0x73, + 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x59, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x74, 0x68, 0x65, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x68, 0x65, - 0x6d, 0x65, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x56, 0x0a, 0x16, 0x47, - 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x73, 0x6c, - 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x22, 0xa5, 0x01, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, - 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x3c, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x3b, - 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, - 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x59, 0x0a, 0x19, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, - 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, - 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x32, 0xd1, 0x02, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x72, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x85, 0x01, - 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x12, 0x23, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0xda, 0x41, 0x02, - 0x69, 0x64, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, - 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0xb2, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x26, 0x2e, 0x73, 0x6c, - 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4c, 0xda, 0x41, - 0x18, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x2c, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x3a, - 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x32, 0x1b, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, - 0x7d, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x42, 0xb5, 0x01, 0x0a, 0x10, 0x63, - 0x6f, 0x6d, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, - 0x17, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x36, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x79, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x6c, 0x66, 0x68, - 0x6f, 0x73, 0x74, 0x65, 0x64, 0x2f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x70, 0x69, - 0x76, 0x31, 0xa2, 0x02, 0x03, 0x53, 0x41, 0x58, 0xaa, 0x02, 0x0c, 0x53, 0x6c, 0x61, 0x73, 0x68, - 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x5c, - 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x18, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x5c, 0x41, - 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0xea, 0x02, 0x0e, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, - 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3a, 0x0a, 0x07, 0x67, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x73, 0x6c, 0x61, + 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x07, 0x67, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x4d, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x74, 0x68, 0x65, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, + 0x68, 0x65, 0x6d, 0x65, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x56, 0x0a, + 0x16, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x22, 0xa5, 0x01, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x3c, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, + 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x59, 0x0a, + 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x75, 0x73, 0x65, + 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x32, 0xd1, 0x02, 0x0a, 0x12, 0x55, 0x73, 0x65, + 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x85, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x12, 0x23, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0xda, + 0x41, 0x02, 0x69, 0x64, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0xb2, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x26, 0x2e, + 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4c, + 0xda, 0x41, 0x18, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x2c, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x2b, 0x3a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x32, + 0x1b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, + 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x42, 0xb5, 0x01, 0x0a, + 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x42, 0x17, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x36, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x79, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x6c, + 0x66, 0x68, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x2f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x61, + 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x53, 0x41, 0x58, 0xaa, 0x02, 0x0c, 0x53, 0x6c, 0x61, + 0x73, 0x68, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x53, 0x6c, 0x61, 0x73, + 0x68, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x18, 0x53, 0x6c, 0x61, 0x73, 0x68, + 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x3a, 0x3a, 0x41, 0x70, 0x69, + 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -385,29 +435,31 @@ func file_api_v1_user_setting_service_proto_rawDescGZIP() []byte { return file_api_v1_user_setting_service_proto_rawDescData } -var file_api_v1_user_setting_service_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_api_v1_user_setting_service_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_api_v1_user_setting_service_proto_goTypes = []any{ (*UserSetting)(nil), // 0: slash.api.v1.UserSetting - (*GetUserSettingRequest)(nil), // 1: slash.api.v1.GetUserSettingRequest - (*GetUserSettingResponse)(nil), // 2: slash.api.v1.GetUserSettingResponse - (*UpdateUserSettingRequest)(nil), // 3: slash.api.v1.UpdateUserSettingRequest - (*UpdateUserSettingResponse)(nil), // 4: slash.api.v1.UpdateUserSettingResponse - (*fieldmaskpb.FieldMask)(nil), // 5: google.protobuf.FieldMask + (*UserSettingGeneral)(nil), // 1: slash.api.v1.UserSettingGeneral + (*GetUserSettingRequest)(nil), // 2: slash.api.v1.GetUserSettingRequest + (*GetUserSettingResponse)(nil), // 3: slash.api.v1.GetUserSettingResponse + (*UpdateUserSettingRequest)(nil), // 4: slash.api.v1.UpdateUserSettingRequest + (*UpdateUserSettingResponse)(nil), // 5: slash.api.v1.UpdateUserSettingResponse + (*fieldmaskpb.FieldMask)(nil), // 6: google.protobuf.FieldMask } var file_api_v1_user_setting_service_proto_depIdxs = []int32{ - 0, // 0: slash.api.v1.GetUserSettingResponse.user_setting:type_name -> slash.api.v1.UserSetting - 0, // 1: slash.api.v1.UpdateUserSettingRequest.user_setting:type_name -> slash.api.v1.UserSetting - 5, // 2: slash.api.v1.UpdateUserSettingRequest.update_mask:type_name -> google.protobuf.FieldMask - 0, // 3: slash.api.v1.UpdateUserSettingResponse.user_setting:type_name -> slash.api.v1.UserSetting - 1, // 4: slash.api.v1.UserSettingService.GetUserSetting:input_type -> slash.api.v1.GetUserSettingRequest - 3, // 5: slash.api.v1.UserSettingService.UpdateUserSetting:input_type -> slash.api.v1.UpdateUserSettingRequest - 2, // 6: slash.api.v1.UserSettingService.GetUserSetting:output_type -> slash.api.v1.GetUserSettingResponse - 4, // 7: slash.api.v1.UserSettingService.UpdateUserSetting:output_type -> slash.api.v1.UpdateUserSettingResponse - 6, // [6:8] is the sub-list for method output_type - 4, // [4:6] is the sub-list for method input_type - 4, // [4:4] is the sub-list for extension type_name - 4, // [4:4] is the sub-list for extension extendee - 0, // [0:4] is the sub-list for field type_name + 1, // 0: slash.api.v1.UserSetting.general:type_name -> slash.api.v1.UserSettingGeneral + 0, // 1: slash.api.v1.GetUserSettingResponse.user_setting:type_name -> slash.api.v1.UserSetting + 0, // 2: slash.api.v1.UpdateUserSettingRequest.user_setting:type_name -> slash.api.v1.UserSetting + 6, // 3: slash.api.v1.UpdateUserSettingRequest.update_mask:type_name -> google.protobuf.FieldMask + 0, // 4: slash.api.v1.UpdateUserSettingResponse.user_setting:type_name -> slash.api.v1.UserSetting + 2, // 5: slash.api.v1.UserSettingService.GetUserSetting:input_type -> slash.api.v1.GetUserSettingRequest + 4, // 6: slash.api.v1.UserSettingService.UpdateUserSetting:input_type -> slash.api.v1.UpdateUserSettingRequest + 3, // 7: slash.api.v1.UserSettingService.GetUserSetting:output_type -> slash.api.v1.GetUserSettingResponse + 5, // 8: slash.api.v1.UserSettingService.UpdateUserSetting:output_type -> slash.api.v1.UpdateUserSettingResponse + 7, // [7:9] is the sub-list for method output_type + 5, // [5:7] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name } func init() { file_api_v1_user_setting_service_proto_init() } @@ -429,7 +481,7 @@ func file_api_v1_user_setting_service_proto_init() { } } file_api_v1_user_setting_service_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*GetUserSettingRequest); i { + switch v := v.(*UserSettingGeneral); i { case 0: return &v.state case 1: @@ -441,7 +493,7 @@ func file_api_v1_user_setting_service_proto_init() { } } file_api_v1_user_setting_service_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*GetUserSettingResponse); i { + switch v := v.(*GetUserSettingRequest); i { case 0: return &v.state case 1: @@ -453,7 +505,7 @@ func file_api_v1_user_setting_service_proto_init() { } } file_api_v1_user_setting_service_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*UpdateUserSettingRequest); i { + switch v := v.(*GetUserSettingResponse); i { case 0: return &v.state case 1: @@ -465,6 +517,18 @@ func file_api_v1_user_setting_service_proto_init() { } } file_api_v1_user_setting_service_proto_msgTypes[4].Exporter = func(v any, i int) any { + switch v := v.(*UpdateUserSettingRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_user_setting_service_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*UpdateUserSettingResponse); i { case 0: return &v.state @@ -483,7 +547,7 @@ func file_api_v1_user_setting_service_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_api_v1_user_setting_service_proto_rawDesc, NumEnums: 0, - NumMessages: 5, + NumMessages: 6, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/gen/apidocs.swagger.yaml b/proto/gen/apidocs.swagger.yaml index 5b6e2db..25f013b 100644 --- a/proto/gen/apidocs.swagger.yaml +++ b/proto/gen/apidocs.swagger.yaml @@ -827,12 +827,15 @@ definitions: type: integer format: int32 description: id is the user id. + general: + $ref: '#/definitions/apiv1UserSettingGeneral' + apiv1UserSettingGeneral: + type: object + properties: locale: type: string - description: locale is the user locale. colorTheme: type: string - description: color_theme is the user color theme. apiv1Visibility: type: string enum: diff --git a/proto/gen/store/README.md b/proto/gen/store/README.md index b7290d8..8f015e6 100644 --- a/proto/gen/store/README.md +++ b/proto/gen/store/README.md @@ -19,9 +19,10 @@ - [Shortcut](#slash-store-Shortcut) - [store/user_setting.proto](#store_user_setting-proto) - - [AccessTokensUserSetting](#slash-store-AccessTokensUserSetting) - - [AccessTokensUserSetting.AccessToken](#slash-store-AccessTokensUserSetting-AccessToken) - [UserSetting](#slash-store-UserSetting) + - [UserSettingAccessTokens](#slash-store-UserSettingAccessTokens) + - [UserSettingAccessTokens.AccessToken](#slash-store-UserSettingAccessTokens-AccessToken) + - [UserSettingGeneral](#slash-store-UserSettingGeneral) - [UserSettingKey](#slash-store-UserSettingKey) @@ -232,24 +233,42 @@ - + -### AccessTokensUserSetting +### UserSetting | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| access_tokens | [AccessTokensUserSetting.AccessToken](#slash-store-AccessTokensUserSetting-AccessToken) | repeated | | +| user_id | [int32](#int32) | | | +| key | [UserSettingKey](#slash-store-UserSettingKey) | | | +| general | [UserSettingGeneral](#slash-store-UserSettingGeneral) | | | +| access_tokens | [UserSettingAccessTokens](#slash-store-UserSettingAccessTokens) | | | - + -### AccessTokensUserSetting.AccessToken +### UserSettingAccessTokens + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| access_tokens | [UserSettingAccessTokens.AccessToken](#slash-store-UserSettingAccessTokens-AccessToken) | repeated | | + + + + + + + + +### UserSettingAccessTokens.AccessToken @@ -263,17 +282,14 @@ - + -### UserSetting +### UserSettingGeneral | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| user_id | [int32](#int32) | | | -| key | [UserSettingKey](#slash-store-UserSettingKey) | | | -| access_tokens | [AccessTokensUserSetting](#slash-store-AccessTokensUserSetting) | | | | locale | [string](#string) | | | | color_theme | [string](#string) | | | @@ -292,9 +308,8 @@ | Name | Number | Description | | ---- | ------ | ----------- | | USER_SETTING_KEY_UNSPECIFIED | 0 | | -| ACCESS_TOKENS | 1 | Access tokens for the user. | -| LOCALE | 2 | Locale for the user. | -| COLOR_THEME | 3 | Color theme for the user. | +| GENERAL | 1 | General settings for the user. | +| ACCESS_TOKENS | 2 | Access tokens for the user. | diff --git a/proto/gen/store/user_setting.pb.go b/proto/gen/store/user_setting.pb.go index 3b399e9..c57fd8a 100644 --- a/proto/gen/store/user_setting.pb.go +++ b/proto/gen/store/user_setting.pb.go @@ -24,27 +24,23 @@ type UserSettingKey int32 const ( UserSettingKey_USER_SETTING_KEY_UNSPECIFIED UserSettingKey = 0 + // General settings for the user. + UserSettingKey_GENERAL UserSettingKey = 1 // Access tokens for the user. - UserSettingKey_ACCESS_TOKENS UserSettingKey = 1 - // Locale for the user. - UserSettingKey_LOCALE UserSettingKey = 2 - // Color theme for the user. - UserSettingKey_COLOR_THEME UserSettingKey = 3 + UserSettingKey_ACCESS_TOKENS UserSettingKey = 2 ) // Enum value maps for UserSettingKey. var ( UserSettingKey_name = map[int32]string{ 0: "USER_SETTING_KEY_UNSPECIFIED", - 1: "ACCESS_TOKENS", - 2: "LOCALE", - 3: "COLOR_THEME", + 1: "GENERAL", + 2: "ACCESS_TOKENS", } UserSettingKey_value = map[string]int32{ "USER_SETTING_KEY_UNSPECIFIED": 0, - "ACCESS_TOKENS": 1, - "LOCALE": 2, - "COLOR_THEME": 3, + "GENERAL": 1, + "ACCESS_TOKENS": 2, } ) @@ -84,9 +80,8 @@ type UserSetting struct { Key UserSettingKey `protobuf:"varint,2,opt,name=key,proto3,enum=slash.store.UserSettingKey" json:"key,omitempty"` // Types that are assignable to Value: // + // *UserSetting_General // *UserSetting_AccessTokens - // *UserSetting_Locale - // *UserSetting_ColorTheme Value isUserSetting_Value `protobuf_oneof:"value"` } @@ -143,59 +138,47 @@ func (m *UserSetting) GetValue() isUserSetting_Value { return nil } -func (x *UserSetting) GetAccessTokens() *AccessTokensUserSetting { +func (x *UserSetting) GetGeneral() *UserSettingGeneral { + if x, ok := x.GetValue().(*UserSetting_General); ok { + return x.General + } + return nil +} + +func (x *UserSetting) GetAccessTokens() *UserSettingAccessTokens { if x, ok := x.GetValue().(*UserSetting_AccessTokens); ok { return x.AccessTokens } return nil } -func (x *UserSetting) GetLocale() string { - if x, ok := x.GetValue().(*UserSetting_Locale); ok { - return x.Locale - } - return "" -} - -func (x *UserSetting) GetColorTheme() string { - if x, ok := x.GetValue().(*UserSetting_ColorTheme); ok { - return x.ColorTheme - } - return "" -} - type isUserSetting_Value interface { isUserSetting_Value() } +type UserSetting_General struct { + General *UserSettingGeneral `protobuf:"bytes,3,opt,name=general,proto3,oneof"` +} + type UserSetting_AccessTokens struct { - AccessTokens *AccessTokensUserSetting `protobuf:"bytes,3,opt,name=access_tokens,json=accessTokens,proto3,oneof"` + AccessTokens *UserSettingAccessTokens `protobuf:"bytes,4,opt,name=access_tokens,json=accessTokens,proto3,oneof"` } -type UserSetting_Locale struct { - Locale string `protobuf:"bytes,4,opt,name=locale,proto3,oneof"` -} - -type UserSetting_ColorTheme struct { - ColorTheme string `protobuf:"bytes,5,opt,name=color_theme,json=colorTheme,proto3,oneof"` -} +func (*UserSetting_General) isUserSetting_Value() {} func (*UserSetting_AccessTokens) isUserSetting_Value() {} -func (*UserSetting_Locale) isUserSetting_Value() {} - -func (*UserSetting_ColorTheme) isUserSetting_Value() {} - -type AccessTokensUserSetting struct { +type UserSettingGeneral struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - AccessTokens []*AccessTokensUserSetting_AccessToken `protobuf:"bytes,1,rep,name=access_tokens,json=accessTokens,proto3" json:"access_tokens,omitempty"` + Locale string `protobuf:"bytes,1,opt,name=locale,proto3" json:"locale,omitempty"` + ColorTheme string `protobuf:"bytes,2,opt,name=color_theme,json=colorTheme,proto3" json:"color_theme,omitempty"` } -func (x *AccessTokensUserSetting) Reset() { - *x = AccessTokensUserSetting{} +func (x *UserSettingGeneral) Reset() { + *x = UserSettingGeneral{} if protoimpl.UnsafeEnabled { mi := &file_store_user_setting_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -203,13 +186,13 @@ func (x *AccessTokensUserSetting) Reset() { } } -func (x *AccessTokensUserSetting) String() string { +func (x *UserSettingGeneral) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AccessTokensUserSetting) ProtoMessage() {} +func (*UserSettingGeneral) ProtoMessage() {} -func (x *AccessTokensUserSetting) ProtoReflect() protoreflect.Message { +func (x *UserSettingGeneral) ProtoReflect() protoreflect.Message { mi := &file_store_user_setting_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -221,32 +204,35 @@ func (x *AccessTokensUserSetting) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AccessTokensUserSetting.ProtoReflect.Descriptor instead. -func (*AccessTokensUserSetting) Descriptor() ([]byte, []int) { +// Deprecated: Use UserSettingGeneral.ProtoReflect.Descriptor instead. +func (*UserSettingGeneral) Descriptor() ([]byte, []int) { return file_store_user_setting_proto_rawDescGZIP(), []int{1} } -func (x *AccessTokensUserSetting) GetAccessTokens() []*AccessTokensUserSetting_AccessToken { +func (x *UserSettingGeneral) GetLocale() string { if x != nil { - return x.AccessTokens + return x.Locale } - return nil + return "" } -type AccessTokensUserSetting_AccessToken struct { +func (x *UserSettingGeneral) GetColorTheme() string { + if x != nil { + return x.ColorTheme + } + return "" +} + +type UserSettingAccessTokens struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // 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"` + AccessTokens []*UserSettingAccessTokens_AccessToken `protobuf:"bytes,1,rep,name=access_tokens,json=accessTokens,proto3" json:"access_tokens,omitempty"` } -func (x *AccessTokensUserSetting_AccessToken) Reset() { - *x = AccessTokensUserSetting_AccessToken{} +func (x *UserSettingAccessTokens) Reset() { + *x = UserSettingAccessTokens{} if protoimpl.UnsafeEnabled { mi := &file_store_user_setting_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -254,13 +240,13 @@ func (x *AccessTokensUserSetting_AccessToken) Reset() { } } -func (x *AccessTokensUserSetting_AccessToken) String() string { +func (x *UserSettingAccessTokens) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AccessTokensUserSetting_AccessToken) ProtoMessage() {} +func (*UserSettingAccessTokens) ProtoMessage() {} -func (x *AccessTokensUserSetting_AccessToken) ProtoReflect() protoreflect.Message { +func (x *UserSettingAccessTokens) ProtoReflect() protoreflect.Message { mi := &file_store_user_setting_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -272,19 +258,70 @@ 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} +// Deprecated: Use UserSettingAccessTokens.ProtoReflect.Descriptor instead. +func (*UserSettingAccessTokens) Descriptor() ([]byte, []int) { + return file_store_user_setting_proto_rawDescGZIP(), []int{2} } -func (x *AccessTokensUserSetting_AccessToken) GetAccessToken() string { +func (x *UserSettingAccessTokens) GetAccessTokens() []*UserSettingAccessTokens_AccessToken { + if x != nil { + return x.AccessTokens + } + return nil +} + +type UserSettingAccessTokens_AccessToken struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // 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"` +} + +func (x *UserSettingAccessTokens_AccessToken) Reset() { + *x = UserSettingAccessTokens_AccessToken{} + if protoimpl.UnsafeEnabled { + mi := &file_store_user_setting_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserSettingAccessTokens_AccessToken) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserSettingAccessTokens_AccessToken) ProtoMessage() {} + +func (x *UserSettingAccessTokens_AccessToken) ProtoReflect() protoreflect.Message { + mi := &file_store_user_setting_proto_msgTypes[3] + 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 UserSettingAccessTokens_AccessToken.ProtoReflect.Descriptor instead. +func (*UserSettingAccessTokens_AccessToken) Descriptor() ([]byte, []int) { + return file_store_user_setting_proto_rawDescGZIP(), []int{2, 0} +} + +func (x *UserSettingAccessTokens_AccessToken) GetAccessToken() string { if x != nil { return x.AccessToken } return "" } -func (x *AccessTokensUserSetting_AccessToken) GetDescription() string { +func (x *UserSettingAccessTokens_AccessToken) GetDescription() string { if x != nil { return x.Description } @@ -302,45 +339,49 @@ var file_store_user_setting_proto_rawDesc = []byte{ 0x12, 0x2d, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x4b, 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x73, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x0c, - 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x18, 0x0a, 0x06, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, - 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, - 0x74, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x63, - 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x68, 0x65, 0x6d, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x22, 0xc4, 0x01, 0x0a, 0x17, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x73, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x55, - 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, - 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x41, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x1a, 0x52, 0x0a, 0x0b, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x62, 0x0a, 0x0e, 0x55, 0x73, 0x65, - 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x20, 0x0a, 0x1c, 0x55, - 0x53, 0x45, 0x52, 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, 0x11, 0x0a, - 0x0d, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x53, 0x10, 0x01, - 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, - 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x5f, 0x54, 0x48, 0x45, 0x4d, 0x45, 0x10, 0x03, 0x42, 0xa1, 0x01, - 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x42, 0x10, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x79, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x6c, 0x66, 0x68, 0x6f, 0x73, 0x74, 0x65, 0x64, - 0x2f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x65, 0x6e, - 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0xa2, 0x02, 0x03, 0x53, 0x53, 0x58, 0xaa, 0x02, 0x0b, 0x53, - 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0xca, 0x02, 0x0b, 0x53, 0x6c, 0x61, - 0x73, 0x68, 0x5c, 0x53, 0x74, 0x6f, 0x72, 0x65, 0xe2, 0x02, 0x17, 0x53, 0x6c, 0x61, 0x73, 0x68, - 0x5c, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0xea, 0x02, 0x0c, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x3a, 0x3a, 0x53, 0x74, 0x6f, 0x72, - 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x3b, 0x0a, 0x07, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x6c, 0x48, 0x00, 0x52, 0x07, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x12, 0x4b, 0x0a, 0x0d, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x22, 0x4d, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, + 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x74, 0x68, 0x65, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x68, 0x65, 0x6d, + 0x65, 0x22, 0xc4, 0x01, 0x0a, 0x17, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x55, 0x0a, + 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x73, 0x1a, 0x52, 0x0a, 0x0b, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x52, 0x0a, 0x0e, 0x55, 0x73, 0x65, 0x72, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x20, 0x0a, 0x1c, 0x55, 0x53, + 0x45, 0x52, 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, 0x0b, 0x0a, 0x07, + 0x47, 0x45, 0x4e, 0x45, 0x52, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x41, 0x43, 0x43, + 0x45, 0x53, 0x53, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x53, 0x10, 0x02, 0x42, 0xa1, 0x01, 0x0a, + 0x0f, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x42, 0x10, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x79, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x6c, 0x66, 0x68, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x2f, + 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0xa2, 0x02, 0x03, 0x53, 0x53, 0x58, 0xaa, 0x02, 0x0b, 0x53, 0x6c, + 0x61, 0x73, 0x68, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0xca, 0x02, 0x0b, 0x53, 0x6c, 0x61, 0x73, + 0x68, 0x5c, 0x53, 0x74, 0x6f, 0x72, 0x65, 0xe2, 0x02, 0x17, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x5c, + 0x53, 0x74, 0x6f, 0x72, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0xea, 0x02, 0x0c, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x3a, 0x3a, 0x53, 0x74, 0x6f, 0x72, 0x65, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -356,22 +397,24 @@ 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, 3) +var file_store_user_setting_proto_msgTypes = make([]protoimpl.MessageInfo, 4) var file_store_user_setting_proto_goTypes = []any{ (UserSettingKey)(0), // 0: slash.store.UserSettingKey (*UserSetting)(nil), // 1: slash.store.UserSetting - (*AccessTokensUserSetting)(nil), // 2: slash.store.AccessTokensUserSetting - (*AccessTokensUserSetting_AccessToken)(nil), // 3: slash.store.AccessTokensUserSetting.AccessToken + (*UserSettingGeneral)(nil), // 2: slash.store.UserSettingGeneral + (*UserSettingAccessTokens)(nil), // 3: slash.store.UserSettingAccessTokens + (*UserSettingAccessTokens_AccessToken)(nil), // 4: slash.store.UserSettingAccessTokens.AccessToken } var file_store_user_setting_proto_depIdxs = []int32{ 0, // 0: slash.store.UserSetting.key:type_name -> slash.store.UserSettingKey - 2, // 1: slash.store.UserSetting.access_tokens:type_name -> slash.store.AccessTokensUserSetting - 3, // 2: slash.store.AccessTokensUserSetting.access_tokens:type_name -> slash.store.AccessTokensUserSetting.AccessToken - 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 + 2, // 1: slash.store.UserSetting.general:type_name -> slash.store.UserSettingGeneral + 3, // 2: slash.store.UserSetting.access_tokens:type_name -> slash.store.UserSettingAccessTokens + 4, // 3: slash.store.UserSettingAccessTokens.access_tokens:type_name -> slash.store.UserSettingAccessTokens.AccessToken + 4, // [4:4] is the sub-list for method output_type + 4, // [4:4] is the sub-list for method input_type + 4, // [4:4] is the sub-list for extension type_name + 4, // [4:4] is the sub-list for extension extendee + 0, // [0:4] is the sub-list for field type_name } func init() { file_store_user_setting_proto_init() } @@ -393,7 +436,7 @@ func file_store_user_setting_proto_init() { } } file_store_user_setting_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*AccessTokensUserSetting); i { + switch v := v.(*UserSettingGeneral); i { case 0: return &v.state case 1: @@ -405,7 +448,19 @@ func file_store_user_setting_proto_init() { } } file_store_user_setting_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*AccessTokensUserSetting_AccessToken); i { + switch v := v.(*UserSettingAccessTokens); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_store_user_setting_proto_msgTypes[3].Exporter = func(v any, i int) any { + switch v := v.(*UserSettingAccessTokens_AccessToken); i { case 0: return &v.state case 1: @@ -418,9 +473,8 @@ func file_store_user_setting_proto_init() { } } file_store_user_setting_proto_msgTypes[0].OneofWrappers = []any{ + (*UserSetting_General)(nil), (*UserSetting_AccessTokens)(nil), - (*UserSetting_Locale)(nil), - (*UserSetting_ColorTheme)(nil), } type x struct{} out := protoimpl.TypeBuilder{ @@ -428,7 +482,7 @@ func file_store_user_setting_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_store_user_setting_proto_rawDesc, NumEnums: 1, - NumMessages: 3, + NumMessages: 4, NumExtensions: 0, NumServices: 0, }, diff --git a/proto/store/user_setting.proto b/proto/store/user_setting.proto index bcd17d5..578a7c2 100644 --- a/proto/store/user_setting.proto +++ b/proto/store/user_setting.proto @@ -10,25 +10,26 @@ message UserSetting { UserSettingKey key = 2; oneof value { - AccessTokensUserSetting access_tokens = 3; + UserSettingGeneral general = 3; - string locale = 4; - - string color_theme = 5; + UserSettingAccessTokens access_tokens = 4; } } enum UserSettingKey { USER_SETTING_KEY_UNSPECIFIED = 0; + // General settings for the user. + GENERAL = 1; // Access tokens for the user. - ACCESS_TOKENS = 1; - // Locale for the user. - LOCALE = 2; - // Color theme for the user. - COLOR_THEME = 3; + ACCESS_TOKENS = 2; } -message AccessTokensUserSetting { +message UserSettingGeneral { + string locale = 1; + string color_theme = 2; +} + +message UserSettingAccessTokens { message AccessToken { // The access token is a JWT token. // Including expiration time, issuer, etc. diff --git a/server/route/api/v1/acl.go b/server/route/api/v1/acl.go index 3b9dcc6..38f5d82 100644 --- a/server/route/api/v1/acl.go +++ b/server/route/api/v1/acl.go @@ -163,7 +163,7 @@ func audienceContains(audience jwt.ClaimStrings, token string) bool { return false } -func validateAccessToken(accessTokenString string, userAccessTokens []*storepb.AccessTokensUserSetting_AccessToken) bool { +func validateAccessToken(accessTokenString string, userAccessTokens []*storepb.UserSettingAccessTokens_AccessToken) bool { for _, userAccessToken := range userAccessTokens { if accessTokenString == userAccessToken.AccessToken { return true diff --git a/server/route/api/v1/user_service.go b/server/route/api/v1/user_service.go index 144c9b5..13641d5 100644 --- a/server/route/api/v1/user_service.go +++ b/server/route/api/v1/user_service.go @@ -251,7 +251,7 @@ func (s *APIV1Service) DeleteUserAccessToken(ctx context.Context, request *v1pb. if err != nil { return nil, status.Errorf(codes.Internal, "failed to list access tokens: %v", err) } - updatedUserAccessTokens := []*storepb.AccessTokensUserSetting_AccessToken{} + updatedUserAccessTokens := []*storepb.UserSettingAccessTokens_AccessToken{} for _, userAccessToken := range userAccessTokens { if userAccessToken.AccessToken == request.AccessToken { continue @@ -262,7 +262,7 @@ func (s *APIV1Service) DeleteUserAccessToken(ctx context.Context, request *v1pb. UserId: user.ID, Key: storepb.UserSettingKey_ACCESS_TOKENS, Value: &storepb.UserSetting_AccessTokens{ - AccessTokens: &storepb.AccessTokensUserSetting{ + AccessTokens: &storepb.UserSettingAccessTokens{ AccessTokens: updatedUserAccessTokens, }, }, @@ -278,7 +278,7 @@ func (s *APIV1Service) UpsertAccessTokenToStore(ctx context.Context, user *store if err != nil { return errors.Wrap(err, "failed to get user access tokens") } - userAccessToken := storepb.AccessTokensUserSetting_AccessToken{ + userAccessToken := storepb.UserSettingAccessTokens_AccessToken{ AccessToken: accessToken, Description: description, } @@ -287,7 +287,7 @@ func (s *APIV1Service) UpsertAccessTokenToStore(ctx context.Context, user *store UserId: user.ID, Key: storepb.UserSettingKey_ACCESS_TOKENS, Value: &storepb.UserSetting_AccessTokens{ - AccessTokens: &storepb.AccessTokensUserSetting{ + AccessTokens: &storepb.UserSettingAccessTokens{ AccessTokens: userAccessTokens, }, }, diff --git a/server/route/api/v1/user_setting_service.go b/server/route/api/v1/user_setting_service.go index 1acacea..5286069 100644 --- a/server/route/api/v1/user_setting_service.go +++ b/server/route/api/v1/user_setting_service.go @@ -32,22 +32,15 @@ func (s *APIV1Service) UpdateUserSetting(ctx context.Context, request *v1pb.Upda return nil, status.Errorf(codes.Unauthenticated, "failed to get current user: %v", err) } for _, path := range request.UpdateMask.Paths { - if path == "locale" { + if path == "general" { if _, err := s.Store.UpsertUserSetting(ctx, &storepb.UserSetting{ UserId: user.ID, - Key: storepb.UserSettingKey_LOCALE, - Value: &storepb.UserSetting_Locale{ - Locale: request.UserSetting.Locale, - }, - }); err != nil { - return nil, status.Errorf(codes.Internal, "failed to update user setting: %v", err) - } - } else if path == "color_theme" { - if _, err := s.Store.UpsertUserSetting(ctx, &storepb.UserSetting{ - UserId: user.ID, - Key: storepb.UserSettingKey_COLOR_THEME, - Value: &storepb.UserSetting_ColorTheme{ - ColorTheme: request.UserSetting.ColorTheme, + Key: storepb.UserSettingKey_GENERAL, + Value: &storepb.UserSetting_General{ + General: &storepb.UserSettingGeneral{ + Locale: request.UserSetting.General.Locale, + ColorTheme: request.UserSetting.General.ColorTheme, + }, }, }); err != nil { return nil, status.Errorf(codes.Internal, "failed to update user setting: %v", err) @@ -75,15 +68,18 @@ func getUserSetting(ctx context.Context, s *store.Store, userID int32) (*v1pb.Us } userSetting := &v1pb.UserSetting{ - Id: userID, - Locale: "EN", - ColorTheme: "SYSTEM", + Id: userID, + General: &v1pb.UserSettingGeneral{ + Locale: "EN", + ColorTheme: "SYSTEM", + }, } for _, setting := range userSettings { - if setting.Key == storepb.UserSettingKey_LOCALE { - userSetting.Locale = setting.GetLocale() - } else if setting.Key == storepb.UserSettingKey_COLOR_THEME { - userSetting.ColorTheme = setting.GetColorTheme() + if setting.Key == storepb.UserSettingKey_GENERAL { + userSetting.General = &v1pb.UserSettingGeneral{ + Locale: setting.GetGeneral().Locale, + ColorTheme: setting.GetGeneral().ColorTheme, + } } } return userSetting, nil diff --git a/store/db/postgres/user_setting.go b/store/db/postgres/user_setting.go index c42cc8e..501a536 100644 --- a/store/db/postgres/user_setting.go +++ b/store/db/postgres/user_setting.go @@ -29,10 +29,12 @@ func (d *DB) UpsertUserSetting(ctx context.Context, upsert *storepb.UserSetting) return nil, err } valueString = string(valueBytes) - } else if upsert.Key == storepb.UserSettingKey_LOCALE { - valueString = upsert.GetLocale() - } else if upsert.Key == storepb.UserSettingKey_COLOR_THEME { - valueString = upsert.GetColorTheme() + } else if upsert.Key == storepb.UserSettingKey_GENERAL { + valueBytes, err := protojson.Marshal(upsert.GetGeneral()) + if err != nil { + return nil, err + } + valueString = string(valueBytes) } else { return nil, errors.New("invalid user setting key") } @@ -81,20 +83,20 @@ func (d *DB) ListUserSettings(ctx context.Context, find *store.FindUserSetting) } userSetting.Key = storepb.UserSettingKey(storepb.UserSettingKey_value[keyString]) if userSetting.Key == storepb.UserSettingKey_ACCESS_TOKENS { - accessTokensUserSetting := &storepb.AccessTokensUserSetting{} - if err := protojson.Unmarshal([]byte(valueString), accessTokensUserSetting); err != nil { + userSettingAccessTokens := &storepb.UserSettingAccessTokens{} + if err := protojson.Unmarshal([]byte(valueString), userSettingAccessTokens); err != nil { return nil, err } userSetting.Value = &storepb.UserSetting_AccessTokens{ - AccessTokens: accessTokensUserSetting, + AccessTokens: userSettingAccessTokens, } - } else if userSetting.Key == storepb.UserSettingKey_LOCALE { - userSetting.Value = &storepb.UserSetting_Locale{ - Locale: valueString, + } else if userSetting.Key == storepb.UserSettingKey_GENERAL { + userSettingGeneral := &storepb.UserSettingGeneral{} + if err := protojson.Unmarshal([]byte(valueString), userSettingGeneral); err != nil { + return nil, err } - } else if userSetting.Key == storepb.UserSettingKey_COLOR_THEME { - userSetting.Value = &storepb.UserSetting_ColorTheme{ - ColorTheme: valueString, + userSetting.Value = &storepb.UserSetting_General{ + General: userSettingGeneral, } } else { // Skip unknown key. diff --git a/store/db/sqlite/user_setting.go b/store/db/sqlite/user_setting.go index 712ea08..7498eb8 100644 --- a/store/db/sqlite/user_setting.go +++ b/store/db/sqlite/user_setting.go @@ -28,10 +28,12 @@ func (d *DB) UpsertUserSetting(ctx context.Context, upsert *storepb.UserSetting) return nil, err } valueString = string(valueBytes) - } else if upsert.Key == storepb.UserSettingKey_LOCALE { - valueString = upsert.GetLocale() - } else if upsert.Key == storepb.UserSettingKey_COLOR_THEME { - valueString = upsert.GetColorTheme() + } else if upsert.Key == storepb.UserSettingKey_GENERAL { + valueBytes, err := protojson.Marshal(upsert.GetGeneral()) + if err != nil { + return nil, err + } + valueString = string(valueBytes) } else { return nil, errors.New("invalid user setting key") } @@ -80,20 +82,20 @@ func (d *DB) ListUserSettings(ctx context.Context, find *store.FindUserSetting) } userSetting.Key = storepb.UserSettingKey(storepb.UserSettingKey_value[keyString]) if userSetting.Key == storepb.UserSettingKey_ACCESS_TOKENS { - accessTokensUserSetting := &storepb.AccessTokensUserSetting{} - if err := protojson.Unmarshal([]byte(valueString), accessTokensUserSetting); err != nil { + userSettingAccessTokens := &storepb.UserSettingAccessTokens{} + if err := protojson.Unmarshal([]byte(valueString), userSettingAccessTokens); err != nil { return nil, err } userSetting.Value = &storepb.UserSetting_AccessTokens{ - AccessTokens: accessTokensUserSetting, + AccessTokens: userSettingAccessTokens, } - } else if userSetting.Key == storepb.UserSettingKey_LOCALE { - userSetting.Value = &storepb.UserSetting_Locale{ - Locale: valueString, + } else if userSetting.Key == storepb.UserSettingKey_GENERAL { + userSettingGeneral := &storepb.UserSettingGeneral{} + if err := protojson.Unmarshal([]byte(valueString), userSettingGeneral); err != nil { + return nil, err } - } else if userSetting.Key == storepb.UserSettingKey_COLOR_THEME { - userSetting.Value = &storepb.UserSetting_ColorTheme{ - ColorTheme: valueString, + userSetting.Value = &storepb.UserSetting_General{ + General: userSettingGeneral, } } else { // Skip unknown key. diff --git a/store/user_setting.go b/store/user_setting.go index d73c31e..920a053 100644 --- a/store/user_setting.go +++ b/store/user_setting.go @@ -54,7 +54,7 @@ func (s *Store) GetUserSetting(ctx context.Context, find *FindUserSetting) (*sto } // GetUserAccessTokens returns the access tokens of the user. -func (s *Store) GetUserAccessTokens(ctx context.Context, userID int32) ([]*storepb.AccessTokensUserSetting_AccessToken, error) { +func (s *Store) GetUserAccessTokens(ctx context.Context, userID int32) ([]*storepb.UserSettingAccessTokens_AccessToken, error) { userSetting, err := s.GetUserSetting(ctx, &FindUserSetting{ UserID: &userID, Key: storepb.UserSettingKey_ACCESS_TOKENS, @@ -63,7 +63,7 @@ func (s *Store) GetUserAccessTokens(ctx context.Context, userID int32) ([]*store return nil, err } if userSetting == nil { - return []*storepb.AccessTokensUserSetting_AccessToken{}, nil + return []*storepb.UserSettingAccessTokens_AccessToken{}, nil } accessTokensUserSetting := userSetting.GetAccessTokens() diff --git a/test/store/user_setting_test.go b/test/store/user_setting_test.go index e248acc..b95cad2 100644 --- a/test/store/user_setting_test.go +++ b/test/store/user_setting_test.go @@ -26,8 +26,8 @@ func TestUserSettingStore(t *testing.T) { UserId: user.ID, Key: storepb.UserSettingKey_ACCESS_TOKENS, Value: &storepb.UserSetting_AccessTokens{ - AccessTokens: &storepb.AccessTokensUserSetting{ - AccessTokens: []*storepb.AccessTokensUserSetting_AccessToken{ + AccessTokens: &storepb.UserSettingAccessTokens{ + AccessTokens: []*storepb.UserSettingAccessTokens_AccessToken{ { AccessToken: "test_access_token", }, @@ -58,8 +58,8 @@ func TestUserSettingStore(t *testing.T) { UserId: user.ID, Key: storepb.UserSettingKey_ACCESS_TOKENS, Value: &storepb.UserSetting_AccessTokens{ - AccessTokens: &storepb.AccessTokensUserSetting{ - AccessTokens: []*storepb.AccessTokensUserSetting_AccessToken{ + AccessTokens: &storepb.UserSettingAccessTokens{ + AccessTokens: []*storepb.UserSettingAccessTokens_AccessToken{ { AccessToken: "test_access_token", }, @@ -74,47 +74,33 @@ func TestUserSettingStore(t *testing.T) { require.NotNil(t, accessTokensUserSetting) require.Equal(t, 2, len(accessTokensUserSetting.GetAccessTokens().AccessTokens)) - // Test for locale user setting. - localeUserSetting, err := ts.UpsertUserSetting(ctx, &storepb.UserSetting{ + // Test for user setting general. + userSettingGeneral, err := ts.UpsertUserSetting(ctx, &storepb.UserSetting{ UserId: user.ID, - Key: storepb.UserSettingKey_LOCALE, - Value: &storepb.UserSetting_Locale{ - Locale: "ZH", + Key: storepb.UserSettingKey_GENERAL, + Value: &storepb.UserSetting_General{ + General: &storepb.UserSettingGeneral{ + Locale: "ZH", + ColorTheme: "SYSTEM", + }, }, }) require.NoError(t, err) - require.NotNil(t, localeUserSetting) - require.Equal(t, storepb.UserSettingKey_LOCALE, localeUserSetting.Key) - require.Equal(t, "ZH", localeUserSetting.GetLocale()) - localeUserSetting, err = ts.UpsertUserSetting(ctx, &storepb.UserSetting{ + require.NotNil(t, userSettingGeneral) + require.Equal(t, storepb.UserSettingKey_GENERAL, userSettingGeneral.Key) + require.Equal(t, "ZH", userSettingGeneral.GetGeneral().Locale) + require.Equal(t, "SYSTEM", userSettingGeneral.GetGeneral().ColorTheme) + userSettingGeneral, err = ts.UpsertUserSetting(ctx, &storepb.UserSetting{ UserId: user.ID, - Key: storepb.UserSettingKey_LOCALE, - Value: &storepb.UserSetting_Locale{ - Locale: "EN", + Key: storepb.UserSettingKey_GENERAL, + Value: &storepb.UserSetting_General{ + General: &storepb.UserSettingGeneral{ + Locale: "EN", + ColorTheme: "DARK", + }, }, }) require.NoError(t, err) - require.Equal(t, "EN", localeUserSetting.GetLocale()) - - // Test for color theme user setting. - colorThemeUserSetting, err := ts.UpsertUserSetting(ctx, &storepb.UserSetting{ - UserId: user.ID, - Key: storepb.UserSettingKey_COLOR_THEME, - Value: &storepb.UserSetting_ColorTheme{ - ColorTheme: "LIGHT", - }, - }) - require.NoError(t, err) - require.NotNil(t, colorThemeUserSetting) - require.Equal(t, storepb.UserSettingKey_COLOR_THEME, colorThemeUserSetting.Key) - require.Equal(t, "LIGHT", colorThemeUserSetting.GetColorTheme()) - colorThemeUserSetting, err = ts.UpsertUserSetting(ctx, &storepb.UserSetting{ - UserId: user.ID, - Key: storepb.UserSettingKey_COLOR_THEME, - Value: &storepb.UserSetting_ColorTheme{ - ColorTheme: "DARK", - }, - }) - require.NoError(t, err) - require.Equal(t, "DARK", colorThemeUserSetting.GetColorTheme()) + require.Equal(t, "EN", userSettingGeneral.GetGeneral().Locale) + require.Equal(t, "DARK", userSettingGeneral.GetGeneral().ColorTheme) }