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 { t } = useTranslation();
const userStore = useUserStore(); const userStore = useUserStore();
const userSetting = userStore.getCurrentUserSetting(); const userSetting = userStore.getCurrentUserSetting();
const language = userSetting.locale; const language = userSetting.general?.locale || "EN";
const colorTheme = userSetting.colorTheme; const colorTheme = userSetting.general?.colorTheme || "SYSTEM";
const languageOptions = [ const languageOptions = [
{ {
@ -49,9 +49,12 @@ const PreferenceSection: React.FC = () => {
await userStore.updateUserSetting( await userStore.updateUserSetting(
{ {
...userSetting, ...userSetting,
locale: locale, general: {
...userSetting.general,
locale: locale,
},
} as UserSetting, } as UserSetting,
["locale"], ["general"],
); );
}; };
@ -59,9 +62,12 @@ const PreferenceSection: React.FC = () => {
await userStore.updateUserSetting( await userStore.updateUserSetting(
{ {
...userSetting, ...userSetting,
colorTheme: colorTheme, general: {
...userSetting.general,
colorTheme: colorTheme,
},
} as UserSetting, } as UserSetting,
["color_theme"], ["general"],
); );
}; };

View File

@ -7,21 +7,21 @@ import zh from "../../locales/zh.json";
i18n.use(initReactI18next).init({ i18n.use(initReactI18next).init({
resources: { resources: {
en: { EN: {
translation: en, translation: en,
}, },
zh: { ZH: {
translation: zh, translation: zh,
}, },
fr: { FR: {
translation: fr, translation: fr,
}, },
ja: { JA: {
translation: ja, translation: ja,
}, },
}, },
lng: "en", lng: "EN",
fallbackLng: "en", fallbackLng: "EN",
}); });
export default i18n; export default i18n;

View File

@ -1,5 +1,4 @@
import { useColorScheme } from "@mui/joy"; import { useColorScheme } from "@mui/joy";
import { isEqual } from "lodash-es";
import { useEffect } from "react"; import { useEffect } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { Outlet } from "react-router-dom"; import { Outlet } from "react-router-dom";
@ -34,19 +33,11 @@ const Root: React.FC = () => {
return; return;
} }
if (isEqual(currentUserSetting.locale, "ZH")) { i18n.changeLanguage(currentUserSetting.general?.locale || "en");
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");
}
if (currentUserSetting.colorTheme === "LIGHT") { if (currentUserSetting.general?.colorTheme === "LIGHT") {
setMode("light"); setMode("light");
} else if (currentUserSetting.colorTheme === "DARK") { } else if (currentUserSetting.general?.colorTheme === "DARK") {
setMode("dark"); setMode("dark");
} else { } else {
setMode("system"); setMode("system");

View File

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

View File

@ -28,11 +28,12 @@ message UserSetting {
// id is the user id. // id is the user id.
int32 id = 1; int32 id = 1;
// locale is the user locale. UserSettingGeneral general = 2;
string locale = 2; }
// color_theme is the user color theme. message UserSettingGeneral {
string color_theme = 3; string locale = 1;
string color_theme = 2;
} }
message GetUserSettingRequest { message GetUserSettingRequest {

View File

@ -98,6 +98,7 @@
- [UpdateUserSettingRequest](#slash-api-v1-UpdateUserSettingRequest) - [UpdateUserSettingRequest](#slash-api-v1-UpdateUserSettingRequest)
- [UpdateUserSettingResponse](#slash-api-v1-UpdateUserSettingResponse) - [UpdateUserSettingResponse](#slash-api-v1-UpdateUserSettingResponse)
- [UserSetting](#slash-api-v1-UserSetting) - [UserSetting](#slash-api-v1-UserSetting)
- [UserSettingGeneral](#slash-api-v1-UserSettingGeneral)
- [UserSettingService](#slash-api-v1-UserSettingService) - [UserSettingService](#slash-api-v1-UserSettingService)
@ -1323,8 +1324,23 @@
| Field | Type | Label | Description | | Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- | | ----- | ---- | ----- | ----------- |
| id | [int32](#int32) | | id is the user id. | | id | [int32](#int32) | | id is the user id. |
| locale | [string](#string) | | locale is the user locale. | | general | [UserSettingGeneral](#slash-api-v1-UserSettingGeneral) | | |
| color_theme | [string](#string) | | color_theme is the user color theme. |
<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 unknownFields protoimpl.UnknownFields
// id is the user id. // id is the user id.
Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
// locale is the user locale. General *UserSettingGeneral `protobuf:"bytes,2,opt,name=general,proto3" json:"general,omitempty"`
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"`
} }
func (x *UserSetting) Reset() { func (x *UserSetting) Reset() {
@ -74,14 +71,62 @@ func (x *UserSetting) GetId() int32 {
return 0 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 { if x != nil {
return x.Locale return x.Locale
} }
return "" return ""
} }
func (x *UserSetting) GetColorTheme() string { func (x *UserSettingGeneral) GetColorTheme() string {
if x != nil { if x != nil {
return x.ColorTheme return x.ColorTheme
} }
@ -100,7 +145,7 @@ type GetUserSettingRequest struct {
func (x *GetUserSettingRequest) Reset() { func (x *GetUserSettingRequest) Reset() {
*x = GetUserSettingRequest{} *x = GetUserSettingRequest{}
if protoimpl.UnsafeEnabled { 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 := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -113,7 +158,7 @@ func (x *GetUserSettingRequest) String() string {
func (*GetUserSettingRequest) ProtoMessage() {} func (*GetUserSettingRequest) ProtoMessage() {}
func (x *GetUserSettingRequest) ProtoReflect() protoreflect.Message { 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 { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -126,7 +171,7 @@ func (x *GetUserSettingRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use GetUserSettingRequest.ProtoReflect.Descriptor instead. // Deprecated: Use GetUserSettingRequest.ProtoReflect.Descriptor instead.
func (*GetUserSettingRequest) Descriptor() ([]byte, []int) { 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 { func (x *GetUserSettingRequest) GetId() int32 {
@ -147,7 +192,7 @@ type GetUserSettingResponse struct {
func (x *GetUserSettingResponse) Reset() { func (x *GetUserSettingResponse) Reset() {
*x = GetUserSettingResponse{} *x = GetUserSettingResponse{}
if protoimpl.UnsafeEnabled { 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 := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -160,7 +205,7 @@ func (x *GetUserSettingResponse) String() string {
func (*GetUserSettingResponse) ProtoMessage() {} func (*GetUserSettingResponse) ProtoMessage() {}
func (x *GetUserSettingResponse) ProtoReflect() protoreflect.Message { 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 { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -173,7 +218,7 @@ func (x *GetUserSettingResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use GetUserSettingResponse.ProtoReflect.Descriptor instead. // Deprecated: Use GetUserSettingResponse.ProtoReflect.Descriptor instead.
func (*GetUserSettingResponse) Descriptor() ([]byte, []int) { 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 { func (x *GetUserSettingResponse) GetUserSetting() *UserSetting {
@ -199,7 +244,7 @@ type UpdateUserSettingRequest struct {
func (x *UpdateUserSettingRequest) Reset() { func (x *UpdateUserSettingRequest) Reset() {
*x = UpdateUserSettingRequest{} *x = UpdateUserSettingRequest{}
if protoimpl.UnsafeEnabled { 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 := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -212,7 +257,7 @@ func (x *UpdateUserSettingRequest) String() string {
func (*UpdateUserSettingRequest) ProtoMessage() {} func (*UpdateUserSettingRequest) ProtoMessage() {}
func (x *UpdateUserSettingRequest) ProtoReflect() protoreflect.Message { 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 { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -225,7 +270,7 @@ func (x *UpdateUserSettingRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use UpdateUserSettingRequest.ProtoReflect.Descriptor instead. // Deprecated: Use UpdateUserSettingRequest.ProtoReflect.Descriptor instead.
func (*UpdateUserSettingRequest) Descriptor() ([]byte, []int) { 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 { func (x *UpdateUserSettingRequest) GetId() int32 {
@ -260,7 +305,7 @@ type UpdateUserSettingResponse struct {
func (x *UpdateUserSettingResponse) Reset() { func (x *UpdateUserSettingResponse) Reset() {
*x = UpdateUserSettingResponse{} *x = UpdateUserSettingResponse{}
if protoimpl.UnsafeEnabled { 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 := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -273,7 +318,7 @@ func (x *UpdateUserSettingResponse) String() string {
func (*UpdateUserSettingResponse) ProtoMessage() {} func (*UpdateUserSettingResponse) ProtoMessage() {}
func (x *UpdateUserSettingResponse) ProtoReflect() protoreflect.Message { 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 { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -286,7 +331,7 @@ func (x *UpdateUserSettingResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use UpdateUserSettingResponse.ProtoReflect.Descriptor instead. // Deprecated: Use UpdateUserSettingResponse.ProtoReflect.Descriptor instead.
func (*UpdateUserSettingResponse) Descriptor() ([]byte, []int) { 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 { 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, 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, 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, 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, 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, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3a, 0x0a, 0x07, 0x67, 0x65, 0x6e,
0x61, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x73, 0x6c, 0x61,
0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x74, 0x68, 0x65, 0x6d, 0x65, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65,
0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x68, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x07, 0x67, 0x65,
0x6d, 0x65, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x4d, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74,
0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x6c,
0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x56, 0x0a, 0x16, 0x47, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x6f, 0x63,
0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x61, 0x6c, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x74, 0x68, 0x65,
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54,
0x74, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x73, 0x6c, 0x68, 0x65, 0x6d, 0x65, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53,
0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a,
0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x56, 0x0a,
0x69, 0x6e, 0x67, 0x22, 0xa5, 0x01, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x16, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52,
0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f,
0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,
0x12, 0x3c, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65,
0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x53, 0x65,
0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x22, 0xa5, 0x01, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
0x67, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x3b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65,
0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x03, 0x20, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02,
0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x69, 0x64, 0x12, 0x3c, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69,
0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68,
0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x59, 0x0a, 0x19, 0x55, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74,
0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x75, 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, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18,
0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73,
0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x53, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x59, 0x0a,
0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x32, 0xd1, 0x02, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x72, 0x53, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69,
0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x85, 0x01, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x75, 0x73,
0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
0x12, 0x23, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x32, 0x19, 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, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x75, 0x73, 0x65,
0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x32, 0xd1, 0x02, 0x0a, 0x12, 0x55, 0x73, 0x65,
0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12,
0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0xda, 0x41, 0x02, 0x85, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69,
0x69, 0x64, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x6e, 0x67, 0x12, 0x23, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76,
0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x65, 0x74, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67,
0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0xb2, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e,
0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x26, 0x2e, 0x73, 0x6c, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65,
0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0xda,
0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x41, 0x02, 0x69, 0x64, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x61, 0x70, 0x69,
0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73,
0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0xb2, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61,
0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4c, 0xda, 0x41, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x26, 0x2e,
0x18, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x2c, 0x75, 0x70, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64,
0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x3a, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65,
0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x32, 0x1b, 0x2f, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70,
0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53,
0x7d, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x42, 0xb5, 0x01, 0x0a, 0x10, 0x63, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4c,
0x6f, 0x6d, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0xda, 0x41, 0x18, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x2c,
0x17, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x82, 0xd3, 0xe4, 0x93, 0x02,
0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x36, 0x67, 0x69, 0x74, 0x68, 0x2b, 0x3a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x32,
0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x79, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x6c, 0x66, 0x68, 0x1b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b,
0x6f, 0x73, 0x74, 0x65, 0x64, 0x2f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x42, 0xb5, 0x01, 0x0a,
0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x70, 0x69, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76,
0x76, 0x31, 0xa2, 0x02, 0x03, 0x53, 0x41, 0x58, 0xaa, 0x02, 0x0c, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x31, 0x42, 0x17, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65,
0x2e, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x5c, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x36, 0x67, 0x69,
0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x18, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x5c, 0x41, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x79, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x6c,
0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x66, 0x68, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x2f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2f, 0x70, 0x72,
0x61, 0xea, 0x02, 0x0e, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x61,
0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 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 ( var (
@ -385,29 +435,31 @@ func file_api_v1_user_setting_service_proto_rawDescGZIP() []byte {
return file_api_v1_user_setting_service_proto_rawDescData 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{ var file_api_v1_user_setting_service_proto_goTypes = []any{
(*UserSetting)(nil), // 0: slash.api.v1.UserSetting (*UserSetting)(nil), // 0: slash.api.v1.UserSetting
(*GetUserSettingRequest)(nil), // 1: slash.api.v1.GetUserSettingRequest (*UserSettingGeneral)(nil), // 1: slash.api.v1.UserSettingGeneral
(*GetUserSettingResponse)(nil), // 2: slash.api.v1.GetUserSettingResponse (*GetUserSettingRequest)(nil), // 2: slash.api.v1.GetUserSettingRequest
(*UpdateUserSettingRequest)(nil), // 3: slash.api.v1.UpdateUserSettingRequest (*GetUserSettingResponse)(nil), // 3: slash.api.v1.GetUserSettingResponse
(*UpdateUserSettingResponse)(nil), // 4: slash.api.v1.UpdateUserSettingResponse (*UpdateUserSettingRequest)(nil), // 4: slash.api.v1.UpdateUserSettingRequest
(*fieldmaskpb.FieldMask)(nil), // 5: google.protobuf.FieldMask (*UpdateUserSettingResponse)(nil), // 5: slash.api.v1.UpdateUserSettingResponse
(*fieldmaskpb.FieldMask)(nil), // 6: google.protobuf.FieldMask
} }
var file_api_v1_user_setting_service_proto_depIdxs = []int32{ var file_api_v1_user_setting_service_proto_depIdxs = []int32{
0, // 0: slash.api.v1.GetUserSettingResponse.user_setting:type_name -> slash.api.v1.UserSetting 1, // 0: slash.api.v1.UserSetting.general:type_name -> slash.api.v1.UserSettingGeneral
0, // 1: slash.api.v1.UpdateUserSettingRequest.user_setting:type_name -> slash.api.v1.UserSetting 0, // 1: slash.api.v1.GetUserSettingResponse.user_setting:type_name -> slash.api.v1.UserSetting
5, // 2: slash.api.v1.UpdateUserSettingRequest.update_mask:type_name -> google.protobuf.FieldMask 0, // 2: slash.api.v1.UpdateUserSettingRequest.user_setting:type_name -> slash.api.v1.UserSetting
0, // 3: slash.api.v1.UpdateUserSettingResponse.user_setting:type_name -> slash.api.v1.UserSetting 6, // 3: slash.api.v1.UpdateUserSettingRequest.update_mask:type_name -> google.protobuf.FieldMask
1, // 4: slash.api.v1.UserSettingService.GetUserSetting:input_type -> slash.api.v1.GetUserSettingRequest 0, // 4: slash.api.v1.UpdateUserSettingResponse.user_setting:type_name -> slash.api.v1.UserSetting
3, // 5: slash.api.v1.UserSettingService.UpdateUserSetting:input_type -> slash.api.v1.UpdateUserSettingRequest 2, // 5: slash.api.v1.UserSettingService.GetUserSetting:input_type -> slash.api.v1.GetUserSettingRequest
2, // 6: slash.api.v1.UserSettingService.GetUserSetting:output_type -> slash.api.v1.GetUserSettingResponse 4, // 6: slash.api.v1.UserSettingService.UpdateUserSetting:input_type -> slash.api.v1.UpdateUserSettingRequest
4, // 7: slash.api.v1.UserSettingService.UpdateUserSetting:output_type -> slash.api.v1.UpdateUserSettingResponse 3, // 7: slash.api.v1.UserSettingService.GetUserSetting:output_type -> slash.api.v1.GetUserSettingResponse
6, // [6:8] is the sub-list for method output_type 5, // 8: slash.api.v1.UserSettingService.UpdateUserSetting:output_type -> slash.api.v1.UpdateUserSettingResponse
4, // [4:6] is the sub-list for method input_type 7, // [7:9] is the sub-list for method output_type
4, // [4:4] is the sub-list for extension type_name 5, // [5:7] is the sub-list for method input_type
4, // [4:4] is the sub-list for extension extendee 5, // [5:5] is the sub-list for extension type_name
0, // [0:4] is the sub-list for field 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() } 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 { 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: case 0:
return &v.state return &v.state
case 1: 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 { 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: case 0:
return &v.state return &v.state
case 1: 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 { 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: case 0:
return &v.state return &v.state
case 1: 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 { 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 { switch v := v.(*UpdateUserSettingResponse); i {
case 0: case 0:
return &v.state return &v.state
@ -483,7 +547,7 @@ func file_api_v1_user_setting_service_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(), GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_api_v1_user_setting_service_proto_rawDesc, RawDescriptor: file_api_v1_user_setting_service_proto_rawDesc,
NumEnums: 0, NumEnums: 0,
NumMessages: 5, NumMessages: 6,
NumExtensions: 0, NumExtensions: 0,
NumServices: 1, NumServices: 1,
}, },

View File

@ -827,12 +827,15 @@ definitions:
type: integer type: integer
format: int32 format: int32
description: id is the user id. description: id is the user id.
general:
$ref: '#/definitions/apiv1UserSettingGeneral'
apiv1UserSettingGeneral:
type: object
properties:
locale: locale:
type: string type: string
description: locale is the user locale.
colorTheme: colorTheme:
type: string type: string
description: color_theme is the user color theme.
apiv1Visibility: apiv1Visibility:
type: string type: string
enum: enum:

View File

@ -19,9 +19,10 @@
- [Shortcut](#slash-store-Shortcut) - [Shortcut](#slash-store-Shortcut)
- [store/user_setting.proto](#store_user_setting-proto) - [store/user_setting.proto](#store_user_setting-proto)
- [AccessTokensUserSetting](#slash-store-AccessTokensUserSetting)
- [AccessTokensUserSetting.AccessToken](#slash-store-AccessTokensUserSetting-AccessToken)
- [UserSetting](#slash-store-UserSetting) - [UserSetting](#slash-store-UserSetting)
- [UserSettingAccessTokens](#slash-store-UserSettingAccessTokens)
- [UserSettingAccessTokens.AccessToken](#slash-store-UserSettingAccessTokens-AccessToken)
- [UserSettingGeneral](#slash-store-UserSettingGeneral)
- [UserSettingKey](#slash-store-UserSettingKey) - [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 | | 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 | | Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- | | ----- | ---- | ----- | ----------- |
| user_id | [int32](#int32) | | |
| key | [UserSettingKey](#slash-store-UserSettingKey) | | |
| access_tokens | [AccessTokensUserSetting](#slash-store-AccessTokensUserSetting) | | |
| locale | [string](#string) | | | | locale | [string](#string) | | |
| color_theme | [string](#string) | | | | color_theme | [string](#string) | | |
@ -292,9 +308,8 @@
| Name | Number | Description | | Name | Number | Description |
| ---- | ------ | ----------- | | ---- | ------ | ----------- |
| USER_SETTING_KEY_UNSPECIFIED | 0 | | | USER_SETTING_KEY_UNSPECIFIED | 0 | |
| ACCESS_TOKENS | 1 | Access tokens for the user. | | GENERAL | 1 | General settings for the user. |
| LOCALE | 2 | Locale for the user. | | ACCESS_TOKENS | 2 | Access tokens for the user. |
| COLOR_THEME | 3 | Color theme for the user. |

View File

@ -24,27 +24,23 @@ type UserSettingKey int32
const ( const (
UserSettingKey_USER_SETTING_KEY_UNSPECIFIED UserSettingKey = 0 UserSettingKey_USER_SETTING_KEY_UNSPECIFIED UserSettingKey = 0
// General settings for the user.
UserSettingKey_GENERAL UserSettingKey = 1
// Access tokens for the user. // Access tokens for the user.
UserSettingKey_ACCESS_TOKENS UserSettingKey = 1 UserSettingKey_ACCESS_TOKENS UserSettingKey = 2
// Locale for the user.
UserSettingKey_LOCALE UserSettingKey = 2
// Color theme for the user.
UserSettingKey_COLOR_THEME UserSettingKey = 3
) )
// Enum value maps for UserSettingKey. // Enum value maps for UserSettingKey.
var ( var (
UserSettingKey_name = map[int32]string{ UserSettingKey_name = map[int32]string{
0: "USER_SETTING_KEY_UNSPECIFIED", 0: "USER_SETTING_KEY_UNSPECIFIED",
1: "ACCESS_TOKENS", 1: "GENERAL",
2: "LOCALE", 2: "ACCESS_TOKENS",
3: "COLOR_THEME",
} }
UserSettingKey_value = map[string]int32{ UserSettingKey_value = map[string]int32{
"USER_SETTING_KEY_UNSPECIFIED": 0, "USER_SETTING_KEY_UNSPECIFIED": 0,
"ACCESS_TOKENS": 1, "GENERAL": 1,
"LOCALE": 2, "ACCESS_TOKENS": 2,
"COLOR_THEME": 3,
} }
) )
@ -84,9 +80,8 @@ type UserSetting struct {
Key UserSettingKey `protobuf:"varint,2,opt,name=key,proto3,enum=slash.store.UserSettingKey" json:"key,omitempty"` Key UserSettingKey `protobuf:"varint,2,opt,name=key,proto3,enum=slash.store.UserSettingKey" json:"key,omitempty"`
// Types that are assignable to Value: // Types that are assignable to Value:
// //
// *UserSetting_General
// *UserSetting_AccessTokens // *UserSetting_AccessTokens
// *UserSetting_Locale
// *UserSetting_ColorTheme
Value isUserSetting_Value `protobuf_oneof:"value"` Value isUserSetting_Value `protobuf_oneof:"value"`
} }
@ -143,59 +138,47 @@ func (m *UserSetting) GetValue() isUserSetting_Value {
return nil 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 { if x, ok := x.GetValue().(*UserSetting_AccessTokens); ok {
return x.AccessTokens return x.AccessTokens
} }
return nil 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 { type isUserSetting_Value interface {
isUserSetting_Value() isUserSetting_Value()
} }
type UserSetting_General struct {
General *UserSettingGeneral `protobuf:"bytes,3,opt,name=general,proto3,oneof"`
}
type UserSetting_AccessTokens struct { 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 { func (*UserSetting_General) isUserSetting_Value() {}
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_AccessTokens) isUserSetting_Value() {} func (*UserSetting_AccessTokens) isUserSetting_Value() {}
func (*UserSetting_Locale) isUserSetting_Value() {} type UserSettingGeneral struct {
func (*UserSetting_ColorTheme) isUserSetting_Value() {}
type AccessTokensUserSetting struct {
state protoimpl.MessageState state protoimpl.MessageState
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields 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() { func (x *UserSettingGeneral) Reset() {
*x = AccessTokensUserSetting{} *x = UserSettingGeneral{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_store_user_setting_proto_msgTypes[1] mi := &file_store_user_setting_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 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) 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] mi := &file_store_user_setting_proto_msgTypes[1]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@ -221,32 +204,35 @@ func (x *AccessTokensUserSetting) ProtoReflect() protoreflect.Message {
return mi.MessageOf(x) return mi.MessageOf(x)
} }
// Deprecated: Use AccessTokensUserSetting.ProtoReflect.Descriptor instead. // Deprecated: Use UserSettingGeneral.ProtoReflect.Descriptor instead.
func (*AccessTokensUserSetting) Descriptor() ([]byte, []int) { func (*UserSettingGeneral) Descriptor() ([]byte, []int) {
return file_store_user_setting_proto_rawDescGZIP(), []int{1} return file_store_user_setting_proto_rawDescGZIP(), []int{1}
} }
func (x *AccessTokensUserSetting) GetAccessTokens() []*AccessTokensUserSetting_AccessToken { func (x *UserSettingGeneral) GetLocale() string {
if x != nil { 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 state protoimpl.MessageState
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields unknownFields protoimpl.UnknownFields
// The access token is a JWT token. AccessTokens []*UserSettingAccessTokens_AccessToken `protobuf:"bytes,1,rep,name=access_tokens,json=accessTokens,proto3" json:"access_tokens,omitempty"`
// 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 *AccessTokensUserSetting_AccessToken) Reset() { func (x *UserSettingAccessTokens) Reset() {
*x = AccessTokensUserSetting_AccessToken{} *x = UserSettingAccessTokens{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_store_user_setting_proto_msgTypes[2] mi := &file_store_user_setting_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 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) 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] mi := &file_store_user_setting_proto_msgTypes[2]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@ -272,19 +258,70 @@ func (x *AccessTokensUserSetting_AccessToken) ProtoReflect() protoreflect.Messag
return mi.MessageOf(x) return mi.MessageOf(x)
} }
// Deprecated: Use AccessTokensUserSetting_AccessToken.ProtoReflect.Descriptor instead. // Deprecated: Use UserSettingAccessTokens.ProtoReflect.Descriptor instead.
func (*AccessTokensUserSetting_AccessToken) Descriptor() ([]byte, []int) { func (*UserSettingAccessTokens) Descriptor() ([]byte, []int) {
return file_store_user_setting_proto_rawDescGZIP(), []int{1, 0} 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 { if x != nil {
return x.AccessToken return x.AccessToken
} }
return "" return ""
} }
func (x *AccessTokensUserSetting_AccessToken) GetDescription() string { func (x *UserSettingAccessTokens_AccessToken) GetDescription() string {
if x != nil { if x != nil {
return x.Description 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, 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, 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, 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, 0x3b, 0x0a, 0x07, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x32, 0x1f, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x55,
0x74, 0x6f, 0x72, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61,
0x73, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x0c, 0x6c, 0x48, 0x00, 0x52, 0x07, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x12, 0x4b, 0x0a, 0x0d,
0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x18, 0x0a, 0x06, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x04, 0x20,
0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72,
0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x21, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63,
0x74, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x63, 0x63,
0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x68, 0x65, 0x6d, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c,
0x75, 0x65, 0x22, 0xc4, 0x01, 0x0a, 0x17, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x75, 0x65, 0x22, 0x4d, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e,
0x65, 0x6e, 0x73, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x55, 0x67, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x61,
0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65,
0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x74, 0x68, 0x65, 0x6d, 0x65, 0x18,
0x6f, 0x72, 0x65, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x68, 0x65, 0x6d,
0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x65, 0x22, 0xc4, 0x01, 0x0a, 0x17, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e,
0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x67, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x55, 0x0a,
0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x1a, 0x52, 0x0a, 0x0b, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01,
0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f,
0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x72, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x63,
0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73,
0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f,
0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x62, 0x0a, 0x0e, 0x55, 0x73, 0x65, 0x6b, 0x65, 0x6e, 0x73, 0x1a, 0x52, 0x0a, 0x0b, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f,
0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x20, 0x0a, 0x1c, 0x55, 0x6b, 0x65, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f,
0x53, 0x45, 0x52, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73,
0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
0x0d, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x53, 0x10, 0x01, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73,
0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x52, 0x0a, 0x0e, 0x55, 0x73, 0x65, 0x72,
0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x5f, 0x54, 0x48, 0x45, 0x4d, 0x45, 0x10, 0x03, 0x42, 0xa1, 0x01, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x20, 0x0a, 0x1c, 0x55, 0x53,
0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x45, 0x52, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x55,
0x65, 0x42, 0x10, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07,
0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x41, 0x43, 0x43,
0x6d, 0x2f, 0x79, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x6c, 0x66, 0x68, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x53, 0x10, 0x02, 0x42, 0xa1, 0x01, 0x0a,
0x2f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x0f, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65,
0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0xa2, 0x02, 0x03, 0x53, 0x53, 0x58, 0xaa, 0x02, 0x0b, 0x53, 0x42, 0x10, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f,
0x6c, 0x61, 0x73, 0x68, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0xca, 0x02, 0x0b, 0x53, 0x6c, 0x61, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
0x73, 0x68, 0x5c, 0x53, 0x74, 0x6f, 0x72, 0x65, 0xe2, 0x02, 0x17, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x2f, 0x79, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x6c, 0x66, 0x68, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x2f,
0x5c, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f,
0x74, 0x61, 0xea, 0x02, 0x0c, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x3a, 0x3a, 0x53, 0x74, 0x6f, 0x72, 0x73, 0x74, 0x6f, 0x72, 0x65, 0xa2, 0x02, 0x03, 0x53, 0x53, 0x58, 0xaa, 0x02, 0x0b, 0x53, 0x6c,
0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 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 ( 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_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{ var file_store_user_setting_proto_goTypes = []any{
(UserSettingKey)(0), // 0: slash.store.UserSettingKey (UserSettingKey)(0), // 0: slash.store.UserSettingKey
(*UserSetting)(nil), // 1: slash.store.UserSetting (*UserSetting)(nil), // 1: slash.store.UserSetting
(*AccessTokensUserSetting)(nil), // 2: slash.store.AccessTokensUserSetting (*UserSettingGeneral)(nil), // 2: slash.store.UserSettingGeneral
(*AccessTokensUserSetting_AccessToken)(nil), // 3: slash.store.AccessTokensUserSetting.AccessToken (*UserSettingAccessTokens)(nil), // 3: slash.store.UserSettingAccessTokens
(*UserSettingAccessTokens_AccessToken)(nil), // 4: slash.store.UserSettingAccessTokens.AccessToken
} }
var file_store_user_setting_proto_depIdxs = []int32{ var file_store_user_setting_proto_depIdxs = []int32{
0, // 0: slash.store.UserSetting.key:type_name -> slash.store.UserSettingKey 0, // 0: slash.store.UserSetting.key:type_name -> slash.store.UserSettingKey
2, // 1: slash.store.UserSetting.access_tokens:type_name -> slash.store.AccessTokensUserSetting 2, // 1: slash.store.UserSetting.general:type_name -> slash.store.UserSettingGeneral
3, // 2: slash.store.AccessTokensUserSetting.access_tokens:type_name -> slash.store.AccessTokensUserSetting.AccessToken 3, // 2: slash.store.UserSetting.access_tokens:type_name -> slash.store.UserSettingAccessTokens
3, // [3:3] is the sub-list for method output_type 4, // 3: slash.store.UserSettingAccessTokens.access_tokens:type_name -> slash.store.UserSettingAccessTokens.AccessToken
3, // [3:3] is the sub-list for method input_type 4, // [4:4] is the sub-list for method output_type
3, // [3:3] is the sub-list for extension type_name 4, // [4:4] is the sub-list for method input_type
3, // [3:3] is the sub-list for extension extendee 4, // [4:4] is the sub-list for extension type_name
0, // [0:3] is the sub-list for field 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() } 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 { 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: case 0:
return &v.state return &v.state
case 1: 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 { 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: case 0:
return &v.state return &v.state
case 1: case 1:
@ -418,9 +473,8 @@ func file_store_user_setting_proto_init() {
} }
} }
file_store_user_setting_proto_msgTypes[0].OneofWrappers = []any{ file_store_user_setting_proto_msgTypes[0].OneofWrappers = []any{
(*UserSetting_General)(nil),
(*UserSetting_AccessTokens)(nil), (*UserSetting_AccessTokens)(nil),
(*UserSetting_Locale)(nil),
(*UserSetting_ColorTheme)(nil),
} }
type x struct{} type x struct{}
out := protoimpl.TypeBuilder{ out := protoimpl.TypeBuilder{
@ -428,7 +482,7 @@ func file_store_user_setting_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(), GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_store_user_setting_proto_rawDesc, RawDescriptor: file_store_user_setting_proto_rawDesc,
NumEnums: 1, NumEnums: 1,
NumMessages: 3, NumMessages: 4,
NumExtensions: 0, NumExtensions: 0,
NumServices: 0, NumServices: 0,
}, },

View File

@ -10,25 +10,26 @@ message UserSetting {
UserSettingKey key = 2; UserSettingKey key = 2;
oneof value { oneof value {
AccessTokensUserSetting access_tokens = 3; UserSettingGeneral general = 3;
string locale = 4; UserSettingAccessTokens access_tokens = 4;
string color_theme = 5;
} }
} }
enum UserSettingKey { enum UserSettingKey {
USER_SETTING_KEY_UNSPECIFIED = 0; USER_SETTING_KEY_UNSPECIFIED = 0;
// General settings for the user.
GENERAL = 1;
// Access tokens for the user. // Access tokens for the user.
ACCESS_TOKENS = 1; ACCESS_TOKENS = 2;
// Locale for the user.
LOCALE = 2;
// Color theme for the user.
COLOR_THEME = 3;
} }
message AccessTokensUserSetting { message UserSettingGeneral {
string locale = 1;
string color_theme = 2;
}
message UserSettingAccessTokens {
message AccessToken { message AccessToken {
// The access token is a JWT token. // The access token is a JWT token.
// Including expiration time, issuer, etc. // Including expiration time, issuer, etc.

View File

@ -163,7 +163,7 @@ func audienceContains(audience jwt.ClaimStrings, token string) bool {
return false return false
} }
func validateAccessToken(accessTokenString string, userAccessTokens []*storepb.AccessTokensUserSetting_AccessToken) bool { func validateAccessToken(accessTokenString string, userAccessTokens []*storepb.UserSettingAccessTokens_AccessToken) bool {
for _, userAccessToken := range userAccessTokens { for _, userAccessToken := range userAccessTokens {
if accessTokenString == userAccessToken.AccessToken { if accessTokenString == userAccessToken.AccessToken {
return true return true

View File

@ -251,7 +251,7 @@ func (s *APIV1Service) DeleteUserAccessToken(ctx context.Context, request *v1pb.
if err != nil { if err != nil {
return nil, status.Errorf(codes.Internal, "failed to list access tokens: %v", err) 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 { for _, userAccessToken := range userAccessTokens {
if userAccessToken.AccessToken == request.AccessToken { if userAccessToken.AccessToken == request.AccessToken {
continue continue
@ -262,7 +262,7 @@ func (s *APIV1Service) DeleteUserAccessToken(ctx context.Context, request *v1pb.
UserId: user.ID, UserId: user.ID,
Key: storepb.UserSettingKey_ACCESS_TOKENS, Key: storepb.UserSettingKey_ACCESS_TOKENS,
Value: &storepb.UserSetting_AccessTokens{ Value: &storepb.UserSetting_AccessTokens{
AccessTokens: &storepb.AccessTokensUserSetting{ AccessTokens: &storepb.UserSettingAccessTokens{
AccessTokens: updatedUserAccessTokens, AccessTokens: updatedUserAccessTokens,
}, },
}, },
@ -278,7 +278,7 @@ func (s *APIV1Service) UpsertAccessTokenToStore(ctx context.Context, user *store
if err != nil { if err != nil {
return errors.Wrap(err, "failed to get user access tokens") return errors.Wrap(err, "failed to get user access tokens")
} }
userAccessToken := storepb.AccessTokensUserSetting_AccessToken{ userAccessToken := storepb.UserSettingAccessTokens_AccessToken{
AccessToken: accessToken, AccessToken: accessToken,
Description: description, Description: description,
} }
@ -287,7 +287,7 @@ func (s *APIV1Service) UpsertAccessTokenToStore(ctx context.Context, user *store
UserId: user.ID, UserId: user.ID,
Key: storepb.UserSettingKey_ACCESS_TOKENS, Key: storepb.UserSettingKey_ACCESS_TOKENS,
Value: &storepb.UserSetting_AccessTokens{ Value: &storepb.UserSetting_AccessTokens{
AccessTokens: &storepb.AccessTokensUserSetting{ AccessTokens: &storepb.UserSettingAccessTokens{
AccessTokens: userAccessTokens, 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) return nil, status.Errorf(codes.Unauthenticated, "failed to get current user: %v", err)
} }
for _, path := range request.UpdateMask.Paths { for _, path := range request.UpdateMask.Paths {
if path == "locale" { if path == "general" {
if _, err := s.Store.UpsertUserSetting(ctx, &storepb.UserSetting{ if _, err := s.Store.UpsertUserSetting(ctx, &storepb.UserSetting{
UserId: user.ID, UserId: user.ID,
Key: storepb.UserSettingKey_LOCALE, Key: storepb.UserSettingKey_GENERAL,
Value: &storepb.UserSetting_Locale{ Value: &storepb.UserSetting_General{
Locale: request.UserSetting.Locale, General: &storepb.UserSettingGeneral{
}, Locale: request.UserSetting.General.Locale,
}); err != nil { ColorTheme: request.UserSetting.General.ColorTheme,
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,
}, },
}); err != nil { }); err != nil {
return nil, status.Errorf(codes.Internal, "failed to update user setting: %v", err) 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{ userSetting := &v1pb.UserSetting{
Id: userID, Id: userID,
Locale: "EN", General: &v1pb.UserSettingGeneral{
ColorTheme: "SYSTEM", Locale: "EN",
ColorTheme: "SYSTEM",
},
} }
for _, setting := range userSettings { for _, setting := range userSettings {
if setting.Key == storepb.UserSettingKey_LOCALE { if setting.Key == storepb.UserSettingKey_GENERAL {
userSetting.Locale = setting.GetLocale() userSetting.General = &v1pb.UserSettingGeneral{
} else if setting.Key == storepb.UserSettingKey_COLOR_THEME { Locale: setting.GetGeneral().Locale,
userSetting.ColorTheme = setting.GetColorTheme() ColorTheme: setting.GetGeneral().ColorTheme,
}
} }
} }
return userSetting, nil return userSetting, nil

View File

@ -29,10 +29,12 @@ func (d *DB) UpsertUserSetting(ctx context.Context, upsert *storepb.UserSetting)
return nil, err return nil, err
} }
valueString = string(valueBytes) valueString = string(valueBytes)
} else if upsert.Key == storepb.UserSettingKey_LOCALE { } else if upsert.Key == storepb.UserSettingKey_GENERAL {
valueString = upsert.GetLocale() valueBytes, err := protojson.Marshal(upsert.GetGeneral())
} else if upsert.Key == storepb.UserSettingKey_COLOR_THEME { if err != nil {
valueString = upsert.GetColorTheme() return nil, err
}
valueString = string(valueBytes)
} else { } else {
return nil, errors.New("invalid user setting key") 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]) userSetting.Key = storepb.UserSettingKey(storepb.UserSettingKey_value[keyString])
if userSetting.Key == storepb.UserSettingKey_ACCESS_TOKENS { if userSetting.Key == storepb.UserSettingKey_ACCESS_TOKENS {
accessTokensUserSetting := &storepb.AccessTokensUserSetting{} userSettingAccessTokens := &storepb.UserSettingAccessTokens{}
if err := protojson.Unmarshal([]byte(valueString), accessTokensUserSetting); err != nil { if err := protojson.Unmarshal([]byte(valueString), userSettingAccessTokens); err != nil {
return nil, err return nil, err
} }
userSetting.Value = &storepb.UserSetting_AccessTokens{ userSetting.Value = &storepb.UserSetting_AccessTokens{
AccessTokens: accessTokensUserSetting, AccessTokens: userSettingAccessTokens,
} }
} else if userSetting.Key == storepb.UserSettingKey_LOCALE { } else if userSetting.Key == storepb.UserSettingKey_GENERAL {
userSetting.Value = &storepb.UserSetting_Locale{ userSettingGeneral := &storepb.UserSettingGeneral{}
Locale: valueString, if err := protojson.Unmarshal([]byte(valueString), userSettingGeneral); err != nil {
return nil, err
} }
} else if userSetting.Key == storepb.UserSettingKey_COLOR_THEME { userSetting.Value = &storepb.UserSetting_General{
userSetting.Value = &storepb.UserSetting_ColorTheme{ General: userSettingGeneral,
ColorTheme: valueString,
} }
} else { } else {
// Skip unknown key. // Skip unknown key.

View File

@ -28,10 +28,12 @@ func (d *DB) UpsertUserSetting(ctx context.Context, upsert *storepb.UserSetting)
return nil, err return nil, err
} }
valueString = string(valueBytes) valueString = string(valueBytes)
} else if upsert.Key == storepb.UserSettingKey_LOCALE { } else if upsert.Key == storepb.UserSettingKey_GENERAL {
valueString = upsert.GetLocale() valueBytes, err := protojson.Marshal(upsert.GetGeneral())
} else if upsert.Key == storepb.UserSettingKey_COLOR_THEME { if err != nil {
valueString = upsert.GetColorTheme() return nil, err
}
valueString = string(valueBytes)
} else { } else {
return nil, errors.New("invalid user setting key") 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]) userSetting.Key = storepb.UserSettingKey(storepb.UserSettingKey_value[keyString])
if userSetting.Key == storepb.UserSettingKey_ACCESS_TOKENS { if userSetting.Key == storepb.UserSettingKey_ACCESS_TOKENS {
accessTokensUserSetting := &storepb.AccessTokensUserSetting{} userSettingAccessTokens := &storepb.UserSettingAccessTokens{}
if err := protojson.Unmarshal([]byte(valueString), accessTokensUserSetting); err != nil { if err := protojson.Unmarshal([]byte(valueString), userSettingAccessTokens); err != nil {
return nil, err return nil, err
} }
userSetting.Value = &storepb.UserSetting_AccessTokens{ userSetting.Value = &storepb.UserSetting_AccessTokens{
AccessTokens: accessTokensUserSetting, AccessTokens: userSettingAccessTokens,
} }
} else if userSetting.Key == storepb.UserSettingKey_LOCALE { } else if userSetting.Key == storepb.UserSettingKey_GENERAL {
userSetting.Value = &storepb.UserSetting_Locale{ userSettingGeneral := &storepb.UserSettingGeneral{}
Locale: valueString, if err := protojson.Unmarshal([]byte(valueString), userSettingGeneral); err != nil {
return nil, err
} }
} else if userSetting.Key == storepb.UserSettingKey_COLOR_THEME { userSetting.Value = &storepb.UserSetting_General{
userSetting.Value = &storepb.UserSetting_ColorTheme{ General: userSettingGeneral,
ColorTheme: valueString,
} }
} else { } else {
// Skip unknown key. // 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. // 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{ userSetting, err := s.GetUserSetting(ctx, &FindUserSetting{
UserID: &userID, UserID: &userID,
Key: storepb.UserSettingKey_ACCESS_TOKENS, Key: storepb.UserSettingKey_ACCESS_TOKENS,
@ -63,7 +63,7 @@ func (s *Store) GetUserAccessTokens(ctx context.Context, userID int32) ([]*store
return nil, err return nil, err
} }
if userSetting == nil { if userSetting == nil {
return []*storepb.AccessTokensUserSetting_AccessToken{}, nil return []*storepb.UserSettingAccessTokens_AccessToken{}, nil
} }
accessTokensUserSetting := userSetting.GetAccessTokens() accessTokensUserSetting := userSetting.GetAccessTokens()

View File

@ -26,8 +26,8 @@ func TestUserSettingStore(t *testing.T) {
UserId: user.ID, UserId: user.ID,
Key: storepb.UserSettingKey_ACCESS_TOKENS, Key: storepb.UserSettingKey_ACCESS_TOKENS,
Value: &storepb.UserSetting_AccessTokens{ Value: &storepb.UserSetting_AccessTokens{
AccessTokens: &storepb.AccessTokensUserSetting{ AccessTokens: &storepb.UserSettingAccessTokens{
AccessTokens: []*storepb.AccessTokensUserSetting_AccessToken{ AccessTokens: []*storepb.UserSettingAccessTokens_AccessToken{
{ {
AccessToken: "test_access_token", AccessToken: "test_access_token",
}, },
@ -58,8 +58,8 @@ func TestUserSettingStore(t *testing.T) {
UserId: user.ID, UserId: user.ID,
Key: storepb.UserSettingKey_ACCESS_TOKENS, Key: storepb.UserSettingKey_ACCESS_TOKENS,
Value: &storepb.UserSetting_AccessTokens{ Value: &storepb.UserSetting_AccessTokens{
AccessTokens: &storepb.AccessTokensUserSetting{ AccessTokens: &storepb.UserSettingAccessTokens{
AccessTokens: []*storepb.AccessTokensUserSetting_AccessToken{ AccessTokens: []*storepb.UserSettingAccessTokens_AccessToken{
{ {
AccessToken: "test_access_token", AccessToken: "test_access_token",
}, },
@ -74,47 +74,33 @@ func TestUserSettingStore(t *testing.T) {
require.NotNil(t, accessTokensUserSetting) require.NotNil(t, accessTokensUserSetting)
require.Equal(t, 2, len(accessTokensUserSetting.GetAccessTokens().AccessTokens)) require.Equal(t, 2, len(accessTokensUserSetting.GetAccessTokens().AccessTokens))
// Test for locale user setting. // Test for user setting general.
localeUserSetting, err := ts.UpsertUserSetting(ctx, &storepb.UserSetting{ userSettingGeneral, err := ts.UpsertUserSetting(ctx, &storepb.UserSetting{
UserId: user.ID, UserId: user.ID,
Key: storepb.UserSettingKey_LOCALE, Key: storepb.UserSettingKey_GENERAL,
Value: &storepb.UserSetting_Locale{ Value: &storepb.UserSetting_General{
Locale: "ZH", General: &storepb.UserSettingGeneral{
Locale: "ZH",
ColorTheme: "SYSTEM",
},
}, },
}) })
require.NoError(t, err) require.NoError(t, err)
require.NotNil(t, localeUserSetting) require.NotNil(t, userSettingGeneral)
require.Equal(t, storepb.UserSettingKey_LOCALE, localeUserSetting.Key) require.Equal(t, storepb.UserSettingKey_GENERAL, userSettingGeneral.Key)
require.Equal(t, "ZH", localeUserSetting.GetLocale()) require.Equal(t, "ZH", userSettingGeneral.GetGeneral().Locale)
localeUserSetting, err = ts.UpsertUserSetting(ctx, &storepb.UserSetting{ require.Equal(t, "SYSTEM", userSettingGeneral.GetGeneral().ColorTheme)
userSettingGeneral, err = ts.UpsertUserSetting(ctx, &storepb.UserSetting{
UserId: user.ID, UserId: user.ID,
Key: storepb.UserSettingKey_LOCALE, Key: storepb.UserSettingKey_GENERAL,
Value: &storepb.UserSetting_Locale{ Value: &storepb.UserSetting_General{
Locale: "EN", General: &storepb.UserSettingGeneral{
Locale: "EN",
ColorTheme: "DARK",
},
}, },
}) })
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, "EN", localeUserSetting.GetLocale()) require.Equal(t, "EN", userSettingGeneral.GetGeneral().Locale)
require.Equal(t, "DARK", userSettingGeneral.GetGeneral().ColorTheme)
// 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())
} }