refactor: update user setting keys

This commit is contained in:
Steven 2024-07-24 00:04:10 +08:00
parent 87deeca110
commit 8010f54747
18 changed files with 519 additions and 377 deletions

View File

@ -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"],
);
};

View File

@ -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;

View File

@ -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");

View File

@ -129,6 +129,11 @@ const useUserStore = create<UserState>()((set, get) => ({
updateMask,
})
).userSetting as UserSetting;
console.log("1", {
id: userId,
userSetting,
updateMask,
});
const userSettingMap = get().userSettingMapById;
userSettingMap[userId] = updatedUserSetting;
set(userSettingMap);

View File

@ -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 {

View File

@ -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) | | |
<a name="slash-api-v1-UserSettingGeneral"></a>
### UserSettingGeneral
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| locale | [string](#string) | | |
| color_theme | [string](#string) | | |

View File

@ -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,
},

View File

@ -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:

View File

@ -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 @@
<a name="slash-store-AccessTokensUserSetting"></a>
<a name="slash-store-UserSetting"></a>
### 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) | | |
<a name="slash-store-AccessTokensUserSetting-AccessToken"></a>
<a name="slash-store-UserSettingAccessTokens"></a>
### AccessTokensUserSetting.AccessToken
### UserSettingAccessTokens
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| access_tokens | [UserSettingAccessTokens.AccessToken](#slash-store-UserSettingAccessTokens-AccessToken) | repeated | |
<a name="slash-store-UserSettingAccessTokens-AccessToken"></a>
### UserSettingAccessTokens.AccessToken
@ -263,17 +282,14 @@
<a name="slash-store-UserSetting"></a>
<a name="slash-store-UserSettingGeneral"></a>
### 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. |

View File

@ -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,
},

View File

@ -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.

View File

@ -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

View File

@ -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,
},
},

View File

@ -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

View File

@ -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.

View File

@ -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.

View File

@ -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()

View File

@ -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)
}