chore: update user setting definition

pull/4925/head
Johnny 3 months ago
parent 3b8bfe72ea
commit 8f51791da8

@ -403,15 +403,15 @@ message UserSetting {
};
// The name of the user setting.
// Format: users/{user}/settings/{setting}
// Format: users/{user}/settings/{setting}, {setting} is the key for the setting.
// For example, "users/123/settings/GENERAL" for general settings.
string name = 1 [(google.api.field_behavior) = IDENTIFIER];
oneof value {
GeneralSetting general_setting = 2;
SessionsSetting sessions_setting = 3;
AccessTokensSetting access_tokens_setting = 4;
ShortcutsSetting shortcuts_setting = 5;
WebhooksSetting webhooks_setting = 6;
WebhooksSetting webhooks_setting = 5;
}
// Enumeration of user setting keys.
@ -423,10 +423,8 @@ message UserSetting {
SESSIONS = 2;
// ACCESS_TOKENS is the key for access tokens.
ACCESS_TOKENS = 3;
// SHORTCUTS is the key for user shortcuts.
SHORTCUTS = 4;
// WEBHOOKS is the key for user webhooks.
WEBHOOKS = 5;
WEBHOOKS = 4;
}
// General user settings configuration.
@ -446,81 +444,19 @@ message UserSetting {
// User authentication sessions configuration.
message SessionsSetting {
// List of active user sessions.
repeated Session sessions = 1;
// User session information.
message Session {
// Unique session identifier.
string session_id = 1 [(google.api.field_behavior) = OUTPUT_ONLY];
// Timestamp when the session was created.
google.protobuf.Timestamp create_time = 2 [(google.api.field_behavior) = OUTPUT_ONLY];
// Timestamp when the session was last accessed.
// Used for sliding expiration calculation (last_accessed_time + 2 weeks).
google.protobuf.Timestamp last_accessed_time = 3 [(google.api.field_behavior) = OUTPUT_ONLY];
// Client information associated with this session.
ClientInfo client_info = 4 [(google.api.field_behavior) = OUTPUT_ONLY];
}
// Client information for a session.
message ClientInfo {
// User agent string of the client.
string user_agent = 1 [(google.api.field_behavior) = OUTPUT_ONLY];
// IP address of the client.
string ip_address = 2 [(google.api.field_behavior) = OUTPUT_ONLY];
// Optional. Device type (e.g., "mobile", "desktop", "tablet").
string device_type = 3 [(google.api.field_behavior) = OUTPUT_ONLY];
// Optional. Operating system (e.g., "iOS 17.0", "Windows 11").
string os = 4 [(google.api.field_behavior) = OUTPUT_ONLY];
// Optional. Browser name and version (e.g., "Chrome 119.0").
string browser = 5 [(google.api.field_behavior) = OUTPUT_ONLY];
}
repeated UserSession sessions = 1;
}
// User access tokens configuration.
message AccessTokensSetting {
// List of user access tokens.
repeated AccessToken access_tokens = 1;
// User access token information.
message AccessToken {
// The access token is a JWT token.
// Including expiration time, issuer, etc.
string access_token = 1 [(google.api.field_behavior) = OUTPUT_ONLY];
// A description for the access token.
string description = 2 [(google.api.field_behavior) = OPTIONAL];
}
}
// User shortcuts configuration.
message ShortcutsSetting {
// List of user shortcuts.
repeated Shortcut shortcuts = 1;
// User shortcut definition.
message Shortcut {
// Unique identifier for the shortcut.
string id = 1 [(google.api.field_behavior) = REQUIRED];
// Display title for the shortcut.
string title = 2 [(google.api.field_behavior) = REQUIRED];
// Filter expression for the shortcut.
string filter = 3 [(google.api.field_behavior) = REQUIRED];
}
repeated UserAccessToken access_tokens = 1;
}
// User webhooks configuration.
message WebhooksSetting {
// List of user webhooks.
repeated Webhook webhooks = 1;
// User webhook definition.
message Webhook {
// Unique identifier for the webhook.
string id = 1 [(google.api.field_behavior) = REQUIRED];
// Descriptive title for the webhook.
string title = 2 [(google.api.field_behavior) = REQUIRED];
// The webhook URL endpoint.
string url = 3 [(google.api.field_behavior) = REQUIRED];
}
repeated UserWebhook webhooks = 1;
}
}

@ -94,10 +94,8 @@ const (
UserSetting_SESSIONS UserSetting_Key = 2
// ACCESS_TOKENS is the key for access tokens.
UserSetting_ACCESS_TOKENS UserSetting_Key = 3
// SHORTCUTS is the key for user shortcuts.
UserSetting_SHORTCUTS UserSetting_Key = 4
// WEBHOOKS is the key for user webhooks.
UserSetting_WEBHOOKS UserSetting_Key = 5
UserSetting_WEBHOOKS UserSetting_Key = 4
)
// Enum value maps for UserSetting_Key.
@ -107,16 +105,14 @@ var (
1: "GENERAL",
2: "SESSIONS",
3: "ACCESS_TOKENS",
4: "SHORTCUTS",
5: "WEBHOOKS",
4: "WEBHOOKS",
}
UserSetting_Key_value = map[string]int32{
"KEY_UNSPECIFIED": 0,
"GENERAL": 1,
"SESSIONS": 2,
"ACCESS_TOKENS": 3,
"SHORTCUTS": 4,
"WEBHOOKS": 5,
"WEBHOOKS": 4,
}
)
@ -1080,14 +1076,14 @@ func (x *ListAllUserStatsResponse) GetStats() []*UserStats {
type UserSetting struct {
state protoimpl.MessageState `protogen:"open.v1"`
// The name of the user setting.
// Format: users/{user}/settings/{setting}
// Format: users/{user}/settings/{setting}, {setting} is the key for the setting.
// For example, "users/123/settings/GENERAL" for general settings.
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
// Types that are valid to be assigned to Value:
//
// *UserSetting_GeneralSetting_
// *UserSetting_SessionsSetting_
// *UserSetting_AccessTokensSetting_
// *UserSetting_ShortcutsSetting_
// *UserSetting_WebhooksSetting_
Value isUserSetting_Value `protobuf_oneof:"value"`
unknownFields protoimpl.UnknownFields
@ -1165,15 +1161,6 @@ func (x *UserSetting) GetAccessTokensSetting() *UserSetting_AccessTokensSetting
return nil
}
func (x *UserSetting) GetShortcutsSetting() *UserSetting_ShortcutsSetting {
if x != nil {
if x, ok := x.Value.(*UserSetting_ShortcutsSetting_); ok {
return x.ShortcutsSetting
}
}
return nil
}
func (x *UserSetting) GetWebhooksSetting() *UserSetting_WebhooksSetting {
if x != nil {
if x, ok := x.Value.(*UserSetting_WebhooksSetting_); ok {
@ -1199,12 +1186,8 @@ type UserSetting_AccessTokensSetting_ struct {
AccessTokensSetting *UserSetting_AccessTokensSetting `protobuf:"bytes,4,opt,name=access_tokens_setting,json=accessTokensSetting,proto3,oneof"`
}
type UserSetting_ShortcutsSetting_ struct {
ShortcutsSetting *UserSetting_ShortcutsSetting `protobuf:"bytes,5,opt,name=shortcuts_setting,json=shortcutsSetting,proto3,oneof"`
}
type UserSetting_WebhooksSetting_ struct {
WebhooksSetting *UserSetting_WebhooksSetting `protobuf:"bytes,6,opt,name=webhooks_setting,json=webhooksSetting,proto3,oneof"`
WebhooksSetting *UserSetting_WebhooksSetting `protobuf:"bytes,5,opt,name=webhooks_setting,json=webhooksSetting,proto3,oneof"`
}
func (*UserSetting_GeneralSetting_) isUserSetting_Value() {}
@ -1213,8 +1196,6 @@ func (*UserSetting_SessionsSetting_) isUserSetting_Value() {}
func (*UserSetting_AccessTokensSetting_) isUserSetting_Value() {}
func (*UserSetting_ShortcutsSetting_) isUserSetting_Value() {}
func (*UserSetting_WebhooksSetting_) isUserSetting_Value() {}
type GetUserSettingRequest struct {
@ -2468,7 +2449,7 @@ func (x *UserSetting_GeneralSetting) GetTheme() string {
type UserSetting_SessionsSetting struct {
state protoimpl.MessageState `protogen:"open.v1"`
// List of active user sessions.
Sessions []*UserSetting_SessionsSetting_Session `protobuf:"bytes,1,rep,name=sessions,proto3" json:"sessions,omitempty"`
Sessions []*UserSession `protobuf:"bytes,1,rep,name=sessions,proto3" json:"sessions,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
@ -2503,7 +2484,7 @@ func (*UserSetting_SessionsSetting) Descriptor() ([]byte, []int) {
return file_api_v1_user_service_proto_rawDescGZIP(), []int{14, 1}
}
func (x *UserSetting_SessionsSetting) GetSessions() []*UserSetting_SessionsSetting_Session {
func (x *UserSetting_SessionsSetting) GetSessions() []*UserSession {
if x != nil {
return x.Sessions
}
@ -2514,7 +2495,7 @@ func (x *UserSetting_SessionsSetting) GetSessions() []*UserSetting_SessionsSetti
type UserSetting_AccessTokensSetting struct {
state protoimpl.MessageState `protogen:"open.v1"`
// List of user access tokens.
AccessTokens []*UserSetting_AccessTokensSetting_AccessToken `protobuf:"bytes,1,rep,name=access_tokens,json=accessTokens,proto3" json:"access_tokens,omitempty"`
AccessTokens []*UserAccessToken `protobuf:"bytes,1,rep,name=access_tokens,json=accessTokens,proto3" json:"access_tokens,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
@ -2549,71 +2530,25 @@ func (*UserSetting_AccessTokensSetting) Descriptor() ([]byte, []int) {
return file_api_v1_user_service_proto_rawDescGZIP(), []int{14, 2}
}
func (x *UserSetting_AccessTokensSetting) GetAccessTokens() []*UserSetting_AccessTokensSetting_AccessToken {
func (x *UserSetting_AccessTokensSetting) GetAccessTokens() []*UserAccessToken {
if x != nil {
return x.AccessTokens
}
return nil
}
// User shortcuts configuration.
type UserSetting_ShortcutsSetting struct {
state protoimpl.MessageState `protogen:"open.v1"`
// List of user shortcuts.
Shortcuts []*UserSetting_ShortcutsSetting_Shortcut `protobuf:"bytes,1,rep,name=shortcuts,proto3" json:"shortcuts,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *UserSetting_ShortcutsSetting) Reset() {
*x = UserSetting_ShortcutsSetting{}
mi := &file_api_v1_user_service_proto_msgTypes[39]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *UserSetting_ShortcutsSetting) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*UserSetting_ShortcutsSetting) ProtoMessage() {}
func (x *UserSetting_ShortcutsSetting) ProtoReflect() protoreflect.Message {
mi := &file_api_v1_user_service_proto_msgTypes[39]
if 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_ShortcutsSetting.ProtoReflect.Descriptor instead.
func (*UserSetting_ShortcutsSetting) Descriptor() ([]byte, []int) {
return file_api_v1_user_service_proto_rawDescGZIP(), []int{14, 3}
}
func (x *UserSetting_ShortcutsSetting) GetShortcuts() []*UserSetting_ShortcutsSetting_Shortcut {
if x != nil {
return x.Shortcuts
}
return nil
}
// User webhooks configuration.
type UserSetting_WebhooksSetting struct {
state protoimpl.MessageState `protogen:"open.v1"`
// List of user webhooks.
Webhooks []*UserSetting_WebhooksSetting_Webhook `protobuf:"bytes,1,rep,name=webhooks,proto3" json:"webhooks,omitempty"`
Webhooks []*UserWebhook `protobuf:"bytes,1,rep,name=webhooks,proto3" json:"webhooks,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *UserSetting_WebhooksSetting) Reset() {
*x = UserSetting_WebhooksSetting{}
mi := &file_api_v1_user_service_proto_msgTypes[40]
mi := &file_api_v1_user_service_proto_msgTypes[39]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -2625,7 +2560,7 @@ func (x *UserSetting_WebhooksSetting) String() string {
func (*UserSetting_WebhooksSetting) ProtoMessage() {}
func (x *UserSetting_WebhooksSetting) ProtoReflect() protoreflect.Message {
mi := &file_api_v1_user_service_proto_msgTypes[40]
mi := &file_api_v1_user_service_proto_msgTypes[39]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -2638,356 +2573,16 @@ func (x *UserSetting_WebhooksSetting) ProtoReflect() protoreflect.Message {
// Deprecated: Use UserSetting_WebhooksSetting.ProtoReflect.Descriptor instead.
func (*UserSetting_WebhooksSetting) Descriptor() ([]byte, []int) {
return file_api_v1_user_service_proto_rawDescGZIP(), []int{14, 4}
return file_api_v1_user_service_proto_rawDescGZIP(), []int{14, 3}
}
func (x *UserSetting_WebhooksSetting) GetWebhooks() []*UserSetting_WebhooksSetting_Webhook {
func (x *UserSetting_WebhooksSetting) GetWebhooks() []*UserWebhook {
if x != nil {
return x.Webhooks
}
return nil
}
// User session information.
type UserSetting_SessionsSetting_Session struct {
state protoimpl.MessageState `protogen:"open.v1"`
// Unique session identifier.
SessionId string `protobuf:"bytes,1,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"`
// Timestamp when the session was created.
CreateTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
// Timestamp when the session was last accessed.
// Used for sliding expiration calculation (last_accessed_time + 2 weeks).
LastAccessedTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=last_accessed_time,json=lastAccessedTime,proto3" json:"last_accessed_time,omitempty"`
// Client information associated with this session.
ClientInfo *UserSetting_SessionsSetting_ClientInfo `protobuf:"bytes,4,opt,name=client_info,json=clientInfo,proto3" json:"client_info,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *UserSetting_SessionsSetting_Session) Reset() {
*x = UserSetting_SessionsSetting_Session{}
mi := &file_api_v1_user_service_proto_msgTypes[41]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *UserSetting_SessionsSetting_Session) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*UserSetting_SessionsSetting_Session) ProtoMessage() {}
func (x *UserSetting_SessionsSetting_Session) ProtoReflect() protoreflect.Message {
mi := &file_api_v1_user_service_proto_msgTypes[41]
if 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_SessionsSetting_Session.ProtoReflect.Descriptor instead.
func (*UserSetting_SessionsSetting_Session) Descriptor() ([]byte, []int) {
return file_api_v1_user_service_proto_rawDescGZIP(), []int{14, 1, 0}
}
func (x *UserSetting_SessionsSetting_Session) GetSessionId() string {
if x != nil {
return x.SessionId
}
return ""
}
func (x *UserSetting_SessionsSetting_Session) GetCreateTime() *timestamppb.Timestamp {
if x != nil {
return x.CreateTime
}
return nil
}
func (x *UserSetting_SessionsSetting_Session) GetLastAccessedTime() *timestamppb.Timestamp {
if x != nil {
return x.LastAccessedTime
}
return nil
}
func (x *UserSetting_SessionsSetting_Session) GetClientInfo() *UserSetting_SessionsSetting_ClientInfo {
if x != nil {
return x.ClientInfo
}
return nil
}
// Client information for a session.
type UserSetting_SessionsSetting_ClientInfo struct {
state protoimpl.MessageState `protogen:"open.v1"`
// User agent string of the client.
UserAgent string `protobuf:"bytes,1,opt,name=user_agent,json=userAgent,proto3" json:"user_agent,omitempty"`
// IP address of the client.
IpAddress string `protobuf:"bytes,2,opt,name=ip_address,json=ipAddress,proto3" json:"ip_address,omitempty"`
// Optional. Device type (e.g., "mobile", "desktop", "tablet").
DeviceType string `protobuf:"bytes,3,opt,name=device_type,json=deviceType,proto3" json:"device_type,omitempty"`
// Optional. Operating system (e.g., "iOS 17.0", "Windows 11").
Os string `protobuf:"bytes,4,opt,name=os,proto3" json:"os,omitempty"`
// Optional. Browser name and version (e.g., "Chrome 119.0").
Browser string `protobuf:"bytes,5,opt,name=browser,proto3" json:"browser,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *UserSetting_SessionsSetting_ClientInfo) Reset() {
*x = UserSetting_SessionsSetting_ClientInfo{}
mi := &file_api_v1_user_service_proto_msgTypes[42]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *UserSetting_SessionsSetting_ClientInfo) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*UserSetting_SessionsSetting_ClientInfo) ProtoMessage() {}
func (x *UserSetting_SessionsSetting_ClientInfo) ProtoReflect() protoreflect.Message {
mi := &file_api_v1_user_service_proto_msgTypes[42]
if 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_SessionsSetting_ClientInfo.ProtoReflect.Descriptor instead.
func (*UserSetting_SessionsSetting_ClientInfo) Descriptor() ([]byte, []int) {
return file_api_v1_user_service_proto_rawDescGZIP(), []int{14, 1, 1}
}
func (x *UserSetting_SessionsSetting_ClientInfo) GetUserAgent() string {
if x != nil {
return x.UserAgent
}
return ""
}
func (x *UserSetting_SessionsSetting_ClientInfo) GetIpAddress() string {
if x != nil {
return x.IpAddress
}
return ""
}
func (x *UserSetting_SessionsSetting_ClientInfo) GetDeviceType() string {
if x != nil {
return x.DeviceType
}
return ""
}
func (x *UserSetting_SessionsSetting_ClientInfo) GetOs() string {
if x != nil {
return x.Os
}
return ""
}
func (x *UserSetting_SessionsSetting_ClientInfo) GetBrowser() string {
if x != nil {
return x.Browser
}
return ""
}
// User access token information.
type UserSetting_AccessTokensSetting_AccessToken struct {
state protoimpl.MessageState `protogen:"open.v1"`
// 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"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *UserSetting_AccessTokensSetting_AccessToken) Reset() {
*x = UserSetting_AccessTokensSetting_AccessToken{}
mi := &file_api_v1_user_service_proto_msgTypes[43]
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_service_proto_msgTypes[43]
if 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_service_proto_rawDescGZIP(), []int{14, 2, 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 ""
}
// User shortcut definition.
type UserSetting_ShortcutsSetting_Shortcut struct {
state protoimpl.MessageState `protogen:"open.v1"`
// Unique identifier for the shortcut.
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
// Display title for the shortcut.
Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"`
// Filter expression for the shortcut.
Filter string `protobuf:"bytes,3,opt,name=filter,proto3" json:"filter,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *UserSetting_ShortcutsSetting_Shortcut) Reset() {
*x = UserSetting_ShortcutsSetting_Shortcut{}
mi := &file_api_v1_user_service_proto_msgTypes[44]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *UserSetting_ShortcutsSetting_Shortcut) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*UserSetting_ShortcutsSetting_Shortcut) ProtoMessage() {}
func (x *UserSetting_ShortcutsSetting_Shortcut) ProtoReflect() protoreflect.Message {
mi := &file_api_v1_user_service_proto_msgTypes[44]
if 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_ShortcutsSetting_Shortcut.ProtoReflect.Descriptor instead.
func (*UserSetting_ShortcutsSetting_Shortcut) Descriptor() ([]byte, []int) {
return file_api_v1_user_service_proto_rawDescGZIP(), []int{14, 3, 0}
}
func (x *UserSetting_ShortcutsSetting_Shortcut) GetId() string {
if x != nil {
return x.Id
}
return ""
}
func (x *UserSetting_ShortcutsSetting_Shortcut) GetTitle() string {
if x != nil {
return x.Title
}
return ""
}
func (x *UserSetting_ShortcutsSetting_Shortcut) GetFilter() string {
if x != nil {
return x.Filter
}
return ""
}
// User webhook definition.
type UserSetting_WebhooksSetting_Webhook struct {
state protoimpl.MessageState `protogen:"open.v1"`
// Unique identifier for the webhook.
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
// Descriptive title for the webhook.
Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"`
// The webhook URL endpoint.
Url string `protobuf:"bytes,3,opt,name=url,proto3" json:"url,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *UserSetting_WebhooksSetting_Webhook) Reset() {
*x = UserSetting_WebhooksSetting_Webhook{}
mi := &file_api_v1_user_service_proto_msgTypes[45]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *UserSetting_WebhooksSetting_Webhook) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*UserSetting_WebhooksSetting_Webhook) ProtoMessage() {}
func (x *UserSetting_WebhooksSetting_Webhook) ProtoReflect() protoreflect.Message {
mi := &file_api_v1_user_service_proto_msgTypes[45]
if 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_WebhooksSetting_Webhook.ProtoReflect.Descriptor instead.
func (*UserSetting_WebhooksSetting_Webhook) Descriptor() ([]byte, []int) {
return file_api_v1_user_service_proto_rawDescGZIP(), []int{14, 4, 0}
}
func (x *UserSetting_WebhooksSetting_Webhook) GetId() string {
if x != nil {
return x.Id
}
return ""
}
func (x *UserSetting_WebhooksSetting_Webhook) GetTitle() string {
if x != nil {
return x.Title
}
return ""
}
func (x *UserSetting_WebhooksSetting_Webhook) GetUrl() string {
if x != nil {
return x.Url
}
return ""
}
type UserSession_ClientInfo struct {
state protoimpl.MessageState `protogen:"open.v1"`
// User agent string of the client.
@ -3006,7 +2601,7 @@ type UserSession_ClientInfo struct {
func (x *UserSession_ClientInfo) Reset() {
*x = UserSession_ClientInfo{}
mi := &file_api_v1_user_service_proto_msgTypes[46]
mi := &file_api_v1_user_service_proto_msgTypes[40]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -3018,7 +2613,7 @@ func (x *UserSession_ClientInfo) String() string {
func (*UserSession_ClientInfo) ProtoMessage() {}
func (x *UserSession_ClientInfo) ProtoReflect() protoreflect.Message {
mi := &file_api_v1_user_service_proto_msgTypes[46]
mi := &file_api_v1_user_service_proto_msgTypes[40]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -3165,65 +2760,32 @@ const file_api_v1_user_service_proto_rawDesc = "" +
"\x11memos.api.v1/UserR\x04name\"\x19\n" +
"\x17ListAllUserStatsRequest\"I\n" +
"\x18ListAllUserStatsResponse\x12-\n" +
"\x05stats\x18\x01 \x03(\v2\x17.memos.api.v1.UserStatsR\x05stats\"\xd1\x0f\n" +
"\x05stats\x18\x01 \x03(\v2\x17.memos.api.v1.UserStatsR\x05stats\"\xd9\a\n" +
"\vUserSetting\x12\x17\n" +
"\x04name\x18\x01 \x01(\tB\x03\xe0A\bR\x04name\x12S\n" +
"\x0fgeneral_setting\x18\x02 \x01(\v2(.memos.api.v1.UserSetting.GeneralSettingH\x00R\x0egeneralSetting\x12V\n" +
"\x10sessions_setting\x18\x03 \x01(\v2).memos.api.v1.UserSetting.SessionsSettingH\x00R\x0fsessionsSetting\x12c\n" +
"\x15access_tokens_setting\x18\x04 \x01(\v2-.memos.api.v1.UserSetting.AccessTokensSettingH\x00R\x13accessTokensSetting\x12Y\n" +
"\x11shortcuts_setting\x18\x05 \x01(\v2*.memos.api.v1.UserSetting.ShortcutsSettingH\x00R\x10shortcutsSetting\x12V\n" +
"\x10webhooks_setting\x18\x06 \x01(\v2).memos.api.v1.UserSetting.WebhooksSettingH\x00R\x0fwebhooksSetting\x1a\x9b\x01\n" +
"\x15access_tokens_setting\x18\x04 \x01(\v2-.memos.api.v1.UserSetting.AccessTokensSettingH\x00R\x13accessTokensSetting\x12V\n" +
"\x10webhooks_setting\x18\x05 \x01(\v2).memos.api.v1.UserSetting.WebhooksSettingH\x00R\x0fwebhooksSetting\x1a\x9b\x01\n" +
"\x0eGeneralSetting\x12\x1b\n" +
"\x06locale\x18\x01 \x01(\tB\x03\xe0A\x01R\x06locale\x12#\n" +
"\n" +
"appearance\x18\x02 \x01(\tB\x03\xe0A\x01R\n" +
"appearance\x12,\n" +
"\x0fmemo_visibility\x18\x03 \x01(\tB\x03\xe0A\x01R\x0ememoVisibility\x12\x19\n" +
"\x05theme\x18\x04 \x01(\tB\x03\xe0A\x01R\x05theme\x1a\xae\x04\n" +
"\x0fSessionsSetting\x12M\n" +
"\bsessions\x18\x01 \x03(\v21.memos.api.v1.UserSetting.SessionsSetting.SessionR\bsessions\x1a\x9a\x02\n" +
"\aSession\x12\"\n" +
"\n" +
"session_id\x18\x01 \x01(\tB\x03\xe0A\x03R\tsessionId\x12@\n" +
"\vcreate_time\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampB\x03\xe0A\x03R\n" +
"createTime\x12M\n" +
"\x12last_accessed_time\x18\x03 \x01(\v2\x1a.google.protobuf.TimestampB\x03\xe0A\x03R\x10lastAccessedTime\x12Z\n" +
"\vclient_info\x18\x04 \x01(\v24.memos.api.v1.UserSetting.SessionsSetting.ClientInfoB\x03\xe0A\x03R\n" +
"clientInfo\x1a\xae\x01\n" +
"\n" +
"ClientInfo\x12\"\n" +
"\n" +
"user_agent\x18\x01 \x01(\tB\x03\xe0A\x03R\tuserAgent\x12\"\n" +
"\n" +
"ip_address\x18\x02 \x01(\tB\x03\xe0A\x03R\tipAddress\x12$\n" +
"\vdevice_type\x18\x03 \x01(\tB\x03\xe0A\x03R\n" +
"deviceType\x12\x13\n" +
"\x02os\x18\x04 \x01(\tB\x03\xe0A\x03R\x02os\x12\x1d\n" +
"\abrowser\x18\x05 \x01(\tB\x03\xe0A\x03R\abrowser\x1a\xd3\x01\n" +
"\x13AccessTokensSetting\x12^\n" +
"\raccess_tokens\x18\x01 \x03(\v29.memos.api.v1.UserSetting.AccessTokensSetting.AccessTokenR\faccessTokens\x1a\\\n" +
"\vAccessToken\x12&\n" +
"\faccess_token\x18\x01 \x01(\tB\x03\xe0A\x03R\vaccessToken\x12%\n" +
"\vdescription\x18\x02 \x01(\tB\x03\xe0A\x01R\vdescription\x1a\xbe\x01\n" +
"\x10ShortcutsSetting\x12Q\n" +
"\tshortcuts\x18\x01 \x03(\v23.memos.api.v1.UserSetting.ShortcutsSetting.ShortcutR\tshortcuts\x1aW\n" +
"\bShortcut\x12\x13\n" +
"\x02id\x18\x01 \x01(\tB\x03\xe0A\x02R\x02id\x12\x19\n" +
"\x05title\x18\x02 \x01(\tB\x03\xe0A\x02R\x05title\x12\x1b\n" +
"\x06filter\x18\x03 \x01(\tB\x03\xe0A\x02R\x06filter\x1a\xb2\x01\n" +
"\x0fWebhooksSetting\x12M\n" +
"\bwebhooks\x18\x01 \x03(\v21.memos.api.v1.UserSetting.WebhooksSetting.WebhookR\bwebhooks\x1aP\n" +
"\aWebhook\x12\x13\n" +
"\x02id\x18\x01 \x01(\tB\x03\xe0A\x02R\x02id\x12\x19\n" +
"\x05title\x18\x02 \x01(\tB\x03\xe0A\x02R\x05title\x12\x15\n" +
"\x03url\x18\x03 \x01(\tB\x03\xe0A\x02R\x03url\"e\n" +
"\x05theme\x18\x04 \x01(\tB\x03\xe0A\x01R\x05theme\x1aH\n" +
"\x0fSessionsSetting\x125\n" +
"\bsessions\x18\x01 \x03(\v2\x19.memos.api.v1.UserSessionR\bsessions\x1aY\n" +
"\x13AccessTokensSetting\x12B\n" +
"\raccess_tokens\x18\x01 \x03(\v2\x1d.memos.api.v1.UserAccessTokenR\faccessTokens\x1aH\n" +
"\x0fWebhooksSetting\x125\n" +
"\bwebhooks\x18\x01 \x03(\v2\x19.memos.api.v1.UserWebhookR\bwebhooks\"V\n" +
"\x03Key\x12\x13\n" +
"\x0fKEY_UNSPECIFIED\x10\x00\x12\v\n" +
"\aGENERAL\x10\x01\x12\f\n" +
"\bSESSIONS\x10\x02\x12\x11\n" +
"\rACCESS_TOKENS\x10\x03\x12\r\n" +
"\tSHORTCUTS\x10\x04\x12\f\n" +
"\bWEBHOOKS\x10\x05:Y\xeaAV\n" +
"\rACCESS_TOKENS\x10\x03\x12\f\n" +
"\bWEBHOOKS\x10\x04:Y\xeaAV\n" +
"\x18memos.api.v1/UserSetting\x12\x1fusers/{user}/settings/{setting}*\fuserSettings2\vuserSettingB\a\n" +
"\x05value\"M\n" +
"\x15GetUserSettingRequest\x124\n" +
@ -3359,154 +2921,143 @@ func file_api_v1_user_service_proto_rawDescGZIP() []byte {
}
var file_api_v1_user_service_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
var file_api_v1_user_service_proto_msgTypes = make([]protoimpl.MessageInfo, 47)
var file_api_v1_user_service_proto_msgTypes = make([]protoimpl.MessageInfo, 41)
var file_api_v1_user_service_proto_goTypes = []any{
(User_Role)(0), // 0: memos.api.v1.User.Role
(UserSetting_Key)(0), // 1: memos.api.v1.UserSetting.Key
(*User)(nil), // 2: memos.api.v1.User
(*ListUsersRequest)(nil), // 3: memos.api.v1.ListUsersRequest
(*ListUsersResponse)(nil), // 4: memos.api.v1.ListUsersResponse
(*GetUserRequest)(nil), // 5: memos.api.v1.GetUserRequest
(*CreateUserRequest)(nil), // 6: memos.api.v1.CreateUserRequest
(*UpdateUserRequest)(nil), // 7: memos.api.v1.UpdateUserRequest
(*DeleteUserRequest)(nil), // 8: memos.api.v1.DeleteUserRequest
(*SearchUsersRequest)(nil), // 9: memos.api.v1.SearchUsersRequest
(*SearchUsersResponse)(nil), // 10: memos.api.v1.SearchUsersResponse
(*GetUserAvatarRequest)(nil), // 11: memos.api.v1.GetUserAvatarRequest
(*UserStats)(nil), // 12: memos.api.v1.UserStats
(*GetUserStatsRequest)(nil), // 13: memos.api.v1.GetUserStatsRequest
(*ListAllUserStatsRequest)(nil), // 14: memos.api.v1.ListAllUserStatsRequest
(*ListAllUserStatsResponse)(nil), // 15: memos.api.v1.ListAllUserStatsResponse
(*UserSetting)(nil), // 16: memos.api.v1.UserSetting
(*GetUserSettingRequest)(nil), // 17: memos.api.v1.GetUserSettingRequest
(*UpdateUserSettingRequest)(nil), // 18: memos.api.v1.UpdateUserSettingRequest
(*ListUserSettingsRequest)(nil), // 19: memos.api.v1.ListUserSettingsRequest
(*ListUserSettingsResponse)(nil), // 20: memos.api.v1.ListUserSettingsResponse
(*UserAccessToken)(nil), // 21: memos.api.v1.UserAccessToken
(*ListUserAccessTokensRequest)(nil), // 22: memos.api.v1.ListUserAccessTokensRequest
(*ListUserAccessTokensResponse)(nil), // 23: memos.api.v1.ListUserAccessTokensResponse
(*CreateUserAccessTokenRequest)(nil), // 24: memos.api.v1.CreateUserAccessTokenRequest
(*DeleteUserAccessTokenRequest)(nil), // 25: memos.api.v1.DeleteUserAccessTokenRequest
(*UserSession)(nil), // 26: memos.api.v1.UserSession
(*ListUserSessionsRequest)(nil), // 27: memos.api.v1.ListUserSessionsRequest
(*ListUserSessionsResponse)(nil), // 28: memos.api.v1.ListUserSessionsResponse
(*RevokeUserSessionRequest)(nil), // 29: memos.api.v1.RevokeUserSessionRequest
(*UserWebhook)(nil), // 30: memos.api.v1.UserWebhook
(*ListUserWebhooksRequest)(nil), // 31: memos.api.v1.ListUserWebhooksRequest
(*ListUserWebhooksResponse)(nil), // 32: memos.api.v1.ListUserWebhooksResponse
(*CreateUserWebhookRequest)(nil), // 33: memos.api.v1.CreateUserWebhookRequest
(*UpdateUserWebhookRequest)(nil), // 34: memos.api.v1.UpdateUserWebhookRequest
(*DeleteUserWebhookRequest)(nil), // 35: memos.api.v1.DeleteUserWebhookRequest
nil, // 36: memos.api.v1.UserStats.TagCountEntry
(*UserStats_MemoTypeStats)(nil), // 37: memos.api.v1.UserStats.MemoTypeStats
(*UserSetting_GeneralSetting)(nil), // 38: memos.api.v1.UserSetting.GeneralSetting
(*UserSetting_SessionsSetting)(nil), // 39: memos.api.v1.UserSetting.SessionsSetting
(*UserSetting_AccessTokensSetting)(nil), // 40: memos.api.v1.UserSetting.AccessTokensSetting
(*UserSetting_ShortcutsSetting)(nil), // 41: memos.api.v1.UserSetting.ShortcutsSetting
(*UserSetting_WebhooksSetting)(nil), // 42: memos.api.v1.UserSetting.WebhooksSetting
(*UserSetting_SessionsSetting_Session)(nil), // 43: memos.api.v1.UserSetting.SessionsSetting.Session
(*UserSetting_SessionsSetting_ClientInfo)(nil), // 44: memos.api.v1.UserSetting.SessionsSetting.ClientInfo
(*UserSetting_AccessTokensSetting_AccessToken)(nil), // 45: memos.api.v1.UserSetting.AccessTokensSetting.AccessToken
(*UserSetting_ShortcutsSetting_Shortcut)(nil), // 46: memos.api.v1.UserSetting.ShortcutsSetting.Shortcut
(*UserSetting_WebhooksSetting_Webhook)(nil), // 47: memos.api.v1.UserSetting.WebhooksSetting.Webhook
(*UserSession_ClientInfo)(nil), // 48: memos.api.v1.UserSession.ClientInfo
(State)(0), // 49: memos.api.v1.State
(*timestamppb.Timestamp)(nil), // 50: google.protobuf.Timestamp
(*fieldmaskpb.FieldMask)(nil), // 51: google.protobuf.FieldMask
(*emptypb.Empty)(nil), // 52: google.protobuf.Empty
(*httpbody.HttpBody)(nil), // 53: google.api.HttpBody
(User_Role)(0), // 0: memos.api.v1.User.Role
(UserSetting_Key)(0), // 1: memos.api.v1.UserSetting.Key
(*User)(nil), // 2: memos.api.v1.User
(*ListUsersRequest)(nil), // 3: memos.api.v1.ListUsersRequest
(*ListUsersResponse)(nil), // 4: memos.api.v1.ListUsersResponse
(*GetUserRequest)(nil), // 5: memos.api.v1.GetUserRequest
(*CreateUserRequest)(nil), // 6: memos.api.v1.CreateUserRequest
(*UpdateUserRequest)(nil), // 7: memos.api.v1.UpdateUserRequest
(*DeleteUserRequest)(nil), // 8: memos.api.v1.DeleteUserRequest
(*SearchUsersRequest)(nil), // 9: memos.api.v1.SearchUsersRequest
(*SearchUsersResponse)(nil), // 10: memos.api.v1.SearchUsersResponse
(*GetUserAvatarRequest)(nil), // 11: memos.api.v1.GetUserAvatarRequest
(*UserStats)(nil), // 12: memos.api.v1.UserStats
(*GetUserStatsRequest)(nil), // 13: memos.api.v1.GetUserStatsRequest
(*ListAllUserStatsRequest)(nil), // 14: memos.api.v1.ListAllUserStatsRequest
(*ListAllUserStatsResponse)(nil), // 15: memos.api.v1.ListAllUserStatsResponse
(*UserSetting)(nil), // 16: memos.api.v1.UserSetting
(*GetUserSettingRequest)(nil), // 17: memos.api.v1.GetUserSettingRequest
(*UpdateUserSettingRequest)(nil), // 18: memos.api.v1.UpdateUserSettingRequest
(*ListUserSettingsRequest)(nil), // 19: memos.api.v1.ListUserSettingsRequest
(*ListUserSettingsResponse)(nil), // 20: memos.api.v1.ListUserSettingsResponse
(*UserAccessToken)(nil), // 21: memos.api.v1.UserAccessToken
(*ListUserAccessTokensRequest)(nil), // 22: memos.api.v1.ListUserAccessTokensRequest
(*ListUserAccessTokensResponse)(nil), // 23: memos.api.v1.ListUserAccessTokensResponse
(*CreateUserAccessTokenRequest)(nil), // 24: memos.api.v1.CreateUserAccessTokenRequest
(*DeleteUserAccessTokenRequest)(nil), // 25: memos.api.v1.DeleteUserAccessTokenRequest
(*UserSession)(nil), // 26: memos.api.v1.UserSession
(*ListUserSessionsRequest)(nil), // 27: memos.api.v1.ListUserSessionsRequest
(*ListUserSessionsResponse)(nil), // 28: memos.api.v1.ListUserSessionsResponse
(*RevokeUserSessionRequest)(nil), // 29: memos.api.v1.RevokeUserSessionRequest
(*UserWebhook)(nil), // 30: memos.api.v1.UserWebhook
(*ListUserWebhooksRequest)(nil), // 31: memos.api.v1.ListUserWebhooksRequest
(*ListUserWebhooksResponse)(nil), // 32: memos.api.v1.ListUserWebhooksResponse
(*CreateUserWebhookRequest)(nil), // 33: memos.api.v1.CreateUserWebhookRequest
(*UpdateUserWebhookRequest)(nil), // 34: memos.api.v1.UpdateUserWebhookRequest
(*DeleteUserWebhookRequest)(nil), // 35: memos.api.v1.DeleteUserWebhookRequest
nil, // 36: memos.api.v1.UserStats.TagCountEntry
(*UserStats_MemoTypeStats)(nil), // 37: memos.api.v1.UserStats.MemoTypeStats
(*UserSetting_GeneralSetting)(nil), // 38: memos.api.v1.UserSetting.GeneralSetting
(*UserSetting_SessionsSetting)(nil), // 39: memos.api.v1.UserSetting.SessionsSetting
(*UserSetting_AccessTokensSetting)(nil), // 40: memos.api.v1.UserSetting.AccessTokensSetting
(*UserSetting_WebhooksSetting)(nil), // 41: memos.api.v1.UserSetting.WebhooksSetting
(*UserSession_ClientInfo)(nil), // 42: memos.api.v1.UserSession.ClientInfo
(State)(0), // 43: memos.api.v1.State
(*timestamppb.Timestamp)(nil), // 44: google.protobuf.Timestamp
(*fieldmaskpb.FieldMask)(nil), // 45: google.protobuf.FieldMask
(*emptypb.Empty)(nil), // 46: google.protobuf.Empty
(*httpbody.HttpBody)(nil), // 47: google.api.HttpBody
}
var file_api_v1_user_service_proto_depIdxs = []int32{
0, // 0: memos.api.v1.User.role:type_name -> memos.api.v1.User.Role
49, // 1: memos.api.v1.User.state:type_name -> memos.api.v1.State
50, // 2: memos.api.v1.User.create_time:type_name -> google.protobuf.Timestamp
50, // 3: memos.api.v1.User.update_time:type_name -> google.protobuf.Timestamp
43, // 1: memos.api.v1.User.state:type_name -> memos.api.v1.State
44, // 2: memos.api.v1.User.create_time:type_name -> google.protobuf.Timestamp
44, // 3: memos.api.v1.User.update_time:type_name -> google.protobuf.Timestamp
2, // 4: memos.api.v1.ListUsersResponse.users:type_name -> memos.api.v1.User
51, // 5: memos.api.v1.GetUserRequest.read_mask:type_name -> google.protobuf.FieldMask
45, // 5: memos.api.v1.GetUserRequest.read_mask:type_name -> google.protobuf.FieldMask
2, // 6: memos.api.v1.CreateUserRequest.user:type_name -> memos.api.v1.User
2, // 7: memos.api.v1.UpdateUserRequest.user:type_name -> memos.api.v1.User
51, // 8: memos.api.v1.UpdateUserRequest.update_mask:type_name -> google.protobuf.FieldMask
45, // 8: memos.api.v1.UpdateUserRequest.update_mask:type_name -> google.protobuf.FieldMask
2, // 9: memos.api.v1.SearchUsersResponse.users:type_name -> memos.api.v1.User
50, // 10: memos.api.v1.UserStats.memo_display_timestamps:type_name -> google.protobuf.Timestamp
44, // 10: memos.api.v1.UserStats.memo_display_timestamps:type_name -> google.protobuf.Timestamp
37, // 11: memos.api.v1.UserStats.memo_type_stats:type_name -> memos.api.v1.UserStats.MemoTypeStats
36, // 12: memos.api.v1.UserStats.tag_count:type_name -> memos.api.v1.UserStats.TagCountEntry
12, // 13: memos.api.v1.ListAllUserStatsResponse.stats:type_name -> memos.api.v1.UserStats
38, // 14: memos.api.v1.UserSetting.general_setting:type_name -> memos.api.v1.UserSetting.GeneralSetting
39, // 15: memos.api.v1.UserSetting.sessions_setting:type_name -> memos.api.v1.UserSetting.SessionsSetting
40, // 16: memos.api.v1.UserSetting.access_tokens_setting:type_name -> memos.api.v1.UserSetting.AccessTokensSetting
41, // 17: memos.api.v1.UserSetting.shortcuts_setting:type_name -> memos.api.v1.UserSetting.ShortcutsSetting
42, // 18: memos.api.v1.UserSetting.webhooks_setting:type_name -> memos.api.v1.UserSetting.WebhooksSetting
16, // 19: memos.api.v1.UpdateUserSettingRequest.setting:type_name -> memos.api.v1.UserSetting
51, // 20: memos.api.v1.UpdateUserSettingRequest.update_mask:type_name -> google.protobuf.FieldMask
16, // 21: memos.api.v1.ListUserSettingsResponse.settings:type_name -> memos.api.v1.UserSetting
50, // 22: memos.api.v1.UserAccessToken.issued_at:type_name -> google.protobuf.Timestamp
50, // 23: memos.api.v1.UserAccessToken.expires_at:type_name -> google.protobuf.Timestamp
21, // 24: memos.api.v1.ListUserAccessTokensResponse.access_tokens:type_name -> memos.api.v1.UserAccessToken
21, // 25: memos.api.v1.CreateUserAccessTokenRequest.access_token:type_name -> memos.api.v1.UserAccessToken
50, // 26: memos.api.v1.UserSession.create_time:type_name -> google.protobuf.Timestamp
50, // 27: memos.api.v1.UserSession.last_accessed_time:type_name -> google.protobuf.Timestamp
48, // 28: memos.api.v1.UserSession.client_info:type_name -> memos.api.v1.UserSession.ClientInfo
26, // 29: memos.api.v1.ListUserSessionsResponse.sessions:type_name -> memos.api.v1.UserSession
50, // 30: memos.api.v1.UserWebhook.create_time:type_name -> google.protobuf.Timestamp
50, // 31: memos.api.v1.UserWebhook.update_time:type_name -> google.protobuf.Timestamp
30, // 32: memos.api.v1.ListUserWebhooksResponse.webhooks:type_name -> memos.api.v1.UserWebhook
30, // 33: memos.api.v1.CreateUserWebhookRequest.webhook:type_name -> memos.api.v1.UserWebhook
30, // 34: memos.api.v1.UpdateUserWebhookRequest.webhook:type_name -> memos.api.v1.UserWebhook
51, // 35: memos.api.v1.UpdateUserWebhookRequest.update_mask:type_name -> google.protobuf.FieldMask
43, // 36: memos.api.v1.UserSetting.SessionsSetting.sessions:type_name -> memos.api.v1.UserSetting.SessionsSetting.Session
45, // 37: memos.api.v1.UserSetting.AccessTokensSetting.access_tokens:type_name -> memos.api.v1.UserSetting.AccessTokensSetting.AccessToken
46, // 38: memos.api.v1.UserSetting.ShortcutsSetting.shortcuts:type_name -> memos.api.v1.UserSetting.ShortcutsSetting.Shortcut
47, // 39: memos.api.v1.UserSetting.WebhooksSetting.webhooks:type_name -> memos.api.v1.UserSetting.WebhooksSetting.Webhook
50, // 40: memos.api.v1.UserSetting.SessionsSetting.Session.create_time:type_name -> google.protobuf.Timestamp
50, // 41: memos.api.v1.UserSetting.SessionsSetting.Session.last_accessed_time:type_name -> google.protobuf.Timestamp
44, // 42: memos.api.v1.UserSetting.SessionsSetting.Session.client_info:type_name -> memos.api.v1.UserSetting.SessionsSetting.ClientInfo
3, // 43: memos.api.v1.UserService.ListUsers:input_type -> memos.api.v1.ListUsersRequest
5, // 44: memos.api.v1.UserService.GetUser:input_type -> memos.api.v1.GetUserRequest
6, // 45: memos.api.v1.UserService.CreateUser:input_type -> memos.api.v1.CreateUserRequest
7, // 46: memos.api.v1.UserService.UpdateUser:input_type -> memos.api.v1.UpdateUserRequest
8, // 47: memos.api.v1.UserService.DeleteUser:input_type -> memos.api.v1.DeleteUserRequest
9, // 48: memos.api.v1.UserService.SearchUsers:input_type -> memos.api.v1.SearchUsersRequest
11, // 49: memos.api.v1.UserService.GetUserAvatar:input_type -> memos.api.v1.GetUserAvatarRequest
14, // 50: memos.api.v1.UserService.ListAllUserStats:input_type -> memos.api.v1.ListAllUserStatsRequest
13, // 51: memos.api.v1.UserService.GetUserStats:input_type -> memos.api.v1.GetUserStatsRequest
17, // 52: memos.api.v1.UserService.GetUserSetting:input_type -> memos.api.v1.GetUserSettingRequest
18, // 53: memos.api.v1.UserService.UpdateUserSetting:input_type -> memos.api.v1.UpdateUserSettingRequest
19, // 54: memos.api.v1.UserService.ListUserSettings:input_type -> memos.api.v1.ListUserSettingsRequest
22, // 55: memos.api.v1.UserService.ListUserAccessTokens:input_type -> memos.api.v1.ListUserAccessTokensRequest
24, // 56: memos.api.v1.UserService.CreateUserAccessToken:input_type -> memos.api.v1.CreateUserAccessTokenRequest
25, // 57: memos.api.v1.UserService.DeleteUserAccessToken:input_type -> memos.api.v1.DeleteUserAccessTokenRequest
27, // 58: memos.api.v1.UserService.ListUserSessions:input_type -> memos.api.v1.ListUserSessionsRequest
29, // 59: memos.api.v1.UserService.RevokeUserSession:input_type -> memos.api.v1.RevokeUserSessionRequest
31, // 60: memos.api.v1.UserService.ListUserWebhooks:input_type -> memos.api.v1.ListUserWebhooksRequest
33, // 61: memos.api.v1.UserService.CreateUserWebhook:input_type -> memos.api.v1.CreateUserWebhookRequest
34, // 62: memos.api.v1.UserService.UpdateUserWebhook:input_type -> memos.api.v1.UpdateUserWebhookRequest
35, // 63: memos.api.v1.UserService.DeleteUserWebhook:input_type -> memos.api.v1.DeleteUserWebhookRequest
4, // 64: memos.api.v1.UserService.ListUsers:output_type -> memos.api.v1.ListUsersResponse
2, // 65: memos.api.v1.UserService.GetUser:output_type -> memos.api.v1.User
2, // 66: memos.api.v1.UserService.CreateUser:output_type -> memos.api.v1.User
2, // 67: memos.api.v1.UserService.UpdateUser:output_type -> memos.api.v1.User
52, // 68: memos.api.v1.UserService.DeleteUser:output_type -> google.protobuf.Empty
10, // 69: memos.api.v1.UserService.SearchUsers:output_type -> memos.api.v1.SearchUsersResponse
53, // 70: memos.api.v1.UserService.GetUserAvatar:output_type -> google.api.HttpBody
15, // 71: memos.api.v1.UserService.ListAllUserStats:output_type -> memos.api.v1.ListAllUserStatsResponse
12, // 72: memos.api.v1.UserService.GetUserStats:output_type -> memos.api.v1.UserStats
16, // 73: memos.api.v1.UserService.GetUserSetting:output_type -> memos.api.v1.UserSetting
16, // 74: memos.api.v1.UserService.UpdateUserSetting:output_type -> memos.api.v1.UserSetting
20, // 75: memos.api.v1.UserService.ListUserSettings:output_type -> memos.api.v1.ListUserSettingsResponse
23, // 76: memos.api.v1.UserService.ListUserAccessTokens:output_type -> memos.api.v1.ListUserAccessTokensResponse
21, // 77: memos.api.v1.UserService.CreateUserAccessToken:output_type -> memos.api.v1.UserAccessToken
52, // 78: memos.api.v1.UserService.DeleteUserAccessToken:output_type -> google.protobuf.Empty
28, // 79: memos.api.v1.UserService.ListUserSessions:output_type -> memos.api.v1.ListUserSessionsResponse
52, // 80: memos.api.v1.UserService.RevokeUserSession:output_type -> google.protobuf.Empty
32, // 81: memos.api.v1.UserService.ListUserWebhooks:output_type -> memos.api.v1.ListUserWebhooksResponse
30, // 82: memos.api.v1.UserService.CreateUserWebhook:output_type -> memos.api.v1.UserWebhook
30, // 83: memos.api.v1.UserService.UpdateUserWebhook:output_type -> memos.api.v1.UserWebhook
52, // 84: memos.api.v1.UserService.DeleteUserWebhook:output_type -> google.protobuf.Empty
64, // [64:85] is the sub-list for method output_type
43, // [43:64] is the sub-list for method input_type
43, // [43:43] is the sub-list for extension type_name
43, // [43:43] is the sub-list for extension extendee
0, // [0:43] is the sub-list for field type_name
41, // 17: memos.api.v1.UserSetting.webhooks_setting:type_name -> memos.api.v1.UserSetting.WebhooksSetting
16, // 18: memos.api.v1.UpdateUserSettingRequest.setting:type_name -> memos.api.v1.UserSetting
45, // 19: memos.api.v1.UpdateUserSettingRequest.update_mask:type_name -> google.protobuf.FieldMask
16, // 20: memos.api.v1.ListUserSettingsResponse.settings:type_name -> memos.api.v1.UserSetting
44, // 21: memos.api.v1.UserAccessToken.issued_at:type_name -> google.protobuf.Timestamp
44, // 22: memos.api.v1.UserAccessToken.expires_at:type_name -> google.protobuf.Timestamp
21, // 23: memos.api.v1.ListUserAccessTokensResponse.access_tokens:type_name -> memos.api.v1.UserAccessToken
21, // 24: memos.api.v1.CreateUserAccessTokenRequest.access_token:type_name -> memos.api.v1.UserAccessToken
44, // 25: memos.api.v1.UserSession.create_time:type_name -> google.protobuf.Timestamp
44, // 26: memos.api.v1.UserSession.last_accessed_time:type_name -> google.protobuf.Timestamp
42, // 27: memos.api.v1.UserSession.client_info:type_name -> memos.api.v1.UserSession.ClientInfo
26, // 28: memos.api.v1.ListUserSessionsResponse.sessions:type_name -> memos.api.v1.UserSession
44, // 29: memos.api.v1.UserWebhook.create_time:type_name -> google.protobuf.Timestamp
44, // 30: memos.api.v1.UserWebhook.update_time:type_name -> google.protobuf.Timestamp
30, // 31: memos.api.v1.ListUserWebhooksResponse.webhooks:type_name -> memos.api.v1.UserWebhook
30, // 32: memos.api.v1.CreateUserWebhookRequest.webhook:type_name -> memos.api.v1.UserWebhook
30, // 33: memos.api.v1.UpdateUserWebhookRequest.webhook:type_name -> memos.api.v1.UserWebhook
45, // 34: memos.api.v1.UpdateUserWebhookRequest.update_mask:type_name -> google.protobuf.FieldMask
26, // 35: memos.api.v1.UserSetting.SessionsSetting.sessions:type_name -> memos.api.v1.UserSession
21, // 36: memos.api.v1.UserSetting.AccessTokensSetting.access_tokens:type_name -> memos.api.v1.UserAccessToken
30, // 37: memos.api.v1.UserSetting.WebhooksSetting.webhooks:type_name -> memos.api.v1.UserWebhook
3, // 38: memos.api.v1.UserService.ListUsers:input_type -> memos.api.v1.ListUsersRequest
5, // 39: memos.api.v1.UserService.GetUser:input_type -> memos.api.v1.GetUserRequest
6, // 40: memos.api.v1.UserService.CreateUser:input_type -> memos.api.v1.CreateUserRequest
7, // 41: memos.api.v1.UserService.UpdateUser:input_type -> memos.api.v1.UpdateUserRequest
8, // 42: memos.api.v1.UserService.DeleteUser:input_type -> memos.api.v1.DeleteUserRequest
9, // 43: memos.api.v1.UserService.SearchUsers:input_type -> memos.api.v1.SearchUsersRequest
11, // 44: memos.api.v1.UserService.GetUserAvatar:input_type -> memos.api.v1.GetUserAvatarRequest
14, // 45: memos.api.v1.UserService.ListAllUserStats:input_type -> memos.api.v1.ListAllUserStatsRequest
13, // 46: memos.api.v1.UserService.GetUserStats:input_type -> memos.api.v1.GetUserStatsRequest
17, // 47: memos.api.v1.UserService.GetUserSetting:input_type -> memos.api.v1.GetUserSettingRequest
18, // 48: memos.api.v1.UserService.UpdateUserSetting:input_type -> memos.api.v1.UpdateUserSettingRequest
19, // 49: memos.api.v1.UserService.ListUserSettings:input_type -> memos.api.v1.ListUserSettingsRequest
22, // 50: memos.api.v1.UserService.ListUserAccessTokens:input_type -> memos.api.v1.ListUserAccessTokensRequest
24, // 51: memos.api.v1.UserService.CreateUserAccessToken:input_type -> memos.api.v1.CreateUserAccessTokenRequest
25, // 52: memos.api.v1.UserService.DeleteUserAccessToken:input_type -> memos.api.v1.DeleteUserAccessTokenRequest
27, // 53: memos.api.v1.UserService.ListUserSessions:input_type -> memos.api.v1.ListUserSessionsRequest
29, // 54: memos.api.v1.UserService.RevokeUserSession:input_type -> memos.api.v1.RevokeUserSessionRequest
31, // 55: memos.api.v1.UserService.ListUserWebhooks:input_type -> memos.api.v1.ListUserWebhooksRequest
33, // 56: memos.api.v1.UserService.CreateUserWebhook:input_type -> memos.api.v1.CreateUserWebhookRequest
34, // 57: memos.api.v1.UserService.UpdateUserWebhook:input_type -> memos.api.v1.UpdateUserWebhookRequest
35, // 58: memos.api.v1.UserService.DeleteUserWebhook:input_type -> memos.api.v1.DeleteUserWebhookRequest
4, // 59: memos.api.v1.UserService.ListUsers:output_type -> memos.api.v1.ListUsersResponse
2, // 60: memos.api.v1.UserService.GetUser:output_type -> memos.api.v1.User
2, // 61: memos.api.v1.UserService.CreateUser:output_type -> memos.api.v1.User
2, // 62: memos.api.v1.UserService.UpdateUser:output_type -> memos.api.v1.User
46, // 63: memos.api.v1.UserService.DeleteUser:output_type -> google.protobuf.Empty
10, // 64: memos.api.v1.UserService.SearchUsers:output_type -> memos.api.v1.SearchUsersResponse
47, // 65: memos.api.v1.UserService.GetUserAvatar:output_type -> google.api.HttpBody
15, // 66: memos.api.v1.UserService.ListAllUserStats:output_type -> memos.api.v1.ListAllUserStatsResponse
12, // 67: memos.api.v1.UserService.GetUserStats:output_type -> memos.api.v1.UserStats
16, // 68: memos.api.v1.UserService.GetUserSetting:output_type -> memos.api.v1.UserSetting
16, // 69: memos.api.v1.UserService.UpdateUserSetting:output_type -> memos.api.v1.UserSetting
20, // 70: memos.api.v1.UserService.ListUserSettings:output_type -> memos.api.v1.ListUserSettingsResponse
23, // 71: memos.api.v1.UserService.ListUserAccessTokens:output_type -> memos.api.v1.ListUserAccessTokensResponse
21, // 72: memos.api.v1.UserService.CreateUserAccessToken:output_type -> memos.api.v1.UserAccessToken
46, // 73: memos.api.v1.UserService.DeleteUserAccessToken:output_type -> google.protobuf.Empty
28, // 74: memos.api.v1.UserService.ListUserSessions:output_type -> memos.api.v1.ListUserSessionsResponse
46, // 75: memos.api.v1.UserService.RevokeUserSession:output_type -> google.protobuf.Empty
32, // 76: memos.api.v1.UserService.ListUserWebhooks:output_type -> memos.api.v1.ListUserWebhooksResponse
30, // 77: memos.api.v1.UserService.CreateUserWebhook:output_type -> memos.api.v1.UserWebhook
30, // 78: memos.api.v1.UserService.UpdateUserWebhook:output_type -> memos.api.v1.UserWebhook
46, // 79: memos.api.v1.UserService.DeleteUserWebhook:output_type -> google.protobuf.Empty
59, // [59:80] is the sub-list for method output_type
38, // [38:59] is the sub-list for method input_type
38, // [38:38] is the sub-list for extension type_name
38, // [38:38] is the sub-list for extension extendee
0, // [0:38] is the sub-list for field type_name
}
func init() { file_api_v1_user_service_proto_init() }
@ -3519,7 +3070,6 @@ func file_api_v1_user_service_proto_init() {
(*UserSetting_GeneralSetting_)(nil),
(*UserSetting_SessionsSetting_)(nil),
(*UserSetting_AccessTokensSetting_)(nil),
(*UserSetting_ShortcutsSetting_)(nil),
(*UserSetting_WebhooksSetting_)(nil),
}
type x struct{}
@ -3528,7 +3078,7 @@ func file_api_v1_user_service_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: unsafe.Slice(unsafe.StringData(file_api_v1_user_service_proto_rawDesc), len(file_api_v1_user_service_proto_rawDesc)),
NumEnums: 2,
NumMessages: 47,
NumMessages: 41,
NumExtensions: 0,
NumServices: 1,
},

@ -2256,19 +2256,6 @@ paths:
$ref: '#/components/schemas/Status'
components:
schemas:
AccessTokensSetting_AccessToken:
type: object
properties:
accessToken:
readOnly: true
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.
description: User access token information.
Activity:
type: object
properties:
@ -3344,55 +3331,6 @@ components:
type: integer
description: The total count of matching users.
format: int32
SessionsSetting_ClientInfo:
type: object
properties:
userAgent:
readOnly: true
type: string
description: User agent string of the client.
ipAddress:
readOnly: true
type: string
description: IP address of the client.
deviceType:
readOnly: true
type: string
description: Optional. Device type (e.g., "mobile", "desktop", "tablet").
os:
readOnly: true
type: string
description: Optional. Operating system (e.g., "iOS 17.0", "Windows 11").
browser:
readOnly: true
type: string
description: Optional. Browser name and version (e.g., "Chrome 119.0").
description: Client information for a session.
SessionsSetting_Session:
type: object
properties:
sessionId:
readOnly: true
type: string
description: Unique session identifier.
createTime:
readOnly: true
type: string
description: Timestamp when the session was created.
format: date-time
lastAccessedTime:
readOnly: true
type: string
description: |-
Timestamp when the session was last accessed.
Used for sliding expiration calculation (last_accessed_time + 2 weeks).
format: date-time
clientInfo:
readOnly: true
allOf:
- $ref: '#/components/schemas/SessionsSetting_ClientInfo'
description: Client information associated with this session.
description: User session information.
SetMemoAttachmentsRequest:
required:
- name
@ -3441,23 +3379,6 @@ components:
filter:
type: string
description: The filter expression for the shortcut.
ShortcutsSetting_Shortcut:
required:
- id
- title
- filter
type: object
properties:
id:
type: string
description: Unique identifier for the shortcut.
title:
type: string
description: Display title for the shortcut.
filter:
type: string
description: Filter expression for the shortcut.
description: User shortcut definition.
SpoilerNode:
type: object
properties:
@ -3738,15 +3659,14 @@ components:
type: string
description: |-
The name of the user setting.
Format: users/{user}/settings/{setting}
Format: users/{user}/settings/{setting}, {setting} is the key for the setting.
For example, "users/123/settings/GENERAL" for general settings.
generalSetting:
$ref: '#/components/schemas/UserSetting_GeneralSetting'
sessionsSetting:
$ref: '#/components/schemas/UserSetting_SessionsSetting'
accessTokensSetting:
$ref: '#/components/schemas/UserSetting_AccessTokensSetting'
shortcutsSetting:
$ref: '#/components/schemas/UserSetting_ShortcutsSetting'
webhooksSetting:
$ref: '#/components/schemas/UserSetting_WebhooksSetting'
description: User settings message
@ -3756,7 +3676,7 @@ components:
accessTokens:
type: array
items:
$ref: '#/components/schemas/AccessTokensSetting_AccessToken'
$ref: '#/components/schemas/UserAccessToken'
description: List of user access tokens.
description: User access tokens configuration.
UserSetting_GeneralSetting:
@ -3784,25 +3704,16 @@ components:
sessions:
type: array
items:
$ref: '#/components/schemas/SessionsSetting_Session'
$ref: '#/components/schemas/UserSession'
description: List of active user sessions.
description: User authentication sessions configuration.
UserSetting_ShortcutsSetting:
type: object
properties:
shortcuts:
type: array
items:
$ref: '#/components/schemas/ShortcutsSetting_Shortcut'
description: List of user shortcuts.
description: User shortcuts configuration.
UserSetting_WebhooksSetting:
type: object
properties:
webhooks:
type: array
items:
$ref: '#/components/schemas/WebhooksSetting_Webhook'
$ref: '#/components/schemas/UserWebhook'
description: List of user webhooks.
description: User webhooks configuration.
UserStats:
@ -3880,23 +3791,6 @@ components:
description: The last update time of the webhook.
format: date-time
description: UserWebhook represents a webhook owned by a user.
WebhooksSetting_Webhook:
required:
- id
- title
- url
type: object
properties:
id:
type: string
description: Unique identifier for the webhook.
title:
type: string
description: Descriptive title for the webhook.
url:
type: string
description: The webhook URL endpoint.
description: User webhook definition.
WorkspaceProfile:
type: object
properties:

@ -1067,15 +1067,13 @@ func ExtractUserIDAndSettingKeyFromName(name string) (int32, string, error) {
// convertSettingKeyToStore converts API setting key to store enum.
func convertSettingKeyToStore(key string) (storepb.UserSetting_Key, error) {
switch key {
case "general":
case v1pb.UserSetting_Key_name[int32(v1pb.UserSetting_GENERAL)]:
return storepb.UserSetting_GENERAL, nil
case "sessions":
case v1pb.UserSetting_Key_name[int32(v1pb.UserSetting_SESSIONS)]:
return storepb.UserSetting_SESSIONS, nil
case "access-tokens":
case v1pb.UserSetting_Key_name[int32(v1pb.UserSetting_ACCESS_TOKENS)]:
return storepb.UserSetting_ACCESS_TOKENS, nil
case "shortcuts":
return storepb.UserSetting_SHORTCUTS, nil
case "webhooks":
case v1pb.UserSetting_Key_name[int32(v1pb.UserSetting_WEBHOOKS)]:
return storepb.UserSetting_WEBHOOKS, nil
default:
return storepb.UserSetting_KEY_UNSPECIFIED, errors.Errorf("unknown setting key: %s", key)
@ -1086,15 +1084,15 @@ func convertSettingKeyToStore(key string) (storepb.UserSetting_Key, error) {
func convertSettingKeyFromStore(key storepb.UserSetting_Key) string {
switch key {
case storepb.UserSetting_GENERAL:
return "general"
return v1pb.UserSetting_Key_name[int32(v1pb.UserSetting_GENERAL)]
case storepb.UserSetting_SESSIONS:
return "sessions"
return v1pb.UserSetting_Key_name[int32(v1pb.UserSetting_SESSIONS)]
case storepb.UserSetting_ACCESS_TOKENS:
return "access-tokens"
return v1pb.UserSetting_Key_name[int32(v1pb.UserSetting_ACCESS_TOKENS)]
case storepb.UserSetting_SHORTCUTS:
return "shortcuts"
return "SHORTCUTS" // Not defined in API proto
case storepb.UserSetting_WEBHOOKS:
return "webhooks"
return v1pb.UserSetting_Key_name[int32(v1pb.UserSetting_WEBHOOKS)]
default:
return "unknown"
}
@ -1117,25 +1115,19 @@ func convertUserSettingFromStore(storeSetting *storepb.UserSetting, userID int32
case storepb.UserSetting_SESSIONS:
setting.Value = &v1pb.UserSetting_SessionsSetting_{
SessionsSetting: &v1pb.UserSetting_SessionsSetting{
Sessions: []*v1pb.UserSetting_SessionsSetting_Session{},
Sessions: []*v1pb.UserSession{},
},
}
case storepb.UserSetting_ACCESS_TOKENS:
setting.Value = &v1pb.UserSetting_AccessTokensSetting_{
AccessTokensSetting: &v1pb.UserSetting_AccessTokensSetting{
AccessTokens: []*v1pb.UserSetting_AccessTokensSetting_AccessToken{},
},
}
case storepb.UserSetting_SHORTCUTS:
setting.Value = &v1pb.UserSetting_ShortcutsSetting_{
ShortcutsSetting: &v1pb.UserSetting_ShortcutsSetting{
Shortcuts: []*v1pb.UserSetting_ShortcutsSetting_Shortcut{},
AccessTokens: []*v1pb.UserAccessToken{},
},
}
case storepb.UserSetting_WEBHOOKS:
setting.Value = &v1pb.UserSetting_WebhooksSetting_{
WebhooksSetting: &v1pb.UserSetting_WebhooksSetting{
Webhooks: []*v1pb.UserSetting_WebhooksSetting_Webhook{},
Webhooks: []*v1pb.UserWebhook{},
},
}
}
@ -1165,13 +1157,14 @@ func convertUserSettingFromStore(storeSetting *storepb.UserSetting, userID int32
}
case storepb.UserSetting_SESSIONS:
sessions := storeSetting.GetSessions()
apiSessions := make([]*v1pb.UserSetting_SessionsSetting_Session, 0, len(sessions.Sessions))
apiSessions := make([]*v1pb.UserSession, 0, len(sessions.Sessions))
for _, session := range sessions.Sessions {
apiSession := &v1pb.UserSetting_SessionsSetting_Session{
apiSession := &v1pb.UserSession{
Name: fmt.Sprintf("users/%d/sessions/%s", userID, session.SessionId),
SessionId: session.SessionId,
CreateTime: session.CreateTime,
LastAccessedTime: session.LastAccessedTime,
ClientInfo: &v1pb.UserSetting_SessionsSetting_ClientInfo{
ClientInfo: &v1pb.UserSession_ClientInfo{
UserAgent: session.ClientInfo.UserAgent,
IpAddress: session.ClientInfo.IpAddress,
DeviceType: session.ClientInfo.DeviceType,
@ -1188,9 +1181,10 @@ func convertUserSettingFromStore(storeSetting *storepb.UserSetting, userID int32
}
case storepb.UserSetting_ACCESS_TOKENS:
accessTokens := storeSetting.GetAccessTokens()
apiTokens := make([]*v1pb.UserSetting_AccessTokensSetting_AccessToken, 0, len(accessTokens.AccessTokens))
apiTokens := make([]*v1pb.UserAccessToken, 0, len(accessTokens.AccessTokens))
for _, token := range accessTokens.AccessTokens {
apiToken := &v1pb.UserSetting_AccessTokensSetting_AccessToken{
apiToken := &v1pb.UserAccessToken{
Name: fmt.Sprintf("users/%d/accessTokens/%s", userID, token.AccessToken),
AccessToken: token.AccessToken,
Description: token.Description,
}
@ -1201,30 +1195,14 @@ func convertUserSettingFromStore(storeSetting *storepb.UserSetting, userID int32
AccessTokens: apiTokens,
},
}
case storepb.UserSetting_SHORTCUTS:
shortcuts := storeSetting.GetShortcuts()
apiShortcuts := make([]*v1pb.UserSetting_ShortcutsSetting_Shortcut, 0, len(shortcuts.Shortcuts))
for _, shortcut := range shortcuts.Shortcuts {
apiShortcut := &v1pb.UserSetting_ShortcutsSetting_Shortcut{
Id: shortcut.Id,
Title: shortcut.Title,
Filter: shortcut.Filter,
}
apiShortcuts = append(apiShortcuts, apiShortcut)
}
setting.Value = &v1pb.UserSetting_ShortcutsSetting_{
ShortcutsSetting: &v1pb.UserSetting_ShortcutsSetting{
Shortcuts: apiShortcuts,
},
}
case storepb.UserSetting_WEBHOOKS:
webhooks := storeSetting.GetWebhooks()
apiWebhooks := make([]*v1pb.UserSetting_WebhooksSetting_Webhook, 0, len(webhooks.Webhooks))
apiWebhooks := make([]*v1pb.UserWebhook, 0, len(webhooks.Webhooks))
for _, webhook := range webhooks.Webhooks {
apiWebhook := &v1pb.UserSetting_WebhooksSetting_Webhook{
Id: webhook.Id,
Title: webhook.Title,
Url: webhook.Url,
apiWebhook := &v1pb.UserWebhook{
Name: fmt.Sprintf("users/%d/webhooks/%s", userID, webhook.Id),
Url: webhook.Url,
DisplayName: webhook.Title,
}
apiWebhooks = append(apiWebhooks, apiWebhook)
}
@ -1303,32 +1281,13 @@ func convertUserSettingToStore(apiSetting *v1pb.UserSetting, userID int32, key s
} else {
return nil, errors.Errorf("access tokens setting is required")
}
case storepb.UserSetting_SHORTCUTS:
if shortcuts := apiSetting.GetShortcutsSetting(); shortcuts != nil {
storeShortcuts := make([]*storepb.ShortcutsUserSetting_Shortcut, 0, len(shortcuts.Shortcuts))
for _, shortcut := range shortcuts.Shortcuts {
storeShortcut := &storepb.ShortcutsUserSetting_Shortcut{
Id: shortcut.Id,
Title: shortcut.Title,
Filter: shortcut.Filter,
}
storeShortcuts = append(storeShortcuts, storeShortcut)
}
storeSetting.Value = &storepb.UserSetting_Shortcuts{
Shortcuts: &storepb.ShortcutsUserSetting{
Shortcuts: storeShortcuts,
},
}
} else {
return nil, errors.Errorf("shortcuts setting is required")
}
case storepb.UserSetting_WEBHOOKS:
if webhooks := apiSetting.GetWebhooksSetting(); webhooks != nil {
storeWebhooks := make([]*storepb.WebhooksUserSetting_Webhook, 0, len(webhooks.Webhooks))
for _, webhook := range webhooks.Webhooks {
storeWebhook := &storepb.WebhooksUserSetting_Webhook{
Id: webhook.Id,
Title: webhook.Title,
Id: extractWebhookIDFromName(webhook.Name),
Title: webhook.DisplayName,
Url: webhook.Url,
}
storeWebhooks = append(storeWebhooks, storeWebhook)
@ -1347,3 +1306,13 @@ func convertUserSettingToStore(apiSetting *v1pb.UserSetting, userID int32, key s
return storeSetting, nil
}
// extractWebhookIDFromName extracts webhook ID from resource name.
// e.g., "users/123/webhooks/webhook-id" -> "webhook-id".
func extractWebhookIDFromName(name string) string {
parts := strings.Split(name, "/")
if len(parts) >= 4 && parts[0] == "users" && parts[2] == "webhooks" {
return parts[3]
}
return ""
}

@ -6,10 +6,10 @@ import { Shortcut } from "@/types/proto/api/v1/shortcut_service";
import {
User,
UserSetting,
UserSetting_Key,
UserSetting_GeneralSetting,
UserSetting_SessionsSetting,
UserSetting_AccessTokensSetting,
UserSetting_ShortcutsSetting,
UserSetting_WebhooksSetting,
UserStats,
} from "@/types/proto/api/v1/user_service";
@ -21,7 +21,6 @@ class LocalState {
userGeneralSetting?: UserSetting_GeneralSetting;
userSessionsSetting?: UserSetting_SessionsSetting;
userAccessTokensSetting?: UserSetting_AccessTokensSetting;
userShortcutsSetting?: UserSetting_ShortcutsSetting;
userWebhooksSetting?: UserSetting_WebhooksSetting;
shortcuts: Shortcut[] = [];
inboxes: Inbox[] = [];
@ -145,7 +144,7 @@ const userStore = (() => {
throw new Error("No current user");
}
const settingName = `${state.currentUser}/settings/general`;
const settingName = `${state.currentUser}/settings/${UserSetting_Key.GENERAL}`;
const userSetting: UserSetting = {
name: settingName,
generalSetting: generalSetting as UserSetting_GeneralSetting,
@ -166,7 +165,7 @@ const userStore = (() => {
throw new Error("No current user");
}
const settingName = `${state.currentUser}/settings/general`;
const settingName = `${state.currentUser}/settings/${UserSetting_Key.GENERAL}`;
const userSetting = await userServiceClient.getUserSetting({ name: settingName });
state.setPartial({
@ -187,24 +186,13 @@ const userStore = (() => {
const generalSetting = settings.find((s) => s.generalSetting)?.generalSetting;
const sessionsSetting = settings.find((s) => s.sessionsSetting)?.sessionsSetting;
const accessTokensSetting = settings.find((s) => s.accessTokensSetting)?.accessTokensSetting;
const shortcutsSetting = settings.find((s) => s.shortcutsSetting)?.shortcutsSetting;
const webhooksSetting = settings.find((s) => s.webhooksSetting)?.webhooksSetting;
// Convert user setting shortcuts to proper Shortcut format
const shortcuts: Shortcut[] =
shortcutsSetting?.shortcuts.map((shortcut) => ({
name: `${state.currentUser}/shortcuts/${shortcut.id}`,
title: shortcut.title,
filter: shortcut.filter,
})) || [];
state.setPartial({
userGeneralSetting: generalSetting,
userSessionsSetting: sessionsSetting,
userAccessTokensSetting: accessTokensSetting,
userShortcutsSetting: shortcutsSetting,
userWebhooksSetting: webhooksSetting,
shortcuts,
});
};

@ -272,13 +272,13 @@ export interface ListAllUserStatsResponse {
export interface UserSetting {
/**
* The name of the user setting.
* Format: users/{user}/settings/{setting}
* Format: users/{user}/settings/{setting}, {setting} is the key for the setting.
* For example, "users/123/settings/GENERAL" for general settings.
*/
name: string;
generalSetting?: UserSetting_GeneralSetting | undefined;
sessionsSetting?: UserSetting_SessionsSetting | undefined;
accessTokensSetting?: UserSetting_AccessTokensSetting | undefined;
shortcutsSetting?: UserSetting_ShortcutsSetting | undefined;
webhooksSetting?: UserSetting_WebhooksSetting | undefined;
}
@ -291,8 +291,6 @@ export enum UserSetting_Key {
SESSIONS = "SESSIONS",
/** ACCESS_TOKENS - ACCESS_TOKENS is the key for access tokens. */
ACCESS_TOKENS = "ACCESS_TOKENS",
/** SHORTCUTS - SHORTCUTS is the key for user shortcuts. */
SHORTCUTS = "SHORTCUTS",
/** WEBHOOKS - WEBHOOKS is the key for user webhooks. */
WEBHOOKS = "WEBHOOKS",
UNRECOGNIZED = "UNRECOGNIZED",
@ -313,9 +311,6 @@ export function userSetting_KeyFromJSON(object: any): UserSetting_Key {
case "ACCESS_TOKENS":
return UserSetting_Key.ACCESS_TOKENS;
case 4:
case "SHORTCUTS":
return UserSetting_Key.SHORTCUTS;
case 5:
case "WEBHOOKS":
return UserSetting_Key.WEBHOOKS;
case -1:
@ -335,10 +330,8 @@ export function userSetting_KeyToNumber(object: UserSetting_Key): number {
return 2;
case UserSetting_Key.ACCESS_TOKENS:
return 3;
case UserSetting_Key.SHORTCUTS:
return 4;
case UserSetting_Key.WEBHOOKS:
return 5;
return 4;
case UserSetting_Key.UNRECOGNIZED:
default:
return -1;
@ -364,89 +357,19 @@ export interface UserSetting_GeneralSetting {
/** User authentication sessions configuration. */
export interface UserSetting_SessionsSetting {
/** List of active user sessions. */
sessions: UserSetting_SessionsSetting_Session[];
}
/** User session information. */
export interface UserSetting_SessionsSetting_Session {
/** Unique session identifier. */
sessionId: string;
/** Timestamp when the session was created. */
createTime?:
| Date
| undefined;
/**
* Timestamp when the session was last accessed.
* Used for sliding expiration calculation (last_accessed_time + 2 weeks).
*/
lastAccessedTime?:
| Date
| undefined;
/** Client information associated with this session. */
clientInfo?: UserSetting_SessionsSetting_ClientInfo | undefined;
}
/** Client information for a session. */
export interface UserSetting_SessionsSetting_ClientInfo {
/** User agent string of the client. */
userAgent: string;
/** IP address of the client. */
ipAddress: string;
/** Optional. Device type (e.g., "mobile", "desktop", "tablet"). */
deviceType: string;
/** Optional. Operating system (e.g., "iOS 17.0", "Windows 11"). */
os: string;
/** Optional. Browser name and version (e.g., "Chrome 119.0"). */
browser: string;
sessions: UserSession[];
}
/** User access tokens configuration. */
export interface UserSetting_AccessTokensSetting {
/** List of user access tokens. */
accessTokens: UserSetting_AccessTokensSetting_AccessToken[];
}
/** User access token information. */
export interface UserSetting_AccessTokensSetting_AccessToken {
/**
* The access token is a JWT token.
* Including expiration time, issuer, etc.
*/
accessToken: string;
/** A description for the access token. */
description: string;
}
/** User shortcuts configuration. */
export interface UserSetting_ShortcutsSetting {
/** List of user shortcuts. */
shortcuts: UserSetting_ShortcutsSetting_Shortcut[];
}
/** User shortcut definition. */
export interface UserSetting_ShortcutsSetting_Shortcut {
/** Unique identifier for the shortcut. */
id: string;
/** Display title for the shortcut. */
title: string;
/** Filter expression for the shortcut. */
filter: string;
accessTokens: UserAccessToken[];
}
/** User webhooks configuration. */
export interface UserSetting_WebhooksSetting {
/** List of user webhooks. */
webhooks: UserSetting_WebhooksSetting_Webhook[];
}
/** User webhook definition. */
export interface UserSetting_WebhooksSetting_Webhook {
/** Unique identifier for the webhook. */
id: string;
/** Descriptive title for the webhook. */
title: string;
/** The webhook URL endpoint. */
url: string;
webhooks: UserWebhook[];
}
export interface GetUserSettingRequest {
@ -1869,7 +1792,6 @@ function createBaseUserSetting(): UserSetting {
generalSetting: undefined,
sessionsSetting: undefined,
accessTokensSetting: undefined,
shortcutsSetting: undefined,
webhooksSetting: undefined,
};
}
@ -1888,11 +1810,8 @@ export const UserSetting: MessageFns<UserSetting> = {
if (message.accessTokensSetting !== undefined) {
UserSetting_AccessTokensSetting.encode(message.accessTokensSetting, writer.uint32(34).fork()).join();
}
if (message.shortcutsSetting !== undefined) {
UserSetting_ShortcutsSetting.encode(message.shortcutsSetting, writer.uint32(42).fork()).join();
}
if (message.webhooksSetting !== undefined) {
UserSetting_WebhooksSetting.encode(message.webhooksSetting, writer.uint32(50).fork()).join();
UserSetting_WebhooksSetting.encode(message.webhooksSetting, writer.uint32(42).fork()).join();
}
return writer;
},
@ -1941,14 +1860,6 @@ export const UserSetting: MessageFns<UserSetting> = {
break;
}
message.shortcutsSetting = UserSetting_ShortcutsSetting.decode(reader, reader.uint32());
continue;
}
case 6: {
if (tag !== 50) {
break;
}
message.webhooksSetting = UserSetting_WebhooksSetting.decode(reader, reader.uint32());
continue;
}
@ -1976,9 +1887,6 @@ export const UserSetting: MessageFns<UserSetting> = {
message.accessTokensSetting = (object.accessTokensSetting !== undefined && object.accessTokensSetting !== null)
? UserSetting_AccessTokensSetting.fromPartial(object.accessTokensSetting)
: undefined;
message.shortcutsSetting = (object.shortcutsSetting !== undefined && object.shortcutsSetting !== null)
? UserSetting_ShortcutsSetting.fromPartial(object.shortcutsSetting)
: undefined;
message.webhooksSetting = (object.webhooksSetting !== undefined && object.webhooksSetting !== null)
? UserSetting_WebhooksSetting.fromPartial(object.webhooksSetting)
: undefined;
@ -2075,7 +1983,7 @@ function createBaseUserSetting_SessionsSetting(): UserSetting_SessionsSetting {
export const UserSetting_SessionsSetting: MessageFns<UserSetting_SessionsSetting> = {
encode(message: UserSetting_SessionsSetting, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
for (const v of message.sessions) {
UserSetting_SessionsSetting_Session.encode(v!, writer.uint32(10).fork()).join();
UserSession.encode(v!, writer.uint32(10).fork()).join();
}
return writer;
},
@ -2092,7 +2000,7 @@ export const UserSetting_SessionsSetting: MessageFns<UserSetting_SessionsSetting
break;
}
message.sessions.push(UserSetting_SessionsSetting_Session.decode(reader, reader.uint32()));
message.sessions.push(UserSession.decode(reader, reader.uint32()));
continue;
}
}
@ -2109,185 +2017,7 @@ export const UserSetting_SessionsSetting: MessageFns<UserSetting_SessionsSetting
},
fromPartial(object: DeepPartial<UserSetting_SessionsSetting>): UserSetting_SessionsSetting {
const message = createBaseUserSetting_SessionsSetting();
message.sessions = object.sessions?.map((e) => UserSetting_SessionsSetting_Session.fromPartial(e)) || [];
return message;
},
};
function createBaseUserSetting_SessionsSetting_Session(): UserSetting_SessionsSetting_Session {
return { sessionId: "", createTime: undefined, lastAccessedTime: undefined, clientInfo: undefined };
}
export const UserSetting_SessionsSetting_Session: MessageFns<UserSetting_SessionsSetting_Session> = {
encode(message: UserSetting_SessionsSetting_Session, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
if (message.sessionId !== "") {
writer.uint32(10).string(message.sessionId);
}
if (message.createTime !== undefined) {
Timestamp.encode(toTimestamp(message.createTime), writer.uint32(18).fork()).join();
}
if (message.lastAccessedTime !== undefined) {
Timestamp.encode(toTimestamp(message.lastAccessedTime), writer.uint32(26).fork()).join();
}
if (message.clientInfo !== undefined) {
UserSetting_SessionsSetting_ClientInfo.encode(message.clientInfo, writer.uint32(34).fork()).join();
}
return writer;
},
decode(input: BinaryReader | Uint8Array, length?: number): UserSetting_SessionsSetting_Session {
const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
let end = length === undefined ? reader.len : reader.pos + length;
const message = createBaseUserSetting_SessionsSetting_Session();
while (reader.pos < end) {
const tag = reader.uint32();
switch (tag >>> 3) {
case 1: {
if (tag !== 10) {
break;
}
message.sessionId = reader.string();
continue;
}
case 2: {
if (tag !== 18) {
break;
}
message.createTime = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
continue;
}
case 3: {
if (tag !== 26) {
break;
}
message.lastAccessedTime = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
continue;
}
case 4: {
if (tag !== 34) {
break;
}
message.clientInfo = UserSetting_SessionsSetting_ClientInfo.decode(reader, reader.uint32());
continue;
}
}
if ((tag & 7) === 4 || tag === 0) {
break;
}
reader.skip(tag & 7);
}
return message;
},
create(base?: DeepPartial<UserSetting_SessionsSetting_Session>): UserSetting_SessionsSetting_Session {
return UserSetting_SessionsSetting_Session.fromPartial(base ?? {});
},
fromPartial(object: DeepPartial<UserSetting_SessionsSetting_Session>): UserSetting_SessionsSetting_Session {
const message = createBaseUserSetting_SessionsSetting_Session();
message.sessionId = object.sessionId ?? "";
message.createTime = object.createTime ?? undefined;
message.lastAccessedTime = object.lastAccessedTime ?? undefined;
message.clientInfo = (object.clientInfo !== undefined && object.clientInfo !== null)
? UserSetting_SessionsSetting_ClientInfo.fromPartial(object.clientInfo)
: undefined;
return message;
},
};
function createBaseUserSetting_SessionsSetting_ClientInfo(): UserSetting_SessionsSetting_ClientInfo {
return { userAgent: "", ipAddress: "", deviceType: "", os: "", browser: "" };
}
export const UserSetting_SessionsSetting_ClientInfo: MessageFns<UserSetting_SessionsSetting_ClientInfo> = {
encode(message: UserSetting_SessionsSetting_ClientInfo, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
if (message.userAgent !== "") {
writer.uint32(10).string(message.userAgent);
}
if (message.ipAddress !== "") {
writer.uint32(18).string(message.ipAddress);
}
if (message.deviceType !== "") {
writer.uint32(26).string(message.deviceType);
}
if (message.os !== "") {
writer.uint32(34).string(message.os);
}
if (message.browser !== "") {
writer.uint32(42).string(message.browser);
}
return writer;
},
decode(input: BinaryReader | Uint8Array, length?: number): UserSetting_SessionsSetting_ClientInfo {
const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
let end = length === undefined ? reader.len : reader.pos + length;
const message = createBaseUserSetting_SessionsSetting_ClientInfo();
while (reader.pos < end) {
const tag = reader.uint32();
switch (tag >>> 3) {
case 1: {
if (tag !== 10) {
break;
}
message.userAgent = reader.string();
continue;
}
case 2: {
if (tag !== 18) {
break;
}
message.ipAddress = reader.string();
continue;
}
case 3: {
if (tag !== 26) {
break;
}
message.deviceType = reader.string();
continue;
}
case 4: {
if (tag !== 34) {
break;
}
message.os = reader.string();
continue;
}
case 5: {
if (tag !== 42) {
break;
}
message.browser = reader.string();
continue;
}
}
if ((tag & 7) === 4 || tag === 0) {
break;
}
reader.skip(tag & 7);
}
return message;
},
create(base?: DeepPartial<UserSetting_SessionsSetting_ClientInfo>): UserSetting_SessionsSetting_ClientInfo {
return UserSetting_SessionsSetting_ClientInfo.fromPartial(base ?? {});
},
fromPartial(object: DeepPartial<UserSetting_SessionsSetting_ClientInfo>): UserSetting_SessionsSetting_ClientInfo {
const message = createBaseUserSetting_SessionsSetting_ClientInfo();
message.userAgent = object.userAgent ?? "";
message.ipAddress = object.ipAddress ?? "";
message.deviceType = object.deviceType ?? "";
message.os = object.os ?? "";
message.browser = object.browser ?? "";
message.sessions = object.sessions?.map((e) => UserSession.fromPartial(e)) || [];
return message;
},
};
@ -2299,7 +2029,7 @@ function createBaseUserSetting_AccessTokensSetting(): UserSetting_AccessTokensSe
export const UserSetting_AccessTokensSetting: MessageFns<UserSetting_AccessTokensSetting> = {
encode(message: UserSetting_AccessTokensSetting, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
for (const v of message.accessTokens) {
UserSetting_AccessTokensSetting_AccessToken.encode(v!, writer.uint32(10).fork()).join();
UserAccessToken.encode(v!, writer.uint32(10).fork()).join();
}
return writer;
},
@ -2316,7 +2046,7 @@ export const UserSetting_AccessTokensSetting: MessageFns<UserSetting_AccessToken
break;
}
message.accessTokens.push(UserSetting_AccessTokensSetting_AccessToken.decode(reader, reader.uint32()));
message.accessTokens.push(UserAccessToken.decode(reader, reader.uint32()));
continue;
}
}
@ -2333,187 +2063,7 @@ export const UserSetting_AccessTokensSetting: MessageFns<UserSetting_AccessToken
},
fromPartial(object: DeepPartial<UserSetting_AccessTokensSetting>): UserSetting_AccessTokensSetting {
const message = createBaseUserSetting_AccessTokensSetting();
message.accessTokens =
object.accessTokens?.map((e) => UserSetting_AccessTokensSetting_AccessToken.fromPartial(e)) || [];
return message;
},
};
function createBaseUserSetting_AccessTokensSetting_AccessToken(): UserSetting_AccessTokensSetting_AccessToken {
return { accessToken: "", description: "" };
}
export const UserSetting_AccessTokensSetting_AccessToken: MessageFns<UserSetting_AccessTokensSetting_AccessToken> = {
encode(
message: UserSetting_AccessTokensSetting_AccessToken,
writer: BinaryWriter = new BinaryWriter(),
): BinaryWriter {
if (message.accessToken !== "") {
writer.uint32(10).string(message.accessToken);
}
if (message.description !== "") {
writer.uint32(18).string(message.description);
}
return writer;
},
decode(input: BinaryReader | Uint8Array, length?: number): UserSetting_AccessTokensSetting_AccessToken {
const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
let end = length === undefined ? reader.len : reader.pos + length;
const message = createBaseUserSetting_AccessTokensSetting_AccessToken();
while (reader.pos < end) {
const tag = reader.uint32();
switch (tag >>> 3) {
case 1: {
if (tag !== 10) {
break;
}
message.accessToken = reader.string();
continue;
}
case 2: {
if (tag !== 18) {
break;
}
message.description = reader.string();
continue;
}
}
if ((tag & 7) === 4 || tag === 0) {
break;
}
reader.skip(tag & 7);
}
return message;
},
create(base?: DeepPartial<UserSetting_AccessTokensSetting_AccessToken>): UserSetting_AccessTokensSetting_AccessToken {
return UserSetting_AccessTokensSetting_AccessToken.fromPartial(base ?? {});
},
fromPartial(
object: DeepPartial<UserSetting_AccessTokensSetting_AccessToken>,
): UserSetting_AccessTokensSetting_AccessToken {
const message = createBaseUserSetting_AccessTokensSetting_AccessToken();
message.accessToken = object.accessToken ?? "";
message.description = object.description ?? "";
return message;
},
};
function createBaseUserSetting_ShortcutsSetting(): UserSetting_ShortcutsSetting {
return { shortcuts: [] };
}
export const UserSetting_ShortcutsSetting: MessageFns<UserSetting_ShortcutsSetting> = {
encode(message: UserSetting_ShortcutsSetting, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
for (const v of message.shortcuts) {
UserSetting_ShortcutsSetting_Shortcut.encode(v!, writer.uint32(10).fork()).join();
}
return writer;
},
decode(input: BinaryReader | Uint8Array, length?: number): UserSetting_ShortcutsSetting {
const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
let end = length === undefined ? reader.len : reader.pos + length;
const message = createBaseUserSetting_ShortcutsSetting();
while (reader.pos < end) {
const tag = reader.uint32();
switch (tag >>> 3) {
case 1: {
if (tag !== 10) {
break;
}
message.shortcuts.push(UserSetting_ShortcutsSetting_Shortcut.decode(reader, reader.uint32()));
continue;
}
}
if ((tag & 7) === 4 || tag === 0) {
break;
}
reader.skip(tag & 7);
}
return message;
},
create(base?: DeepPartial<UserSetting_ShortcutsSetting>): UserSetting_ShortcutsSetting {
return UserSetting_ShortcutsSetting.fromPartial(base ?? {});
},
fromPartial(object: DeepPartial<UserSetting_ShortcutsSetting>): UserSetting_ShortcutsSetting {
const message = createBaseUserSetting_ShortcutsSetting();
message.shortcuts = object.shortcuts?.map((e) => UserSetting_ShortcutsSetting_Shortcut.fromPartial(e)) || [];
return message;
},
};
function createBaseUserSetting_ShortcutsSetting_Shortcut(): UserSetting_ShortcutsSetting_Shortcut {
return { id: "", title: "", filter: "" };
}
export const UserSetting_ShortcutsSetting_Shortcut: MessageFns<UserSetting_ShortcutsSetting_Shortcut> = {
encode(message: UserSetting_ShortcutsSetting_Shortcut, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
if (message.id !== "") {
writer.uint32(10).string(message.id);
}
if (message.title !== "") {
writer.uint32(18).string(message.title);
}
if (message.filter !== "") {
writer.uint32(26).string(message.filter);
}
return writer;
},
decode(input: BinaryReader | Uint8Array, length?: number): UserSetting_ShortcutsSetting_Shortcut {
const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
let end = length === undefined ? reader.len : reader.pos + length;
const message = createBaseUserSetting_ShortcutsSetting_Shortcut();
while (reader.pos < end) {
const tag = reader.uint32();
switch (tag >>> 3) {
case 1: {
if (tag !== 10) {
break;
}
message.id = reader.string();
continue;
}
case 2: {
if (tag !== 18) {
break;
}
message.title = reader.string();
continue;
}
case 3: {
if (tag !== 26) {
break;
}
message.filter = reader.string();
continue;
}
}
if ((tag & 7) === 4 || tag === 0) {
break;
}
reader.skip(tag & 7);
}
return message;
},
create(base?: DeepPartial<UserSetting_ShortcutsSetting_Shortcut>): UserSetting_ShortcutsSetting_Shortcut {
return UserSetting_ShortcutsSetting_Shortcut.fromPartial(base ?? {});
},
fromPartial(object: DeepPartial<UserSetting_ShortcutsSetting_Shortcut>): UserSetting_ShortcutsSetting_Shortcut {
const message = createBaseUserSetting_ShortcutsSetting_Shortcut();
message.id = object.id ?? "";
message.title = object.title ?? "";
message.filter = object.filter ?? "";
message.accessTokens = object.accessTokens?.map((e) => UserAccessToken.fromPartial(e)) || [];
return message;
},
};
@ -2525,7 +2075,7 @@ function createBaseUserSetting_WebhooksSetting(): UserSetting_WebhooksSetting {
export const UserSetting_WebhooksSetting: MessageFns<UserSetting_WebhooksSetting> = {
encode(message: UserSetting_WebhooksSetting, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
for (const v of message.webhooks) {
UserSetting_WebhooksSetting_Webhook.encode(v!, writer.uint32(10).fork()).join();
UserWebhook.encode(v!, writer.uint32(10).fork()).join();
}
return writer;
},
@ -2542,7 +2092,7 @@ export const UserSetting_WebhooksSetting: MessageFns<UserSetting_WebhooksSetting
break;
}
message.webhooks.push(UserSetting_WebhooksSetting_Webhook.decode(reader, reader.uint32()));
message.webhooks.push(UserWebhook.decode(reader, reader.uint32()));
continue;
}
}
@ -2559,77 +2109,7 @@ export const UserSetting_WebhooksSetting: MessageFns<UserSetting_WebhooksSetting
},
fromPartial(object: DeepPartial<UserSetting_WebhooksSetting>): UserSetting_WebhooksSetting {
const message = createBaseUserSetting_WebhooksSetting();
message.webhooks = object.webhooks?.map((e) => UserSetting_WebhooksSetting_Webhook.fromPartial(e)) || [];
return message;
},
};
function createBaseUserSetting_WebhooksSetting_Webhook(): UserSetting_WebhooksSetting_Webhook {
return { id: "", title: "", url: "" };
}
export const UserSetting_WebhooksSetting_Webhook: MessageFns<UserSetting_WebhooksSetting_Webhook> = {
encode(message: UserSetting_WebhooksSetting_Webhook, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
if (message.id !== "") {
writer.uint32(10).string(message.id);
}
if (message.title !== "") {
writer.uint32(18).string(message.title);
}
if (message.url !== "") {
writer.uint32(26).string(message.url);
}
return writer;
},
decode(input: BinaryReader | Uint8Array, length?: number): UserSetting_WebhooksSetting_Webhook {
const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
let end = length === undefined ? reader.len : reader.pos + length;
const message = createBaseUserSetting_WebhooksSetting_Webhook();
while (reader.pos < end) {
const tag = reader.uint32();
switch (tag >>> 3) {
case 1: {
if (tag !== 10) {
break;
}
message.id = reader.string();
continue;
}
case 2: {
if (tag !== 18) {
break;
}
message.title = reader.string();
continue;
}
case 3: {
if (tag !== 26) {
break;
}
message.url = reader.string();
continue;
}
}
if ((tag & 7) === 4 || tag === 0) {
break;
}
reader.skip(tag & 7);
}
return message;
},
create(base?: DeepPartial<UserSetting_WebhooksSetting_Webhook>): UserSetting_WebhooksSetting_Webhook {
return UserSetting_WebhooksSetting_Webhook.fromPartial(base ?? {});
},
fromPartial(object: DeepPartial<UserSetting_WebhooksSetting_Webhook>): UserSetting_WebhooksSetting_Webhook {
const message = createBaseUserSetting_WebhooksSetting_Webhook();
message.id = object.id ?? "";
message.title = object.title ?? "";
message.url = object.url ?? "";
message.webhooks = object.webhooks?.map((e) => UserWebhook.fromPartial(e)) || [];
return message;
},
};

@ -35,7 +35,7 @@ export enum Edition {
EDITION_2024 = "EDITION_2024",
/**
* EDITION_1_TEST_ONLY - Placeholder editions for testing feature resolution. These should not be
* used or relyed on outside of tests.
* used or relied on outside of tests.
*/
EDITION_1_TEST_ONLY = "EDITION_1_TEST_ONLY",
EDITION_2_TEST_ONLY = "EDITION_2_TEST_ONLY",
@ -177,11 +177,19 @@ export interface FileDescriptorProto {
* The supported values are "proto2", "proto3", and "editions".
*
* If `edition` is present, this value must be "editions".
* WARNING: This field should only be used by protobuf plugins or special
* cases like the proto compiler. Other uses are discouraged and
* developers should rely on the protoreflect APIs for their client language.
*/
syntax?:
| string
| undefined;
/** The edition of the proto file. */
/**
* The edition of the proto file.
* WARNING: This field should only be used by protobuf plugins or special
* cases like the proto compiler. Other uses are discouraged and
* developers should rely on the protoreflect APIs for their client language.
*/
edition?: Edition | undefined;
}
@ -828,7 +836,12 @@ export interface FileOptions {
rubyPackage?:
| string
| undefined;
/** Any features defined in the specific edition. */
/**
* Any features defined in the specific edition.
* WARNING: This field should only be used by protobuf plugins or special
* cases like the proto compiler. Other uses are discouraged and
* developers should rely on the protoreflect APIs for their client language.
*/
features?:
| FeatureSet
| undefined;
@ -966,7 +979,12 @@ export interface MessageOptions {
deprecatedLegacyJsonFieldConflicts?:
| boolean
| undefined;
/** Any features defined in the specific edition. */
/**
* Any features defined in the specific edition.
* WARNING: This field should only be used by protobuf plugins or special
* cases like the proto compiler. Other uses are discouraged and
* developers should rely on the protoreflect APIs for their client language.
*/
features?:
| FeatureSet
| undefined;
@ -976,12 +994,13 @@ export interface MessageOptions {
export interface FieldOptions {
/**
* NOTE: ctype is deprecated. Use `features.(pb.cpp).string_type` instead.
* The ctype option instructs the C++ code generator to use a different
* representation of the field than it normally would. See the specific
* options below. This option is only implemented to support use of
* [ctype=CORD] and [ctype=STRING] (the default) on non-repeated fields of
* type "bytes" in the open source release -- sorry, we'll try to include
* other types in a future version!
* type "bytes" in the open source release.
* TODO: make ctype actually deprecated.
*/
ctype?:
| FieldOptions_CType
@ -1070,7 +1089,12 @@ export interface FieldOptions {
retention?: FieldOptions_OptionRetention | undefined;
targets: FieldOptions_OptionTargetType[];
editionDefaults: FieldOptions_EditionDefault[];
/** Any features defined in the specific edition. */
/**
* Any features defined in the specific edition.
* WARNING: This field should only be used by protobuf plugins or special
* cases like the proto compiler. Other uses are discouraged and
* developers should rely on the protoreflect APIs for their client language.
*/
features?: FeatureSet | undefined;
featureSupport?:
| FieldOptions_FeatureSupport
@ -1169,11 +1193,7 @@ export function fieldOptions_JSTypeToNumber(object: FieldOptions_JSType): number
}
}
/**
* If set to RETENTION_SOURCE, the option will be omitted from the binary.
* Note: as of January 2023, support for this is in progress and does not yet
* have an effect (b/264593489).
*/
/** If set to RETENTION_SOURCE, the option will be omitted from the binary. */
export enum FieldOptions_OptionRetention {
RETENTION_UNKNOWN = "RETENTION_UNKNOWN",
RETENTION_RUNTIME = "RETENTION_RUNTIME",
@ -1216,8 +1236,7 @@ export function fieldOptions_OptionRetentionToNumber(object: FieldOptions_Option
/**
* This indicates the types of entities that the field may apply to when used
* as an option. If it is unset, then the field may be freely used as an
* option on any kind of entity. Note: as of January 2023, support for this is
* in progress and does not yet have an effect (b/264593489).
* option on any kind of entity.
*/
export enum FieldOptions_OptionTargetType {
TARGET_TYPE_UNKNOWN = "TARGET_TYPE_UNKNOWN",
@ -1341,7 +1360,12 @@ export interface FieldOptions_FeatureSupport {
}
export interface OneofOptions {
/** Any features defined in the specific edition. */
/**
* Any features defined in the specific edition.
* WARNING: This field should only be used by protobuf plugins or special
* cases like the proto compiler. Other uses are discouraged and
* developers should rely on the protoreflect APIs for their client language.
*/
features?:
| FeatureSet
| undefined;
@ -1379,7 +1403,12 @@ export interface EnumOptions {
deprecatedLegacyJsonFieldConflicts?:
| boolean
| undefined;
/** Any features defined in the specific edition. */
/**
* Any features defined in the specific edition.
* WARNING: This field should only be used by protobuf plugins or special
* cases like the proto compiler. Other uses are discouraged and
* developers should rely on the protoreflect APIs for their client language.
*/
features?:
| FeatureSet
| undefined;
@ -1397,7 +1426,12 @@ export interface EnumValueOptions {
deprecated?:
| boolean
| undefined;
/** Any features defined in the specific edition. */
/**
* Any features defined in the specific edition.
* WARNING: This field should only be used by protobuf plugins or special
* cases like the proto compiler. Other uses are discouraged and
* developers should rely on the protoreflect APIs for their client language.
*/
features?:
| FeatureSet
| undefined;
@ -1418,7 +1452,12 @@ export interface EnumValueOptions {
}
export interface ServiceOptions {
/** Any features defined in the specific edition. */
/**
* Any features defined in the specific edition.
* WARNING: This field should only be used by protobuf plugins or special
* cases like the proto compiler. Other uses are discouraged and
* developers should rely on the protoreflect APIs for their client language.
*/
features?:
| FeatureSet
| undefined;
@ -1446,7 +1485,12 @@ export interface MethodOptions {
idempotencyLevel?:
| MethodOptions_IdempotencyLevel
| undefined;
/** Any features defined in the specific edition. */
/**
* Any features defined in the specific edition.
* WARNING: This field should only be used by protobuf plugins or special
* cases like the proto compiler. Other uses are discouraged and
* developers should rely on the protoreflect APIs for their client language.
*/
features?:
| FeatureSet
| undefined;
@ -1549,6 +1593,7 @@ export interface FeatureSet {
utf8Validation?: FeatureSet_Utf8Validation | undefined;
messageEncoding?: FeatureSet_MessageEncoding | undefined;
jsonFormat?: FeatureSet_JsonFormat | undefined;
enforceNamingStyle?: FeatureSet_EnforceNamingStyle | undefined;
}
export enum FeatureSet_FieldPresence {
@ -1791,6 +1836,45 @@ export function featureSet_JsonFormatToNumber(object: FeatureSet_JsonFormat): nu
}
}
export enum FeatureSet_EnforceNamingStyle {
ENFORCE_NAMING_STYLE_UNKNOWN = "ENFORCE_NAMING_STYLE_UNKNOWN",
STYLE2024 = "STYLE2024",
STYLE_LEGACY = "STYLE_LEGACY",
UNRECOGNIZED = "UNRECOGNIZED",
}
export function featureSet_EnforceNamingStyleFromJSON(object: any): FeatureSet_EnforceNamingStyle {
switch (object) {
case 0:
case "ENFORCE_NAMING_STYLE_UNKNOWN":
return FeatureSet_EnforceNamingStyle.ENFORCE_NAMING_STYLE_UNKNOWN;
case 1:
case "STYLE2024":
return FeatureSet_EnforceNamingStyle.STYLE2024;
case 2:
case "STYLE_LEGACY":
return FeatureSet_EnforceNamingStyle.STYLE_LEGACY;
case -1:
case "UNRECOGNIZED":
default:
return FeatureSet_EnforceNamingStyle.UNRECOGNIZED;
}
}
export function featureSet_EnforceNamingStyleToNumber(object: FeatureSet_EnforceNamingStyle): number {
switch (object) {
case FeatureSet_EnforceNamingStyle.ENFORCE_NAMING_STYLE_UNKNOWN:
return 0;
case FeatureSet_EnforceNamingStyle.STYLE2024:
return 1;
case FeatureSet_EnforceNamingStyle.STYLE_LEGACY:
return 2;
case FeatureSet_EnforceNamingStyle.UNRECOGNIZED:
default:
return -1;
}
}
/**
* A compiled specification for the defaults of a set of features. These
* messages are generated from FeatureSet extensions and can be used to seed
@ -4914,6 +4998,7 @@ function createBaseFeatureSet(): FeatureSet {
utf8Validation: FeatureSet_Utf8Validation.UTF8_VALIDATION_UNKNOWN,
messageEncoding: FeatureSet_MessageEncoding.MESSAGE_ENCODING_UNKNOWN,
jsonFormat: FeatureSet_JsonFormat.JSON_FORMAT_UNKNOWN,
enforceNamingStyle: FeatureSet_EnforceNamingStyle.ENFORCE_NAMING_STYLE_UNKNOWN,
};
}
@ -4948,6 +5033,12 @@ export const FeatureSet: MessageFns<FeatureSet> = {
if (message.jsonFormat !== undefined && message.jsonFormat !== FeatureSet_JsonFormat.JSON_FORMAT_UNKNOWN) {
writer.uint32(48).int32(featureSet_JsonFormatToNumber(message.jsonFormat));
}
if (
message.enforceNamingStyle !== undefined &&
message.enforceNamingStyle !== FeatureSet_EnforceNamingStyle.ENFORCE_NAMING_STYLE_UNKNOWN
) {
writer.uint32(56).int32(featureSet_EnforceNamingStyleToNumber(message.enforceNamingStyle));
}
return writer;
},
@ -5006,6 +5097,14 @@ export const FeatureSet: MessageFns<FeatureSet> = {
message.jsonFormat = featureSet_JsonFormatFromJSON(reader.int32());
continue;
}
case 7: {
if (tag !== 56) {
break;
}
message.enforceNamingStyle = featureSet_EnforceNamingStyleFromJSON(reader.int32());
continue;
}
}
if ((tag & 7) === 4 || tag === 0) {
break;
@ -5027,6 +5126,8 @@ export const FeatureSet: MessageFns<FeatureSet> = {
message.utf8Validation = object.utf8Validation ?? FeatureSet_Utf8Validation.UTF8_VALIDATION_UNKNOWN;
message.messageEncoding = object.messageEncoding ?? FeatureSet_MessageEncoding.MESSAGE_ENCODING_UNKNOWN;
message.jsonFormat = object.jsonFormat ?? FeatureSet_JsonFormat.JSON_FORMAT_UNKNOWN;
message.enforceNamingStyle = object.enforceNamingStyle ??
FeatureSet_EnforceNamingStyle.ENFORCE_NAMING_STYLE_UNKNOWN;
return message;
},
};

Loading…
Cancel
Save