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"
"github.com/yourselfhosted/slash/server/metric" "github.com/yourselfhosted/slash/server/metric"
"github.com/yourselfhosted/slash/server/profile" "github.com/yourselfhosted/slash/server/profile"
"github.com/yourselfhosted/slash/server/version"
"github.com/yourselfhosted/slash/store" "github.com/yourselfhosted/slash/store"
"github.com/yourselfhosted/slash/store/db" "github.com/yourselfhosted/slash/store/db"
) )
@ -24,36 +25,47 @@ const (
) )
var ( var (
serverProfile *profile.Profile
mode string
port int
data string
driver string
dsn string
enableMetric bool
rootCmd = &cobra.Command{ rootCmd = &cobra.Command{
Use: "slash", Use: "slash",
Short: `An open source, self-hosted links shortener and sharing platform.`, Short: `An open source, self-hosted links shortener and sharing platform.`,
Run: func(_ *cobra.Command, _ []string) { 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()) ctx, cancel := context.WithCancel(context.Background())
dbDriver, err := db.NewDBDriver(serverProfile) dbDriver, err := db.NewDBDriver(serverProfile)
if err != nil { if err != nil {
cancel() cancel()
slog.Error("failed to create db driver", err) slog.Error("failed to create db driver", "error", err)
return return
} }
if err := dbDriver.Migrate(ctx); err != nil { if err := dbDriver.Migrate(ctx); err != nil {
cancel() cancel()
slog.Error("failed to migrate db", err) slog.Error("failed to migrate db", "error", err)
return return
} }
storeInstance := store.New(dbDriver, serverProfile) 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) s, err := server.NewServer(ctx, serverProfile, storeInstance)
if err != nil { if err != nil {
cancel() cancel()
slog.Error("failed to create server", err) slog.Error("failed to create server", "error", err)
return return
} }
@ -74,11 +86,11 @@ var (
cancel() cancel()
}() }()
printGreetings() printGreetings(serverProfile)
if err := s.Start(ctx); err != nil { if err := s.Start(ctx); err != nil {
if err != http.ErrServerClosed { if err != http.ErrServerClosed {
slog.Error("failed to start server", err) slog.Error("failed to start server", "error", err)
cancel() cancel()
} }
} }
@ -89,71 +101,60 @@ var (
} }
) )
func Execute() error {
return rootCmd.Execute()
}
func init() { 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("mode", "demo")
viper.SetDefault("port", 8082)
viper.SetDefault("driver", "sqlite") 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") viper.SetEnvPrefix("slash")
}
func initConfig() {
viper.AutomaticEnv() viper.AutomaticEnv()
var err error if err := viper.BindEnv("instance-url", "SLASH_INSTANCE_URL"); err != nil {
serverProfile, err = profile.GetProfile() panic(err)
if err != nil { }
slog.Error("failed to get profile", err)
return
} }
func printGreetings(serverProfile *profile.Profile) {
println("---") println("---")
println("Server profile") println("Server profile")
println("dsn:", serverProfile.DSN) println("dsn:", serverProfile.DSN)
println("port:", serverProfile.Port) println("port:", serverProfile.Port)
println("mode:", serverProfile.Mode) println("mode:", serverProfile.Mode)
println("version:", serverProfile.Version) println("version:", serverProfile.Version)
println("public:", serverProfile.Public)
println("instance-url:", serverProfile.InstanceURL)
println("---") println("---")
}
func printGreetings() {
println(greetingBanner) println(greetingBanner)
fmt.Printf("Version %s has been started on port %d\n", serverProfile.Version, serverProfile.Port) fmt.Printf("Version %s has been started on port %d\n", serverProfile.Version, serverProfile.Port)
println("---") println("---")
@ -163,8 +164,7 @@ func printGreetings() {
} }
func main() { func main() {
err := Execute() if err := rootCmd.Execute(); err != nil {
if err != nil {
panic(err) panic(err)
} }
} }

View File

@ -1,5 +1,4 @@
import { useState } from "react"; import { useState } from "react";
import { useWorkspaceStore } from "@/stores";
import Icon from "./Icon"; import Icon from "./Icon";
interface Props { interface Props {
@ -18,8 +17,7 @@ const getFaviconUrlWithProvider = (url: string, provider: string) => {
const LinkFavicon = (props: Props) => { const LinkFavicon = (props: Props) => {
const { url } = props; const { url } = props;
const workspaceStore = useWorkspaceStore(); const faviconProvider = "https://www.google.com/s2/favicons";
const faviconProvider = workspaceStore.profile.faviconProvider || "https://www.google.com/s2/favicons";
const [faviconUrl, setFaviconUrl] = useState<string>(getFaviconUrlWithProvider(url, faviconProvider)); const [faviconUrl, setFaviconUrl] = useState<string>(getFaviconUrlWithProvider(url, faviconProvider));
const handleImgError = () => { 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 { isEqual } from "lodash-es";
import { useRef, useState } from "react"; import { useRef, useState } from "react";
import toast from "react-hot-toast"; import toast from "react-hot-toast";
@ -7,7 +7,6 @@ import { workspaceServiceClient } from "@/grpcweb";
import { useWorkspaceStore } from "@/stores"; import { useWorkspaceStore } from "@/stores";
import { Visibility } from "@/types/proto/api/v1/common"; import { Visibility } from "@/types/proto/api/v1/common";
import { WorkspaceSetting } from "@/types/proto/api/v1/workspace_service"; import { WorkspaceSetting } from "@/types/proto/api/v1/workspace_service";
import BetaBadge from "../BetaBadge";
const getDefaultVisibility = (visibility?: Visibility) => { const getDefaultVisibility = (visibility?: Visibility) => {
if (!visibility || [Visibility.VISIBILITY_UNSPECIFIED, Visibility.UNRECOGNIZED].includes(visibility)) { if (!visibility || [Visibility.VISIBILITY_UNSPECIFIED, Visibility.UNRECOGNIZED].includes(visibility)) {
@ -24,27 +23,6 @@ const WorkspaceSection = () => {
const originalWorkspaceSetting = useRef<WorkspaceSetting>(workspaceStore.setting); const originalWorkspaceSetting = useRef<WorkspaceSetting>(workspaceStore.setting);
const allowSave = !isEqual(originalWorkspaceSetting.current, workspaceSetting); 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) => { const handleCustomStyleChange = async (value: string) => {
setWorkspaceSetting({ setWorkspaceSetting({
...workspaceSetting, ...workspaceSetting,
@ -61,21 +39,12 @@ const WorkspaceSection = () => {
const handleSaveWorkspaceSetting = async () => { const handleSaveWorkspaceSetting = async () => {
const updateMask: string[] = []; 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)) { if (!isEqual(originalWorkspaceSetting.current.customStyle, workspaceSetting.customStyle)) {
updateMask.push("custom_style"); updateMask.push("custom_style");
} }
if (!isEqual(originalWorkspaceSetting.current.defaultVisibility, workspaceSetting.defaultVisibility)) { if (!isEqual(originalWorkspaceSetting.current.defaultVisibility, workspaceSetting.defaultVisibility)) {
updateMask.push("default_visibility"); updateMask.push("default_visibility");
} }
if (!isEqual(originalWorkspaceSetting.current.faviconProvider, workspaceSetting.faviconProvider)) {
updateMask.push("favicon_provider");
}
if (updateMask.length === 0) { if (updateMask.length === 0) {
toast.error("No changes made"); toast.error("No changes made");
return; 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"> <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> <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 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-row justify-between items-center">
<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">{t("settings.workspace.default-visibility")}</p> <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> <Option value={Visibility.PUBLIC}>{t(`shortcut.visibility.public.self`)}</Option>
</Select> </Select>
</div> </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"> <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> <p className="mt-2 font-medium dark:text-gray-400">{t("settings.workspace.custom-style")}</p>
<Textarea <Textarea

View File

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

View File

@ -25,17 +25,28 @@ service UserSettingService {
} }
message UserSetting { message UserSetting {
// id is the user id. int32 user_id = 1;
int32 id = 1;
UserSettingGeneral general = 2; GeneralSetting general = 2;
}
message UserSettingGeneral { AccessTokensSetting access_tokens = 3;
message GeneralSetting {
string locale = 1; string locale = 1;
string color_theme = 2; 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 { message GetUserSettingRequest {
// id is the user id. // id is the user id.
int32 id = 1; int32 id = 1;

View File

@ -37,25 +37,16 @@ message WorkspaceProfile {
bool enable_signup = 4; bool enable_signup = 4;
// The custom style. // The custom style.
string custom_style = 5; string custom_style = 5;
// The url of custom favicon provider.
string favicon_provider = 7;
// The owner name. // The owner name.
// Format: "users/{id}" // Format: "users/{id}"
string owner = 8; string owner = 6;
} }
message WorkspaceSetting { 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. // The custom style.
string custom_style = 4; string custom_style = 1;
// The default visibility of shortcuts and collections. // The default visibility of shortcuts and collections.
Visibility default_visibility = 7; Visibility default_visibility = 2;
// The url of custom favicon provider.
string favicon_provider = 8;
} }
message GetWorkspaceProfileRequest {} message GetWorkspaceProfileRequest {}

View File

@ -98,7 +98,9 @@
- [UpdateUserSettingRequest](#slash-api-v1-UpdateUserSettingRequest) - [UpdateUserSettingRequest](#slash-api-v1-UpdateUserSettingRequest)
- [UpdateUserSettingResponse](#slash-api-v1-UpdateUserSettingResponse) - [UpdateUserSettingResponse](#slash-api-v1-UpdateUserSettingResponse)
- [UserSetting](#slash-api-v1-UserSetting) - [UserSetting](#slash-api-v1-UserSetting)
- [UserSettingGeneral](#slash-api-v1-UserSettingGeneral) - [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) - [UserSettingService](#slash-api-v1-UserSettingService)
@ -1322,17 +1324,49 @@
| Field | Type | Label | Description | | Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- | | ----- | ---- | ----- | ----------- |
| id | [int32](#int32) | | id is the user id. | | user_id | [int32](#int32) | | |
| general | [UserSettingGeneral](#slash-api-v1-UserSettingGeneral) | | | | 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. | | plan | [PlanType](#slash-api-v1-PlanType) | | The workspace plan. |
| enable_signup | [bool](#bool) | | Whether to enable other users to sign up. | | enable_signup | [bool](#bool) | | Whether to enable other users to sign up. |
| custom_style | [string](#string) | | The custom style. | | 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; | | owner | [string](#string) | | The owner name. Format: &#34;users/{id}&#34; |
@ -1483,12 +1516,8 @@
| Field | Type | Label | Description | | 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. | | custom_style | [string](#string) | | The custom style. |
| default_visibility | [Visibility](#slash-api-v1-Visibility) | | The default visibility of shortcuts and collections. | | 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 sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields unknownFields protoimpl.UnknownFields
// id is the user id. UserId int32 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"`
Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` General *UserSetting_GeneralSetting `protobuf:"bytes,2,opt,name=general,proto3" json:"general,omitempty"`
General *UserSettingGeneral `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() { func (x *UserSetting) Reset() {
@ -64,73 +64,25 @@ func (*UserSetting) Descriptor() ([]byte, []int) {
return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{0} return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{0}
} }
func (x *UserSetting) GetId() int32 { func (x *UserSetting) GetUserId() int32 {
if x != nil { if x != nil {
return x.Id return x.UserId
} }
return 0 return 0
} }
func (x *UserSetting) GetGeneral() *UserSettingGeneral { func (x *UserSetting) GetGeneral() *UserSetting_GeneralSetting {
if x != nil { if x != nil {
return x.General return x.General
} }
return nil return nil
} }
type UserSettingGeneral struct { func (x *UserSetting) GetAccessTokens() *UserSetting_AccessTokensSetting {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Locale string `protobuf:"bytes,1,opt,name=locale,proto3" json:"locale,omitempty"`
ColorTheme string `protobuf:"bytes,2,opt,name=color_theme,json=colorTheme,proto3" json:"color_theme,omitempty"`
}
func (x *UserSettingGeneral) Reset() {
*x = UserSettingGeneral{}
if protoimpl.UnsafeEnabled {
mi := &file_api_v1_user_setting_service_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *UserSettingGeneral) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*UserSettingGeneral) ProtoMessage() {}
func (x *UserSettingGeneral) ProtoReflect() protoreflect.Message {
mi := &file_api_v1_user_setting_service_proto_msgTypes[1]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use UserSettingGeneral.ProtoReflect.Descriptor instead.
func (*UserSettingGeneral) Descriptor() ([]byte, []int) {
return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{1}
}
func (x *UserSettingGeneral) GetLocale() string {
if x != nil { if x != nil {
return x.Locale return x.AccessTokens
} }
return "" return nil
}
func (x *UserSettingGeneral) GetColorTheme() string {
if x != nil {
return x.ColorTheme
}
return ""
} }
type GetUserSettingRequest struct { type GetUserSettingRequest struct {
@ -145,7 +97,7 @@ type GetUserSettingRequest struct {
func (x *GetUserSettingRequest) Reset() { func (x *GetUserSettingRequest) Reset() {
*x = GetUserSettingRequest{} *x = GetUserSettingRequest{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_api_v1_user_setting_service_proto_msgTypes[2] mi := &file_api_v1_user_setting_service_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -158,7 +110,7 @@ func (x *GetUserSettingRequest) String() string {
func (*GetUserSettingRequest) ProtoMessage() {} func (*GetUserSettingRequest) ProtoMessage() {}
func (x *GetUserSettingRequest) ProtoReflect() protoreflect.Message { func (x *GetUserSettingRequest) ProtoReflect() protoreflect.Message {
mi := &file_api_v1_user_setting_service_proto_msgTypes[2] mi := &file_api_v1_user_setting_service_proto_msgTypes[1]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -171,7 +123,7 @@ func (x *GetUserSettingRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use GetUserSettingRequest.ProtoReflect.Descriptor instead. // Deprecated: Use GetUserSettingRequest.ProtoReflect.Descriptor instead.
func (*GetUserSettingRequest) Descriptor() ([]byte, []int) { func (*GetUserSettingRequest) Descriptor() ([]byte, []int) {
return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{2} return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{1}
} }
func (x *GetUserSettingRequest) GetId() int32 { func (x *GetUserSettingRequest) GetId() int32 {
@ -192,7 +144,7 @@ type GetUserSettingResponse struct {
func (x *GetUserSettingResponse) Reset() { func (x *GetUserSettingResponse) Reset() {
*x = GetUserSettingResponse{} *x = GetUserSettingResponse{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_api_v1_user_setting_service_proto_msgTypes[3] mi := &file_api_v1_user_setting_service_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -205,7 +157,7 @@ func (x *GetUserSettingResponse) String() string {
func (*GetUserSettingResponse) ProtoMessage() {} func (*GetUserSettingResponse) ProtoMessage() {}
func (x *GetUserSettingResponse) ProtoReflect() protoreflect.Message { func (x *GetUserSettingResponse) ProtoReflect() protoreflect.Message {
mi := &file_api_v1_user_setting_service_proto_msgTypes[3] mi := &file_api_v1_user_setting_service_proto_msgTypes[2]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -218,7 +170,7 @@ func (x *GetUserSettingResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use GetUserSettingResponse.ProtoReflect.Descriptor instead. // Deprecated: Use GetUserSettingResponse.ProtoReflect.Descriptor instead.
func (*GetUserSettingResponse) Descriptor() ([]byte, []int) { func (*GetUserSettingResponse) Descriptor() ([]byte, []int) {
return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{3} return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{2}
} }
func (x *GetUserSettingResponse) GetUserSetting() *UserSetting { func (x *GetUserSettingResponse) GetUserSetting() *UserSetting {
@ -244,7 +196,7 @@ type UpdateUserSettingRequest struct {
func (x *UpdateUserSettingRequest) Reset() { func (x *UpdateUserSettingRequest) Reset() {
*x = UpdateUserSettingRequest{} *x = UpdateUserSettingRequest{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_api_v1_user_setting_service_proto_msgTypes[4] mi := &file_api_v1_user_setting_service_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -257,7 +209,7 @@ func (x *UpdateUserSettingRequest) String() string {
func (*UpdateUserSettingRequest) ProtoMessage() {} func (*UpdateUserSettingRequest) ProtoMessage() {}
func (x *UpdateUserSettingRequest) ProtoReflect() protoreflect.Message { func (x *UpdateUserSettingRequest) ProtoReflect() protoreflect.Message {
mi := &file_api_v1_user_setting_service_proto_msgTypes[4] mi := &file_api_v1_user_setting_service_proto_msgTypes[3]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -270,7 +222,7 @@ func (x *UpdateUserSettingRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use UpdateUserSettingRequest.ProtoReflect.Descriptor instead. // Deprecated: Use UpdateUserSettingRequest.ProtoReflect.Descriptor instead.
func (*UpdateUserSettingRequest) Descriptor() ([]byte, []int) { func (*UpdateUserSettingRequest) Descriptor() ([]byte, []int) {
return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{4} return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{3}
} }
func (x *UpdateUserSettingRequest) GetId() int32 { func (x *UpdateUserSettingRequest) GetId() int32 {
@ -305,7 +257,7 @@ type UpdateUserSettingResponse struct {
func (x *UpdateUserSettingResponse) Reset() { func (x *UpdateUserSettingResponse) Reset() {
*x = UpdateUserSettingResponse{} *x = UpdateUserSettingResponse{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_api_v1_user_setting_service_proto_msgTypes[5] mi := &file_api_v1_user_setting_service_proto_msgTypes[4]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -318,7 +270,7 @@ func (x *UpdateUserSettingResponse) String() string {
func (*UpdateUserSettingResponse) ProtoMessage() {} func (*UpdateUserSettingResponse) ProtoMessage() {}
func (x *UpdateUserSettingResponse) ProtoReflect() protoreflect.Message { func (x *UpdateUserSettingResponse) ProtoReflect() protoreflect.Message {
mi := &file_api_v1_user_setting_service_proto_msgTypes[5] mi := &file_api_v1_user_setting_service_proto_msgTypes[4]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -331,7 +283,7 @@ func (x *UpdateUserSettingResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use UpdateUserSettingResponse.ProtoReflect.Descriptor instead. // Deprecated: Use UpdateUserSettingResponse.ProtoReflect.Descriptor instead.
func (*UpdateUserSettingResponse) Descriptor() ([]byte, []int) { func (*UpdateUserSettingResponse) Descriptor() ([]byte, []int) {
return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{5} return file_api_v1_user_setting_service_proto_rawDescGZIP(), []int{4}
} }
func (x *UpdateUserSettingResponse) GetUserSetting() *UserSetting { func (x *UpdateUserSettingResponse) GetUserSetting() *UserSetting {
@ -341,6 +293,165 @@ func (x *UpdateUserSettingResponse) GetUserSetting() *UserSetting {
return nil 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 protoreflect.FileDescriptor
var file_api_v1_user_setting_service_proto_rawDesc = []byte{ 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, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65,
0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f,
0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x59, 0x0a, 0x0b, 0x55, 0x73, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd5, 0x03, 0x0a, 0x0b, 0x55,
0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73,
0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3a, 0x0a, 0x07, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x75, 0x73, 0x65,
0x65, 0x72, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x73, 0x6c, 0x61, 0x72, 0x49, 0x64, 0x12, 0x42, 0x0a, 0x07, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x18, 0x02,
0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69,
0x74, 0x74, 0x69, 0x6e, 0x67, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x07, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x2e,
0x6e, 0x65, 0x72, 0x61, 0x6c, 0x22, 0x4d, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x07,
0x74, 0x69, 0x6e, 0x67, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x12, 0x52, 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73,
0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d,
0x61, 0x6c, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x74, 0x68, 0x65, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73,
0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73,
0x68, 0x65, 0x6d, 0x65, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x61,
0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x1a, 0x49, 0x0a, 0x0e, 0x47,
0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x56, 0x0a, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x0a,
0x16, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c,
0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x74,
0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6f,
0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x54, 0x68, 0x65, 0x6d, 0x65, 0x1a, 0xc9, 0x01, 0x0a, 0x13, 0x41, 0x63, 0x63, 0x65, 0x73,
0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x53, 0x65, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x5e,
0x74, 0x74, 0x69, 0x6e, 0x67, 0x22, 0xa5, 0x01, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18,
0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70,
0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67,
0x69, 0x64, 0x12, 0x3c, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x65, 0x74,
0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e,
0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x1a, 0x52,
0x69, 0x6e, 0x67, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x0a, 0x0b, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x21, 0x0a,
0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20,
0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e,
0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18,
0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x59, 0x0a, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74,
0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x75, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,
0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x56, 0x0a, 0x16, 0x47,
0x32, 0x19, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73,
0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x65,
0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x32, 0xd1, 0x02, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x73, 0x6c,
0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53,
0x85, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74,
0x6e, 0x67, 0x12, 0x23, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x69, 0x6e, 0x67, 0x22, 0xa5, 0x01, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73,
0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64,
0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67,
0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0xda, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61,
0x41, 0x02, 0x69, 0x64, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x61, 0x70, 0x69, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e,
0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x67, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x3b,
0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0xb2, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x03, 0x20,
0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x26, 0x2e, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52,
0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x59, 0x0a, 0x19, 0x55,
0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67,
0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72,
0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4c, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19,
0xda, 0x41, 0x18, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x2c, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73,
0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x53,
0x2b, 0x3a, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x32, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x32, 0xd1, 0x02, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x72, 0x53,
0x1b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x85, 0x01,
0x69, 0x64, 0x7d, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x42, 0xb5, 0x01, 0x0a, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67,
0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x12, 0x23, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e,
0x31, 0x42, 0x17, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65,
0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x36, 0x67, 0x69, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70,
0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x79, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74,
0x66, 0x68, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x2f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2f, 0x70, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0xda, 0x41, 0x02,
0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x69, 0x64, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x12, 0x1b, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76,
0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x53, 0x41, 0x58, 0xaa, 0x02, 0x0c, 0x53, 0x6c, 0x61, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x65, 0x74,
0x73, 0x68, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x53, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0xb2, 0x01, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
0x68, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x18, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x26, 0x2e, 0x73, 0x6c,
0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74,
0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x65, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75,
0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 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 ( var (
@ -435,31 +565,35 @@ func file_api_v1_user_setting_service_proto_rawDescGZIP() []byte {
return file_api_v1_user_setting_service_proto_rawDescData return file_api_v1_user_setting_service_proto_rawDescData
} }
var file_api_v1_user_setting_service_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_api_v1_user_setting_service_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
var file_api_v1_user_setting_service_proto_goTypes = []any{ var file_api_v1_user_setting_service_proto_goTypes = []any{
(*UserSetting)(nil), // 0: slash.api.v1.UserSetting (*UserSetting)(nil), // 0: slash.api.v1.UserSetting
(*UserSettingGeneral)(nil), // 1: slash.api.v1.UserSettingGeneral (*GetUserSettingRequest)(nil), // 1: slash.api.v1.GetUserSettingRequest
(*GetUserSettingRequest)(nil), // 2: slash.api.v1.GetUserSettingRequest (*GetUserSettingResponse)(nil), // 2: slash.api.v1.GetUserSettingResponse
(*GetUserSettingResponse)(nil), // 3: slash.api.v1.GetUserSettingResponse (*UpdateUserSettingRequest)(nil), // 3: slash.api.v1.UpdateUserSettingRequest
(*UpdateUserSettingRequest)(nil), // 4: slash.api.v1.UpdateUserSettingRequest (*UpdateUserSettingResponse)(nil), // 4: slash.api.v1.UpdateUserSettingResponse
(*UpdateUserSettingResponse)(nil), // 5: slash.api.v1.UpdateUserSettingResponse (*UserSetting_GeneralSetting)(nil), // 5: slash.api.v1.UserSetting.GeneralSetting
(*fieldmaskpb.FieldMask)(nil), // 6: google.protobuf.FieldMask (*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{ var file_api_v1_user_setting_service_proto_depIdxs = []int32{
1, // 0: slash.api.v1.UserSetting.general:type_name -> slash.api.v1.UserSettingGeneral 5, // 0: slash.api.v1.UserSetting.general:type_name -> slash.api.v1.UserSetting.GeneralSetting
0, // 1: slash.api.v1.GetUserSettingResponse.user_setting:type_name -> slash.api.v1.UserSetting 6, // 1: slash.api.v1.UserSetting.access_tokens:type_name -> slash.api.v1.UserSetting.AccessTokensSetting
0, // 2: slash.api.v1.UpdateUserSettingRequest.user_setting:type_name -> slash.api.v1.UserSetting 0, // 2: slash.api.v1.GetUserSettingResponse.user_setting:type_name -> slash.api.v1.UserSetting
6, // 3: slash.api.v1.UpdateUserSettingRequest.update_mask:type_name -> google.protobuf.FieldMask 0, // 3: slash.api.v1.UpdateUserSettingRequest.user_setting:type_name -> slash.api.v1.UserSetting
0, // 4: slash.api.v1.UpdateUserSettingResponse.user_setting:type_name -> slash.api.v1.UserSetting 8, // 4: slash.api.v1.UpdateUserSettingRequest.update_mask:type_name -> google.protobuf.FieldMask
2, // 5: slash.api.v1.UserSettingService.GetUserSetting:input_type -> slash.api.v1.GetUserSettingRequest 0, // 5: slash.api.v1.UpdateUserSettingResponse.user_setting:type_name -> slash.api.v1.UserSetting
4, // 6: slash.api.v1.UserSettingService.UpdateUserSetting:input_type -> slash.api.v1.UpdateUserSettingRequest 7, // 6: slash.api.v1.UserSetting.AccessTokensSetting.access_tokens:type_name -> slash.api.v1.UserSetting.AccessTokensSetting.AccessToken
3, // 7: slash.api.v1.UserSettingService.GetUserSetting:output_type -> slash.api.v1.GetUserSettingResponse 1, // 7: slash.api.v1.UserSettingService.GetUserSetting:input_type -> slash.api.v1.GetUserSettingRequest
5, // 8: slash.api.v1.UserSettingService.UpdateUserSetting:output_type -> slash.api.v1.UpdateUserSettingResponse 3, // 8: slash.api.v1.UserSettingService.UpdateUserSetting:input_type -> slash.api.v1.UpdateUserSettingRequest
7, // [7:9] is the sub-list for method output_type 2, // 9: slash.api.v1.UserSettingService.GetUserSetting:output_type -> slash.api.v1.GetUserSettingResponse
5, // [5:7] is the sub-list for method input_type 4, // 10: slash.api.v1.UserSettingService.UpdateUserSetting:output_type -> slash.api.v1.UpdateUserSettingResponse
5, // [5:5] is the sub-list for extension type_name 9, // [9:11] is the sub-list for method output_type
5, // [5:5] is the sub-list for extension extendee 7, // [7:9] is the sub-list for method input_type
0, // [0:5] is the sub-list for field type_name 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() } 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 { 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 { switch v := v.(*GetUserSettingRequest); i {
case 0: case 0:
return &v.state return &v.state
@ -504,7 +626,7 @@ func file_api_v1_user_setting_service_proto_init() {
return nil 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 { switch v := v.(*GetUserSettingResponse); i {
case 0: case 0:
return &v.state return &v.state
@ -516,7 +638,7 @@ func file_api_v1_user_setting_service_proto_init() {
return nil 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 { switch v := v.(*UpdateUserSettingRequest); i {
case 0: case 0:
return &v.state return &v.state
@ -528,7 +650,7 @@ func file_api_v1_user_setting_service_proto_init() {
return nil 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 { switch v := v.(*UpdateUserSettingResponse); i {
case 0: case 0:
return &v.state return &v.state
@ -540,6 +662,42 @@ func file_api_v1_user_setting_service_proto_init() {
return nil 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{} type x struct{}
out := protoimpl.TypeBuilder{ out := protoimpl.TypeBuilder{
@ -547,7 +705,7 @@ func file_api_v1_user_setting_service_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(), GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_api_v1_user_setting_service_proto_rawDesc, RawDescriptor: file_api_v1_user_setting_service_proto_rawDesc,
NumEnums: 0, NumEnums: 0,
NumMessages: 6, NumMessages: 8,
NumExtensions: 0, NumExtensions: 0,
NumServices: 1, 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"` EnableSignup bool `protobuf:"varint,4,opt,name=enable_signup,json=enableSignup,proto3" json:"enable_signup,omitempty"`
// The custom style. // The custom style.
CustomStyle string `protobuf:"bytes,5,opt,name=custom_style,json=customStyle,proto3" json:"custom_style,omitempty"` 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. // The owner name.
// Format: "users/{id}" // 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() { func (x *WorkspaceProfile) Reset() {
@ -111,13 +109,6 @@ func (x *WorkspaceProfile) GetCustomStyle() string {
return "" return ""
} }
func (x *WorkspaceProfile) GetFaviconProvider() string {
if x != nil {
return x.FaviconProvider
}
return ""
}
func (x *WorkspaceProfile) GetOwner() string { func (x *WorkspaceProfile) GetOwner() string {
if x != nil { if x != nil {
return x.Owner return x.Owner
@ -130,17 +121,10 @@ type WorkspaceSetting struct {
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields 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. // 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. // 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"` DefaultVisibility Visibility `protobuf:"varint,2,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"`
} }
func (x *WorkspaceSetting) Reset() { func (x *WorkspaceSetting) Reset() {
@ -175,27 +159,6 @@ func (*WorkspaceSetting) Descriptor() ([]byte, []int) {
return file_api_v1_workspace_service_proto_rawDescGZIP(), []int{1} 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 { func (x *WorkspaceSetting) GetCustomStyle() string {
if x != nil { if x != nil {
return x.CustomStyle return x.CustomStyle
@ -210,13 +173,6 @@ func (x *WorkspaceSetting) GetDefaultVisibility() Visibility {
return Visibility_VISIBILITY_UNSPECIFIED return Visibility_VISIBILITY_UNSPECIFIED
} }
func (x *WorkspaceSetting) GetFaviconProvider() string {
if x != nil {
return x.FaviconProvider
}
return ""
}
type GetWorkspaceProfileRequest struct { type GetWorkspaceProfileRequest struct {
state protoimpl.MessageState state protoimpl.MessageState
sizeCache protoimpl.SizeCache 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0x6d, 0x53, 0x74, 0x79, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18,
0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x22, 0x7e, 0x0a, 0x10,
0x52, 0x0f, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67,
0x72, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65,
0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x22, 0x92, 0x02, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x53, 0x74,
0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x79, 0x6c, 0x65, 0x12, 0x47, 0x0a, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76,
0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32,
0x09, 0x52, 0x0a, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x18, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x56,
0x0d, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x75, 0x70, 0x18, 0x02, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x11, 0x64, 0x65, 0x66, 0x61, 0x75,
0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x6c, 0x74, 0x56, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0x1c, 0x0a, 0x1a,
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,
0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x66, 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, 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, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c,

View File

@ -807,13 +807,32 @@ definitions:
apiv1UserSetting: apiv1UserSetting:
type: object type: object
properties: properties:
id: userId:
type: integer type: integer
format: int32 format: int32
description: id is the user id.
general: general:
$ref: '#/definitions/apiv1UserSettingGeneral' $ref: '#/definitions/apiv1UserSettingGeneralSetting'
apiv1UserSettingGeneral: 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 type: object
properties: properties:
locale: locale:
@ -831,23 +850,12 @@ definitions:
apiv1WorkspaceSetting: apiv1WorkspaceSetting:
type: object type: object
properties: properties:
licenseKey:
type: string
enableSignup:
type: boolean
description: Whether to enable other users to sign up.
instanceUrl:
type: string
description: The instance URL.
customStyle: customStyle:
type: string type: string
description: The custom style. description: The custom style.
defaultVisibility: defaultVisibility:
$ref: '#/definitions/apiv1Visibility' $ref: '#/definitions/apiv1Visibility'
description: The default visibility of shortcuts and collections. description: The default visibility of shortcuts and collections.
faviconProvider:
type: string
description: The url of custom favicon provider.
protobufAny: protobufAny:
type: object type: object
properties: properties:
@ -1128,9 +1136,6 @@ definitions:
customStyle: customStyle:
type: string type: string
description: The custom style. description: The custom style.
faviconProvider:
type: string
description: The url of custom favicon provider.
owner: owner:
type: string type: string
title: |- title: |-

View File

@ -20,14 +20,16 @@
- [store/user_setting.proto](#store_user_setting-proto) - [store/user_setting.proto](#store_user_setting-proto)
- [UserSetting](#slash-store-UserSetting) - [UserSetting](#slash-store-UserSetting)
- [UserSettingAccessTokens](#slash-store-UserSettingAccessTokens) - [UserSetting.AccessTokensSetting](#slash-store-UserSetting-AccessTokensSetting)
- [UserSettingAccessTokens.AccessToken](#slash-store-UserSettingAccessTokens-AccessToken) - [UserSetting.AccessTokensSetting.AccessToken](#slash-store-UserSetting-AccessTokensSetting-AccessToken)
- [UserSettingGeneral](#slash-store-UserSettingGeneral) - [UserSetting.GeneralSetting](#slash-store-UserSetting-GeneralSetting)
- [UserSettingKey](#slash-store-UserSettingKey) - [UserSettingKey](#slash-store-UserSettingKey)
- [store/workspace_setting.proto](#store_workspace_setting-proto) - [store/workspace_setting.proto](#store_workspace_setting-proto)
- [WorkspaceSetting](#slash-store-WorkspaceSetting) - [WorkspaceSetting](#slash-store-WorkspaceSetting)
- [WorkspaceSetting.GeneralSetting](#slash-store-WorkspaceSetting-GeneralSetting)
- [WorkspaceSetting.ShortcutRelatedSetting](#slash-store-WorkspaceSetting-ShortcutRelatedSetting)
- [WorkspaceSettingKey](#slash-store-WorkspaceSettingKey) - [WorkspaceSettingKey](#slash-store-WorkspaceSettingKey)
@ -242,38 +244,38 @@
| ----- | ---- | ----- | ----------- | | ----- | ---- | ----- | ----------- |
| user_id | [int32](#int32) | | | | user_id | [int32](#int32) | | |
| key | [UserSettingKey](#slash-store-UserSettingKey) | | | | key | [UserSettingKey](#slash-store-UserSettingKey) | | |
| general | [UserSettingGeneral](#slash-store-UserSettingGeneral) | | | | general | [UserSetting.GeneralSetting](#slash-store-UserSetting-GeneralSetting) | | |
| access_tokens | [UserSettingAccessTokens](#slash-store-UserSettingAccessTokens) | | | | 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 | | 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 | | 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. | | 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 | | Name | Number | Description |
| ---- | ------ | ----------- | | ---- | ------ | ----------- |
| USER_SETTING_KEY_UNSPECIFIED | 0 | | | USER_SETTING_KEY_UNSPECIFIED | 0 | |
| GENERAL | 1 | General settings for the user. | | USER_SETTING_GENERAL | 1 | User general settings. |
| ACCESS_TOKENS | 2 | Access tokens for the user. | | USER_SETTING_ACCESS_TOKENS | 2 | User access tokens. |
@ -335,13 +337,41 @@
| Field | Type | Label | Description | | Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- | | ----- | ---- | ----- | ----------- |
| key | [WorkspaceSettingKey](#slash-store-WorkspaceSettingKey) | | | | key | [WorkspaceSettingKey](#slash-store-WorkspaceSettingKey) | | |
| license_key | [string](#string) | | The license key of workspace. | | raw | [string](#string) | | |
| secret_session | [string](#string) | | The secret session key used to encrypt session data. | | general | [WorkspaceSetting.GeneralSetting](#slash-store-WorkspaceSetting-GeneralSetting) | | |
| enable_signup | [bool](#bool) | | Whether to enable other users to sign up. | | shortcut_related | [WorkspaceSetting.ShortcutRelatedSetting](#slash-store-WorkspaceSetting-ShortcutRelatedSetting) | | |
| 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 |
<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 | | Name | Number | Description |
| ---- | ------ | ----------- | | ---- | ------ | ----------- |
| WORKSPACE_SETTING_KEY_UNSPECIFIED | 0 | | | WORKSPACE_SETTING_KEY_UNSPECIFIED | 0 | |
| WORKSPACE_SETTING_LICENSE_KEY | 1 | The license key. | | WORKSPACE_SETTING_GENERAL | 1 | Workspace general settings. |
| WORKSPACE_SETTING_SECRET_SESSION | 2 | The secret session key used to encrypt session data. | | WORKSPACE_SETTING_SHORTCUT_RELATED | 2 | Workspace shortcut-related settings. |
| WORKSAPCE_SETTING_ENABLE_SIGNUP | 3 | Whether to enable other users to sign up. | | WORKSPACE_SETTING_LICENSE_KEY | 3 | TODO: remove the following keys. The license key. |
| WORKSPACE_SETTING_CUSTOM_STYLE | 4 | The custom style. | | WORKSPACE_SETTING_SECRET_SESSION | 4 | The secret session key used to encrypt session data. |
| WORKSPACE_SETTING_INSTANCE_URL | 7 | The instance URL. | | WORKSPACE_SETTING_CUSTOM_STYLE | 5 | The custom style. |
| WORKSPACE_SETTING_DEFAULT_VISIBILITY | 8 | The default visibility of shortcuts and collections. | | WORKSPACE_SETTING_DEFAULT_VISIBILITY | 6 | The default visibility of shortcuts and collections. |
| WORKSPACE_SETTING_FAVICON_PROVIDER | 9 | The url of custom favicon provider. |

View File

@ -24,23 +24,23 @@ type UserSettingKey int32
const ( const (
UserSettingKey_USER_SETTING_KEY_UNSPECIFIED UserSettingKey = 0 UserSettingKey_USER_SETTING_KEY_UNSPECIFIED UserSettingKey = 0
// General settings for the user. // User general settings.
UserSettingKey_GENERAL UserSettingKey = 1 UserSettingKey_USER_SETTING_GENERAL UserSettingKey = 1
// Access tokens for the user. // User access tokens.
UserSettingKey_ACCESS_TOKENS UserSettingKey = 2 UserSettingKey_USER_SETTING_ACCESS_TOKENS UserSettingKey = 2
) )
// Enum value maps for UserSettingKey. // Enum value maps for UserSettingKey.
var ( var (
UserSettingKey_name = map[int32]string{ UserSettingKey_name = map[int32]string{
0: "USER_SETTING_KEY_UNSPECIFIED", 0: "USER_SETTING_KEY_UNSPECIFIED",
1: "GENERAL", 1: "USER_SETTING_GENERAL",
2: "ACCESS_TOKENS", 2: "USER_SETTING_ACCESS_TOKENS",
} }
UserSettingKey_value = map[string]int32{ UserSettingKey_value = map[string]int32{
"USER_SETTING_KEY_UNSPECIFIED": 0, "USER_SETTING_KEY_UNSPECIFIED": 0,
"GENERAL": 1, "USER_SETTING_GENERAL": 1,
"ACCESS_TOKENS": 2, "USER_SETTING_ACCESS_TOKENS": 2,
} }
) )
@ -138,14 +138,14 @@ func (m *UserSetting) GetValue() isUserSetting_Value {
return nil return nil
} }
func (x *UserSetting) GetGeneral() *UserSettingGeneral { func (x *UserSetting) GetGeneral() *UserSetting_GeneralSetting {
if x, ok := x.GetValue().(*UserSetting_General); ok { if x, ok := x.GetValue().(*UserSetting_General); ok {
return x.General return x.General
} }
return nil return nil
} }
func (x *UserSetting) GetAccessTokens() *UserSettingAccessTokens { func (x *UserSetting) GetAccessTokens() *UserSetting_AccessTokensSetting {
if x, ok := x.GetValue().(*UserSetting_AccessTokens); ok { if x, ok := x.GetValue().(*UserSetting_AccessTokens); ok {
return x.AccessTokens return x.AccessTokens
} }
@ -157,18 +157,18 @@ type isUserSetting_Value interface {
} }
type UserSetting_General struct { 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 { 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_General) isUserSetting_Value() {}
func (*UserSetting_AccessTokens) isUserSetting_Value() {} func (*UserSetting_AccessTokens) isUserSetting_Value() {}
type UserSettingGeneral struct { type UserSetting_GeneralSetting struct {
state protoimpl.MessageState state protoimpl.MessageState
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields 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"` ColorTheme string `protobuf:"bytes,2,opt,name=color_theme,json=colorTheme,proto3" json:"color_theme,omitempty"`
} }
func (x *UserSettingGeneral) Reset() { func (x *UserSetting_GeneralSetting) Reset() {
*x = UserSettingGeneral{} *x = UserSetting_GeneralSetting{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_store_user_setting_proto_msgTypes[1] mi := &file_store_user_setting_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@ -186,13 +186,13 @@ func (x *UserSettingGeneral) Reset() {
} }
} }
func (x *UserSettingGeneral) String() string { func (x *UserSetting_GeneralSetting) String() string {
return protoimpl.X.MessageStringOf(x) 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] mi := &file_store_user_setting_proto_msgTypes[1]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@ -204,35 +204,35 @@ func (x *UserSettingGeneral) ProtoReflect() protoreflect.Message {
return mi.MessageOf(x) return mi.MessageOf(x)
} }
// Deprecated: Use UserSettingGeneral.ProtoReflect.Descriptor instead. // Deprecated: Use UserSetting_GeneralSetting.ProtoReflect.Descriptor instead.
func (*UserSettingGeneral) Descriptor() ([]byte, []int) { func (*UserSetting_GeneralSetting) Descriptor() ([]byte, []int) {
return file_store_user_setting_proto_rawDescGZIP(), []int{1} return file_store_user_setting_proto_rawDescGZIP(), []int{0, 0}
} }
func (x *UserSettingGeneral) GetLocale() string { func (x *UserSetting_GeneralSetting) GetLocale() string {
if x != nil { if x != nil {
return x.Locale return x.Locale
} }
return "" return ""
} }
func (x *UserSettingGeneral) GetColorTheme() string { func (x *UserSetting_GeneralSetting) GetColorTheme() string {
if x != nil { if x != nil {
return x.ColorTheme return x.ColorTheme
} }
return "" return ""
} }
type UserSettingAccessTokens struct { type UserSetting_AccessTokensSetting struct {
state protoimpl.MessageState state protoimpl.MessageState
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields 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() { func (x *UserSetting_AccessTokensSetting) Reset() {
*x = UserSettingAccessTokens{} *x = UserSetting_AccessTokensSetting{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_store_user_setting_proto_msgTypes[2] mi := &file_store_user_setting_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@ -240,13 +240,13 @@ func (x *UserSettingAccessTokens) Reset() {
} }
} }
func (x *UserSettingAccessTokens) String() string { func (x *UserSetting_AccessTokensSetting) String() string {
return protoimpl.X.MessageStringOf(x) 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] mi := &file_store_user_setting_proto_msgTypes[2]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@ -258,32 +258,31 @@ func (x *UserSettingAccessTokens) ProtoReflect() protoreflect.Message {
return mi.MessageOf(x) return mi.MessageOf(x)
} }
// Deprecated: Use UserSettingAccessTokens.ProtoReflect.Descriptor instead. // Deprecated: Use UserSetting_AccessTokensSetting.ProtoReflect.Descriptor instead.
func (*UserSettingAccessTokens) Descriptor() ([]byte, []int) { func (*UserSetting_AccessTokensSetting) Descriptor() ([]byte, []int) {
return file_store_user_setting_proto_rawDescGZIP(), []int{2} 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 { if x != nil {
return x.AccessTokens return x.AccessTokens
} }
return nil return nil
} }
type UserSettingAccessTokens_AccessToken struct { type UserSetting_AccessTokensSetting_AccessToken struct {
state protoimpl.MessageState state protoimpl.MessageState
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields unknownFields protoimpl.UnknownFields
// The access token is a JWT token. // The access token is a JWT token, including expiration time, issuer, etc.
// Including expiration time, issuer, etc.
AccessToken string `protobuf:"bytes,1,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"` AccessToken string `protobuf:"bytes,1,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"`
// A description for the access token. // A description for the access token.
Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
} }
func (x *UserSettingAccessTokens_AccessToken) Reset() { func (x *UserSetting_AccessTokensSetting_AccessToken) Reset() {
*x = UserSettingAccessTokens_AccessToken{} *x = UserSetting_AccessTokensSetting_AccessToken{}
if protoimpl.UnsafeEnabled { if protoimpl.UnsafeEnabled {
mi := &file_store_user_setting_proto_msgTypes[3] mi := &file_store_user_setting_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 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) 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] mi := &file_store_user_setting_proto_msgTypes[3]
if protoimpl.UnsafeEnabled && x != nil { if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@ -309,19 +308,19 @@ func (x *UserSettingAccessTokens_AccessToken) ProtoReflect() protoreflect.Messag
return mi.MessageOf(x) return mi.MessageOf(x)
} }
// Deprecated: Use UserSettingAccessTokens_AccessToken.ProtoReflect.Descriptor instead. // Deprecated: Use UserSetting_AccessTokensSetting_AccessToken.ProtoReflect.Descriptor instead.
func (*UserSettingAccessTokens_AccessToken) Descriptor() ([]byte, []int) { func (*UserSetting_AccessTokensSetting_AccessToken) Descriptor() ([]byte, []int) {
return file_store_user_setting_proto_rawDescGZIP(), []int{2, 0} 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 { if x != nil {
return x.AccessToken return x.AccessToken
} }
return "" return ""
} }
func (x *UserSettingAccessTokens_AccessToken) GetDescription() string { func (x *UserSetting_AccessTokensSetting_AccessToken) GetDescription() string {
if x != nil { if x != nil {
return x.Description return x.Description
} }
@ -333,55 +332,58 @@ var File_store_user_setting_proto protoreflect.FileDescriptor
var file_store_user_setting_proto_rawDesc = []byte{ var file_store_user_setting_proto_rawDesc = []byte{
0x0a, 0x18, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x74, 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, 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, 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, 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, 0x12, 0x2d, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e,
0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72,
0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12,
0x3b, 0x0a, 0x07, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x43, 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, 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, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72,
0x6c, 0x48, 0x00, 0x52, 0x07, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x12, 0x4b, 0x0a, 0x0d, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x07, 0x67, 0x65, 0x6e,
0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x65, 0x72, 0x61, 0x6c, 0x12, 0x53, 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74,
0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x73, 0x6c,
0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65,
0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65,
0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x6e, 0x73, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x63, 0x63,
0x75, 0x65, 0x22, 0x4d, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x1a, 0x49, 0x0a, 0x0e, 0x47, 0x65, 0x6e,
0x67, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x61, 0x65, 0x72, 0x61, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x6c,
0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x6f, 0x63,
0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x74, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x61, 0x6c, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x5f, 0x74, 0x68, 0x65,
0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x68, 0x65, 0x6d, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54,
0x65, 0x22, 0xc4, 0x01, 0x0a, 0x17, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x68, 0x65, 0x6d, 0x65, 0x1a, 0xc8, 0x01, 0x0a, 0x13, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54,
0x67, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x55, 0x0a, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x5d, 0x0a, 0x0d,
0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20,
0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72,
0x72, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x63, 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, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e,
0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x67, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x0c, 0x61,
0x6b, 0x65, 0x6e, 0x73, 0x1a, 0x52, 0x0a, 0x0b, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x1a, 0x52, 0x0a, 0x0b, 0x41,
0x6b, 0x65, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63,
0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x20, 0x0a,
0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01,
0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x52, 0x0a, 0x0e, 0x55, 0x73, 0x65, 0x72, 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, 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, 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, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14,
0x47, 0x45, 0x4e, 0x45, 0x52, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x41, 0x43, 0x43, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x47, 0x45, 0x4e,
0x45, 0x53, 0x53, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x53, 0x10, 0x02, 0x42, 0xa1, 0x01, 0x0a, 0x45, 0x52, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x53,
0x0f, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x54, 0x4f,
0x42, 0x10, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x4b, 0x45, 0x4e, 0x53, 0x10, 0x02, 0x42, 0xa1, 0x01, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x2e, 0x73,
0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x10, 0x55, 0x73, 0x65, 0x72,
0x2f, 0x79, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x6c, 0x66, 0x68, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x2f, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2f,
0x73, 0x6c, 0x61, 0x73, 0x68, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x79, 0x6f, 0x75, 0x72, 0x73,
0x73, 0x74, 0x6f, 0x72, 0x65, 0xa2, 0x02, 0x03, 0x53, 0x53, 0x58, 0xaa, 0x02, 0x0b, 0x53, 0x6c, 0x65, 0x6c, 0x66, 0x68, 0x6f, 0x73, 0x74, 0x65, 0x64, 0x2f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2f,
0x61, 0x73, 0x68, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0xca, 0x02, 0x0b, 0x53, 0x6c, 0x61, 0x73, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0xa2,
0x68, 0x5c, 0x53, 0x74, 0x6f, 0x72, 0x65, 0xe2, 0x02, 0x17, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x5c, 0x02, 0x03, 0x53, 0x53, 0x58, 0xaa, 0x02, 0x0b, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x53, 0x74,
0x53, 0x74, 0x6f, 0x72, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x65, 0xca, 0x02, 0x0b, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x5c, 0x53, 0x74, 0x6f, 0x72,
0x61, 0xea, 0x02, 0x0c, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x3a, 0x3a, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x65, 0xe2, 0x02, 0x17, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x5c, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x5c,
0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0c, 0x53, 0x6c,
0x61, 0x73, 0x68, 0x3a, 0x3a, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x33,
} }
var ( var (
@ -401,15 +403,15 @@ var file_store_user_setting_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
var file_store_user_setting_proto_goTypes = []any{ var file_store_user_setting_proto_goTypes = []any{
(UserSettingKey)(0), // 0: slash.store.UserSettingKey (UserSettingKey)(0), // 0: slash.store.UserSettingKey
(*UserSetting)(nil), // 1: slash.store.UserSetting (*UserSetting)(nil), // 1: slash.store.UserSetting
(*UserSettingGeneral)(nil), // 2: slash.store.UserSettingGeneral (*UserSetting_GeneralSetting)(nil), // 2: slash.store.UserSetting.GeneralSetting
(*UserSettingAccessTokens)(nil), // 3: slash.store.UserSettingAccessTokens (*UserSetting_AccessTokensSetting)(nil), // 3: slash.store.UserSetting.AccessTokensSetting
(*UserSettingAccessTokens_AccessToken)(nil), // 4: slash.store.UserSettingAccessTokens.AccessToken (*UserSetting_AccessTokensSetting_AccessToken)(nil), // 4: slash.store.UserSetting.AccessTokensSetting.AccessToken
} }
var file_store_user_setting_proto_depIdxs = []int32{ var file_store_user_setting_proto_depIdxs = []int32{
0, // 0: slash.store.UserSetting.key:type_name -> slash.store.UserSettingKey 0, // 0: slash.store.UserSetting.key:type_name -> slash.store.UserSettingKey
2, // 1: slash.store.UserSetting.general:type_name -> slash.store.UserSettingGeneral 2, // 1: slash.store.UserSetting.general:type_name -> slash.store.UserSetting.GeneralSetting
3, // 2: slash.store.UserSetting.access_tokens:type_name -> slash.store.UserSettingAccessTokens 3, // 2: slash.store.UserSetting.access_tokens:type_name -> slash.store.UserSetting.AccessTokensSetting
4, // 3: slash.store.UserSettingAccessTokens.access_tokens:type_name -> slash.store.UserSettingAccessTokens.AccessToken 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 output_type
4, // [4:4] is the sub-list for method input_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 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 { 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: case 0:
return &v.state return &v.state
case 1: 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 { 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: case 0:
return &v.state return &v.state
case 1: 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 { 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: case 0:
return &v.state return &v.state
case 1: case 1:

View File

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

View File

@ -10,32 +10,30 @@ message UserSetting {
UserSettingKey key = 2; UserSettingKey key = 2;
oneof value { 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 { enum UserSettingKey {
USER_SETTING_KEY_UNSPECIFIED = 0; USER_SETTING_KEY_UNSPECIFIED = 0;
// General settings for the user. // User general settings.
GENERAL = 1; USER_SETTING_GENERAL = 1;
// Access tokens for the user. // User access tokens.
ACCESS_TOKENS = 2; USER_SETTING_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;
} }

View File

@ -8,39 +8,38 @@ option go_package = "gen/store";
message WorkspaceSetting { message WorkspaceSetting {
WorkspaceSettingKey key = 1; WorkspaceSettingKey key = 1;
string raw = 4;
oneof value { oneof value {
// The license key of workspace. GeneralSetting general = 2;
ShortcutRelatedSetting shortcut_related = 3;
}
message GeneralSetting {
string secret_session = 1;
string license_key = 2; string license_key = 2;
// The secret session key used to encrypt session data. string custom_style = 3;
string secret_session = 3; }
// Whether to enable other users to sign up.
bool enable_signup = 4; message ShortcutRelatedSetting {
// The custom style. Visibility default_visibility = 1;
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;
} }
} }
enum WorkspaceSettingKey { enum WorkspaceSettingKey {
WORKSPACE_SETTING_KEY_UNSPECIFIED = 0; 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. // The license key.
WORKSPACE_SETTING_LICENSE_KEY = 1; WORKSPACE_SETTING_LICENSE_KEY = 3;
// The secret session key used to encrypt session data. // The secret session key used to encrypt session data.
WORKSPACE_SETTING_SECRET_SESSION = 2; WORKSPACE_SETTING_SECRET_SESSION = 4;
// Whether to enable other users to sign up.
WORKSAPCE_SETTING_ENABLE_SIGNUP = 3;
// The custom style. // The custom style.
WORKSPACE_SETTING_CUSTOM_STYLE = 4; WORKSPACE_SETTING_CUSTOM_STYLE = 5;
// The instance URL.
WORKSPACE_SETTING_INSTANCE_URL = 7;
// The default visibility of shortcuts and collections. // The default visibility of shortcuts and collections.
WORKSPACE_SETTING_DEFAULT_VISIBILITY = 8; WORKSPACE_SETTING_DEFAULT_VISIBILITY = 6;
// The url of custom favicon provider.
WORKSPACE_SETTING_FAVICON_PROVIDER = 9;
} }

View File

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

View File

@ -12,7 +12,6 @@ import (
"google.golang.org/grpc/status" "google.golang.org/grpc/status"
v1pb "github.com/yourselfhosted/slash/proto/gen/api/v1" 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/metric"
"github.com/yourselfhosted/slash/server/service/license" "github.com/yourselfhosted/slash/server/service/license"
"github.com/yourselfhosted/slash/store" "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) { func (s *APIV1Service) SignUp(ctx context.Context, request *v1pb.SignUpRequest) (*v1pb.SignUpResponse, error) {
enableSignUpSetting, err := s.Store.GetWorkspaceSetting(ctx, &store.FindWorkspaceSetting{ if !s.Profile.Public {
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() {
return nil, status.Errorf(codes.PermissionDenied, "sign up is not allowed") 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 { if err != nil {
return nil, status.Errorf(codes.Internal, "failed to list access tokens: %v", err) return nil, status.Errorf(codes.Internal, "failed to list access tokens: %v", err)
} }
updatedUserAccessTokens := []*storepb.UserSettingAccessTokens_AccessToken{} updatedUserAccessTokens := []*storepb.UserSetting_AccessTokensSetting_AccessToken{}
for _, userAccessToken := range userAccessTokens { for _, userAccessToken := range userAccessTokens {
if userAccessToken.AccessToken == request.AccessToken { if userAccessToken.AccessToken == request.AccessToken {
continue continue
@ -260,9 +260,9 @@ func (s *APIV1Service) DeleteUserAccessToken(ctx context.Context, request *v1pb.
} }
if _, err := s.Store.UpsertUserSetting(ctx, &storepb.UserSetting{ if _, err := s.Store.UpsertUserSetting(ctx, &storepb.UserSetting{
UserId: user.ID, UserId: user.ID,
Key: storepb.UserSettingKey_ACCESS_TOKENS, Key: storepb.UserSettingKey_USER_SETTING_ACCESS_TOKENS,
Value: &storepb.UserSetting_AccessTokens{ Value: &storepb.UserSetting_AccessTokens{
AccessTokens: &storepb.UserSettingAccessTokens{ AccessTokens: &storepb.UserSetting_AccessTokensSetting{
AccessTokens: updatedUserAccessTokens, AccessTokens: updatedUserAccessTokens,
}, },
}, },
@ -278,16 +278,16 @@ func (s *APIV1Service) UpsertAccessTokenToStore(ctx context.Context, user *store
if err != nil { if err != nil {
return errors.Wrap(err, "failed to get user access tokens") return errors.Wrap(err, "failed to get user access tokens")
} }
userAccessToken := storepb.UserSettingAccessTokens_AccessToken{ userAccessToken := storepb.UserSetting_AccessTokensSetting_AccessToken{
AccessToken: accessToken, AccessToken: accessToken,
Description: description, Description: description,
} }
userAccessTokens = append(userAccessTokens, &userAccessToken) userAccessTokens = append(userAccessTokens, &userAccessToken)
if _, err := s.Store.UpsertUserSetting(ctx, &storepb.UserSetting{ if _, err := s.Store.UpsertUserSetting(ctx, &storepb.UserSetting{
UserId: user.ID, UserId: user.ID,
Key: storepb.UserSettingKey_ACCESS_TOKENS, Key: storepb.UserSettingKey_USER_SETTING_ACCESS_TOKENS,
Value: &storepb.UserSetting_AccessTokens{ Value: &storepb.UserSetting_AccessTokens{
AccessTokens: &storepb.UserSettingAccessTokens{ AccessTokens: &storepb.UserSetting_AccessTokensSetting{
AccessTokens: userAccessTokens, AccessTokens: userAccessTokens,
}, },
}, },

View File

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

View File

@ -14,10 +14,11 @@ import (
) )
func (s *APIV1Service) GetWorkspaceProfile(ctx context.Context, _ *v1pb.GetWorkspaceProfileRequest) (*v1pb.GetWorkspaceProfileResponse, error) { func (s *APIV1Service) GetWorkspaceProfile(ctx context.Context, _ *v1pb.GetWorkspaceProfileRequest) (*v1pb.GetWorkspaceProfileResponse, error) {
profile := &v1pb.WorkspaceProfile{ workspaceProfile := &v1pb.WorkspaceProfile{
Mode: s.Profile.Mode, Mode: s.Profile.Mode,
Version: s.Profile.Version, Version: s.Profile.Version,
Plan: v1pb.PlanType_FREE, Plan: v1pb.PlanType_FREE,
EnableSignup: s.Profile.Public,
} }
// Load subscription plan from license service. // Load subscription plan from license service.
@ -25,66 +26,34 @@ func (s *APIV1Service) GetWorkspaceProfile(ctx context.Context, _ *v1pb.GetWorks
if err != nil { if err != nil {
return nil, status.Errorf(codes.Internal, "failed to get subscription: %v", err) 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) owner, err := s.GetInstanceOwner(ctx)
if err != nil { if err != nil {
return nil, status.Errorf(codes.Internal, "failed to get instance owner: %v", err) return nil, status.Errorf(codes.Internal, "failed to get instance owner: %v", err)
} }
if owner != nil { if owner != nil {
profile.Owner = fmt.Sprintf("%s%d", UserNamePrefix, owner.Id) workspaceProfile.Owner = fmt.Sprintf("%s%d", UserNamePrefix, owner.Id)
} }
return &v1pb.GetWorkspaceProfileResponse{ return &v1pb.GetWorkspaceProfileResponse{
Profile: profile, Profile: workspaceProfile,
}, nil }, nil
} }
func (s *APIV1Service) GetWorkspaceSetting(ctx context.Context, _ *v1pb.GetWorkspaceSettingRequest) (*v1pb.GetWorkspaceSettingResponse, error) { 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{}) workspaceSettings, err := s.Store.ListWorkspaceSettings(ctx, &store.FindWorkspaceSetting{})
if err != nil { if err != nil {
return nil, status.Errorf(codes.Internal, "failed to list workspace settings: %v", err) return nil, status.Errorf(codes.Internal, "failed to list workspace settings: %v", err)
} }
workspaceSetting := &v1pb.WorkspaceSetting{ workspaceSetting := &v1pb.WorkspaceSetting{}
EnableSignup: true,
}
for _, v := range workspaceSettings { for _, v := range workspaceSettings {
if v.Key == storepb.WorkspaceSettingKey_WORKSAPCE_SETTING_ENABLE_SIGNUP { if v.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL {
workspaceSetting.EnableSignup = v.GetEnableSignup() generalSetting := v.GetGeneral()
} else if v.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_INSTANCE_URL { workspaceSetting.CustomStyle = generalSetting.GetCustomStyle()
workspaceSetting.InstanceUrl = v.GetInstanceUrl() } else if v.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SHORTCUT_RELATED {
} else if v.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_CUSTOM_STYLE { shortcutRelatedSetting := v.GetShortcutRelated()
workspaceSetting.CustomStyle = v.GetCustomStyle() workspaceSetting.DefaultVisibility = v1pb.Visibility(shortcutRelatedSetting.GetDefaultVisibility())
} 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()
}
} }
} }
return &v1pb.GetWorkspaceSettingResponse{ return &v1pb.GetWorkspaceSettingResponse{
@ -98,56 +67,50 @@ func (s *APIV1Service) UpdateWorkspaceSetting(ctx context.Context, request *v1pb
} }
for _, path := range request.UpdateMask.Paths { for _, path := range request.UpdateMask.Paths {
if path == "license_key" { if path == "custom_style" {
if _, err := s.Store.UpsertWorkspaceSetting(ctx, &storepb.WorkspaceSetting{ generalSetting, err := s.Store.GetWorkspaceSetting(ctx, &store.FindWorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY, Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL,
Value: &storepb.WorkspaceSetting_LicenseKey{ })
LicenseKey: request.Setting.LicenseKey, if err != nil {
}, return nil, status.Errorf(codes.Internal, "failed to get workspace setting: %v", err)
}); err != nil {
return nil, status.Errorf(codes.Internal, "failed to update workspace setting: %v", err)
} }
} else if path == "enable_signup" { if generalSetting == nil {
if _, err := s.Store.UpsertWorkspaceSetting(ctx, &storepb.WorkspaceSetting{ generalSetting = &storepb.WorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSAPCE_SETTING_ENABLE_SIGNUP, Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL,
Value: &storepb.WorkspaceSetting_EnableSignup{ Value: &storepb.WorkspaceSetting_General{
EnableSignup: request.Setting.EnableSignup, 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{ if _, err := s.Store.UpsertWorkspaceSetting(ctx, &storepb.WorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_CUSTOM_STYLE, Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL,
Value: &storepb.WorkspaceSetting_CustomStyle{ Value: &storepb.WorkspaceSetting_General{
CustomStyle: request.Setting.CustomStyle, General: generalSetting.GetGeneral(),
}, },
}); err != nil { }); err != nil {
return nil, status.Errorf(codes.Internal, "failed to update workspace setting: %v", err) return nil, status.Errorf(codes.Internal, "failed to update workspace setting: %v", err)
} }
} else if path == "default_visibility" { } else if path == "default_visibility" {
if _, err := s.Store.UpsertWorkspaceSetting(ctx, &storepb.WorkspaceSetting{ shortcutRelatedSetting, err := s.Store.GetWorkspaceSetting(ctx, &store.FindWorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_DEFAULT_VISIBILITY, Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SHORTCUT_RELATED,
Value: &storepb.WorkspaceSetting_DefaultVisibility{ })
DefaultVisibility: storepb.Visibility(request.Setting.DefaultVisibility), if err != nil {
}, return nil, status.Errorf(codes.Internal, "failed to get workspace setting: %v", err)
}); err != nil {
return nil, status.Errorf(codes.Internal, "failed to update 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{ if _, err := s.Store.UpsertWorkspaceSetting(ctx, &storepb.WorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_FAVICON_PROVIDER, Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SHORTCUT_RELATED,
Value: &storepb.WorkspaceSetting_FaviconProvider{ Value: &storepb.WorkspaceSetting_ShortcutRelated{
FaviconProvider: request.Setting.FaviconProvider, ShortcutRelated: shortcutRelatedSetting.GetShortcutRelated(),
}, },
}); err != nil { }); err != nil {
return nil, status.Errorf(codes.Internal, "failed to update workspace setting: %v", err) 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) { func (s *FrontendService) registerFileRoutes(ctx context.Context, e *echo.Echo) {
instanceURLSetting, err := s.Store.GetWorkspaceSetting(ctx, &store.FindWorkspaceSetting{ instanceURL := s.Profile.InstanceURL
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_INSTANCE_URL,
})
if err != nil || instanceURLSetting == nil {
return
}
instanceURL := instanceURLSetting.GetInstanceUrl()
if instanceURL == "" { if instanceURL == "" {
return return
} }

View File

@ -120,23 +120,25 @@ func (s *Server) GetEcho() *echo.Echo {
} }
func (s *Server) getSecretSessionName(ctx context.Context) (string, error) { func (s *Server) getSecretSessionName(ctx context.Context) (string, error) {
secretSessionSetting, err := s.Store.GetWorkspaceSetting(ctx, &store.FindWorkspaceSetting{ workspaceSettingGeneral, err := s.Store.GetWorkspaceSetting(ctx, &store.FindWorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SECRET_SESSION, Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL,
}) })
if err != nil { if err != nil {
return "", err return "", err
} }
if secretSessionSetting == nil { if workspaceSettingGeneral == nil || workspaceSettingGeneral.GetGeneral() == nil {
tempSecret := uuid.New().String() tempSecret := uuid.New().String()
secretSessionSetting, err = s.Store.UpsertWorkspaceSetting(ctx, &storepb.WorkspaceSetting{ workspaceSettingGeneral, err = s.Store.UpsertWorkspaceSetting(ctx, &storepb.WorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SECRET_SESSION, Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL,
Value: &storepb.WorkspaceSetting_SecretSession{ Value: &storepb.WorkspaceSetting_General{
General: &storepb.WorkspaceSetting_GeneralSetting{
SecretSession: tempSecret, SecretSession: tempSecret,
}, },
},
}) })
if err != nil { if err != nil {
return "", err 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) { func (s *LicenseService) LoadSubscription(ctx context.Context) (*v1pb.Subscription, error) {
workspaceSetting, err := s.Store.GetWorkspaceSetting(ctx, &store.FindWorkspaceSetting{ workspaceSettingGeneral, err := s.Store.GetWorkspaceSetting(ctx, &store.FindWorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY, Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL,
}) })
if err != nil { if err != nil {
return nil, errors.Wrap(err, "failed to get workspace setting") 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, Plan: v1pb.PlanType_FREE,
} }
licenseKey := "" licenseKey := ""
if workspaceSetting != nil { if workspaceSettingGeneral != nil {
licenseKey = workspaceSetting.GetLicenseKey() licenseKey = workspaceSettingGeneral.GetGeneral().LicenseKey
} }
if licenseKey == "" { if licenseKey == "" {
return subscription, nil return subscription, nil
@ -79,12 +79,25 @@ func (s *LicenseService) UpdateSubscription(ctx context.Context, licenseKey stri
if result == nil { if result == nil {
return nil, errors.New("invalid license key") return nil, errors.New("invalid license key")
} }
_, err = s.Store.UpsertWorkspaceSetting(ctx, &storepb.WorkspaceSetting{ workspaceSettingGeneral, err := s.Store.GetWorkspaceSetting(ctx, &store.FindWorkspaceSetting{
Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY, Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL,
Value: &storepb.WorkspaceSetting_LicenseKey{ })
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, LicenseKey: licenseKey,
}, },
}) },
}
} else {
workspaceSettingGeneral.GetGeneral().LicenseKey = licenseKey
}
_, err = s.Store.UpsertWorkspaceSetting(ctx, workspaceSettingGeneral)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "failed to upsert workspace setting") return nil, errors.Wrap(err, "failed to upsert workspace setting")
} }

View File

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

View File

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

View File

@ -3,11 +3,12 @@ package postgres
import ( import (
"context" "context"
"errors" "errors"
"strconv" "slices"
"strings" "strings"
storepb "github.com/yourselfhosted/slash/proto/gen/store" storepb "github.com/yourselfhosted/slash/proto/gen/store"
"github.com/yourselfhosted/slash/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) { 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 SET value = EXCLUDED.value
` `
var valueString string var valueString string
if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY { if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL {
valueString = upsert.GetLicenseKey() valueBytes, err := protojson.Marshal(upsert.GetGeneral())
} else if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SECRET_SESSION { if err != nil {
valueString = upsert.GetSecretSession() return nil, err
} else if upsert.Key == storepb.WorkspaceSettingKey_WORKSAPCE_SETTING_ENABLE_SIGNUP { }
valueString = strconv.FormatBool(upsert.GetEnableSignup()) valueString = string(valueBytes)
} else if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_CUSTOM_STYLE { } else if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SHORTCUT_RELATED {
valueString = upsert.GetCustomStyle() valueBytes, err := protojson.Marshal(upsert.GetShortcutRelated())
} else if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_INSTANCE_URL { if err != nil {
valueString = upsert.GetInstanceUrl() return nil, err
} else if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_DEFAULT_VISIBILITY { }
valueString = upsert.GetDefaultVisibility().String() valueString = string(valueBytes)
} else { } else {
return nil, errors.New("invalid workspace setting key") 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 return nil, err
} }
workspaceSetting.Key = storepb.WorkspaceSettingKey(storepb.WorkspaceSettingKey_value[keyString]) workspaceSetting.Key = storepb.WorkspaceSettingKey(storepb.WorkspaceSettingKey_value[keyString])
if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY { if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL {
workspaceSetting.Value = &storepb.WorkspaceSetting_LicenseKey{LicenseKey: valueString} workspaceSettingGeneral := &storepb.WorkspaceSetting_GeneralSetting{}
} else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SECRET_SESSION { if err := protojsonUnmarshaler.Unmarshal([]byte(valueString), workspaceSettingGeneral); err != nil {
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 {
return nil, err return nil, err
} }
workspaceSetting.Value = &storepb.WorkspaceSetting_EnableSignup{EnableSignup: enableSignup} workspaceSetting.Value = &storepb.WorkspaceSetting_General{
} else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_CUSTOM_STYLE { General: workspaceSettingGeneral,
workspaceSetting.Value = &storepb.WorkspaceSetting_CustomStyle{CustomStyle: valueString} }
} else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_INSTANCE_URL { } else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SHORTCUT_RELATED {
workspaceSetting.Value = &storepb.WorkspaceSetting_InstanceUrl{InstanceUrl: valueString} workspaceSettingShortcutRelated := &storepb.WorkspaceSetting_ShortcutRelatedSetting{}
} else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_DEFAULT_VISIBILITY { if err := protojsonUnmarshaler.Unmarshal([]byte(valueString), workspaceSettingShortcutRelated); err != nil {
workspaceSetting.Value = &storepb.WorkspaceSetting_DefaultVisibility{DefaultVisibility: storepb.Visibility(storepb.Visibility_value[valueString])} 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 { } else {
continue continue
} }
@ -104,3 +112,14 @@ func (d *DB) ListWorkspaceSettings(ctx context.Context, find *store.FindWorkspac
return list, nil 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 SET value = EXCLUDED.value
` `
var valueString string 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()) valueBytes, err := protojson.Marshal(upsert.GetAccessTokens())
if err != nil { if err != nil {
return nil, err return nil, err
} }
valueString = string(valueBytes) 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()) valueBytes, err := protojson.Marshal(upsert.GetGeneral())
if err != nil { if err != nil {
return nil, err return nil, err
@ -81,16 +81,16 @@ func (d *DB) ListUserSettings(ctx context.Context, find *store.FindUserSetting)
return nil, err return nil, err
} }
userSetting.Key = storepb.UserSettingKey(storepb.UserSettingKey_value[keyString]) userSetting.Key = storepb.UserSettingKey(storepb.UserSettingKey_value[keyString])
if userSetting.Key == storepb.UserSettingKey_ACCESS_TOKENS { if userSetting.Key == storepb.UserSettingKey_USER_SETTING_ACCESS_TOKENS {
userSettingAccessTokens := &storepb.UserSettingAccessTokens{} userSettingAccessTokens := &storepb.UserSetting_AccessTokensSetting{}
if err := protojson.Unmarshal([]byte(valueString), userSettingAccessTokens); err != nil { if err := protojson.Unmarshal([]byte(valueString), userSettingAccessTokens); err != nil {
return nil, err return nil, err
} }
userSetting.Value = &storepb.UserSetting_AccessTokens{ userSetting.Value = &storepb.UserSetting_AccessTokens{
AccessTokens: userSettingAccessTokens, AccessTokens: userSettingAccessTokens,
} }
} else if userSetting.Key == storepb.UserSettingKey_GENERAL { } else if userSetting.Key == storepb.UserSettingKey_USER_SETTING_GENERAL {
userSettingGeneral := &storepb.UserSettingGeneral{} userSettingGeneral := &storepb.UserSetting_GeneralSetting{}
if err := protojson.Unmarshal([]byte(valueString), userSettingGeneral); err != nil { if err := protojson.Unmarshal([]byte(valueString), userSettingGeneral); err != nil {
return nil, err return nil, err
} }

View File

@ -3,11 +3,12 @@ package sqlite
import ( import (
"context" "context"
"errors" "errors"
"strconv" "slices"
"strings" "strings"
storepb "github.com/yourselfhosted/slash/proto/gen/store" storepb "github.com/yourselfhosted/slash/proto/gen/store"
"github.com/yourselfhosted/slash/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) { 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 SET value = EXCLUDED.value
` `
var valueString string var valueString string
if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY { if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL {
valueString = upsert.GetLicenseKey() valueBytes, err := protojson.Marshal(upsert.GetGeneral())
} else if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SECRET_SESSION { if err != nil {
valueString = upsert.GetSecretSession() return nil, err
} else if upsert.Key == storepb.WorkspaceSettingKey_WORKSAPCE_SETTING_ENABLE_SIGNUP { }
valueString = strconv.FormatBool(upsert.GetEnableSignup()) valueString = string(valueBytes)
} else if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_CUSTOM_STYLE { } else if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SHORTCUT_RELATED {
valueString = upsert.GetCustomStyle() valueBytes, err := protojson.Marshal(upsert.GetShortcutRelated())
} else if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_INSTANCE_URL { if err != nil {
valueString = upsert.GetInstanceUrl() return nil, err
} else if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_DEFAULT_VISIBILITY { }
valueString = upsert.GetDefaultVisibility().String() valueString = string(valueBytes)
} else if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_FAVICON_PROVIDER {
valueString = upsert.GetFaviconProvider()
} else { } else {
return nil, errors.New("invalid workspace setting key") 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 return nil, err
} }
workspaceSetting.Key = storepb.WorkspaceSettingKey(storepb.WorkspaceSettingKey_value[keyString]) workspaceSetting.Key = storepb.WorkspaceSettingKey(storepb.WorkspaceSettingKey_value[keyString])
if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY { if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_GENERAL {
workspaceSetting.Value = &storepb.WorkspaceSetting_LicenseKey{LicenseKey: valueString} workspaceSettingGeneral := &storepb.WorkspaceSetting_GeneralSetting{}
} else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SECRET_SESSION { if err := protojsonUnmarshaler.Unmarshal([]byte(valueString), workspaceSettingGeneral); err != nil {
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 {
return nil, err return nil, err
} }
workspaceSetting.Value = &storepb.WorkspaceSetting_EnableSignup{EnableSignup: enableSignup} workspaceSetting.Value = &storepb.WorkspaceSetting_General{
} else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_CUSTOM_STYLE { General: workspaceSettingGeneral,
workspaceSetting.Value = &storepb.WorkspaceSetting_CustomStyle{CustomStyle: valueString} }
} else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_INSTANCE_URL { } else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SHORTCUT_RELATED {
workspaceSetting.Value = &storepb.WorkspaceSetting_InstanceUrl{InstanceUrl: valueString} workspaceSettingShortcutRelated := &storepb.WorkspaceSetting_ShortcutRelatedSetting{}
} else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_DEFAULT_VISIBILITY { if err := protojsonUnmarshaler.Unmarshal([]byte(valueString), workspaceSettingShortcutRelated); err != nil {
workspaceSetting.Value = &storepb.WorkspaceSetting_DefaultVisibility{DefaultVisibility: storepb.Visibility(storepb.Visibility_value[valueString])} return nil, err
} else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_FAVICON_PROVIDER { }
workspaceSetting.Value = &storepb.WorkspaceSetting_FaviconProvider{FaviconProvider: valueString} 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 { } else {
continue continue
} }
@ -108,3 +112,14 @@ func (d *DB) ListWorkspaceSettings(ctx context.Context, find *store.FindWorkspac
return list, nil 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. // WorkspaceSetting model related methods.
UpsertWorkspaceSetting(ctx context.Context, upsert *storepb.WorkspaceSetting) (*storepb.WorkspaceSetting, error) UpsertWorkspaceSetting(ctx context.Context, upsert *storepb.WorkspaceSetting) (*storepb.WorkspaceSetting, error)
ListWorkspaceSettings(ctx context.Context, find *FindWorkspaceSetting) ([]*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. // 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{ userSetting, err := s.GetUserSetting(ctx, &FindUserSetting{
UserID: &userID, UserID: &userID,
Key: storepb.UserSettingKey_ACCESS_TOKENS, Key: storepb.UserSettingKey_USER_SETTING_ACCESS_TOKENS,
}) })
if err != nil { if err != nil {
return nil, err return nil, err
} }
if userSetting == nil { if userSetting == nil {
return []*storepb.UserSettingAccessTokens_AccessToken{}, nil return []*storepb.UserSetting_AccessTokensSetting_AccessToken{}, nil
} }
accessTokensUserSetting := userSetting.GetAccessTokens() accessTokensUserSetting := userSetting.GetAccessTokens()

View File

@ -3,6 +3,8 @@ package store
import ( import (
"context" "context"
"github.com/pkg/errors"
storepb "github.com/yourselfhosted/slash/proto/gen/store" 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) s.workspaceSettingCache.Store(workspaceSetting.Key, workspaceSetting)
return workspaceSetting, nil 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. // Test for access tokens user setting.
accessTokensUserSetting, err := ts.UpsertUserSetting(ctx, &storepb.UserSetting{ accessTokensUserSetting, err := ts.UpsertUserSetting(ctx, &storepb.UserSetting{
UserId: user.ID, UserId: user.ID,
Key: storepb.UserSettingKey_ACCESS_TOKENS, Key: storepb.UserSettingKey_USER_SETTING_ACCESS_TOKENS,
Value: &storepb.UserSetting_AccessTokens{ Value: &storepb.UserSetting_AccessTokens{
AccessTokens: &storepb.UserSettingAccessTokens{ AccessTokens: &storepb.UserSetting_AccessTokensSetting{
AccessTokens: []*storepb.UserSettingAccessTokens_AccessToken{ AccessTokens: []*storepb.UserSetting_AccessTokensSetting_AccessToken{
{ {
AccessToken: "test_access_token", AccessToken: "test_access_token",
}, },
@ -37,7 +37,7 @@ func TestUserSettingStore(t *testing.T) {
}) })
require.NoError(t, err) require.NoError(t, err)
require.NotNil(t, accessTokensUserSetting) 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, user.ID, accessTokensUserSetting.UserId)
require.Equal(t, 1, len(accessTokensUserSetting.GetAccessTokens().AccessTokens)) require.Equal(t, 1, len(accessTokensUserSetting.GetAccessTokens().AccessTokens))
userSettings, err = ts.ListUserSettings(ctx, &store.FindUserSetting{ userSettings, err = ts.ListUserSettings(ctx, &store.FindUserSetting{
@ -48,7 +48,7 @@ func TestUserSettingStore(t *testing.T) {
require.Equal(t, accessTokensUserSetting, userSettings[0]) require.Equal(t, accessTokensUserSetting, userSettings[0])
accessTokensUserSetting, err = ts.GetUserSetting(ctx, &store.FindUserSetting{ accessTokensUserSetting, err = ts.GetUserSetting(ctx, &store.FindUserSetting{
UserID: &user.ID, UserID: &user.ID,
Key: storepb.UserSettingKey_ACCESS_TOKENS, Key: storepb.UserSettingKey_USER_SETTING_ACCESS_TOKENS,
}) })
require.NoError(t, err) require.NoError(t, err)
require.NotNil(t, accessTokensUserSetting) require.NotNil(t, accessTokensUserSetting)
@ -56,10 +56,10 @@ func TestUserSettingStore(t *testing.T) {
require.Equal(t, "test_access_token", accessTokensUserSetting.GetAccessTokens().AccessTokens[0].AccessToken) require.Equal(t, "test_access_token", accessTokensUserSetting.GetAccessTokens().AccessTokens[0].AccessToken)
accessTokensUserSetting, err = ts.UpsertUserSetting(ctx, &storepb.UserSetting{ accessTokensUserSetting, err = ts.UpsertUserSetting(ctx, &storepb.UserSetting{
UserId: user.ID, UserId: user.ID,
Key: storepb.UserSettingKey_ACCESS_TOKENS, Key: storepb.UserSettingKey_USER_SETTING_ACCESS_TOKENS,
Value: &storepb.UserSetting_AccessTokens{ Value: &storepb.UserSetting_AccessTokens{
AccessTokens: &storepb.UserSettingAccessTokens{ AccessTokens: &storepb.UserSetting_AccessTokensSetting{
AccessTokens: []*storepb.UserSettingAccessTokens_AccessToken{ AccessTokens: []*storepb.UserSetting_AccessTokensSetting_AccessToken{
{ {
AccessToken: "test_access_token", AccessToken: "test_access_token",
}, },
@ -77,9 +77,9 @@ func TestUserSettingStore(t *testing.T) {
// Test for user setting general. // Test for user setting general.
userSettingGeneral, err := ts.UpsertUserSetting(ctx, &storepb.UserSetting{ userSettingGeneral, err := ts.UpsertUserSetting(ctx, &storepb.UserSetting{
UserId: user.ID, UserId: user.ID,
Key: storepb.UserSettingKey_GENERAL, Key: storepb.UserSettingKey_USER_SETTING_GENERAL,
Value: &storepb.UserSetting_General{ Value: &storepb.UserSetting_General{
General: &storepb.UserSettingGeneral{ General: &storepb.UserSetting_GeneralSetting{
Locale: "ZH", Locale: "ZH",
ColorTheme: "SYSTEM", ColorTheme: "SYSTEM",
}, },
@ -87,14 +87,14 @@ func TestUserSettingStore(t *testing.T) {
}) })
require.NoError(t, err) require.NoError(t, err)
require.NotNil(t, userSettingGeneral) 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, "ZH", userSettingGeneral.GetGeneral().Locale)
require.Equal(t, "SYSTEM", userSettingGeneral.GetGeneral().ColorTheme) require.Equal(t, "SYSTEM", userSettingGeneral.GetGeneral().ColorTheme)
userSettingGeneral, err = ts.UpsertUserSetting(ctx, &storepb.UserSetting{ userSettingGeneral, err = ts.UpsertUserSetting(ctx, &storepb.UserSetting{
UserId: user.ID, UserId: user.ID,
Key: storepb.UserSettingKey_GENERAL, Key: storepb.UserSettingKey_USER_SETTING_GENERAL,
Value: &storepb.UserSetting_General{ Value: &storepb.UserSetting_General{
General: &storepb.UserSettingGeneral{ General: &storepb.UserSetting_GeneralSetting{
Locale: "EN", Locale: "EN",
ColorTheme: "DARK", ColorTheme: "DARK",
}, },

View File

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