refactor: workspace setting definitions

This commit is contained in:
Steven 2024-07-29 22:03:21 +08:00
parent 61d01a53eb
commit ecf77e0774
36 changed files with 1277 additions and 1052 deletions

View File

@ -15,6 +15,7 @@ import (
"github.com/yourselfhosted/slash/server"
"github.com/yourselfhosted/slash/server/metric"
"github.com/yourselfhosted/slash/server/profile"
"github.com/yourselfhosted/slash/server/version"
"github.com/yourselfhosted/slash/store"
"github.com/yourselfhosted/slash/store/db"
)
@ -24,36 +25,47 @@ const (
)
var (
serverProfile *profile.Profile
mode string
port int
data string
driver string
dsn string
enableMetric bool
rootCmd = &cobra.Command{
Use: "slash",
Short: `An open source, self-hosted links shortener and sharing platform.`,
Run: func(_ *cobra.Command, _ []string) {
serverProfile := &profile.Profile{
Mode: viper.GetString("mode"),
Port: viper.GetInt("port"),
Data: viper.GetString("data"),
DSN: viper.GetString("dsn"),
Driver: viper.GetString("driver"),
Public: viper.GetBool("public"),
InstanceURL: viper.GetString("instance-url"),
Version: version.GetCurrentVersion(viper.GetString("mode")),
}
if err := serverProfile.Validate(); err != nil {
panic(err)
}
ctx, cancel := context.WithCancel(context.Background())
dbDriver, err := db.NewDBDriver(serverProfile)
if err != nil {
cancel()
slog.Error("failed to create db driver", err)
slog.Error("failed to create db driver", "error", err)
return
}
if err := dbDriver.Migrate(ctx); err != nil {
cancel()
slog.Error("failed to migrate db", err)
slog.Error("failed to migrate db", "error", err)
return
}
storeInstance := store.New(dbDriver, serverProfile)
if err := storeInstance.MigrateWorkspaceSettings(ctx); err != nil {
cancel()
slog.Error("failed to migrate workspace settings", "error", err)
return
}
s, err := server.NewServer(ctx, serverProfile, storeInstance)
if err != nil {
cancel()
slog.Error("failed to create server", err)
slog.Error("failed to create server", "error", err)
return
}
@ -74,11 +86,11 @@ var (
cancel()
}()
printGreetings()
printGreetings(serverProfile)
if err := s.Start(ctx); err != nil {
if err != http.ErrServerClosed {
slog.Error("failed to start server", err)
slog.Error("failed to start server", "error", err)
cancel()
}
}
@ -89,71 +101,60 @@ var (
}
)
func Execute() error {
return rootCmd.Execute()
}
func init() {
cobra.OnInitialize(initConfig)
rootCmd.PersistentFlags().StringVarP(&mode, "mode", "m", "demo", `mode of server, can be "prod" or "dev" or "demo"`)
rootCmd.PersistentFlags().IntVarP(&port, "port", "p", 8082, "port of server")
rootCmd.PersistentFlags().StringVarP(&data, "data", "d", "", "data directory")
rootCmd.PersistentFlags().StringVarP(&driver, "driver", "", "", "database driver")
rootCmd.PersistentFlags().StringVarP(&dsn, "dsn", "", "", "database source name(aka. DSN)")
rootCmd.PersistentFlags().BoolVarP(&enableMetric, "metric", "", true, "allow metric collection")
err := viper.BindPFlag("mode", rootCmd.PersistentFlags().Lookup("mode"))
if err != nil {
panic(err)
}
err = viper.BindPFlag("port", rootCmd.PersistentFlags().Lookup("port"))
if err != nil {
panic(err)
}
err = viper.BindPFlag("data", rootCmd.PersistentFlags().Lookup("data"))
if err != nil {
panic(err)
}
err = viper.BindPFlag("driver", rootCmd.PersistentFlags().Lookup("driver"))
if err != nil {
panic(err)
}
err = viper.BindPFlag("dsn", rootCmd.PersistentFlags().Lookup("dsn"))
if err != nil {
panic(err)
}
err = viper.BindPFlag("metric", rootCmd.PersistentFlags().Lookup("metric"))
if err != nil {
panic(err)
}
viper.SetDefault("mode", "demo")
viper.SetDefault("port", 8082)
viper.SetDefault("driver", "sqlite")
viper.SetDefault("metric", true)
viper.SetDefault("port", 8082)
viper.SetDefault("public", true)
rootCmd.PersistentFlags().String("mode", "demo", `mode of server, can be "prod" or "dev" or "demo"`)
rootCmd.PersistentFlags().String("addr", "", "address of server")
rootCmd.PersistentFlags().Int("port", 8082, "port of server")
rootCmd.PersistentFlags().String("data", "", "data directory")
rootCmd.PersistentFlags().String("driver", "sqlite", "database driver")
rootCmd.PersistentFlags().String("dsn", "", "database source name(aka. DSN)")
rootCmd.PersistentFlags().Bool("public", true, "")
rootCmd.PersistentFlags().String("instance-url", "", "URL of the instance")
if err := viper.BindPFlag("mode", rootCmd.PersistentFlags().Lookup("mode")); err != nil {
panic(err)
}
if err := viper.BindPFlag("port", rootCmd.PersistentFlags().Lookup("port")); err != nil {
panic(err)
}
if err := viper.BindPFlag("data", rootCmd.PersistentFlags().Lookup("data")); err != nil {
panic(err)
}
if err := viper.BindPFlag("driver", rootCmd.PersistentFlags().Lookup("driver")); err != nil {
panic(err)
}
if err := viper.BindPFlag("dsn", rootCmd.PersistentFlags().Lookup("dsn")); err != nil {
panic(err)
}
if err := viper.BindPFlag("public", rootCmd.PersistentFlags().Lookup("public")); err != nil {
panic(err)
}
if err := viper.BindPFlag("instance-url", rootCmd.PersistentFlags().Lookup("instance-url")); err != nil {
panic(err)
}
viper.SetEnvPrefix("slash")
}
func initConfig() {
viper.AutomaticEnv()
var err error
serverProfile, err = profile.GetProfile()
if err != nil {
slog.Error("failed to get profile", err)
return
if err := viper.BindEnv("instance-url", "SLASH_INSTANCE_URL"); err != nil {
panic(err)
}
}
func printGreetings(serverProfile *profile.Profile) {
println("---")
println("Server profile")
println("dsn:", serverProfile.DSN)
println("port:", serverProfile.Port)
println("mode:", serverProfile.Mode)
println("version:", serverProfile.Version)
println("public:", serverProfile.Public)
println("instance-url:", serverProfile.InstanceURL)
println("---")
}
func printGreetings() {
println(greetingBanner)
fmt.Printf("Version %s has been started on port %d\n", serverProfile.Version, serverProfile.Port)
println("---")
@ -163,8 +164,7 @@ func printGreetings() {
}
func main() {
err := Execute()
if err != nil {
if err := rootCmd.Execute(); err != nil {
panic(err)
}
}

View File

@ -1,5 +1,4 @@
import { useState } from "react";
import { useWorkspaceStore } from "@/stores";
import Icon from "./Icon";
interface Props {
@ -18,8 +17,7 @@ const getFaviconUrlWithProvider = (url: string, provider: string) => {
const LinkFavicon = (props: Props) => {
const { url } = props;
const workspaceStore = useWorkspaceStore();
const faviconProvider = workspaceStore.profile.faviconProvider || "https://www.google.com/s2/favicons";
const faviconProvider = "https://www.google.com/s2/favicons";
const [faviconUrl, setFaviconUrl] = useState<string>(getFaviconUrlWithProvider(url, faviconProvider));
const handleImgError = () => {

View File

@ -1,4 +1,4 @@
import { Button, Input, Link, Option, Select, Switch, Textarea } from "@mui/joy";
import { Button, Option, Select, Textarea } from "@mui/joy";
import { isEqual } from "lodash-es";
import { useRef, useState } from "react";
import toast from "react-hot-toast";
@ -7,7 +7,6 @@ import { workspaceServiceClient } from "@/grpcweb";
import { useWorkspaceStore } from "@/stores";
import { Visibility } from "@/types/proto/api/v1/common";
import { WorkspaceSetting } from "@/types/proto/api/v1/workspace_service";
import BetaBadge from "../BetaBadge";
const getDefaultVisibility = (visibility?: Visibility) => {
if (!visibility || [Visibility.VISIBILITY_UNSPECIFIED, Visibility.UNRECOGNIZED].includes(visibility)) {
@ -24,27 +23,6 @@ const WorkspaceSection = () => {
const originalWorkspaceSetting = useRef<WorkspaceSetting>(workspaceStore.setting);
const allowSave = !isEqual(originalWorkspaceSetting.current, workspaceSetting);
const handleEnableSignUpChange = async (value: boolean) => {
setWorkspaceSetting({
...workspaceSetting,
enableSignup: value,
});
};
const handleInstanceUrlChange = async (value: string) => {
setWorkspaceSetting({
...workspaceSetting,
instanceUrl: value,
});
};
const handleFaviconProvierChange = async (value: string) => {
setWorkspaceSetting({
...workspaceSetting,
faviconProvider: value,
});
};
const handleCustomStyleChange = async (value: string) => {
setWorkspaceSetting({
...workspaceSetting,
@ -61,21 +39,12 @@ const WorkspaceSection = () => {
const handleSaveWorkspaceSetting = async () => {
const updateMask: string[] = [];
if (!isEqual(originalWorkspaceSetting.current.enableSignup, workspaceSetting.enableSignup)) {
updateMask.push("enable_signup");
}
if (!isEqual(originalWorkspaceSetting.current.instanceUrl, workspaceSetting.instanceUrl)) {
updateMask.push("instance_url");
}
if (!isEqual(originalWorkspaceSetting.current.customStyle, workspaceSetting.customStyle)) {
updateMask.push("custom_style");
}
if (!isEqual(originalWorkspaceSetting.current.defaultVisibility, workspaceSetting.defaultVisibility)) {
updateMask.push("default_visibility");
}
if (!isEqual(originalWorkspaceSetting.current.faviconProvider, workspaceSetting.faviconProvider)) {
updateMask.push("favicon_provider");
}
if (updateMask.length === 0) {
toast.error("No changes made");
return;
@ -101,33 +70,6 @@ const WorkspaceSection = () => {
<div className="w-full flex flex-col sm:flex-row justify-start items-start gap-4 sm:gap-x-16">
<p className="sm:w-1/4 text-2xl shrink-0 font-semibold text-gray-900 dark:text-gray-500">{t("settings.workspace.self")}</p>
<div className="w-full sm:w-auto grow flex flex-col justify-start items-start gap-4">
<div className="w-full flex flex-col justify-start items-start">
<div className="w-full flex flex-col justify-start items-start">
<p className="font-medium dark:text-gray-400">Instance URL</p>
<p className="text-sm text-gray-500 leading-tight">
{"Mainly used for SEO and social sharing. Leave empty to disallow crawlers."}
</p>
</div>
<Input
className="w-full mt-2"
placeholder="Your instance URL. e.g. https://slash.example.com"
value={workspaceSetting.instanceUrl}
onChange={(event) => handleInstanceUrlChange(event.target.value)}
/>
</div>
<div className="w-full flex flex-row justify-between items-center">
<div className="w-full flex flex-col justify-start items-start">
<p className="font-medium dark:text-gray-400">{t("settings.workspace.enable-user-signup.self")}</p>
<p className="text-sm text-gray-500">{t("settings.workspace.enable-user-signup.description")}</p>
</div>
<div>
<Switch
size="lg"
checked={workspaceSetting.enableSignup}
onChange={(event) => handleEnableSignUpChange(event.target.checked)}
/>
</div>
</div>
<div className="w-full flex flex-row justify-between items-center">
<div className="w-full flex flex-col justify-start items-start">
<p className="font-medium dark:text-gray-400">{t("settings.workspace.default-visibility")}</p>
@ -143,24 +85,6 @@ const WorkspaceSection = () => {
<Option value={Visibility.PUBLIC}>{t(`shortcut.visibility.public.self`)}</Option>
</Select>
</div>
<div className="w-full flex flex-col justify-start items-start">
<div className="w-full flex flex-row justify-start items-center gap-2">
<p className="font-medium dark:text-gray-400">Favicon provider</p>
<BetaBadge />
</div>
<p className="text-sm text-gray-500">
e.g.{" "}
<Link className="!text-sm" href="https://github.com/yourselfhosted/favicons" target="_blank">
yourselfhosted/favicons
</Link>
</p>
<Input
className="w-full mt-2"
placeholder="The provider of favicon. Empty for default Google S2."
value={workspaceSetting.faviconProvider}
onChange={(event) => handleFaviconProvierChange(event.target.value)}
/>
</div>
<div className="w-full flex flex-col justify-start items-start">
<p className="mt-2 font-medium dark:text-gray-400">{t("settings.workspace.custom-style")}</p>
<Textarea

View File

@ -121,7 +121,7 @@ const useUserStore = create<UserState>()((set, get) => ({
return userSetting;
},
updateUserSetting: async (userSetting: UserSetting, updateMask: string[]) => {
const userId = userSetting.id;
const userId = userSetting.userId;
const updatedUserSetting = (
await userSettingServiceClient.updateUserSetting({
id: userId,
@ -129,11 +129,6 @@ 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

@ -25,17 +25,28 @@ service UserSettingService {
}
message UserSetting {
// id is the user id.
int32 id = 1;
int32 user_id = 1;
UserSettingGeneral general = 2;
}
GeneralSetting general = 2;
message UserSettingGeneral {
AccessTokensSetting access_tokens = 3;
message GeneralSetting {
string locale = 1;
string color_theme = 2;
}
message AccessTokensSetting {
message AccessToken {
// The access token is a JWT token, including expiration time, issuer, etc.
string access_token = 1;
// A description for the access token.
string description = 2;
}
repeated AccessToken access_tokens = 1; // Nested repeated field
}
}
message GetUserSettingRequest {
// id is the user id.
int32 id = 1;

View File

@ -37,25 +37,16 @@ message WorkspaceProfile {
bool enable_signup = 4;
// The custom style.
string custom_style = 5;
// The url of custom favicon provider.
string favicon_provider = 7;
// The owner name.
// Format: "users/{id}"
string owner = 8;
string owner = 6;
}
message WorkspaceSetting {
string license_key = 1;
// Whether to enable other users to sign up.
bool enable_signup = 2;
// The instance URL.
string instance_url = 3;
// The custom style.
string custom_style = 4;
string custom_style = 1;
// The default visibility of shortcuts and collections.
Visibility default_visibility = 7;
// The url of custom favicon provider.
string favicon_provider = 8;
Visibility default_visibility = 2;
}
message GetWorkspaceProfileRequest {}

View File

@ -98,7 +98,9 @@
- [UpdateUserSettingRequest](#slash-api-v1-UpdateUserSettingRequest)
- [UpdateUserSettingResponse](#slash-api-v1-UpdateUserSettingResponse)
- [UserSetting](#slash-api-v1-UserSetting)
- [UserSettingGeneral](#slash-api-v1-UserSettingGeneral)
- [UserSetting.AccessTokensSetting](#slash-api-v1-UserSetting-AccessTokensSetting)
- [UserSetting.AccessTokensSetting.AccessToken](#slash-api-v1-UserSetting-AccessTokensSetting-AccessToken)
- [UserSetting.GeneralSetting](#slash-api-v1-UserSetting-GeneralSetting)
- [UserSettingService](#slash-api-v1-UserSettingService)
@ -1322,17 +1324,49 @@
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| id | [int32](#int32) | | id is the user id. |
| general | [UserSettingGeneral](#slash-api-v1-UserSettingGeneral) | | |
| user_id | [int32](#int32) | | |
| general | [UserSetting.GeneralSetting](#slash-api-v1-UserSetting-GeneralSetting) | | |
| access_tokens | [UserSetting.AccessTokensSetting](#slash-api-v1-UserSetting-AccessTokensSetting) | | |
<a name="slash-api-v1-UserSettingGeneral"></a>
<a name="slash-api-v1-UserSetting-AccessTokensSetting"></a>
### UserSettingGeneral
### UserSetting.AccessTokensSetting
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| access_tokens | [UserSetting.AccessTokensSetting.AccessToken](#slash-api-v1-UserSetting-AccessTokensSetting-AccessToken) | repeated | Nested repeated field |
<a name="slash-api-v1-UserSetting-AccessTokensSetting-AccessToken"></a>
### UserSetting.AccessTokensSetting.AccessToken
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| access_token | [string](#string) | | The access token is a JWT token, including expiration time, issuer, etc. |
| description | [string](#string) | | A description for the access token. |
<a name="slash-api-v1-UserSetting-GeneralSetting"></a>
### UserSetting.GeneralSetting
@ -1467,7 +1501,6 @@
| plan | [PlanType](#slash-api-v1-PlanType) | | The workspace plan. |
| enable_signup | [bool](#bool) | | Whether to enable other users to sign up. |
| custom_style | [string](#string) | | The custom style. |
| favicon_provider | [string](#string) | | The url of custom favicon provider. |
| owner | [string](#string) | | The owner name. Format: &#34;users/{id}&#34; |
@ -1483,12 +1516,8 @@
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| license_key | [string](#string) | | |
| enable_signup | [bool](#bool) | | Whether to enable other users to sign up. |
| instance_url | [string](#string) | | The instance URL. |
| custom_style | [string](#string) | | The custom style. |
| default_visibility | [Visibility](#slash-api-v1-Visibility) | | The default visibility of shortcuts and collections. |
| favicon_provider | [string](#string) | | The url of custom favicon provider. |

View File

@ -27,9 +27,9 @@ type UserSetting struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// id is the user id.
Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
General *UserSettingGeneral `protobuf:"bytes,2,opt,name=general,proto3" json:"general,omitempty"`
UserId int32 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
General *UserSetting_GeneralSetting `protobuf:"bytes,2,opt,name=general,proto3" json:"general,omitempty"`
AccessTokens *UserSetting_AccessTokensSetting `protobuf:"bytes,3,opt,name=access_tokens,json=accessTokens,proto3" json:"access_tokens,omitempty"`
}
func (x *UserSetting) Reset() {
@ -64,73 +64,25 @@ func (*UserSetting) Descriptor() ([]byte, []int) {
return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{0}
}
func (x *UserSetting) GetId() int32 {
func (x *UserSetting) GetUserId() int32 {
if x != nil {
return x.Id
return x.UserId
}
return 0
}
func (x *UserSetting) GetGeneral() *UserSettingGeneral {
func (x *UserSetting) GetGeneral() *UserSetting_GeneralSetting {
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 {
func (x *UserSetting) GetAccessTokens() *UserSetting_AccessTokensSetting {
if x != nil {
return x.Locale
return x.AccessTokens
}
return ""
}
func (x *UserSettingGeneral) GetColorTheme() string {
if x != nil {
return x.ColorTheme
}
return ""
return nil
}
type GetUserSettingRequest struct {
@ -145,7 +97,7 @@ type GetUserSettingRequest struct {
func (x *GetUserSettingRequest) Reset() {
*x = GetUserSettingRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_api_v1_user_setting_service_proto_msgTypes[2]
mi := &file_api_v1_user_setting_service_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -158,7 +110,7 @@ func (x *GetUserSettingRequest) String() string {
func (*GetUserSettingRequest) ProtoMessage() {}
func (x *GetUserSettingRequest) ProtoReflect() protoreflect.Message {
mi := &file_api_v1_user_setting_service_proto_msgTypes[2]
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 {
@ -171,7 +123,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{2}
return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{1}
}
func (x *GetUserSettingRequest) GetId() int32 {
@ -192,7 +144,7 @@ type GetUserSettingResponse struct {
func (x *GetUserSettingResponse) Reset() {
*x = GetUserSettingResponse{}
if protoimpl.UnsafeEnabled {
mi := &file_api_v1_user_setting_service_proto_msgTypes[3]
mi := &file_api_v1_user_setting_service_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -205,7 +157,7 @@ func (x *GetUserSettingResponse) String() string {
func (*GetUserSettingResponse) ProtoMessage() {}
func (x *GetUserSettingResponse) ProtoReflect() protoreflect.Message {
mi := &file_api_v1_user_setting_service_proto_msgTypes[3]
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 {
@ -218,7 +170,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{3}
return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{2}
}
func (x *GetUserSettingResponse) GetUserSetting() *UserSetting {
@ -244,7 +196,7 @@ type UpdateUserSettingRequest struct {
func (x *UpdateUserSettingRequest) Reset() {
*x = UpdateUserSettingRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_api_v1_user_setting_service_proto_msgTypes[4]
mi := &file_api_v1_user_setting_service_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -257,7 +209,7 @@ func (x *UpdateUserSettingRequest) String() string {
func (*UpdateUserSettingRequest) ProtoMessage() {}
func (x *UpdateUserSettingRequest) ProtoReflect() protoreflect.Message {
mi := &file_api_v1_user_setting_service_proto_msgTypes[4]
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 {
@ -270,7 +222,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{4}
return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{3}
}
func (x *UpdateUserSettingRequest) GetId() int32 {
@ -305,7 +257,7 @@ type UpdateUserSettingResponse struct {
func (x *UpdateUserSettingResponse) Reset() {
*x = UpdateUserSettingResponse{}
if protoimpl.UnsafeEnabled {
mi := &file_api_v1_user_setting_service_proto_msgTypes[5]
mi := &file_api_v1_user_setting_service_proto_msgTypes[4]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -318,7 +270,7 @@ func (x *UpdateUserSettingResponse) String() string {
func (*UpdateUserSettingResponse) ProtoMessage() {}
func (x *UpdateUserSettingResponse) ProtoReflect() protoreflect.Message {
mi := &file_api_v1_user_setting_service_proto_msgTypes[5]
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 {
@ -331,7 +283,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{5}
return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{4}
}
func (x *UpdateUserSettingResponse) GetUserSetting() *UserSetting {
@ -341,6 +293,165 @@ func (x *UpdateUserSettingResponse) GetUserSetting() *UserSetting {
return nil
}
type UserSetting_GeneralSetting 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 *UserSetting_GeneralSetting) Reset() {
*x = UserSetting_GeneralSetting{}
if protoimpl.UnsafeEnabled {
mi := &file_api_v1_user_setting_service_proto_msgTypes[5]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *UserSetting_GeneralSetting) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*UserSetting_GeneralSetting) ProtoMessage() {}
func (x *UserSetting_GeneralSetting) ProtoReflect() protoreflect.Message {
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 {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use UserSetting_GeneralSetting.ProtoReflect.Descriptor instead.
func (*UserSetting_GeneralSetting) Descriptor() ([]byte, []int) {
return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{0, 0}
}
func (x *UserSetting_GeneralSetting) GetLocale() string {
if x != nil {
return x.Locale
}
return ""
}
func (x *UserSetting_GeneralSetting) GetColorTheme() string {
if x != nil {
return x.ColorTheme
}
return ""
}
type UserSetting_AccessTokensSetting struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
AccessTokens []*UserSetting_AccessTokensSetting_AccessToken `protobuf:"bytes,1,rep,name=access_tokens,json=accessTokens,proto3" json:"access_tokens,omitempty"` // Nested repeated field
}
func (x *UserSetting_AccessTokensSetting) Reset() {
*x = UserSetting_AccessTokensSetting{}
if protoimpl.UnsafeEnabled {
mi := &file_api_v1_user_setting_service_proto_msgTypes[6]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *UserSetting_AccessTokensSetting) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*UserSetting_AccessTokensSetting) ProtoMessage() {}
func (x *UserSetting_AccessTokensSetting) ProtoReflect() protoreflect.Message {
mi := &file_api_v1_user_setting_service_proto_msgTypes[6]
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 UserSetting_AccessTokensSetting.ProtoReflect.Descriptor instead.
func (*UserSetting_AccessTokensSetting) Descriptor() ([]byte, []int) {
return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{0, 1}
}
func (x *UserSetting_AccessTokensSetting) GetAccessTokens() []*UserSetting_AccessTokensSetting_AccessToken {
if x != nil {
return x.AccessTokens
}
return nil
}
type UserSetting_AccessTokensSetting_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 *UserSetting_AccessTokensSetting_AccessToken) Reset() {
*x = UserSetting_AccessTokensSetting_AccessToken{}
if protoimpl.UnsafeEnabled {
mi := &file_api_v1_user_setting_service_proto_msgTypes[7]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *UserSetting_AccessTokensSetting_AccessToken) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*UserSetting_AccessTokensSetting_AccessToken) ProtoMessage() {}
func (x *UserSetting_AccessTokensSetting_AccessToken) ProtoReflect() protoreflect.Message {
mi := &file_api_v1_user_setting_service_proto_msgTypes[7]
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 UserSetting_AccessTokensSetting_AccessToken.ProtoReflect.Descriptor instead.
func (*UserSetting_AccessTokensSetting_AccessToken) Descriptor() ([]byte, []int) {
return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{0, 1, 0}
}
func (x *UserSetting_AccessTokensSetting_AccessToken) GetAccessToken() string {
if x != nil {
return x.AccessToken
}
return ""
}
func (x *UserSetting_AccessTokensSetting_AccessToken) GetDescription() string {
if x != nil {
return x.Description
}
return ""
}
var File_api_v1_user_setting_service_proto protoreflect.FileDescriptor
var file_api_v1_user_setting_service_proto_rawDesc = []byte{
@ -352,75 +463,94 @@ 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, 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, 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,
0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd5, 0x03, 0x0a, 0x0b, 0x55,
0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73,
0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x75, 0x73, 0x65,
0x72, 0x49, 0x64, 0x12, 0x42, 0x0a, 0x07, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x18, 0x02,
0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 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, 0x2e,
0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x07,
0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x12, 0x52, 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73,
0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d,
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, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73,
0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x61,
0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x1a, 0x49, 0x0a, 0x0e, 0x47,
0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 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, 0x1a, 0xc9, 0x01, 0x0a, 0x13, 0x41, 0x63, 0x63, 0x65, 0x73,
0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x5e,
0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18,
0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 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,
0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 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, 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 (
@ -435,31 +565,35 @@ 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, 6)
var file_api_v1_user_setting_service_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
var file_api_v1_user_setting_service_proto_goTypes = []any{
(*UserSetting)(nil), // 0: slash.api.v1.UserSetting
(*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
(*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
(*UserSetting_GeneralSetting)(nil), // 5: slash.api.v1.UserSetting.GeneralSetting
(*UserSetting_AccessTokensSetting)(nil), // 6: slash.api.v1.UserSetting.AccessTokensSetting
(*UserSetting_AccessTokensSetting_AccessToken)(nil), // 7: slash.api.v1.UserSetting.AccessTokensSetting.AccessToken
(*fieldmaskpb.FieldMask)(nil), // 8: google.protobuf.FieldMask
}
var file_api_v1_user_setting_service_proto_depIdxs = []int32{
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
5, // 0: slash.api.v1.UserSetting.general:type_name -> slash.api.v1.UserSetting.GeneralSetting
6, // 1: slash.api.v1.UserSetting.access_tokens:type_name -> slash.api.v1.UserSetting.AccessTokensSetting
0, // 2: slash.api.v1.GetUserSettingResponse.user_setting:type_name -> slash.api.v1.UserSetting
0, // 3: slash.api.v1.UpdateUserSettingRequest.user_setting:type_name -> slash.api.v1.UserSetting
8, // 4: slash.api.v1.UpdateUserSettingRequest.update_mask:type_name -> google.protobuf.FieldMask
0, // 5: slash.api.v1.UpdateUserSettingResponse.user_setting:type_name -> slash.api.v1.UserSetting
7, // 6: slash.api.v1.UserSetting.AccessTokensSetting.access_tokens:type_name -> slash.api.v1.UserSetting.AccessTokensSetting.AccessToken
1, // 7: slash.api.v1.UserSettingService.GetUserSetting:input_type -> slash.api.v1.GetUserSettingRequest
3, // 8: slash.api.v1.UserSettingService.UpdateUserSetting:input_type -> slash.api.v1.UpdateUserSettingRequest
2, // 9: slash.api.v1.UserSettingService.GetUserSetting:output_type -> slash.api.v1.GetUserSettingResponse
4, // 10: slash.api.v1.UserSettingService.UpdateUserSetting:output_type -> slash.api.v1.UpdateUserSettingResponse
9, // [9:11] is the sub-list for method output_type
7, // [7:9] is the sub-list for method input_type
7, // [7:7] is the sub-list for extension type_name
7, // [7:7] is the sub-list for extension extendee
0, // [0:7] is the sub-list for field type_name
}
func init() { file_api_v1_user_setting_service_proto_init() }
@ -481,18 +615,6 @@ 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.(*UserSettingGeneral); 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[2].Exporter = func(v any, i int) any {
switch v := v.(*GetUserSettingRequest); i {
case 0:
return &v.state
@ -504,7 +626,7 @@ func file_api_v1_user_setting_service_proto_init() {
return nil
}
}
file_api_v1_user_setting_service_proto_msgTypes[3].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 {
case 0:
return &v.state
@ -516,7 +638,7 @@ func file_api_v1_user_setting_service_proto_init() {
return nil
}
}
file_api_v1_user_setting_service_proto_msgTypes[4].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 {
case 0:
return &v.state
@ -528,7 +650,7 @@ func file_api_v1_user_setting_service_proto_init() {
return nil
}
}
file_api_v1_user_setting_service_proto_msgTypes[5].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.(*UpdateUserSettingResponse); i {
case 0:
return &v.state
@ -540,6 +662,42 @@ func file_api_v1_user_setting_service_proto_init() {
return nil
}
}
file_api_v1_user_setting_service_proto_msgTypes[5].Exporter = func(v any, i int) any {
switch v := v.(*UserSetting_GeneralSetting); 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[6].Exporter = func(v any, i int) any {
switch v := v.(*UserSetting_AccessTokensSetting); 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[7].Exporter = func(v any, i int) any {
switch v := v.(*UserSetting_AccessTokensSetting_AccessToken); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
}
type x struct{}
out := protoimpl.TypeBuilder{
@ -547,7 +705,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: 6,
NumMessages: 8,
NumExtensions: 0,
NumServices: 1,
},

View File

@ -37,11 +37,9 @@ type WorkspaceProfile struct {
EnableSignup bool `protobuf:"varint,4,opt,name=enable_signup,json=enableSignup,proto3" json:"enable_signup,omitempty"`
// The custom style.
CustomStyle string `protobuf:"bytes,5,opt,name=custom_style,json=customStyle,proto3" json:"custom_style,omitempty"`
// The url of custom favicon provider.
FaviconProvider string `protobuf:"bytes,7,opt,name=favicon_provider,json=faviconProvider,proto3" json:"favicon_provider,omitempty"`
// The owner name.
// Format: "users/{id}"
Owner string `protobuf:"bytes,8,opt,name=owner,proto3" json:"owner,omitempty"`
Owner string `protobuf:"bytes,6,opt,name=owner,proto3" json:"owner,omitempty"`
}
func (x *WorkspaceProfile) Reset() {
@ -111,13 +109,6 @@ func (x *WorkspaceProfile) GetCustomStyle() string {
return ""
}
func (x *WorkspaceProfile) GetFaviconProvider() string {
if x != nil {
return x.FaviconProvider
}
return ""
}
func (x *WorkspaceProfile) GetOwner() string {
if x != nil {
return x.Owner
@ -130,17 +121,10 @@ type WorkspaceSetting struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
LicenseKey string `protobuf:"bytes,1,opt,name=license_key,json=licenseKey,proto3" json:"license_key,omitempty"`
// Whether to enable other users to sign up.
EnableSignup bool `protobuf:"varint,2,opt,name=enable_signup,json=enableSignup,proto3" json:"enable_signup,omitempty"`
// The instance URL.
InstanceUrl string `protobuf:"bytes,3,opt,name=instance_url,json=instanceUrl,proto3" json:"instance_url,omitempty"`
// The custom style.
CustomStyle string `protobuf:"bytes,4,opt,name=custom_style,json=customStyle,proto3" json:"custom_style,omitempty"`
CustomStyle string `protobuf:"bytes,1,opt,name=custom_style,json=customStyle,proto3" json:"custom_style,omitempty"`
// The default visibility of shortcuts and collections.
DefaultVisibility Visibility `protobuf:"varint,7,opt,name=default_visibility,json=defaultVisibility,proto3,enum=slash.api.v1.Visibility" json:"default_visibility,omitempty"`
// The url of custom favicon provider.
FaviconProvider string `protobuf:"bytes,8,opt,name=favicon_provider,json=faviconProvider,proto3" json:"favicon_provider,omitempty"`
DefaultVisibility Visibility `protobuf:"varint,2,opt,name=default_visibility,json=defaultVisibility,proto3,enum=slash.api.v1.Visibility" json:"default_visibility,omitempty"`
}
func (x *WorkspaceSetting) Reset() {
@ -175,27 +159,6 @@ func (*WorkspaceSetting) Descriptor() ([]byte, []int) {
return file_api_v1_workspace_service_proto_rawDescGZIP(), []int{1}
}
func (x *WorkspaceSetting) GetLicenseKey() string {
if x != nil {
return x.LicenseKey
}
return ""
}
func (x *WorkspaceSetting) GetEnableSignup() bool {
if x != nil {
return x.EnableSignup
}
return false
}
func (x *WorkspaceSetting) GetInstanceUrl() string {
if x != nil {
return x.InstanceUrl
}
return ""
}
func (x *WorkspaceSetting) GetCustomStyle() string {
if x != nil {
return x.CustomStyle
@ -210,13 +173,6 @@ func (x *WorkspaceSetting) GetDefaultVisibility() Visibility {
return Visibility_VISIBILITY_UNSPECIFIED
}
func (x *WorkspaceSetting) GetFaviconProvider() string {
if x != nil {
return x.FaviconProvider
}
return ""
}
type GetWorkspaceProfileRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@ -509,7 +465,7 @@ var file_api_v1_workspace_service_proto_rawDesc = []byte{
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,
0xf5, 0x01, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x72, 0x6f,
0xca, 0x01, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x72, 0x6f,
0x66, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01,
0x28, 0x09, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73,
0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69,
@ -520,28 +476,16 @@ var file_api_v1_workspace_service_proto_rawDesc = []byte{
0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x67,
0x6e, 0x75, 0x70, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x73, 0x74,
0x79, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f,
0x6d, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f,
0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09,
0x52, 0x0f, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65,
0x72, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09,
0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x22, 0x92, 0x02, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b,
0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x1f, 0x0a, 0x0b,
0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28,
0x09, 0x52, 0x0a, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a,
0x0d, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x75, 0x70, 0x18, 0x02,
0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x67, 0x6e,
0x75, 0x70, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x75,
0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e,
0x63, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f,
0x73, 0x74, 0x79, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x75, 0x73,
0x74, 0x6f, 0x6d, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x12, 0x47, 0x0a, 0x12, 0x64, 0x65, 0x66, 0x61,
0x75, 0x6c, 0x74, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x07,
0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69,
0x2e, 0x76, 0x31, 0x2e, 0x56, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x11,
0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74,
0x79, 0x12, 0x29, 0x0a, 0x10, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f,
0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x66, 0x61, 0x76,
0x69, 0x63, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x1c, 0x0a, 0x1a,
0x6d, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18,
0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x22, 0x7e, 0x0a, 0x10,
0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67,
0x12, 0x21, 0x0a, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65,
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x53, 0x74,
0x79, 0x6c, 0x65, 0x12, 0x47, 0x0a, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76,
0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32,
0x18, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56,
0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x11, 0x64, 0x65, 0x66, 0x61, 0x75,
0x6c, 0x74, 0x56, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0x1c, 0x0a, 0x1a,
0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x66,
0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x57, 0x0a, 0x1b, 0x47, 0x65,
0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c,

View File

@ -807,13 +807,32 @@ definitions:
apiv1UserSetting:
type: object
properties:
id:
userId:
type: integer
format: int32
description: id is the user id.
general:
$ref: '#/definitions/apiv1UserSettingGeneral'
apiv1UserSettingGeneral:
$ref: '#/definitions/apiv1UserSettingGeneralSetting'
accessTokens:
$ref: '#/definitions/apiv1UserSettingAccessTokensSetting'
apiv1UserSettingAccessTokensSetting:
type: object
properties:
accessTokens:
type: array
items:
type: object
$ref: '#/definitions/apiv1UserSettingAccessTokensSettingAccessToken'
title: Nested repeated field
apiv1UserSettingAccessTokensSettingAccessToken:
type: object
properties:
accessToken:
type: string
description: The access token is a JWT token, including expiration time, issuer, etc.
description:
type: string
description: A description for the access token.
apiv1UserSettingGeneralSetting:
type: object
properties:
locale:
@ -831,23 +850,12 @@ definitions:
apiv1WorkspaceSetting:
type: object
properties:
licenseKey:
type: string
enableSignup:
type: boolean
description: Whether to enable other users to sign up.
instanceUrl:
type: string
description: The instance URL.
customStyle:
type: string
description: The custom style.
defaultVisibility:
$ref: '#/definitions/apiv1Visibility'
description: The default visibility of shortcuts and collections.
faviconProvider:
type: string
description: The url of custom favicon provider.
protobufAny:
type: object
properties:
@ -1128,9 +1136,6 @@ definitions:
customStyle:
type: string
description: The custom style.
faviconProvider:
type: string
description: The url of custom favicon provider.
owner:
type: string
title: |-

View File

@ -20,14 +20,16 @@
- [store/user_setting.proto](#store_user_setting-proto)
- [UserSetting](#slash-store-UserSetting)
- [UserSettingAccessTokens](#slash-store-UserSettingAccessTokens)
- [UserSettingAccessTokens.AccessToken](#slash-store-UserSettingAccessTokens-AccessToken)
- [UserSettingGeneral](#slash-store-UserSettingGeneral)
- [UserSetting.AccessTokensSetting](#slash-store-UserSetting-AccessTokensSetting)
- [UserSetting.AccessTokensSetting.AccessToken](#slash-store-UserSetting-AccessTokensSetting-AccessToken)
- [UserSetting.GeneralSetting](#slash-store-UserSetting-GeneralSetting)
- [UserSettingKey](#slash-store-UserSettingKey)
- [store/workspace_setting.proto](#store_workspace_setting-proto)
- [WorkspaceSetting](#slash-store-WorkspaceSetting)
- [WorkspaceSetting.GeneralSetting](#slash-store-WorkspaceSetting-GeneralSetting)
- [WorkspaceSetting.ShortcutRelatedSetting](#slash-store-WorkspaceSetting-ShortcutRelatedSetting)
- [WorkspaceSettingKey](#slash-store-WorkspaceSettingKey)
@ -242,38 +244,38 @@
| ----- | ---- | ----- | ----------- |
| user_id | [int32](#int32) | | |
| key | [UserSettingKey](#slash-store-UserSettingKey) | | |
| general | [UserSettingGeneral](#slash-store-UserSettingGeneral) | | |
| access_tokens | [UserSettingAccessTokens](#slash-store-UserSettingAccessTokens) | | |
| general | [UserSetting.GeneralSetting](#slash-store-UserSetting-GeneralSetting) | | |
| access_tokens | [UserSetting.AccessTokensSetting](#slash-store-UserSetting-AccessTokensSetting) | | |
<a name="slash-store-UserSettingAccessTokens"></a>
<a name="slash-store-UserSetting-AccessTokensSetting"></a>
### UserSettingAccessTokens
### UserSetting.AccessTokensSetting
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| access_tokens | [UserSettingAccessTokens.AccessToken](#slash-store-UserSettingAccessTokens-AccessToken) | repeated | |
| access_tokens | [UserSetting.AccessTokensSetting.AccessToken](#slash-store-UserSetting-AccessTokensSetting-AccessToken) | repeated | Nested repeated field |
<a name="slash-store-UserSettingAccessTokens-AccessToken"></a>
<a name="slash-store-UserSetting-AccessTokensSetting-AccessToken"></a>
### UserSettingAccessTokens.AccessToken
### UserSetting.AccessTokensSetting.AccessToken
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| access_token | [string](#string) | | The access token is a JWT token. Including expiration time, issuer, etc. |
| access_token | [string](#string) | | The access token is a JWT token, including expiration time, issuer, etc. |
| description | [string](#string) | | A description for the access token. |
@ -281,9 +283,9 @@
<a name="slash-store-UserSettingGeneral"></a>
<a name="slash-store-UserSetting-GeneralSetting"></a>
### UserSettingGeneral
### UserSetting.GeneralSetting
@ -307,8 +309,8 @@
| Name | Number | Description |
| ---- | ------ | ----------- |
| USER_SETTING_KEY_UNSPECIFIED | 0 | |
| GENERAL | 1 | General settings for the user. |
| ACCESS_TOKENS | 2 | Access tokens for the user. |
| USER_SETTING_GENERAL | 1 | User general settings. |
| USER_SETTING_ACCESS_TOKENS | 2 | User access tokens. |
@ -335,13 +337,41 @@
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| key | [WorkspaceSettingKey](#slash-store-WorkspaceSettingKey) | | |
| license_key | [string](#string) | | The license key of workspace. |
| secret_session | [string](#string) | | The secret session key used to encrypt session data. |
| enable_signup | [bool](#bool) | | Whether to enable other users to sign up. |
| custom_style | [string](#string) | | The custom style. |
| instance_url | [string](#string) | | The instance URL of workspace. |
| default_visibility | [Visibility](#slash-store-Visibility) | | The default visibility of shortcuts and collections. |
| favicon_provider | [string](#string) | | The url of custom favicon provider. e.g. https://github.com/yourselfhosted/favicons |
| raw | [string](#string) | | |
| general | [WorkspaceSetting.GeneralSetting](#slash-store-WorkspaceSetting-GeneralSetting) | | |
| shortcut_related | [WorkspaceSetting.ShortcutRelatedSetting](#slash-store-WorkspaceSetting-ShortcutRelatedSetting) | | |
<a name="slash-store-WorkspaceSetting-GeneralSetting"></a>
### WorkspaceSetting.GeneralSetting
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| secret_session | [string](#string) | | |
| license_key | [string](#string) | | |
| custom_style | [string](#string) | | |
<a name="slash-store-WorkspaceSetting-ShortcutRelatedSetting"></a>
### WorkspaceSetting.ShortcutRelatedSetting
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| default_visibility | [Visibility](#slash-store-Visibility) | | |
@ -358,13 +388,12 @@
| Name | Number | Description |
| ---- | ------ | ----------- |
| WORKSPACE_SETTING_KEY_UNSPECIFIED | 0 | |
| WORKSPACE_SETTING_LICENSE_KEY | 1 | The license key. |
| WORKSPACE_SETTING_SECRET_SESSION | 2 | The secret session key used to encrypt session data. |
| WORKSAPCE_SETTING_ENABLE_SIGNUP | 3 | Whether to enable other users to sign up. |
| WORKSPACE_SETTING_CUSTOM_STYLE | 4 | The custom style. |
| WORKSPACE_SETTING_INSTANCE_URL | 7 | The instance URL. |
| WORKSPACE_SETTING_DEFAULT_VISIBILITY | 8 | The default visibility of shortcuts and collections. |
| WORKSPACE_SETTING_FAVICON_PROVIDER | 9 | The url of custom favicon provider. |
| WORKSPACE_SETTING_GENERAL | 1 | Workspace general settings. |
| WORKSPACE_SETTING_SHORTCUT_RELATED | 2 | Workspace shortcut-related settings. |
| WORKSPACE_SETTING_LICENSE_KEY | 3 | TODO: remove the following keys. The license key. |
| WORKSPACE_SETTING_SECRET_SESSION | 4 | The secret session key used to encrypt session data. |
| WORKSPACE_SETTING_CUSTOM_STYLE | 5 | The custom style. |
| WORKSPACE_SETTING_DEFAULT_VISIBILITY | 6 | The default visibility of shortcuts and collections. |

View File

@ -24,23 +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 = 2
// User general settings.
UserSettingKey_USER_SETTING_GENERAL UserSettingKey = 1
// User access tokens.
UserSettingKey_USER_SETTING_ACCESS_TOKENS UserSettingKey = 2
)
// Enum value maps for UserSettingKey.
var (
UserSettingKey_name = map[int32]string{
0: "USER_SETTING_KEY_UNSPECIFIED",
1: "GENERAL",
2: "ACCESS_TOKENS",
1: "USER_SETTING_GENERAL",
2: "USER_SETTING_ACCESS_TOKENS",
}
UserSettingKey_value = map[string]int32{
"USER_SETTING_KEY_UNSPECIFIED": 0,
"GENERAL": 1,
"ACCESS_TOKENS": 2,
"USER_SETTING_GENERAL": 1,
"USER_SETTING_ACCESS_TOKENS": 2,
}
)
@ -138,14 +138,14 @@ func (m *UserSetting) GetValue() isUserSetting_Value {
return nil
}
func (x *UserSetting) GetGeneral() *UserSettingGeneral {
func (x *UserSetting) GetGeneral() *UserSetting_GeneralSetting {
if x, ok := x.GetValue().(*UserSetting_General); ok {
return x.General
}
return nil
}
func (x *UserSetting) GetAccessTokens() *UserSettingAccessTokens {
func (x *UserSetting) GetAccessTokens() *UserSetting_AccessTokensSetting {
if x, ok := x.GetValue().(*UserSetting_AccessTokens); ok {
return x.AccessTokens
}
@ -157,18 +157,18 @@ type isUserSetting_Value interface {
}
type UserSetting_General struct {
General *UserSettingGeneral `protobuf:"bytes,3,opt,name=general,proto3,oneof"`
General *UserSetting_GeneralSetting `protobuf:"bytes,3,opt,name=general,proto3,oneof"`
}
type UserSetting_AccessTokens struct {
AccessTokens *UserSettingAccessTokens `protobuf:"bytes,4,opt,name=access_tokens,json=accessTokens,proto3,oneof"`
AccessTokens *UserSetting_AccessTokensSetting `protobuf:"bytes,4,opt,name=access_tokens,json=accessTokens,proto3,oneof"`
}
func (*UserSetting_General) isUserSetting_Value() {}
func (*UserSetting_AccessTokens) isUserSetting_Value() {}
type UserSettingGeneral struct {
type UserSetting_GeneralSetting struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
@ -177,8 +177,8 @@ type UserSettingGeneral struct {
ColorTheme string `protobuf:"bytes,2,opt,name=color_theme,json=colorTheme,proto3" json:"color_theme,omitempty"`
}
func (x *UserSettingGeneral) Reset() {
*x = UserSettingGeneral{}
func (x *UserSetting_GeneralSetting) Reset() {
*x = UserSetting_GeneralSetting{}
if protoimpl.UnsafeEnabled {
mi := &file_store_user_setting_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@ -186,13 +186,13 @@ func (x *UserSettingGeneral) Reset() {
}
}
func (x *UserSettingGeneral) String() string {
func (x *UserSetting_GeneralSetting) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*UserSettingGeneral) ProtoMessage() {}
func (*UserSetting_GeneralSetting) ProtoMessage() {}
func (x *UserSettingGeneral) ProtoReflect() protoreflect.Message {
func (x *UserSetting_GeneralSetting) ProtoReflect() protoreflect.Message {
mi := &file_store_user_setting_proto_msgTypes[1]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@ -204,35 +204,35 @@ func (x *UserSettingGeneral) ProtoReflect() protoreflect.Message {
return mi.MessageOf(x)
}
// Deprecated: Use UserSettingGeneral.ProtoReflect.Descriptor instead.
func (*UserSettingGeneral) Descriptor() ([]byte, []int) {
return file_store_user_setting_proto_rawDescGZIP(), []int{1}
// Deprecated: Use UserSetting_GeneralSetting.ProtoReflect.Descriptor instead.
func (*UserSetting_GeneralSetting) Descriptor() ([]byte, []int) {
return file_store_user_setting_proto_rawDescGZIP(), []int{0, 0}
}
func (x *UserSettingGeneral) GetLocale() string {
func (x *UserSetting_GeneralSetting) GetLocale() string {
if x != nil {
return x.Locale
}
return ""
}
func (x *UserSettingGeneral) GetColorTheme() string {
func (x *UserSetting_GeneralSetting) GetColorTheme() string {
if x != nil {
return x.ColorTheme
}
return ""
}
type UserSettingAccessTokens struct {
type UserSetting_AccessTokensSetting struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
AccessTokens []*UserSettingAccessTokens_AccessToken `protobuf:"bytes,1,rep,name=access_tokens,json=accessTokens,proto3" json:"access_tokens,omitempty"`
AccessTokens []*UserSetting_AccessTokensSetting_AccessToken `protobuf:"bytes,1,rep,name=access_tokens,json=accessTokens,proto3" json:"access_tokens,omitempty"` // Nested repeated field
}
func (x *UserSettingAccessTokens) Reset() {
*x = UserSettingAccessTokens{}
func (x *UserSetting_AccessTokensSetting) Reset() {
*x = UserSetting_AccessTokensSetting{}
if protoimpl.UnsafeEnabled {
mi := &file_store_user_setting_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@ -240,13 +240,13 @@ func (x *UserSettingAccessTokens) Reset() {
}
}
func (x *UserSettingAccessTokens) String() string {
func (x *UserSetting_AccessTokensSetting) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*UserSettingAccessTokens) ProtoMessage() {}
func (*UserSetting_AccessTokensSetting) ProtoMessage() {}
func (x *UserSettingAccessTokens) ProtoReflect() protoreflect.Message {
func (x *UserSetting_AccessTokensSetting) ProtoReflect() protoreflect.Message {
mi := &file_store_user_setting_proto_msgTypes[2]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@ -258,32 +258,31 @@ func (x *UserSettingAccessTokens) ProtoReflect() protoreflect.Message {
return mi.MessageOf(x)
}
// Deprecated: Use UserSettingAccessTokens.ProtoReflect.Descriptor instead.
func (*UserSettingAccessTokens) Descriptor() ([]byte, []int) {
return file_store_user_setting_proto_rawDescGZIP(), []int{2}
// Deprecated: Use UserSetting_AccessTokensSetting.ProtoReflect.Descriptor instead.
func (*UserSetting_AccessTokensSetting) Descriptor() ([]byte, []int) {
return file_store_user_setting_proto_rawDescGZIP(), []int{0, 1}
}
func (x *UserSettingAccessTokens) GetAccessTokens() []*UserSettingAccessTokens_AccessToken {
func (x *UserSetting_AccessTokensSetting) GetAccessTokens() []*UserSetting_AccessTokensSetting_AccessToken {
if x != nil {
return x.AccessTokens
}
return nil
}
type UserSettingAccessTokens_AccessToken struct {
type UserSetting_AccessTokensSetting_AccessToken struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// The access token is a JWT token.
// Including expiration time, issuer, etc.
// 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{}
func (x *UserSetting_AccessTokensSetting_AccessToken) Reset() {
*x = UserSetting_AccessTokensSetting_AccessToken{}
if protoimpl.UnsafeEnabled {
mi := &file_store_user_setting_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@ -291,13 +290,13 @@ func (x *UserSettingAccessTokens_AccessToken) Reset() {
}
}
func (x *UserSettingAccessTokens_AccessToken) String() string {
func (x *UserSetting_AccessTokensSetting_AccessToken) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*UserSettingAccessTokens_AccessToken) ProtoMessage() {}
func (*UserSetting_AccessTokensSetting_AccessToken) ProtoMessage() {}
func (x *UserSettingAccessTokens_AccessToken) ProtoReflect() protoreflect.Message {
func (x *UserSetting_AccessTokensSetting_AccessToken) ProtoReflect() protoreflect.Message {
mi := &file_store_user_setting_proto_msgTypes[3]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@ -309,19 +308,19 @@ func (x *UserSettingAccessTokens_AccessToken) ProtoReflect() protoreflect.Messag
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}
// Deprecated: Use UserSetting_AccessTokensSetting_AccessToken.ProtoReflect.Descriptor instead.
func (*UserSetting_AccessTokensSetting_AccessToken) Descriptor() ([]byte, []int) {
return file_store_user_setting_proto_rawDescGZIP(), []int{0, 1, 0}
}
func (x *UserSettingAccessTokens_AccessToken) GetAccessToken() string {
func (x *UserSetting_AccessTokensSetting_AccessToken) GetAccessToken() string {
if x != nil {
return x.AccessToken
}
return ""
}
func (x *UserSettingAccessTokens_AccessToken) GetDescription() string {
func (x *UserSetting_AccessTokensSetting_AccessToken) GetDescription() string {
if x != nil {
return x.Description
}
@ -333,55 +332,58 @@ var File_store_user_setting_proto protoreflect.FileDescriptor
var file_store_user_setting_proto_rawDesc = []byte{
0x0a, 0x18, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74,
0x74, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0b, 0x73, 0x6c, 0x61, 0x73,
0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x22, 0xe8, 0x01, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72,
0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x22, 0x8e, 0x04, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72,
0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f,
0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64,
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,
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,
0x43, 0x0a, 0x07, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
0x32, 0x27, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x55,
0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72,
0x61, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x07, 0x67, 0x65, 0x6e,
0x65, 0x72, 0x61, 0x6c, 0x12, 0x53, 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74,
0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x73, 0x6c,
0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65,
0x74, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65,
0x6e, 0x73, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x63, 0x63,
0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x1a, 0x49, 0x0a, 0x0e, 0x47, 0x65, 0x6e,
0x65, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 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, 0x1a, 0xc8, 0x01, 0x0a, 0x13, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54,
0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x5d, 0x0a, 0x0d,
0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20,
0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72,
0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x41, 0x63,
0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 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, 0x42,
0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x6c, 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,
0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14,
0x55, 0x53, 0x45, 0x52, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x47, 0x45, 0x4e,
0x45, 0x52, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x53,
0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 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 (
@ -401,15 +403,15 @@ 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
(*UserSettingGeneral)(nil), // 2: slash.store.UserSettingGeneral
(*UserSettingAccessTokens)(nil), // 3: slash.store.UserSettingAccessTokens
(*UserSettingAccessTokens_AccessToken)(nil), // 4: slash.store.UserSettingAccessTokens.AccessToken
(*UserSetting_GeneralSetting)(nil), // 2: slash.store.UserSetting.GeneralSetting
(*UserSetting_AccessTokensSetting)(nil), // 3: slash.store.UserSetting.AccessTokensSetting
(*UserSetting_AccessTokensSetting_AccessToken)(nil), // 4: slash.store.UserSetting.AccessTokensSetting.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.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
2, // 1: slash.store.UserSetting.general:type_name -> slash.store.UserSetting.GeneralSetting
3, // 2: slash.store.UserSetting.access_tokens:type_name -> slash.store.UserSetting.AccessTokensSetting
4, // 3: slash.store.UserSetting.AccessTokensSetting.access_tokens:type_name -> slash.store.UserSetting.AccessTokensSetting.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
@ -436,7 +438,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.(*UserSettingGeneral); i {
switch v := v.(*UserSetting_GeneralSetting); i {
case 0:
return &v.state
case 1:
@ -448,7 +450,7 @@ func file_store_user_setting_proto_init() {
}
}
file_store_user_setting_proto_msgTypes[2].Exporter = func(v any, i int) any {
switch v := v.(*UserSettingAccessTokens); i {
switch v := v.(*UserSetting_AccessTokensSetting); i {
case 0:
return &v.state
case 1:
@ -460,7 +462,7 @@ func file_store_user_setting_proto_init() {
}
}
file_store_user_setting_proto_msgTypes[3].Exporter = func(v any, i int) any {
switch v := v.(*UserSettingAccessTokens_AccessToken); i {
switch v := v.(*UserSetting_AccessTokensSetting_AccessToken); i {
case 0:
return &v.state
case 1:

View File

@ -24,43 +24,40 @@ type WorkspaceSettingKey int32
const (
WorkspaceSettingKey_WORKSPACE_SETTING_KEY_UNSPECIFIED WorkspaceSettingKey = 0
// Workspace general settings.
WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL WorkspaceSettingKey = 1
// Workspace shortcut-related settings.
WorkspaceSettingKey_WORKSPACE_SETTING_SHORTCUT_RELATED WorkspaceSettingKey = 2
// TODO: remove the following keys.
// The license key.
WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY WorkspaceSettingKey = 1
WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY WorkspaceSettingKey = 3
// The secret session key used to encrypt session data.
WorkspaceSettingKey_WORKSPACE_SETTING_SECRET_SESSION WorkspaceSettingKey = 2
// Whether to enable other users to sign up.
WorkspaceSettingKey_WORKSAPCE_SETTING_ENABLE_SIGNUP WorkspaceSettingKey = 3
WorkspaceSettingKey_WORKSPACE_SETTING_SECRET_SESSION WorkspaceSettingKey = 4
// The custom style.
WorkspaceSettingKey_WORKSPACE_SETTING_CUSTOM_STYLE WorkspaceSettingKey = 4
// The instance URL.
WorkspaceSettingKey_WORKSPACE_SETTING_INSTANCE_URL WorkspaceSettingKey = 7
WorkspaceSettingKey_WORKSPACE_SETTING_CUSTOM_STYLE WorkspaceSettingKey = 5
// The default visibility of shortcuts and collections.
WorkspaceSettingKey_WORKSPACE_SETTING_DEFAULT_VISIBILITY WorkspaceSettingKey = 8
// The url of custom favicon provider.
WorkspaceSettingKey_WORKSPACE_SETTING_FAVICON_PROVIDER WorkspaceSettingKey = 9
WorkspaceSettingKey_WORKSPACE_SETTING_DEFAULT_VISIBILITY WorkspaceSettingKey = 6
)
// Enum value maps for WorkspaceSettingKey.
var (
WorkspaceSettingKey_name = map[int32]string{
0: "WORKSPACE_SETTING_KEY_UNSPECIFIED",
1: "WORKSPACE_SETTING_LICENSE_KEY",
2: "WORKSPACE_SETTING_SECRET_SESSION",
3: "WORKSAPCE_SETTING_ENABLE_SIGNUP",
4: "WORKSPACE_SETTING_CUSTOM_STYLE",
7: "WORKSPACE_SETTING_INSTANCE_URL",
8: "WORKSPACE_SETTING_DEFAULT_VISIBILITY",
9: "WORKSPACE_SETTING_FAVICON_PROVIDER",
1: "WORKSPACE_SETTING_GENERAL",
2: "WORKSPACE_SETTING_SHORTCUT_RELATED",
3: "WORKSPACE_SETTING_LICENSE_KEY",
4: "WORKSPACE_SETTING_SECRET_SESSION",
5: "WORKSPACE_SETTING_CUSTOM_STYLE",
6: "WORKSPACE_SETTING_DEFAULT_VISIBILITY",
}
WorkspaceSettingKey_value = map[string]int32{
"WORKSPACE_SETTING_KEY_UNSPECIFIED": 0,
"WORKSPACE_SETTING_LICENSE_KEY": 1,
"WORKSPACE_SETTING_SECRET_SESSION": 2,
"WORKSAPCE_SETTING_ENABLE_SIGNUP": 3,
"WORKSPACE_SETTING_CUSTOM_STYLE": 4,
"WORKSPACE_SETTING_INSTANCE_URL": 7,
"WORKSPACE_SETTING_DEFAULT_VISIBILITY": 8,
"WORKSPACE_SETTING_FAVICON_PROVIDER": 9,
"WORKSPACE_SETTING_GENERAL": 1,
"WORKSPACE_SETTING_SHORTCUT_RELATED": 2,
"WORKSPACE_SETTING_LICENSE_KEY": 3,
"WORKSPACE_SETTING_SECRET_SESSION": 4,
"WORKSPACE_SETTING_CUSTOM_STYLE": 5,
"WORKSPACE_SETTING_DEFAULT_VISIBILITY": 6,
}
)
@ -97,15 +94,11 @@ type WorkspaceSetting struct {
unknownFields protoimpl.UnknownFields
Key WorkspaceSettingKey `protobuf:"varint,1,opt,name=key,proto3,enum=slash.store.WorkspaceSettingKey" json:"key,omitempty"`
Raw string `protobuf:"bytes,4,opt,name=raw,proto3" json:"raw,omitempty"`
// Types that are assignable to Value:
//
// *WorkspaceSetting_LicenseKey
// *WorkspaceSetting_SecretSession
// *WorkspaceSetting_EnableSignup
// *WorkspaceSetting_CustomStyle
// *WorkspaceSetting_InstanceUrl
// *WorkspaceSetting_DefaultVisibility
// *WorkspaceSetting_FaviconProvider
// *WorkspaceSetting_General
// *WorkspaceSetting_ShortcutRelated
Value isWorkspaceSetting_Value `protobuf_oneof:"value"`
}
@ -148,6 +141,13 @@ func (x *WorkspaceSetting) GetKey() WorkspaceSettingKey {
return WorkspaceSettingKey_WORKSPACE_SETTING_KEY_UNSPECIFIED
}
func (x *WorkspaceSetting) GetRaw() string {
if x != nil {
return x.Raw
}
return ""
}
func (m *WorkspaceSetting) GetValue() isWorkspaceSetting_Value {
if m != nil {
return m.Value
@ -155,107 +155,145 @@ func (m *WorkspaceSetting) GetValue() isWorkspaceSetting_Value {
return nil
}
func (x *WorkspaceSetting) GetLicenseKey() string {
if x, ok := x.GetValue().(*WorkspaceSetting_LicenseKey); ok {
return x.LicenseKey
func (x *WorkspaceSetting) GetGeneral() *WorkspaceSetting_GeneralSetting {
if x, ok := x.GetValue().(*WorkspaceSetting_General); ok {
return x.General
}
return ""
return nil
}
func (x *WorkspaceSetting) GetSecretSession() string {
if x, ok := x.GetValue().(*WorkspaceSetting_SecretSession); ok {
return x.SecretSession
func (x *WorkspaceSetting) GetShortcutRelated() *WorkspaceSetting_ShortcutRelatedSetting {
if x, ok := x.GetValue().(*WorkspaceSetting_ShortcutRelated); ok {
return x.ShortcutRelated
}
return ""
}
func (x *WorkspaceSetting) GetEnableSignup() bool {
if x, ok := x.GetValue().(*WorkspaceSetting_EnableSignup); ok {
return x.EnableSignup
}
return false
}
func (x *WorkspaceSetting) GetCustomStyle() string {
if x, ok := x.GetValue().(*WorkspaceSetting_CustomStyle); ok {
return x.CustomStyle
}
return ""
}
func (x *WorkspaceSetting) GetInstanceUrl() string {
if x, ok := x.GetValue().(*WorkspaceSetting_InstanceUrl); ok {
return x.InstanceUrl
}
return ""
}
func (x *WorkspaceSetting) GetDefaultVisibility() Visibility {
if x, ok := x.GetValue().(*WorkspaceSetting_DefaultVisibility); ok {
return x.DefaultVisibility
}
return Visibility_VISIBILITY_UNSPECIFIED
}
func (x *WorkspaceSetting) GetFaviconProvider() string {
if x, ok := x.GetValue().(*WorkspaceSetting_FaviconProvider); ok {
return x.FaviconProvider
}
return ""
return nil
}
type isWorkspaceSetting_Value interface {
isWorkspaceSetting_Value()
}
type WorkspaceSetting_LicenseKey struct {
// The license key of workspace.
LicenseKey string `protobuf:"bytes,2,opt,name=license_key,json=licenseKey,proto3,oneof"`
type WorkspaceSetting_General struct {
General *WorkspaceSetting_GeneralSetting `protobuf:"bytes,2,opt,name=general,proto3,oneof"`
}
type WorkspaceSetting_SecretSession struct {
// The secret session key used to encrypt session data.
SecretSession string `protobuf:"bytes,3,opt,name=secret_session,json=secretSession,proto3,oneof"`
type WorkspaceSetting_ShortcutRelated struct {
ShortcutRelated *WorkspaceSetting_ShortcutRelatedSetting `protobuf:"bytes,3,opt,name=shortcut_related,json=shortcutRelated,proto3,oneof"`
}
type WorkspaceSetting_EnableSignup struct {
// Whether to enable other users to sign up.
EnableSignup bool `protobuf:"varint,4,opt,name=enable_signup,json=enableSignup,proto3,oneof"`
func (*WorkspaceSetting_General) isWorkspaceSetting_Value() {}
func (*WorkspaceSetting_ShortcutRelated) isWorkspaceSetting_Value() {}
type WorkspaceSetting_GeneralSetting struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
SecretSession string `protobuf:"bytes,1,opt,name=secret_session,json=secretSession,proto3" json:"secret_session,omitempty"`
LicenseKey string `protobuf:"bytes,2,opt,name=license_key,json=licenseKey,proto3" json:"license_key,omitempty"`
CustomStyle string `protobuf:"bytes,3,opt,name=custom_style,json=customStyle,proto3" json:"custom_style,omitempty"`
}
type WorkspaceSetting_CustomStyle struct {
// The custom style.
CustomStyle string `protobuf:"bytes,5,opt,name=custom_style,json=customStyle,proto3,oneof"`
func (x *WorkspaceSetting_GeneralSetting) Reset() {
*x = WorkspaceSetting_GeneralSetting{}
if protoimpl.UnsafeEnabled {
mi := &file_store_workspace_setting_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
type WorkspaceSetting_InstanceUrl struct {
// The instance URL of workspace.
InstanceUrl string `protobuf:"bytes,8,opt,name=instance_url,json=instanceUrl,proto3,oneof"`
func (x *WorkspaceSetting_GeneralSetting) String() string {
return protoimpl.X.MessageStringOf(x)
}
type WorkspaceSetting_DefaultVisibility struct {
// The default visibility of shortcuts and collections.
DefaultVisibility Visibility `protobuf:"varint,9,opt,name=default_visibility,json=defaultVisibility,proto3,enum=slash.store.Visibility,oneof"`
func (*WorkspaceSetting_GeneralSetting) ProtoMessage() {}
func (x *WorkspaceSetting_GeneralSetting) ProtoReflect() protoreflect.Message {
mi := &file_store_workspace_setting_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)
}
type WorkspaceSetting_FaviconProvider struct {
// The url of custom favicon provider. e.g. https://github.com/yourselfhosted/favicons
FaviconProvider string `protobuf:"bytes,10,opt,name=favicon_provider,json=faviconProvider,proto3,oneof"`
// Deprecated: Use WorkspaceSetting_GeneralSetting.ProtoReflect.Descriptor instead.
func (*WorkspaceSetting_GeneralSetting) Descriptor() ([]byte, []int) {
return file_store_workspace_setting_proto_rawDescGZIP(), []int{0, 0}
}
func (*WorkspaceSetting_LicenseKey) isWorkspaceSetting_Value() {}
func (x *WorkspaceSetting_GeneralSetting) GetSecretSession() string {
if x != nil {
return x.SecretSession
}
return ""
}
func (*WorkspaceSetting_SecretSession) isWorkspaceSetting_Value() {}
func (x *WorkspaceSetting_GeneralSetting) GetLicenseKey() string {
if x != nil {
return x.LicenseKey
}
return ""
}
func (*WorkspaceSetting_EnableSignup) isWorkspaceSetting_Value() {}
func (x *WorkspaceSetting_GeneralSetting) GetCustomStyle() string {
if x != nil {
return x.CustomStyle
}
return ""
}
func (*WorkspaceSetting_CustomStyle) isWorkspaceSetting_Value() {}
type WorkspaceSetting_ShortcutRelatedSetting struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
func (*WorkspaceSetting_InstanceUrl) isWorkspaceSetting_Value() {}
DefaultVisibility Visibility `protobuf:"varint,1,opt,name=default_visibility,json=defaultVisibility,proto3,enum=slash.store.Visibility" json:"default_visibility,omitempty"`
}
func (*WorkspaceSetting_DefaultVisibility) isWorkspaceSetting_Value() {}
func (x *WorkspaceSetting_ShortcutRelatedSetting) Reset() {
*x = WorkspaceSetting_ShortcutRelatedSetting{}
if protoimpl.UnsafeEnabled {
mi := &file_store_workspace_setting_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (*WorkspaceSetting_FaviconProvider) isWorkspaceSetting_Value() {}
func (x *WorkspaceSetting_ShortcutRelatedSetting) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*WorkspaceSetting_ShortcutRelatedSetting) ProtoMessage() {}
func (x *WorkspaceSetting_ShortcutRelatedSetting) ProtoReflect() protoreflect.Message {
mi := &file_store_workspace_setting_proto_msgTypes[2]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use WorkspaceSetting_ShortcutRelatedSetting.ProtoReflect.Descriptor instead.
func (*WorkspaceSetting_ShortcutRelatedSetting) Descriptor() ([]byte, []int) {
return file_store_workspace_setting_proto_rawDescGZIP(), []int{0, 1}
}
func (x *WorkspaceSetting_ShortcutRelatedSetting) GetDefaultVisibility() Visibility {
if x != nil {
return x.DefaultVisibility
}
return Visibility_VISIBILITY_UNSPECIFIED
}
var File_store_workspace_setting_proto protoreflect.FileDescriptor
@ -264,51 +302,55 @@ var file_store_workspace_setting_proto_rawDesc = []byte{
0x65, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
0x0b, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x1a, 0x12, 0x73, 0x74,
0x6f, 0x72, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x22, 0x83, 0x03, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65,
0x22, 0xed, 0x03, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65,
0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x32, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,
0x28, 0x0e, 0x32, 0x20, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65,
0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e,
0x67, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0b, 0x6c, 0x69, 0x63,
0x65, 0x6e, 0x73, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00,
0x52, 0x0a, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x27, 0x0a, 0x0e,
0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03,
0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0d, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x53, 0x65,
0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0d, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f,
0x73, 0x69, 0x67, 0x6e, 0x75, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0c,
0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x75, 0x70, 0x12, 0x23, 0x0a, 0x0c,
0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01,
0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x53, 0x74, 0x79, 0x6c,
0x65, 0x12, 0x23, 0x0a, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x75, 0x72,
0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61,
0x6e, 0x63, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x48, 0x0a, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,
0x74, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x09, 0x20, 0x01,
0x28, 0x0e, 0x32, 0x17, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65,
0x2e, 0x56, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x48, 0x00, 0x52, 0x11, 0x64,
0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79,
0x12, 0x2b, 0x0a, 0x10, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x76,
0x69, 0x64, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, 0x66, 0x61,
0x76, 0x69, 0x63, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x42, 0x07, 0x0a,
0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0xc4, 0x02, 0x0a, 0x13, 0x57, 0x6f, 0x72, 0x6b, 0x73,
0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x25,
0x0a, 0x21, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54,
0x49, 0x4e, 0x47, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46,
0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41,
0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x4c, 0x49, 0x43, 0x45, 0x4e,
0x53, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x57, 0x4f, 0x52, 0x4b,
0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x45,
0x43, 0x52, 0x45, 0x54, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x23,
0x0a, 0x1f, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x41, 0x50, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54,
0x49, 0x4e, 0x47, 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x55,
0x50, 0x10, 0x03, 0x12, 0x22, 0x0a, 0x1e, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45,
0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f,
0x53, 0x54, 0x59, 0x4c, 0x45, 0x10, 0x04, 0x12, 0x22, 0x0a, 0x1e, 0x57, 0x4f, 0x52, 0x4b, 0x53,
0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x49, 0x4e, 0x53,
0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x55, 0x52, 0x4c, 0x10, 0x07, 0x12, 0x28, 0x0a, 0x24, 0x57,
0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47,
0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x56, 0x49, 0x53, 0x49, 0x42, 0x49, 0x4c,
0x49, 0x54, 0x59, 0x10, 0x08, 0x12, 0x26, 0x0a, 0x22, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41,
0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x46, 0x41, 0x56, 0x49, 0x43,
0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x10, 0x09, 0x42, 0xa6, 0x01,
0x67, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x61, 0x77,
0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x61, 0x77, 0x12, 0x48, 0x0a, 0x07, 0x67,
0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x73,
0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73,
0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x6e, 0x65,
0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x07, 0x67, 0x65,
0x6e, 0x65, 0x72, 0x61, 0x6c, 0x12, 0x61, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75,
0x74, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x34, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x57, 0x6f,
0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x53,
0x68, 0x6f, 0x72, 0x74, 0x63, 0x75, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65,
0x74, 0x74, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x0f, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75,
0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x1a, 0x7b, 0x0a, 0x0e, 0x47, 0x65, 0x6e, 0x65,
0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x65,
0x63, 0x72, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01,
0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f,
0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x6b, 0x65, 0x79,
0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x4b,
0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x73, 0x74, 0x79,
0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d,
0x53, 0x74, 0x79, 0x6c, 0x65, 0x1a, 0x60, 0x0a, 0x16, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x63, 0x75,
0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12,
0x46, 0x0a, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x62,
0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x73, 0x6c,
0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x56, 0x69, 0x73, 0x69, 0x62, 0x69,
0x6c, 0x69, 0x74, 0x79, 0x52, 0x11, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x69, 0x73,
0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
0x2a, 0x9a, 0x02, 0x0a, 0x13, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65,
0x74, 0x74, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x0a, 0x21, 0x57, 0x4f, 0x52, 0x4b,
0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x4b, 0x45,
0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12,
0x1d, 0x0a, 0x19, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54,
0x54, 0x49, 0x4e, 0x47, 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x26,
0x0a, 0x22, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54,
0x49, 0x4e, 0x47, 0x5f, 0x53, 0x48, 0x4f, 0x52, 0x54, 0x43, 0x55, 0x54, 0x5f, 0x52, 0x45, 0x4c,
0x41, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x21, 0x0a, 0x1d, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50,
0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x4c, 0x49, 0x43, 0x45,
0x4e, 0x53, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x03, 0x12, 0x24, 0x0a, 0x20, 0x57, 0x4f, 0x52,
0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x53,
0x45, 0x43, 0x52, 0x45, 0x54, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x12,
0x22, 0x0a, 0x1e, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54,
0x54, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x53, 0x54, 0x59, 0x4c,
0x45, 0x10, 0x05, 0x12, 0x28, 0x0a, 0x24, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45,
0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54,
0x5f, 0x56, 0x49, 0x53, 0x49, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x10, 0x06, 0x42, 0xa6, 0x01,
0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72,
0x65, 0x42, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x74, 0x74,
0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68,
@ -335,20 +377,24 @@ func file_store_workspace_setting_proto_rawDescGZIP() []byte {
}
var file_store_workspace_setting_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_store_workspace_setting_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_store_workspace_setting_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
var file_store_workspace_setting_proto_goTypes = []any{
(WorkspaceSettingKey)(0), // 0: slash.store.WorkspaceSettingKey
(*WorkspaceSetting)(nil), // 1: slash.store.WorkspaceSetting
(Visibility)(0), // 2: slash.store.Visibility
(*WorkspaceSetting_GeneralSetting)(nil), // 2: slash.store.WorkspaceSetting.GeneralSetting
(*WorkspaceSetting_ShortcutRelatedSetting)(nil), // 3: slash.store.WorkspaceSetting.ShortcutRelatedSetting
(Visibility)(0), // 4: slash.store.Visibility
}
var file_store_workspace_setting_proto_depIdxs = []int32{
0, // 0: slash.store.WorkspaceSetting.key:type_name -> slash.store.WorkspaceSettingKey
2, // 1: slash.store.WorkspaceSetting.default_visibility:type_name -> slash.store.Visibility
2, // [2:2] is the sub-list for method output_type
2, // [2:2] is the sub-list for method input_type
2, // [2:2] is the sub-list for extension type_name
2, // [2:2] is the sub-list for extension extendee
0, // [0:2] is the sub-list for field type_name
2, // 1: slash.store.WorkspaceSetting.general:type_name -> slash.store.WorkspaceSetting.GeneralSetting
3, // 2: slash.store.WorkspaceSetting.shortcut_related:type_name -> slash.store.WorkspaceSetting.ShortcutRelatedSetting
4, // 3: slash.store.WorkspaceSetting.ShortcutRelatedSetting.default_visibility:type_name -> slash.store.Visibility
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_workspace_setting_proto_init() }
@ -370,15 +416,34 @@ func file_store_workspace_setting_proto_init() {
return nil
}
}
file_store_workspace_setting_proto_msgTypes[1].Exporter = func(v any, i int) any {
switch v := v.(*WorkspaceSetting_GeneralSetting); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_store_workspace_setting_proto_msgTypes[2].Exporter = func(v any, i int) any {
switch v := v.(*WorkspaceSetting_ShortcutRelatedSetting); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
}
file_store_workspace_setting_proto_msgTypes[0].OneofWrappers = []any{
(*WorkspaceSetting_LicenseKey)(nil),
(*WorkspaceSetting_SecretSession)(nil),
(*WorkspaceSetting_EnableSignup)(nil),
(*WorkspaceSetting_CustomStyle)(nil),
(*WorkspaceSetting_InstanceUrl)(nil),
(*WorkspaceSetting_DefaultVisibility)(nil),
(*WorkspaceSetting_FaviconProvider)(nil),
(*WorkspaceSetting_General)(nil),
(*WorkspaceSetting_ShortcutRelated)(nil),
}
type x struct{}
out := protoimpl.TypeBuilder{
@ -386,7 +451,7 @@ func file_store_workspace_setting_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_store_workspace_setting_proto_rawDesc,
NumEnums: 1,
NumMessages: 1,
NumMessages: 3,
NumExtensions: 0,
NumServices: 0,
},

View File

@ -10,32 +10,30 @@ message UserSetting {
UserSettingKey key = 2;
oneof value {
UserSettingGeneral general = 3;
GeneralSetting general = 3;
AccessTokensSetting access_tokens = 4;
}
UserSettingAccessTokens access_tokens = 4;
message GeneralSetting {
string locale = 1;
string color_theme = 2;
}
message AccessTokensSetting {
message AccessToken {
// The access token is a JWT token, including expiration time, issuer, etc.
string access_token = 1;
// A description for the access token.
string description = 2;
}
repeated AccessToken access_tokens = 1; // Nested repeated field
}
}
enum UserSettingKey {
USER_SETTING_KEY_UNSPECIFIED = 0;
// General settings for the user.
GENERAL = 1;
// Access tokens for the user.
ACCESS_TOKENS = 2;
}
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.
string access_token = 1;
// A description for the access token.
string description = 2;
}
repeated AccessToken access_tokens = 1;
// User general settings.
USER_SETTING_GENERAL = 1;
// User access tokens.
USER_SETTING_ACCESS_TOKENS = 2;
}

View File

@ -8,39 +8,38 @@ option go_package = "gen/store";
message WorkspaceSetting {
WorkspaceSettingKey key = 1;
string raw = 4;
oneof value {
// The license key of workspace.
GeneralSetting general = 2;
ShortcutRelatedSetting shortcut_related = 3;
}
message GeneralSetting {
string secret_session = 1;
string license_key = 2;
// The secret session key used to encrypt session data.
string secret_session = 3;
// Whether to enable other users to sign up.
bool enable_signup = 4;
// The custom style.
string custom_style = 5;
// The instance URL of workspace.
string instance_url = 8;
// The default visibility of shortcuts and collections.
Visibility default_visibility = 9;
// The url of custom favicon provider. e.g. https://github.com/yourselfhosted/favicons
string favicon_provider = 10;
string custom_style = 3;
}
message ShortcutRelatedSetting {
Visibility default_visibility = 1;
}
}
enum WorkspaceSettingKey {
WORKSPACE_SETTING_KEY_UNSPECIFIED = 0;
// Workspace general settings.
WORKSPACE_SETTING_GENERAL = 1;
// Workspace shortcut-related settings.
WORKSPACE_SETTING_SHORTCUT_RELATED = 2;
// TODO: remove the following keys.
// The license key.
WORKSPACE_SETTING_LICENSE_KEY = 1;
WORKSPACE_SETTING_LICENSE_KEY = 3;
// The secret session key used to encrypt session data.
WORKSPACE_SETTING_SECRET_SESSION = 2;
// Whether to enable other users to sign up.
WORKSAPCE_SETTING_ENABLE_SIGNUP = 3;
WORKSPACE_SETTING_SECRET_SESSION = 4;
// The custom style.
WORKSPACE_SETTING_CUSTOM_STYLE = 4;
// The instance URL.
WORKSPACE_SETTING_INSTANCE_URL = 7;
WORKSPACE_SETTING_CUSTOM_STYLE = 5;
// The default visibility of shortcuts and collections.
WORKSPACE_SETTING_DEFAULT_VISIBILITY = 8;
// The url of custom favicon provider.
WORKSPACE_SETTING_FAVICON_PROVIDER = 9;
WORKSPACE_SETTING_DEFAULT_VISIBILITY = 6;
}

View File

@ -8,28 +8,28 @@ import (
"strings"
"github.com/pkg/errors"
"github.com/spf13/viper"
"github.com/yourselfhosted/slash/server/version"
)
// Profile is the configuration to start main server.
type Profile struct {
// Mode can be "prod" or "dev"
Mode string `json:"mode"`
// Port is the binding port for server
Port int `json:"-"`
// Data is the data directory
Data string `json:"-"`
// DSN points to where slash stores its own data
DSN string `json:"-"`
// Driver is the database driver
// sqlite, mysql
Driver string `json:"-"`
// Version is the current version of server
Version string `json:"version"`
// Metric indicate the metric collection is enabled or not
Metric bool `json:"-"`
// Mode can be "prod" or "dev".
Mode string
// Port is the binding port for server.
Port int
// Data is the data directory.
Data string
// DSN points to where slash stores its own data.
DSN string
// Driver is the database driver. Supported drivers are sqlite, postgres.
Driver string
// Version is the current version of server.
Version string
// Metric indicate the metric collection is enabled or not.
Metric bool
// Pubic is the flag whether the instance is public for others.
Public bool
// InstanceURL is the URL of the instance.
InstanceURL string
}
func (p *Profile) IsDev() bool {
@ -57,47 +57,36 @@ func checkDataDir(dataDir string) (string, error) {
return dataDir, nil
}
// GetProfile will return a profile for dev or prod.
func GetProfile() (*Profile, error) {
profile := Profile{}
err := viper.Unmarshal(&profile)
if err != nil {
return nil, err
func (p *Profile) Validate() error {
if p.Mode != "demo" && p.Mode != "dev" && p.Mode != "prod" {
p.Mode = "demo"
}
if profile.Mode != "demo" && profile.Mode != "dev" && profile.Mode != "prod" {
profile.Mode = "demo"
}
if profile.Mode == "prod" && profile.Data == "" {
if p.Mode == "prod" && p.Data == "" {
if runtime.GOOS == "windows" {
profile.Data = filepath.Join(os.Getenv("ProgramData"), "slash")
if _, err := os.Stat(profile.Data); os.IsNotExist(err) {
if err := os.MkdirAll(profile.Data, 0770); err != nil {
fmt.Printf("Failed to create data directory: %s, err: %+v\n", profile.Data, err)
return nil, err
p.Data = filepath.Join(os.Getenv("ProgramData"), "slash")
if _, err := os.Stat(p.Data); os.IsNotExist(err) {
if err := os.MkdirAll(p.Data, 0770); err != nil {
fmt.Printf("Failed to create data directory: %s, err: %+v\n", p.Data, err)
return err
}
}
} else {
profile.Data = "/var/opt/slash"
p.Data = "/var/opt/slash"
}
}
if profile.Driver == "sqlite" {
dataDir, err := checkDataDir(profile.Data)
dataDir, err := checkDataDir(p.Data)
if err != nil {
fmt.Printf("Failed to check dsn: %s, err: %+v\n", dataDir, err)
return nil, err
return err
}
profile.Data = dataDir
if profile.DSN == "" {
dbFile := fmt.Sprintf("slash_%s.db", profile.Mode)
profile.DSN = filepath.Join(dataDir, dbFile)
p.Data = dataDir
if p.Driver == "sqlite" && p.DSN == "" {
dbFile := fmt.Sprintf("slash_%s.db", p.Mode)
p.DSN = filepath.Join(dataDir, dbFile)
}
}
profile.Version = version.GetCurrentVersion(profile.Mode)
return &profile, nil
return nil
}

View File

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

View File

@ -12,7 +12,6 @@ import (
"google.golang.org/grpc/status"
v1pb "github.com/yourselfhosted/slash/proto/gen/api/v1"
storepb "github.com/yourselfhosted/slash/proto/gen/store"
"github.com/yourselfhosted/slash/server/metric"
"github.com/yourselfhosted/slash/server/service/license"
"github.com/yourselfhosted/slash/store"
@ -70,13 +69,7 @@ func (s *APIV1Service) SignIn(ctx context.Context, request *v1pb.SignInRequest)
}
func (s *APIV1Service) SignUp(ctx context.Context, request *v1pb.SignUpRequest) (*v1pb.SignUpResponse, error) {
enableSignUpSetting, err := s.Store.GetWorkspaceSetting(ctx, &store.FindWorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSAPCE_SETTING_ENABLE_SIGNUP,
})
if err != nil {
return nil, status.Errorf(codes.Internal, fmt.Sprintf("failed to get workspace setting, err: %s", err))
}
if enableSignUpSetting != nil && !enableSignUpSetting.GetEnableSignup() {
if !s.Profile.Public {
return nil, status.Errorf(codes.PermissionDenied, "sign up is not allowed")
}

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.UserSettingAccessTokens_AccessToken{}
updatedUserAccessTokens := []*storepb.UserSetting_AccessTokensSetting_AccessToken{}
for _, userAccessToken := range userAccessTokens {
if userAccessToken.AccessToken == request.AccessToken {
continue
@ -260,9 +260,9 @@ func (s *APIV1Service) DeleteUserAccessToken(ctx context.Context, request *v1pb.
}
if _, err := s.Store.UpsertUserSetting(ctx, &storepb.UserSetting{
UserId: user.ID,
Key: storepb.UserSettingKey_ACCESS_TOKENS,
Key: storepb.UserSettingKey_USER_SETTING_ACCESS_TOKENS,
Value: &storepb.UserSetting_AccessTokens{
AccessTokens: &storepb.UserSettingAccessTokens{
AccessTokens: &storepb.UserSetting_AccessTokensSetting{
AccessTokens: updatedUserAccessTokens,
},
},
@ -278,16 +278,16 @@ func (s *APIV1Service) UpsertAccessTokenToStore(ctx context.Context, user *store
if err != nil {
return errors.Wrap(err, "failed to get user access tokens")
}
userAccessToken := storepb.UserSettingAccessTokens_AccessToken{
userAccessToken := storepb.UserSetting_AccessTokensSetting_AccessToken{
AccessToken: accessToken,
Description: description,
}
userAccessTokens = append(userAccessTokens, &userAccessToken)
if _, err := s.Store.UpsertUserSetting(ctx, &storepb.UserSetting{
UserId: user.ID,
Key: storepb.UserSettingKey_ACCESS_TOKENS,
Key: storepb.UserSettingKey_USER_SETTING_ACCESS_TOKENS,
Value: &storepb.UserSetting_AccessTokens{
AccessTokens: &storepb.UserSettingAccessTokens{
AccessTokens: &storepb.UserSetting_AccessTokensSetting{
AccessTokens: userAccessTokens,
},
},

View File

@ -35,9 +35,9 @@ func (s *APIV1Service) UpdateUserSetting(ctx context.Context, request *v1pb.Upda
if path == "general" {
if _, err := s.Store.UpsertUserSetting(ctx, &storepb.UserSetting{
UserId: user.ID,
Key: storepb.UserSettingKey_GENERAL,
Key: storepb.UserSettingKey_USER_SETTING_GENERAL,
Value: &storepb.UserSetting_General{
General: &storepb.UserSettingGeneral{
General: &storepb.UserSetting_GeneralSetting{
Locale: request.UserSetting.General.Locale,
ColorTheme: request.UserSetting.General.ColorTheme,
},
@ -68,15 +68,15 @@ func getUserSetting(ctx context.Context, s *store.Store, userID int32) (*v1pb.Us
}
userSetting := &v1pb.UserSetting{
Id: userID,
General: &v1pb.UserSettingGeneral{
UserId: userID,
General: &v1pb.UserSetting_GeneralSetting{
Locale: "EN",
ColorTheme: "SYSTEM",
},
}
for _, setting := range userSettings {
if setting.Key == storepb.UserSettingKey_GENERAL {
userSetting.General = &v1pb.UserSettingGeneral{
if setting.Key == storepb.UserSettingKey_USER_SETTING_GENERAL {
userSetting.General = &v1pb.UserSetting_GeneralSetting{
Locale: setting.GetGeneral().Locale,
ColorTheme: setting.GetGeneral().ColorTheme,
}

View File

@ -14,10 +14,11 @@ import (
)
func (s *APIV1Service) GetWorkspaceProfile(ctx context.Context, _ *v1pb.GetWorkspaceProfileRequest) (*v1pb.GetWorkspaceProfileResponse, error) {
profile := &v1pb.WorkspaceProfile{
workspaceProfile := &v1pb.WorkspaceProfile{
Mode: s.Profile.Mode,
Version: s.Profile.Version,
Plan: v1pb.PlanType_FREE,
EnableSignup: s.Profile.Public,
}
// Load subscription plan from license service.
@ -25,66 +26,34 @@ func (s *APIV1Service) GetWorkspaceProfile(ctx context.Context, _ *v1pb.GetWorks
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to get subscription: %v", err)
}
profile.Plan = subscription.Plan
workspaceProfile.Plan = subscription.Plan
workspaceSetting, err := s.GetWorkspaceSetting(ctx, &v1pb.GetWorkspaceSettingRequest{})
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to get workspace setting: %v", err)
}
if workspaceSetting != nil {
setting := workspaceSetting.GetSetting()
profile.EnableSignup = setting.GetEnableSignup()
profile.CustomStyle = setting.GetCustomStyle()
profile.FaviconProvider = setting.GetFaviconProvider()
}
owner, err := s.GetInstanceOwner(ctx)
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to get instance owner: %v", err)
}
if owner != nil {
profile.Owner = fmt.Sprintf("%s%d", UserNamePrefix, owner.Id)
workspaceProfile.Owner = fmt.Sprintf("%s%d", UserNamePrefix, owner.Id)
}
return &v1pb.GetWorkspaceProfileResponse{
Profile: profile,
Profile: workspaceProfile,
}, nil
}
func (s *APIV1Service) GetWorkspaceSetting(ctx context.Context, _ *v1pb.GetWorkspaceSettingRequest) (*v1pb.GetWorkspaceSettingResponse, error) {
isAdmin := false
userID, ok := ctx.Value(userIDContextKey).(int32)
if ok {
user, err := s.Store.GetUser(ctx, &store.FindUser{ID: &userID})
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to get user: %v", err)
}
if user.Role == store.RoleAdmin {
isAdmin = true
}
}
workspaceSettings, err := s.Store.ListWorkspaceSettings(ctx, &store.FindWorkspaceSetting{})
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to list workspace settings: %v", err)
}
workspaceSetting := &v1pb.WorkspaceSetting{
EnableSignup: true,
}
workspaceSetting := &v1pb.WorkspaceSetting{}
for _, v := range workspaceSettings {
if v.Key == storepb.WorkspaceSettingKey_WORKSAPCE_SETTING_ENABLE_SIGNUP {
workspaceSetting.EnableSignup = v.GetEnableSignup()
} else if v.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_INSTANCE_URL {
workspaceSetting.InstanceUrl = v.GetInstanceUrl()
} else if v.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_CUSTOM_STYLE {
workspaceSetting.CustomStyle = v.GetCustomStyle()
} else if v.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_DEFAULT_VISIBILITY {
workspaceSetting.DefaultVisibility = v1pb.Visibility(v.GetDefaultVisibility())
} else if v.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_FAVICON_PROVIDER {
workspaceSetting.FaviconProvider = v.GetFaviconProvider()
} else if isAdmin {
// For some settings, only admin can get the value.
if v.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY {
workspaceSetting.LicenseKey = v.GetLicenseKey()
}
if v.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL {
generalSetting := v.GetGeneral()
workspaceSetting.CustomStyle = generalSetting.GetCustomStyle()
} else if v.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SHORTCUT_RELATED {
shortcutRelatedSetting := v.GetShortcutRelated()
workspaceSetting.DefaultVisibility = v1pb.Visibility(shortcutRelatedSetting.GetDefaultVisibility())
}
}
return &v1pb.GetWorkspaceSettingResponse{
@ -98,56 +67,50 @@ func (s *APIV1Service) UpdateWorkspaceSetting(ctx context.Context, request *v1pb
}
for _, path := range request.UpdateMask.Paths {
if path == "license_key" {
if _, err := s.Store.UpsertWorkspaceSetting(ctx, &storepb.WorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY,
Value: &storepb.WorkspaceSetting_LicenseKey{
LicenseKey: request.Setting.LicenseKey,
},
}); err != nil {
return nil, status.Errorf(codes.Internal, "failed to update workspace setting: %v", err)
if path == "custom_style" {
generalSetting, err := s.Store.GetWorkspaceSetting(ctx, &store.FindWorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL,
})
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to get workspace setting: %v", err)
}
} else if path == "enable_signup" {
if _, err := s.Store.UpsertWorkspaceSetting(ctx, &storepb.WorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSAPCE_SETTING_ENABLE_SIGNUP,
Value: &storepb.WorkspaceSetting_EnableSignup{
EnableSignup: request.Setting.EnableSignup,
if generalSetting == nil {
generalSetting = &storepb.WorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL,
Value: &storepb.WorkspaceSetting_General{
General: &storepb.WorkspaceSetting_GeneralSetting{},
},
}); err != nil {
return nil, status.Errorf(codes.Internal, "failed to update workspace setting: %v", err)
}
} else if path == "instance_url" {
if _, err := s.Store.UpsertWorkspaceSetting(ctx, &storepb.WorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_INSTANCE_URL,
Value: &storepb.WorkspaceSetting_InstanceUrl{
InstanceUrl: request.Setting.InstanceUrl,
},
}); err != nil {
return nil, status.Errorf(codes.Internal, "failed to update workspace setting: %v", err)
}
} else if path == "custom_style" {
generalSetting.GetGeneral().CustomStyle = request.Setting.CustomStyle
if _, err := s.Store.UpsertWorkspaceSetting(ctx, &storepb.WorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_CUSTOM_STYLE,
Value: &storepb.WorkspaceSetting_CustomStyle{
CustomStyle: request.Setting.CustomStyle,
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL,
Value: &storepb.WorkspaceSetting_General{
General: generalSetting.GetGeneral(),
},
}); err != nil {
return nil, status.Errorf(codes.Internal, "failed to update workspace setting: %v", err)
}
} else if path == "default_visibility" {
if _, err := s.Store.UpsertWorkspaceSetting(ctx, &storepb.WorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_DEFAULT_VISIBILITY,
Value: &storepb.WorkspaceSetting_DefaultVisibility{
DefaultVisibility: storepb.Visibility(request.Setting.DefaultVisibility),
},
}); err != nil {
return nil, status.Errorf(codes.Internal, "failed to update workspace setting: %v", err)
shortcutRelatedSetting, err := s.Store.GetWorkspaceSetting(ctx, &store.FindWorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SHORTCUT_RELATED,
})
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to get workspace setting: %v", err)
}
} else if path == "favicon_provider" {
if shortcutRelatedSetting == nil {
shortcutRelatedSetting = &storepb.WorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SHORTCUT_RELATED,
Value: &storepb.WorkspaceSetting_ShortcutRelated{
ShortcutRelated: &storepb.WorkspaceSetting_ShortcutRelatedSetting{},
},
}
}
shortcutRelatedSetting.GetShortcutRelated().DefaultVisibility = storepb.Visibility(request.Setting.DefaultVisibility)
if _, err := s.Store.UpsertWorkspaceSetting(ctx, &storepb.WorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_FAVICON_PROVIDER,
Value: &storepb.WorkspaceSetting_FaviconProvider{
FaviconProvider: request.Setting.FaviconProvider,
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SHORTCUT_RELATED,
Value: &storepb.WorkspaceSetting_ShortcutRelated{
ShortcutRelated: shortcutRelatedSetting.GetShortcutRelated(),
},
}); err != nil {
return nil, status.Errorf(codes.Internal, "failed to update workspace setting: %v", err)

View File

@ -118,13 +118,7 @@ func (s *FrontendService) registerRoutes(e *echo.Echo) {
}
func (s *FrontendService) registerFileRoutes(ctx context.Context, e *echo.Echo) {
instanceURLSetting, err := s.Store.GetWorkspaceSetting(ctx, &store.FindWorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_INSTANCE_URL,
})
if err != nil || instanceURLSetting == nil {
return
}
instanceURL := instanceURLSetting.GetInstanceUrl()
instanceURL := s.Profile.InstanceURL
if instanceURL == "" {
return
}

View File

@ -120,23 +120,25 @@ func (s *Server) GetEcho() *echo.Echo {
}
func (s *Server) getSecretSessionName(ctx context.Context) (string, error) {
secretSessionSetting, err := s.Store.GetWorkspaceSetting(ctx, &store.FindWorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SECRET_SESSION,
workspaceSettingGeneral, err := s.Store.GetWorkspaceSetting(ctx, &store.FindWorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL,
})
if err != nil {
return "", err
}
if secretSessionSetting == nil {
if workspaceSettingGeneral == nil || workspaceSettingGeneral.GetGeneral() == nil {
tempSecret := uuid.New().String()
secretSessionSetting, err = s.Store.UpsertWorkspaceSetting(ctx, &storepb.WorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SECRET_SESSION,
Value: &storepb.WorkspaceSetting_SecretSession{
workspaceSettingGeneral, err = s.Store.UpsertWorkspaceSetting(ctx, &storepb.WorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL,
Value: &storepb.WorkspaceSetting_General{
General: &storepb.WorkspaceSetting_GeneralSetting{
SecretSession: tempSecret,
},
},
})
if err != nil {
return "", err
}
}
return secretSessionSetting.GetSecretSession(), nil
return workspaceSettingGeneral.GetGeneral().SecretSession, nil
}

View File

@ -38,8 +38,8 @@ func NewLicenseService(profile *profile.Profile, store *store.Store) *LicenseSer
}
func (s *LicenseService) LoadSubscription(ctx context.Context) (*v1pb.Subscription, error) {
workspaceSetting, err := s.Store.GetWorkspaceSetting(ctx, &store.FindWorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY,
workspaceSettingGeneral, err := s.Store.GetWorkspaceSetting(ctx, &store.FindWorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL,
})
if err != nil {
return nil, errors.Wrap(err, "failed to get workspace setting")
@ -48,8 +48,8 @@ func (s *LicenseService) LoadSubscription(ctx context.Context) (*v1pb.Subscripti
Plan: v1pb.PlanType_FREE,
}
licenseKey := ""
if workspaceSetting != nil {
licenseKey = workspaceSetting.GetLicenseKey()
if workspaceSettingGeneral != nil {
licenseKey = workspaceSettingGeneral.GetGeneral().LicenseKey
}
if licenseKey == "" {
return subscription, nil
@ -79,12 +79,25 @@ func (s *LicenseService) UpdateSubscription(ctx context.Context, licenseKey stri
if result == nil {
return nil, errors.New("invalid license key")
}
_, err = s.Store.UpsertWorkspaceSetting(ctx, &storepb.WorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY,
Value: &storepb.WorkspaceSetting_LicenseKey{
workspaceSettingGeneral, err := s.Store.GetWorkspaceSetting(ctx, &store.FindWorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL,
})
if err != nil {
return nil, errors.Wrap(err, "failed to get workspace setting")
}
if workspaceSettingGeneral == nil || workspaceSettingGeneral.GetGeneral() == nil {
workspaceSettingGeneral = &storepb.WorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL,
Value: &storepb.WorkspaceSetting_General{
General: &storepb.WorkspaceSetting_GeneralSetting{
LicenseKey: licenseKey,
},
})
},
}
} else {
workspaceSettingGeneral.GetGeneral().LicenseKey = licenseKey
}
_, err = s.Store.UpsertWorkspaceSetting(ctx, workspaceSettingGeneral)
if err != nil {
return nil, errors.Wrap(err, "failed to upsert workspace setting")
}

View File

@ -3,6 +3,14 @@ package postgres
import (
"fmt"
"strings"
"google.golang.org/protobuf/encoding/protojson"
)
var (
protojsonUnmarshaler = protojson.UnmarshalOptions{
DiscardUnknown: true,
}
)
func placeholder(n int) string {

View File

@ -23,13 +23,13 @@ func (d *DB) UpsertUserSetting(ctx context.Context, upsert *storepb.UserSetting)
`
var valueString string
if upsert.Key == storepb.UserSettingKey_ACCESS_TOKENS {
if upsert.Key == storepb.UserSettingKey_USER_SETTING_ACCESS_TOKENS {
valueBytes, err := protojson.Marshal(upsert.GetAccessTokens())
if err != nil {
return nil, err
}
valueString = string(valueBytes)
} else if upsert.Key == storepb.UserSettingKey_GENERAL {
} else if upsert.Key == storepb.UserSettingKey_USER_SETTING_GENERAL {
valueBytes, err := protojson.Marshal(upsert.GetGeneral())
if err != nil {
return nil, err
@ -82,16 +82,16 @@ func (d *DB) ListUserSettings(ctx context.Context, find *store.FindUserSetting)
return nil, err
}
userSetting.Key = storepb.UserSettingKey(storepb.UserSettingKey_value[keyString])
if userSetting.Key == storepb.UserSettingKey_ACCESS_TOKENS {
userSettingAccessTokens := &storepb.UserSettingAccessTokens{}
if userSetting.Key == storepb.UserSettingKey_USER_SETTING_ACCESS_TOKENS {
userSettingAccessTokens := &storepb.UserSetting_AccessTokensSetting{}
if err := protojson.Unmarshal([]byte(valueString), userSettingAccessTokens); err != nil {
return nil, err
}
userSetting.Value = &storepb.UserSetting_AccessTokens{
AccessTokens: userSettingAccessTokens,
}
} else if userSetting.Key == storepb.UserSettingKey_GENERAL {
userSettingGeneral := &storepb.UserSettingGeneral{}
} else if userSetting.Key == storepb.UserSettingKey_USER_SETTING_GENERAL {
userSettingGeneral := &storepb.UserSetting_GeneralSetting{}
if err := protojson.Unmarshal([]byte(valueString), userSettingGeneral); err != nil {
return nil, err
}

View File

@ -3,11 +3,12 @@ package postgres
import (
"context"
"errors"
"strconv"
"slices"
"strings"
storepb "github.com/yourselfhosted/slash/proto/gen/store"
"github.com/yourselfhosted/slash/store"
"google.golang.org/protobuf/encoding/protojson"
)
func (d *DB) UpsertWorkspaceSetting(ctx context.Context, upsert *storepb.WorkspaceSetting) (*storepb.WorkspaceSetting, error) {
@ -21,18 +22,18 @@ func (d *DB) UpsertWorkspaceSetting(ctx context.Context, upsert *storepb.Workspa
SET value = EXCLUDED.value
`
var valueString string
if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY {
valueString = upsert.GetLicenseKey()
} else if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SECRET_SESSION {
valueString = upsert.GetSecretSession()
} else if upsert.Key == storepb.WorkspaceSettingKey_WORKSAPCE_SETTING_ENABLE_SIGNUP {
valueString = strconv.FormatBool(upsert.GetEnableSignup())
} else if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_CUSTOM_STYLE {
valueString = upsert.GetCustomStyle()
} else if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_INSTANCE_URL {
valueString = upsert.GetInstanceUrl()
} else if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_DEFAULT_VISIBILITY {
valueString = upsert.GetDefaultVisibility().String()
if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL {
valueBytes, err := protojson.Marshal(upsert.GetGeneral())
if err != nil {
return nil, err
}
valueString = string(valueBytes)
} else if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SHORTCUT_RELATED {
valueBytes, err := protojson.Marshal(upsert.GetShortcutRelated())
if err != nil {
return nil, err
}
valueString = string(valueBytes)
} else {
return nil, errors.New("invalid workspace setting key")
}
@ -76,22 +77,29 @@ func (d *DB) ListWorkspaceSettings(ctx context.Context, find *store.FindWorkspac
return nil, err
}
workspaceSetting.Key = storepb.WorkspaceSettingKey(storepb.WorkspaceSettingKey_value[keyString])
if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY {
workspaceSetting.Value = &storepb.WorkspaceSetting_LicenseKey{LicenseKey: valueString}
} else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SECRET_SESSION {
workspaceSetting.Value = &storepb.WorkspaceSetting_SecretSession{SecretSession: valueString}
} else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSAPCE_SETTING_ENABLE_SIGNUP {
enableSignup, err := strconv.ParseBool(valueString)
if err != nil {
if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL {
workspaceSettingGeneral := &storepb.WorkspaceSetting_GeneralSetting{}
if err := protojsonUnmarshaler.Unmarshal([]byte(valueString), workspaceSettingGeneral); err != nil {
return nil, err
}
workspaceSetting.Value = &storepb.WorkspaceSetting_EnableSignup{EnableSignup: enableSignup}
} else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_CUSTOM_STYLE {
workspaceSetting.Value = &storepb.WorkspaceSetting_CustomStyle{CustomStyle: valueString}
} else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_INSTANCE_URL {
workspaceSetting.Value = &storepb.WorkspaceSetting_InstanceUrl{InstanceUrl: valueString}
} else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_DEFAULT_VISIBILITY {
workspaceSetting.Value = &storepb.WorkspaceSetting_DefaultVisibility{DefaultVisibility: storepb.Visibility(storepb.Visibility_value[valueString])}
workspaceSetting.Value = &storepb.WorkspaceSetting_General{
General: workspaceSettingGeneral,
}
} else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SHORTCUT_RELATED {
workspaceSettingShortcutRelated := &storepb.WorkspaceSetting_ShortcutRelatedSetting{}
if err := protojsonUnmarshaler.Unmarshal([]byte(valueString), workspaceSettingShortcutRelated); err != nil {
return nil, err
}
workspaceSetting.Value = &storepb.WorkspaceSetting_ShortcutRelated{
ShortcutRelated: workspaceSettingShortcutRelated,
}
} else if slices.Contains([]storepb.WorkspaceSettingKey{
storepb.WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY,
storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SECRET_SESSION,
storepb.WorkspaceSettingKey_WORKSPACE_SETTING_CUSTOM_STYLE,
storepb.WorkspaceSettingKey_WORKSPACE_SETTING_DEFAULT_VISIBILITY,
}, workspaceSetting.Key) {
workspaceSetting.Raw = valueString
} else {
continue
}
@ -104,3 +112,14 @@ func (d *DB) ListWorkspaceSettings(ctx context.Context, find *store.FindWorkspac
return list, nil
}
func (d *DB) DeleteWorkspaceSetting(ctx context.Context, key storepb.WorkspaceSettingKey) error {
stmt := `
DELETE FROM workspace_setting
WHERE key = $1
`
if _, err := d.db.ExecContext(ctx, stmt, key.String()); err != nil {
return err
}
return nil
}

View File

@ -0,0 +1,9 @@
package sqlite
import "google.golang.org/protobuf/encoding/protojson"
var (
protojsonUnmarshaler = protojson.UnmarshalOptions{
DiscardUnknown: true,
}
)

View File

@ -22,13 +22,13 @@ func (d *DB) UpsertUserSetting(ctx context.Context, upsert *storepb.UserSetting)
SET value = EXCLUDED.value
`
var valueString string
if upsert.Key == storepb.UserSettingKey_ACCESS_TOKENS {
if upsert.Key == storepb.UserSettingKey_USER_SETTING_ACCESS_TOKENS {
valueBytes, err := protojson.Marshal(upsert.GetAccessTokens())
if err != nil {
return nil, err
}
valueString = string(valueBytes)
} else if upsert.Key == storepb.UserSettingKey_GENERAL {
} else if upsert.Key == storepb.UserSettingKey_USER_SETTING_GENERAL {
valueBytes, err := protojson.Marshal(upsert.GetGeneral())
if err != nil {
return nil, err
@ -81,16 +81,16 @@ func (d *DB) ListUserSettings(ctx context.Context, find *store.FindUserSetting)
return nil, err
}
userSetting.Key = storepb.UserSettingKey(storepb.UserSettingKey_value[keyString])
if userSetting.Key == storepb.UserSettingKey_ACCESS_TOKENS {
userSettingAccessTokens := &storepb.UserSettingAccessTokens{}
if userSetting.Key == storepb.UserSettingKey_USER_SETTING_ACCESS_TOKENS {
userSettingAccessTokens := &storepb.UserSetting_AccessTokensSetting{}
if err := protojson.Unmarshal([]byte(valueString), userSettingAccessTokens); err != nil {
return nil, err
}
userSetting.Value = &storepb.UserSetting_AccessTokens{
AccessTokens: userSettingAccessTokens,
}
} else if userSetting.Key == storepb.UserSettingKey_GENERAL {
userSettingGeneral := &storepb.UserSettingGeneral{}
} else if userSetting.Key == storepb.UserSettingKey_USER_SETTING_GENERAL {
userSettingGeneral := &storepb.UserSetting_GeneralSetting{}
if err := protojson.Unmarshal([]byte(valueString), userSettingGeneral); err != nil {
return nil, err
}

View File

@ -3,11 +3,12 @@ package sqlite
import (
"context"
"errors"
"strconv"
"slices"
"strings"
storepb "github.com/yourselfhosted/slash/proto/gen/store"
"github.com/yourselfhosted/slash/store"
"google.golang.org/protobuf/encoding/protojson"
)
func (d *DB) UpsertWorkspaceSetting(ctx context.Context, upsert *storepb.WorkspaceSetting) (*storepb.WorkspaceSetting, error) {
@ -21,20 +22,18 @@ func (d *DB) UpsertWorkspaceSetting(ctx context.Context, upsert *storepb.Workspa
SET value = EXCLUDED.value
`
var valueString string
if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY {
valueString = upsert.GetLicenseKey()
} else if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SECRET_SESSION {
valueString = upsert.GetSecretSession()
} else if upsert.Key == storepb.WorkspaceSettingKey_WORKSAPCE_SETTING_ENABLE_SIGNUP {
valueString = strconv.FormatBool(upsert.GetEnableSignup())
} else if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_CUSTOM_STYLE {
valueString = upsert.GetCustomStyle()
} else if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_INSTANCE_URL {
valueString = upsert.GetInstanceUrl()
} else if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_DEFAULT_VISIBILITY {
valueString = upsert.GetDefaultVisibility().String()
} else if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_FAVICON_PROVIDER {
valueString = upsert.GetFaviconProvider()
if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL {
valueBytes, err := protojson.Marshal(upsert.GetGeneral())
if err != nil {
return nil, err
}
valueString = string(valueBytes)
} else if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SHORTCUT_RELATED {
valueBytes, err := protojson.Marshal(upsert.GetShortcutRelated())
if err != nil {
return nil, err
}
valueString = string(valueBytes)
} else {
return nil, errors.New("invalid workspace setting key")
}
@ -78,24 +77,29 @@ func (d *DB) ListWorkspaceSettings(ctx context.Context, find *store.FindWorkspac
return nil, err
}
workspaceSetting.Key = storepb.WorkspaceSettingKey(storepb.WorkspaceSettingKey_value[keyString])
if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY {
workspaceSetting.Value = &storepb.WorkspaceSetting_LicenseKey{LicenseKey: valueString}
} else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SECRET_SESSION {
workspaceSetting.Value = &storepb.WorkspaceSetting_SecretSession{SecretSession: valueString}
} else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSAPCE_SETTING_ENABLE_SIGNUP {
enableSignup, err := strconv.ParseBool(valueString)
if err != nil {
if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL {
workspaceSettingGeneral := &storepb.WorkspaceSetting_GeneralSetting{}
if err := protojsonUnmarshaler.Unmarshal([]byte(valueString), workspaceSettingGeneral); err != nil {
return nil, err
}
workspaceSetting.Value = &storepb.WorkspaceSetting_EnableSignup{EnableSignup: enableSignup}
} else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_CUSTOM_STYLE {
workspaceSetting.Value = &storepb.WorkspaceSetting_CustomStyle{CustomStyle: valueString}
} else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_INSTANCE_URL {
workspaceSetting.Value = &storepb.WorkspaceSetting_InstanceUrl{InstanceUrl: valueString}
} else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_DEFAULT_VISIBILITY {
workspaceSetting.Value = &storepb.WorkspaceSetting_DefaultVisibility{DefaultVisibility: storepb.Visibility(storepb.Visibility_value[valueString])}
} else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_FAVICON_PROVIDER {
workspaceSetting.Value = &storepb.WorkspaceSetting_FaviconProvider{FaviconProvider: valueString}
workspaceSetting.Value = &storepb.WorkspaceSetting_General{
General: workspaceSettingGeneral,
}
} else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SHORTCUT_RELATED {
workspaceSettingShortcutRelated := &storepb.WorkspaceSetting_ShortcutRelatedSetting{}
if err := protojsonUnmarshaler.Unmarshal([]byte(valueString), workspaceSettingShortcutRelated); err != nil {
return nil, err
}
workspaceSetting.Value = &storepb.WorkspaceSetting_ShortcutRelated{
ShortcutRelated: workspaceSettingShortcutRelated,
}
} else if slices.Contains([]storepb.WorkspaceSettingKey{
storepb.WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY,
storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SECRET_SESSION,
storepb.WorkspaceSettingKey_WORKSPACE_SETTING_CUSTOM_STYLE,
storepb.WorkspaceSettingKey_WORKSPACE_SETTING_DEFAULT_VISIBILITY,
}, workspaceSetting.Key) {
workspaceSetting.Raw = valueString
} else {
continue
}
@ -108,3 +112,14 @@ func (d *DB) ListWorkspaceSettings(ctx context.Context, find *store.FindWorkspac
return list, nil
}
func (d *DB) DeleteWorkspaceSetting(ctx context.Context, key storepb.WorkspaceSettingKey) error {
stmt := `
DELETE FROM workspace_setting
WHERE key = ?
`
if _, err := d.db.ExecContext(ctx, stmt, key.String()); err != nil {
return err
}
return nil
}

View File

@ -48,4 +48,5 @@ type Driver interface {
// WorkspaceSetting model related methods.
UpsertWorkspaceSetting(ctx context.Context, upsert *storepb.WorkspaceSetting) (*storepb.WorkspaceSetting, error)
ListWorkspaceSettings(ctx context.Context, find *FindWorkspaceSetting) ([]*storepb.WorkspaceSetting, error)
DeleteWorkspaceSetting(ctx context.Context, key storepb.WorkspaceSettingKey) error
}

57
store/migrator.go Normal file
View File

@ -0,0 +1,57 @@
package store
import (
"context"
storepb "github.com/yourselfhosted/slash/proto/gen/store"
)
func (s *Store) MigrateWorkspaceSettings(ctx context.Context) error {
workspaceSettings, err := s.driver.ListWorkspaceSettings(ctx, &FindWorkspaceSetting{})
if err != nil {
return err
}
workspaceSettingGeneral, err := s.GetWorkspaceSetting(ctx, &FindWorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL,
})
if err != nil {
return err
}
if workspaceSettingGeneral == nil || workspaceSettingGeneral.GetGeneral() == nil {
workspaceSettingGeneral = &storepb.WorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL,
Value: &storepb.WorkspaceSetting_General{
General: &storepb.WorkspaceSetting_GeneralSetting{},
},
}
}
updateWorkspaceSetting := false
for _, workspaceSetting := range workspaceSettings {
if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY {
workspaceSettingGeneral.GetGeneral().LicenseKey = workspaceSetting.Raw
updateWorkspaceSetting = true
if err := s.DeleteWorkspaceSetting(ctx, storepb.WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY); err != nil {
return err
}
} else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_CUSTOM_STYLE {
workspaceSettingGeneral.GetGeneral().CustomStyle = workspaceSetting.Raw
updateWorkspaceSetting = true
if err := s.DeleteWorkspaceSetting(ctx, storepb.WorkspaceSettingKey_WORKSPACE_SETTING_CUSTOM_STYLE); err != nil {
return err
}
} else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SECRET_SESSION {
workspaceSettingGeneral.GetGeneral().SecretSession = workspaceSetting.Raw
updateWorkspaceSetting = true
if err := s.DeleteWorkspaceSetting(ctx, storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SECRET_SESSION); err != nil {
return err
}
}
}
if updateWorkspaceSetting {
if _, err := s.UpsertWorkspaceSetting(ctx, workspaceSettingGeneral); err != nil {
return err
}
}
return nil
}

View File

@ -54,16 +54,16 @@ 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.UserSettingAccessTokens_AccessToken, error) {
func (s *Store) GetUserAccessTokens(ctx context.Context, userID int32) ([]*storepb.UserSetting_AccessTokensSetting_AccessToken, error) {
userSetting, err := s.GetUserSetting(ctx, &FindUserSetting{
UserID: &userID,
Key: storepb.UserSettingKey_ACCESS_TOKENS,
Key: storepb.UserSettingKey_USER_SETTING_ACCESS_TOKENS,
})
if err != nil {
return nil, err
}
if userSetting == nil {
return []*storepb.UserSettingAccessTokens_AccessToken{}, nil
return []*storepb.UserSetting_AccessTokensSetting_AccessToken{}, nil
}
accessTokensUserSetting := userSetting.GetAccessTokens()

View File

@ -3,6 +3,8 @@ package store
import (
"context"
"github.com/pkg/errors"
storepb "github.com/yourselfhosted/slash/proto/gen/store"
)
@ -50,3 +52,11 @@ func (s *Store) GetWorkspaceSetting(ctx context.Context, find *FindWorkspaceSett
s.workspaceSettingCache.Store(workspaceSetting.Key, workspaceSetting)
return workspaceSetting, nil
}
func (s *Store) DeleteWorkspaceSetting(ctx context.Context, key storepb.WorkspaceSettingKey) error {
if err := s.driver.DeleteWorkspaceSetting(ctx, key); err != nil {
return errors.Wrap(err, "failed to delete workspace setting")
}
s.workspaceSettingCache.Delete(key)
return nil
}

View File

@ -24,10 +24,10 @@ func TestUserSettingStore(t *testing.T) {
// Test for access tokens user setting.
accessTokensUserSetting, err := ts.UpsertUserSetting(ctx, &storepb.UserSetting{
UserId: user.ID,
Key: storepb.UserSettingKey_ACCESS_TOKENS,
Key: storepb.UserSettingKey_USER_SETTING_ACCESS_TOKENS,
Value: &storepb.UserSetting_AccessTokens{
AccessTokens: &storepb.UserSettingAccessTokens{
AccessTokens: []*storepb.UserSettingAccessTokens_AccessToken{
AccessTokens: &storepb.UserSetting_AccessTokensSetting{
AccessTokens: []*storepb.UserSetting_AccessTokensSetting_AccessToken{
{
AccessToken: "test_access_token",
},
@ -37,7 +37,7 @@ func TestUserSettingStore(t *testing.T) {
})
require.NoError(t, err)
require.NotNil(t, accessTokensUserSetting)
require.Equal(t, storepb.UserSettingKey_ACCESS_TOKENS, accessTokensUserSetting.Key)
require.Equal(t, storepb.UserSettingKey_USER_SETTING_ACCESS_TOKENS, accessTokensUserSetting.Key)
require.Equal(t, user.ID, accessTokensUserSetting.UserId)
require.Equal(t, 1, len(accessTokensUserSetting.GetAccessTokens().AccessTokens))
userSettings, err = ts.ListUserSettings(ctx, &store.FindUserSetting{
@ -48,7 +48,7 @@ func TestUserSettingStore(t *testing.T) {
require.Equal(t, accessTokensUserSetting, userSettings[0])
accessTokensUserSetting, err = ts.GetUserSetting(ctx, &store.FindUserSetting{
UserID: &user.ID,
Key: storepb.UserSettingKey_ACCESS_TOKENS,
Key: storepb.UserSettingKey_USER_SETTING_ACCESS_TOKENS,
})
require.NoError(t, err)
require.NotNil(t, accessTokensUserSetting)
@ -56,10 +56,10 @@ func TestUserSettingStore(t *testing.T) {
require.Equal(t, "test_access_token", accessTokensUserSetting.GetAccessTokens().AccessTokens[0].AccessToken)
accessTokensUserSetting, err = ts.UpsertUserSetting(ctx, &storepb.UserSetting{
UserId: user.ID,
Key: storepb.UserSettingKey_ACCESS_TOKENS,
Key: storepb.UserSettingKey_USER_SETTING_ACCESS_TOKENS,
Value: &storepb.UserSetting_AccessTokens{
AccessTokens: &storepb.UserSettingAccessTokens{
AccessTokens: []*storepb.UserSettingAccessTokens_AccessToken{
AccessTokens: &storepb.UserSetting_AccessTokensSetting{
AccessTokens: []*storepb.UserSetting_AccessTokensSetting_AccessToken{
{
AccessToken: "test_access_token",
},
@ -77,9 +77,9 @@ func TestUserSettingStore(t *testing.T) {
// Test for user setting general.
userSettingGeneral, err := ts.UpsertUserSetting(ctx, &storepb.UserSetting{
UserId: user.ID,
Key: storepb.UserSettingKey_GENERAL,
Key: storepb.UserSettingKey_USER_SETTING_GENERAL,
Value: &storepb.UserSetting_General{
General: &storepb.UserSettingGeneral{
General: &storepb.UserSetting_GeneralSetting{
Locale: "ZH",
ColorTheme: "SYSTEM",
},
@ -87,14 +87,14 @@ func TestUserSettingStore(t *testing.T) {
})
require.NoError(t, err)
require.NotNil(t, userSettingGeneral)
require.Equal(t, storepb.UserSettingKey_GENERAL, userSettingGeneral.Key)
require.Equal(t, storepb.UserSettingKey_USER_SETTING_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_GENERAL,
Key: storepb.UserSettingKey_USER_SETTING_GENERAL,
Value: &storepb.UserSetting_General{
General: &storepb.UserSettingGeneral{
General: &storepb.UserSetting_GeneralSetting{
Locale: "EN",
ColorTheme: "DARK",
},

View File

@ -16,12 +16,16 @@ func TestWorkspaceSettingStore(t *testing.T) {
ts := NewTestingStore(ctx, t)
tempSecret := uuid.New().String()
workspaceSetting, err := ts.UpsertWorkspaceSetting(ctx, &storepb.WorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SECRET_SESSION,
Value: &storepb.WorkspaceSetting_SecretSession{SecretSession: tempSecret},
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL,
Value: &storepb.WorkspaceSetting_General{
General: &storepb.WorkspaceSetting_GeneralSetting{
SecretSession: tempSecret,
},
},
})
require.NoError(t, err)
foundWorkspaceSetting, err := ts.GetWorkspaceSetting(ctx, &store.FindWorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SECRET_SESSION,
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL,
})
require.NoError(t, err)
require.Equal(t, workspaceSetting, foundWorkspaceSetting)