Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
canifa_note
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Vũ Hoàng Anh
canifa_note
Commits
77b7fc44
Commit
77b7fc44
authored
Jun 22, 2025
by
Johnny
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: implement user session
parent
741fe35c
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
1687 additions
and
98 deletions
+1687
-98
user_service.proto
proto/api/v1/user_service.proto
+82
-0
user_service.pb.go
proto/gen/api/v1/user_service.pb.go
+432
-67
user_service.pb.gw.go
proto/gen/api/v1/user_service.pb.gw.go
+156
-0
user_service_grpc.pb.go
proto/gen/api/v1/user_service_grpc.pb.go
+80
-0
apidocs.swagger.yaml
proto/gen/apidocs.swagger.yaml
+141
-31
auth_service.go
server/router/api/v1/auth_service.go
+46
-0
user_service.go
server/router/api/v1/user_service.go
+103
-0
user_setting.go
store/user_setting.go
+122
-0
user_service.ts
web/src/types/proto/api/v1/user_service.ts
+525
-0
No files found.
proto/api/v1/user_service.proto
View file @
77b7fc44
...
@@ -108,6 +108,18 @@ service UserService {
...
@@ -108,6 +108,18 @@ service UserService {
option
(
google.api.http
)
=
{
delete
:
"/api/v1/{name=users/*/accessTokens/*}"
};
option
(
google.api.http
)
=
{
delete
:
"/api/v1/{name=users/*/accessTokens/*}"
};
option
(
google.api.method_signature
)
=
"name"
;
option
(
google.api.method_signature
)
=
"name"
;
}
}
// ListUserSessions returns a list of active sessions for a user.
rpc
ListUserSessions
(
ListUserSessionsRequest
)
returns
(
ListUserSessionsResponse
)
{
option
(
google.api.http
)
=
{
get
:
"/api/v1/{parent=users/*}/sessions"
};
option
(
google.api.method_signature
)
=
"parent"
;
}
// RevokeUserSession revokes a specific session for a user.
rpc
RevokeUserSession
(
RevokeUserSessionRequest
)
returns
(
google.protobuf.Empty
)
{
option
(
google.api.http
)
=
{
delete
:
"/api/v1/{name=users/*/sessions/*}"
};
option
(
google.api.method_signature
)
=
"name"
;
}
}
}
message
User
{
message
User
{
...
@@ -458,6 +470,76 @@ message DeleteUserAccessTokenRequest {
...
@@ -458,6 +470,76 @@ message DeleteUserAccessTokenRequest {
];
];
}
}
message
UserSession
{
option
(
google.api.resource
)
=
{
type
:
"memos.api.v1/UserSession"
pattern
:
"users/{user}/sessions/{session}"
name_field
:
"name"
};
// The resource name of the session.
// Format: users/{user}/sessions/{session}
string
name
=
1
[(
google.api.field_behavior
)
=
IDENTIFIER
];
// The session ID.
string
session_id
=
2
[(
google.api.field_behavior
)
=
OUTPUT_ONLY
];
// The timestamp when the session was created.
google.protobuf.Timestamp
create_time
=
3
[(
google.api.field_behavior
)
=
OUTPUT_ONLY
];
// The timestamp when the session expires.
google.protobuf.Timestamp
expire_time
=
4
[(
google.api.field_behavior
)
=
OUTPUT_ONLY
];
// The timestamp when the session was last accessed.
google.protobuf.Timestamp
last_accessed_time
=
5
[(
google.api.field_behavior
)
=
OUTPUT_ONLY
];
// Client information associated with this session.
ClientInfo
client_info
=
6
[(
google.api.field_behavior
)
=
OUTPUT_ONLY
];
message
ClientInfo
{
// User agent string of the client.
string
user_agent
=
1
;
// IP address of the client.
string
ip_address
=
2
;
// Optional. Device type (e.g., "mobile", "desktop", "tablet").
string
device_type
=
3
[(
google.api.field_behavior
)
=
OPTIONAL
];
// Optional. Operating system (e.g., "iOS 17.0", "Windows 11").
string
os
=
4
[(
google.api.field_behavior
)
=
OPTIONAL
];
// Optional. Browser name and version (e.g., "Chrome 119.0").
string
browser
=
5
[(
google.api.field_behavior
)
=
OPTIONAL
];
// Optional. Geographic location (country code, e.g., "US").
string
country
=
6
[(
google.api.field_behavior
)
=
OPTIONAL
];
}
}
message
ListUserSessionsRequest
{
// Required. The resource name of the parent.
// Format: users/{user}
string
parent
=
1
[
(
google.api.field_behavior
)
=
REQUIRED
,
(
google.api.resource_reference
)
=
{
type
:
"memos.api.v1/User"
}
];
}
message
ListUserSessionsResponse
{
// The list of user sessions.
repeated
UserSession
sessions
=
1
;
}
message
RevokeUserSessionRequest
{
// Required. The resource name of the session to revoke.
// Format: users/{user}/sessions/{session}
string
name
=
1
[
(
google.api.field_behavior
)
=
REQUIRED
,
(
google.api.resource_reference
)
=
{
type
:
"memos.api.v1/UserSession"
}
];
}
message
ListAllUserStatsRequest
{
message
ListAllUserStatsRequest
{
// Optional. The maximum number of user stats to return.
// Optional. The maximum number of user stats to return.
int32
page_size
=
1
[(
google.api.field_behavior
)
=
OPTIONAL
];
int32
page_size
=
1
[(
google.api.field_behavior
)
=
OPTIONAL
];
...
...
proto/gen/api/v1/user_service.pb.go
View file @
77b7fc44
...
@@ -1443,6 +1443,234 @@ func (x *DeleteUserAccessTokenRequest) GetName() string {
...
@@ -1443,6 +1443,234 @@ func (x *DeleteUserAccessTokenRequest) GetName() string {
return
""
return
""
}
}
type
UserSession
struct
{
state
protoimpl
.
MessageState
`protogen:"open.v1"`
// The resource name of the session.
// Format: users/{user}/sessions/{session}
Name
string
`protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
// The session ID.
SessionId
string
`protobuf:"bytes,2,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"`
// The timestamp when the session was created.
CreateTime
*
timestamppb
.
Timestamp
`protobuf:"bytes,3,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
// The timestamp when the session expires.
ExpireTime
*
timestamppb
.
Timestamp
`protobuf:"bytes,4,opt,name=expire_time,json=expireTime,proto3" json:"expire_time,omitempty"`
// The timestamp when the session was last accessed.
LastAccessedTime
*
timestamppb
.
Timestamp
`protobuf:"bytes,5,opt,name=last_accessed_time,json=lastAccessedTime,proto3" json:"last_accessed_time,omitempty"`
// Client information associated with this session.
ClientInfo
*
UserSession_ClientInfo
`protobuf:"bytes,6,opt,name=client_info,json=clientInfo,proto3" json:"client_info,omitempty"`
unknownFields
protoimpl
.
UnknownFields
sizeCache
protoimpl
.
SizeCache
}
func
(
x
*
UserSession
)
Reset
()
{
*
x
=
UserSession
{}
mi
:=
&
file_api_v1_user_service_proto_msgTypes
[
20
]
ms
:=
protoimpl
.
X
.
MessageStateOf
(
protoimpl
.
Pointer
(
x
))
ms
.
StoreMessageInfo
(
mi
)
}
func
(
x
*
UserSession
)
String
()
string
{
return
protoimpl
.
X
.
MessageStringOf
(
x
)
}
func
(
*
UserSession
)
ProtoMessage
()
{}
func
(
x
*
UserSession
)
ProtoReflect
()
protoreflect
.
Message
{
mi
:=
&
file_api_v1_user_service_proto_msgTypes
[
20
]
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 UserSession.ProtoReflect.Descriptor instead.
func
(
*
UserSession
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
file_api_v1_user_service_proto_rawDescGZIP
(),
[]
int
{
20
}
}
func
(
x
*
UserSession
)
GetName
()
string
{
if
x
!=
nil
{
return
x
.
Name
}
return
""
}
func
(
x
*
UserSession
)
GetSessionId
()
string
{
if
x
!=
nil
{
return
x
.
SessionId
}
return
""
}
func
(
x
*
UserSession
)
GetCreateTime
()
*
timestamppb
.
Timestamp
{
if
x
!=
nil
{
return
x
.
CreateTime
}
return
nil
}
func
(
x
*
UserSession
)
GetExpireTime
()
*
timestamppb
.
Timestamp
{
if
x
!=
nil
{
return
x
.
ExpireTime
}
return
nil
}
func
(
x
*
UserSession
)
GetLastAccessedTime
()
*
timestamppb
.
Timestamp
{
if
x
!=
nil
{
return
x
.
LastAccessedTime
}
return
nil
}
func
(
x
*
UserSession
)
GetClientInfo
()
*
UserSession_ClientInfo
{
if
x
!=
nil
{
return
x
.
ClientInfo
}
return
nil
}
type
ListUserSessionsRequest
struct
{
state
protoimpl
.
MessageState
`protogen:"open.v1"`
// Required. The resource name of the parent.
// Format: users/{user}
Parent
string
`protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
unknownFields
protoimpl
.
UnknownFields
sizeCache
protoimpl
.
SizeCache
}
func
(
x
*
ListUserSessionsRequest
)
Reset
()
{
*
x
=
ListUserSessionsRequest
{}
mi
:=
&
file_api_v1_user_service_proto_msgTypes
[
21
]
ms
:=
protoimpl
.
X
.
MessageStateOf
(
protoimpl
.
Pointer
(
x
))
ms
.
StoreMessageInfo
(
mi
)
}
func
(
x
*
ListUserSessionsRequest
)
String
()
string
{
return
protoimpl
.
X
.
MessageStringOf
(
x
)
}
func
(
*
ListUserSessionsRequest
)
ProtoMessage
()
{}
func
(
x
*
ListUserSessionsRequest
)
ProtoReflect
()
protoreflect
.
Message
{
mi
:=
&
file_api_v1_user_service_proto_msgTypes
[
21
]
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 ListUserSessionsRequest.ProtoReflect.Descriptor instead.
func
(
*
ListUserSessionsRequest
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
file_api_v1_user_service_proto_rawDescGZIP
(),
[]
int
{
21
}
}
func
(
x
*
ListUserSessionsRequest
)
GetParent
()
string
{
if
x
!=
nil
{
return
x
.
Parent
}
return
""
}
type
ListUserSessionsResponse
struct
{
state
protoimpl
.
MessageState
`protogen:"open.v1"`
// The list of user sessions.
Sessions
[]
*
UserSession
`protobuf:"bytes,1,rep,name=sessions,proto3" json:"sessions,omitempty"`
unknownFields
protoimpl
.
UnknownFields
sizeCache
protoimpl
.
SizeCache
}
func
(
x
*
ListUserSessionsResponse
)
Reset
()
{
*
x
=
ListUserSessionsResponse
{}
mi
:=
&
file_api_v1_user_service_proto_msgTypes
[
22
]
ms
:=
protoimpl
.
X
.
MessageStateOf
(
protoimpl
.
Pointer
(
x
))
ms
.
StoreMessageInfo
(
mi
)
}
func
(
x
*
ListUserSessionsResponse
)
String
()
string
{
return
protoimpl
.
X
.
MessageStringOf
(
x
)
}
func
(
*
ListUserSessionsResponse
)
ProtoMessage
()
{}
func
(
x
*
ListUserSessionsResponse
)
ProtoReflect
()
protoreflect
.
Message
{
mi
:=
&
file_api_v1_user_service_proto_msgTypes
[
22
]
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 ListUserSessionsResponse.ProtoReflect.Descriptor instead.
func
(
*
ListUserSessionsResponse
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
file_api_v1_user_service_proto_rawDescGZIP
(),
[]
int
{
22
}
}
func
(
x
*
ListUserSessionsResponse
)
GetSessions
()
[]
*
UserSession
{
if
x
!=
nil
{
return
x
.
Sessions
}
return
nil
}
type
RevokeUserSessionRequest
struct
{
state
protoimpl
.
MessageState
`protogen:"open.v1"`
// Required. The resource name of the session to revoke.
// Format: users/{user}/sessions/{session}
Name
string
`protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
unknownFields
protoimpl
.
UnknownFields
sizeCache
protoimpl
.
SizeCache
}
func
(
x
*
RevokeUserSessionRequest
)
Reset
()
{
*
x
=
RevokeUserSessionRequest
{}
mi
:=
&
file_api_v1_user_service_proto_msgTypes
[
23
]
ms
:=
protoimpl
.
X
.
MessageStateOf
(
protoimpl
.
Pointer
(
x
))
ms
.
StoreMessageInfo
(
mi
)
}
func
(
x
*
RevokeUserSessionRequest
)
String
()
string
{
return
protoimpl
.
X
.
MessageStringOf
(
x
)
}
func
(
*
RevokeUserSessionRequest
)
ProtoMessage
()
{}
func
(
x
*
RevokeUserSessionRequest
)
ProtoReflect
()
protoreflect
.
Message
{
mi
:=
&
file_api_v1_user_service_proto_msgTypes
[
23
]
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 RevokeUserSessionRequest.ProtoReflect.Descriptor instead.
func
(
*
RevokeUserSessionRequest
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
file_api_v1_user_service_proto_rawDescGZIP
(),
[]
int
{
23
}
}
func
(
x
*
RevokeUserSessionRequest
)
GetName
()
string
{
if
x
!=
nil
{
return
x
.
Name
}
return
""
}
type
ListAllUserStatsRequest
struct
{
type
ListAllUserStatsRequest
struct
{
state
protoimpl
.
MessageState
`protogen:"open.v1"`
state
protoimpl
.
MessageState
`protogen:"open.v1"`
// Optional. The maximum number of user stats to return.
// Optional. The maximum number of user stats to return.
...
@@ -1455,7 +1683,7 @@ type ListAllUserStatsRequest struct {
...
@@ -1455,7 +1683,7 @@ type ListAllUserStatsRequest struct {
func
(
x
*
ListAllUserStatsRequest
)
Reset
()
{
func
(
x
*
ListAllUserStatsRequest
)
Reset
()
{
*
x
=
ListAllUserStatsRequest
{}
*
x
=
ListAllUserStatsRequest
{}
mi
:=
&
file_api_v1_user_service_proto_msgTypes
[
2
0
]
mi
:=
&
file_api_v1_user_service_proto_msgTypes
[
2
4
]
ms
:=
protoimpl
.
X
.
MessageStateOf
(
protoimpl
.
Pointer
(
x
))
ms
:=
protoimpl
.
X
.
MessageStateOf
(
protoimpl
.
Pointer
(
x
))
ms
.
StoreMessageInfo
(
mi
)
ms
.
StoreMessageInfo
(
mi
)
}
}
...
@@ -1467,7 +1695,7 @@ func (x *ListAllUserStatsRequest) String() string {
...
@@ -1467,7 +1695,7 @@ func (x *ListAllUserStatsRequest) String() string {
func
(
*
ListAllUserStatsRequest
)
ProtoMessage
()
{}
func
(
*
ListAllUserStatsRequest
)
ProtoMessage
()
{}
func
(
x
*
ListAllUserStatsRequest
)
ProtoReflect
()
protoreflect
.
Message
{
func
(
x
*
ListAllUserStatsRequest
)
ProtoReflect
()
protoreflect
.
Message
{
mi
:=
&
file_api_v1_user_service_proto_msgTypes
[
2
0
]
mi
:=
&
file_api_v1_user_service_proto_msgTypes
[
2
4
]
if
x
!=
nil
{
if
x
!=
nil
{
ms
:=
protoimpl
.
X
.
MessageStateOf
(
protoimpl
.
Pointer
(
x
))
ms
:=
protoimpl
.
X
.
MessageStateOf
(
protoimpl
.
Pointer
(
x
))
if
ms
.
LoadMessageInfo
()
==
nil
{
if
ms
.
LoadMessageInfo
()
==
nil
{
...
@@ -1480,7 +1708,7 @@ func (x *ListAllUserStatsRequest) ProtoReflect() protoreflect.Message {
...
@@ -1480,7 +1708,7 @@ func (x *ListAllUserStatsRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use ListAllUserStatsRequest.ProtoReflect.Descriptor instead.
// Deprecated: Use ListAllUserStatsRequest.ProtoReflect.Descriptor instead.
func
(
*
ListAllUserStatsRequest
)
Descriptor
()
([]
byte
,
[]
int
)
{
func
(
*
ListAllUserStatsRequest
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
file_api_v1_user_service_proto_rawDescGZIP
(),
[]
int
{
2
0
}
return
file_api_v1_user_service_proto_rawDescGZIP
(),
[]
int
{
2
4
}
}
}
func
(
x
*
ListAllUserStatsRequest
)
GetPageSize
()
int32
{
func
(
x
*
ListAllUserStatsRequest
)
GetPageSize
()
int32
{
...
@@ -1511,7 +1739,7 @@ type ListAllUserStatsResponse struct {
...
@@ -1511,7 +1739,7 @@ type ListAllUserStatsResponse struct {
func
(
x
*
ListAllUserStatsResponse
)
Reset
()
{
func
(
x
*
ListAllUserStatsResponse
)
Reset
()
{
*
x
=
ListAllUserStatsResponse
{}
*
x
=
ListAllUserStatsResponse
{}
mi
:=
&
file_api_v1_user_service_proto_msgTypes
[
2
1
]
mi
:=
&
file_api_v1_user_service_proto_msgTypes
[
2
5
]
ms
:=
protoimpl
.
X
.
MessageStateOf
(
protoimpl
.
Pointer
(
x
))
ms
:=
protoimpl
.
X
.
MessageStateOf
(
protoimpl
.
Pointer
(
x
))
ms
.
StoreMessageInfo
(
mi
)
ms
.
StoreMessageInfo
(
mi
)
}
}
...
@@ -1523,7 +1751,7 @@ func (x *ListAllUserStatsResponse) String() string {
...
@@ -1523,7 +1751,7 @@ func (x *ListAllUserStatsResponse) String() string {
func
(
*
ListAllUserStatsResponse
)
ProtoMessage
()
{}
func
(
*
ListAllUserStatsResponse
)
ProtoMessage
()
{}
func
(
x
*
ListAllUserStatsResponse
)
ProtoReflect
()
protoreflect
.
Message
{
func
(
x
*
ListAllUserStatsResponse
)
ProtoReflect
()
protoreflect
.
Message
{
mi
:=
&
file_api_v1_user_service_proto_msgTypes
[
2
1
]
mi
:=
&
file_api_v1_user_service_proto_msgTypes
[
2
5
]
if
x
!=
nil
{
if
x
!=
nil
{
ms
:=
protoimpl
.
X
.
MessageStateOf
(
protoimpl
.
Pointer
(
x
))
ms
:=
protoimpl
.
X
.
MessageStateOf
(
protoimpl
.
Pointer
(
x
))
if
ms
.
LoadMessageInfo
()
==
nil
{
if
ms
.
LoadMessageInfo
()
==
nil
{
...
@@ -1536,7 +1764,7 @@ func (x *ListAllUserStatsResponse) ProtoReflect() protoreflect.Message {
...
@@ -1536,7 +1764,7 @@ func (x *ListAllUserStatsResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use ListAllUserStatsResponse.ProtoReflect.Descriptor instead.
// Deprecated: Use ListAllUserStatsResponse.ProtoReflect.Descriptor instead.
func
(
*
ListAllUserStatsResponse
)
Descriptor
()
([]
byte
,
[]
int
)
{
func
(
*
ListAllUserStatsResponse
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
file_api_v1_user_service_proto_rawDescGZIP
(),
[]
int
{
2
1
}
return
file_api_v1_user_service_proto_rawDescGZIP
(),
[]
int
{
2
5
}
}
}
func
(
x
*
ListAllUserStatsResponse
)
GetUserStats
()
[]
*
UserStats
{
func
(
x
*
ListAllUserStatsResponse
)
GetUserStats
()
[]
*
UserStats
{
...
@@ -1573,7 +1801,7 @@ type UserStats_MemoTypeStats struct {
...
@@ -1573,7 +1801,7 @@ type UserStats_MemoTypeStats struct {
func
(
x
*
UserStats_MemoTypeStats
)
Reset
()
{
func
(
x
*
UserStats_MemoTypeStats
)
Reset
()
{
*
x
=
UserStats_MemoTypeStats
{}
*
x
=
UserStats_MemoTypeStats
{}
mi
:=
&
file_api_v1_user_service_proto_msgTypes
[
2
3
]
mi
:=
&
file_api_v1_user_service_proto_msgTypes
[
2
7
]
ms
:=
protoimpl
.
X
.
MessageStateOf
(
protoimpl
.
Pointer
(
x
))
ms
:=
protoimpl
.
X
.
MessageStateOf
(
protoimpl
.
Pointer
(
x
))
ms
.
StoreMessageInfo
(
mi
)
ms
.
StoreMessageInfo
(
mi
)
}
}
...
@@ -1585,7 +1813,7 @@ func (x *UserStats_MemoTypeStats) String() string {
...
@@ -1585,7 +1813,7 @@ func (x *UserStats_MemoTypeStats) String() string {
func
(
*
UserStats_MemoTypeStats
)
ProtoMessage
()
{}
func
(
*
UserStats_MemoTypeStats
)
ProtoMessage
()
{}
func
(
x
*
UserStats_MemoTypeStats
)
ProtoReflect
()
protoreflect
.
Message
{
func
(
x
*
UserStats_MemoTypeStats
)
ProtoReflect
()
protoreflect
.
Message
{
mi
:=
&
file_api_v1_user_service_proto_msgTypes
[
2
3
]
mi
:=
&
file_api_v1_user_service_proto_msgTypes
[
2
7
]
if
x
!=
nil
{
if
x
!=
nil
{
ms
:=
protoimpl
.
X
.
MessageStateOf
(
protoimpl
.
Pointer
(
x
))
ms
:=
protoimpl
.
X
.
MessageStateOf
(
protoimpl
.
Pointer
(
x
))
if
ms
.
LoadMessageInfo
()
==
nil
{
if
ms
.
LoadMessageInfo
()
==
nil
{
...
@@ -1629,6 +1857,96 @@ func (x *UserStats_MemoTypeStats) GetUndoCount() int32 {
...
@@ -1629,6 +1857,96 @@ func (x *UserStats_MemoTypeStats) GetUndoCount() int32 {
return
0
return
0
}
}
type
UserSession_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"`
// Optional. Geographic location (country code, e.g., "US").
Country
string
`protobuf:"bytes,6,opt,name=country,proto3" json:"country,omitempty"`
unknownFields
protoimpl
.
UnknownFields
sizeCache
protoimpl
.
SizeCache
}
func
(
x
*
UserSession_ClientInfo
)
Reset
()
{
*
x
=
UserSession_ClientInfo
{}
mi
:=
&
file_api_v1_user_service_proto_msgTypes
[
28
]
ms
:=
protoimpl
.
X
.
MessageStateOf
(
protoimpl
.
Pointer
(
x
))
ms
.
StoreMessageInfo
(
mi
)
}
func
(
x
*
UserSession_ClientInfo
)
String
()
string
{
return
protoimpl
.
X
.
MessageStringOf
(
x
)
}
func
(
*
UserSession_ClientInfo
)
ProtoMessage
()
{}
func
(
x
*
UserSession_ClientInfo
)
ProtoReflect
()
protoreflect
.
Message
{
mi
:=
&
file_api_v1_user_service_proto_msgTypes
[
28
]
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 UserSession_ClientInfo.ProtoReflect.Descriptor instead.
func
(
*
UserSession_ClientInfo
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
file_api_v1_user_service_proto_rawDescGZIP
(),
[]
int
{
20
,
0
}
}
func
(
x
*
UserSession_ClientInfo
)
GetUserAgent
()
string
{
if
x
!=
nil
{
return
x
.
UserAgent
}
return
""
}
func
(
x
*
UserSession_ClientInfo
)
GetIpAddress
()
string
{
if
x
!=
nil
{
return
x
.
IpAddress
}
return
""
}
func
(
x
*
UserSession_ClientInfo
)
GetDeviceType
()
string
{
if
x
!=
nil
{
return
x
.
DeviceType
}
return
""
}
func
(
x
*
UserSession_ClientInfo
)
GetOs
()
string
{
if
x
!=
nil
{
return
x
.
Os
}
return
""
}
func
(
x
*
UserSession_ClientInfo
)
GetBrowser
()
string
{
if
x
!=
nil
{
return
x
.
Browser
}
return
""
}
func
(
x
*
UserSession_ClientInfo
)
GetCountry
()
string
{
if
x
!=
nil
{
return
x
.
Country
}
return
""
}
var
File_api_v1_user_service_proto
protoreflect
.
FileDescriptor
var
File_api_v1_user_service_proto
protoreflect
.
FileDescriptor
const
file_api_v1_user_service_proto_rawDesc
=
""
+
const
file_api_v1_user_service_proto_rawDesc
=
""
+
...
@@ -1766,7 +2084,38 @@ const file_api_v1_user_service_proto_rawDesc = "" +
...
@@ -1766,7 +2084,38 @@ const file_api_v1_user_service_proto_rawDesc = "" +
"
\x0f
access_token_id
\x18\x03
\x01
(
\t
B
\x03\xe0
A
\x01
R
\r
accessTokenId
\"
X
\n
"
+
"
\x0f
access_token_id
\x18\x03
\x01
(
\t
B
\x03\xe0
A
\x01
R
\r
accessTokenId
\"
X
\n
"
+
"
\x1c
DeleteUserAccessTokenRequest
\x12
8
\n
"
+
"
\x1c
DeleteUserAccessTokenRequest
\x12
8
\n
"
+
"
\x04
name
\x18\x01
\x01
(
\t
B$
\xe0
A
\x02\xfa
A
\x1e\n
"
+
"
\x04
name
\x18\x01
\x01
(
\t
B$
\xe0
A
\x02\xfa
A
\x1e\n
"
+
"
\x1c
memos.api.v1/UserAccessTokenR
\x04
name
\"
_
\n
"
+
"
\x1c
memos.api.v1/UserAccessTokenR
\x04
name
\"\xf5\x04\n
"
+
"
\v
UserSession
\x12\x17\n
"
+
"
\x04
name
\x18\x01
\x01
(
\t
B
\x03\xe0
A
\b
R
\x04
name
\x12\"\n
"
+
"
\n
"
+
"session_id
\x18\x02
\x01
(
\t
B
\x03\xe0
A
\x03
R
\t
sessionId
\x12
@
\n
"
+
"
\v
create_time
\x18\x03
\x01
(
\v
2
\x1a
.google.protobuf.TimestampB
\x03\xe0
A
\x03
R
\n
"
+
"createTime
\x12
@
\n
"
+
"
\v
expire_time
\x18\x04
\x01
(
\v
2
\x1a
.google.protobuf.TimestampB
\x03\xe0
A
\x03
R
\n
"
+
"expireTime
\x12
M
\n
"
+
"
\x12
last_accessed_time
\x18\x05
\x01
(
\v
2
\x1a
.google.protobuf.TimestampB
\x03\xe0
A
\x03
R
\x10
lastAccessedTime
\x12
J
\n
"
+
"
\v
client_info
\x18\x06
\x01
(
\v
2$.memos.api.v1.UserSession.ClientInfoB
\x03\xe0
A
\x03
R
\n
"
+
"clientInfo
\x1a\xc3\x01\n
"
+
"
\n
"
+
"ClientInfo
\x12\x1d\n
"
+
"
\n
"
+
"user_agent
\x18\x01
\x01
(
\t
R
\t
userAgent
\x12\x1d\n
"
+
"
\n
"
+
"ip_address
\x18\x02
\x01
(
\t
R
\t
ipAddress
\x12
$
\n
"
+
"
\v
device_type
\x18\x03
\x01
(
\t
B
\x03\xe0
A
\x01
R
\n
"
+
"deviceType
\x12\x13\n
"
+
"
\x02
os
\x18\x04
\x01
(
\t
B
\x03\xe0
A
\x01
R
\x02
os
\x12\x1d\n
"
+
"
\a
browser
\x18\x05
\x01
(
\t
B
\x03\xe0
A
\x01
R
\a
browser
\x12\x1d\n
"
+
"
\a
country
\x18\x06
\x01
(
\t
B
\x03\xe0
A
\x01
R
\a
country:D
\xea
AA
\n
"
+
"
\x18
memos.api.v1/UserSession
\x12\x1f
users/{user}/sessions/{session}
\x1a\x04
name
\"
L
\n
"
+
"
\x17
ListUserSessionsRequest
\x12
1
\n
"
+
"
\x06
parent
\x18\x01
\x01
(
\t
B
\x19\xe0
A
\x02\xfa
A
\x13\n
"
+
"
\x11
memos.api.v1/UserR
\x06
parent
\"
Q
\n
"
+
"
\x18
ListUserSessionsResponse
\x12
5
\n
"
+
"
\b
sessions
\x18\x01
\x03
(
\v
2
\x19
.memos.api.v1.UserSessionR
\b
sessions
\"
P
\n
"
+
"
\x18
RevokeUserSessionRequest
\x12
4
\n
"
+
"
\x04
name
\x18\x01
\x01
(
\t
B
\xe0
A
\x02\xfa
A
\x1a\n
"
+
"
\x18
memos.api.v1/UserSessionR
\x04
name
\"
_
\n
"
+
"
\x17
ListAllUserStatsRequest
\x12
\n
"
+
"
\x17
ListAllUserStatsRequest
\x12
\n
"
+
"
\t
page_size
\x18\x01
\x01
(
\x05
B
\x03\xe0
A
\x01
R
\b
pageSize
\x12\"\n
"
+
"
\t
page_size
\x18\x01
\x01
(
\x05
B
\x03\xe0
A
\x01
R
\b
pageSize
\x12\"\n
"
+
"
\n
"
+
"
\n
"
+
...
@@ -1776,7 +2125,7 @@ const file_api_v1_user_service_proto_rawDesc = "" +
...
@@ -1776,7 +2125,7 @@ const file_api_v1_user_service_proto_rawDesc = "" +
"user_stats
\x18\x01
\x03
(
\v
2
\x17
.memos.api.v1.UserStatsR
\t
userStats
\x12
&
\n
"
+
"user_stats
\x18\x01
\x03
(
\v
2
\x17
.memos.api.v1.UserStatsR
\t
userStats
\x12
&
\n
"
+
"
\x0f
next_page_token
\x18\x02
\x01
(
\t
R
\r
nextPageToken
\x12\x1d\n
"
+
"
\x0f
next_page_token
\x18\x02
\x01
(
\t
R
\r
nextPageToken
\x12\x1d\n
"
+
"
\n
"
+
"
\n
"
+
"total_size
\x18\x03
\x01
(
\x05
R
\t
totalSize2
\x
c2\x0e
\n
"
+
"total_size
\x18\x03
\x01
(
\x05
R
\t
totalSize2
\x
e2\x10
\n
"
+
"
\v
UserService
\x12
c
\n
"
+
"
\v
UserService
\x12
c
\n
"
+
"
\t
ListUsers
\x12\x1e
.memos.api.v1.ListUsersRequest
\x1a\x1f
.memos.api.v1.ListUsersResponse
\"\x15\x82\xd3\xe4\x93\x02\x0f\x12\r
/api/v1/users
\x12
b
\n
"
+
"
\t
ListUsers
\x12\x1e
.memos.api.v1.ListUsersRequest
\x1a\x1f
.memos.api.v1.ListUsersResponse
\"\x15\x82\xd3\xe4\x93\x02\x0f\x12\r
/api/v1/users
\x12
b
\n
"
+
"
\a
GetUser
\x12\x1c
.memos.api.v1.GetUserRequest
\x1a\x12
.memos.api.v1.User
\"
%
\xda
A
\x04
name
\x82\xd3\xe4\x93\x02\x18\x12\x16
/api/v1/{name=users/*}
\x12
e
\n
"
+
"
\a
GetUser
\x12\x1c
.memos.api.v1.GetUserRequest
\x1a\x12
.memos.api.v1.User
\"
%
\xda
A
\x04
name
\x82\xd3\xe4\x93\x02\x18\x12\x16
/api/v1/{name=users/*}
\x12
e
\n
"
+
...
@@ -1794,7 +2143,9 @@ const file_api_v1_user_service_proto_rawDesc = "" +
...
@@ -1794,7 +2143,9 @@ const file_api_v1_user_service_proto_rawDesc = "" +
"
\x11
UpdateUserSetting
\x12
&.memos.api.v1.UpdateUserSettingRequest
\x1a\x19
.memos.api.v1.UserSetting
\"
S
\xda
A
\x13
setting,update_mask
\x82\xd3\xe4\x93\x02
7:
\a
setting2,/api/v1/{setting.name=users/*}:updateSetting
\x12\xa5\x01\n
"
+
"
\x11
UpdateUserSetting
\x12
&.memos.api.v1.UpdateUserSettingRequest
\x1a\x19
.memos.api.v1.UserSetting
\"
S
\xda
A
\x13
setting,update_mask
\x82\xd3\xe4\x93\x02
7:
\a
setting2,/api/v1/{setting.name=users/*}:updateSetting
\x12\xa5\x01\n
"
+
"
\x14
ListUserAccessTokens
\x12
).memos.api.v1.ListUserAccessTokensRequest
\x1a
*.memos.api.v1.ListUserAccessTokensResponse
\"
6
\xda
A
\x06
parent
\x82\xd3\xe4\x93\x02
'
\x12
%/api/v1/{parent=users/*}/accessTokens
\x12\xb5\x01\n
"
+
"
\x14
ListUserAccessTokens
\x12
).memos.api.v1.ListUserAccessTokensRequest
\x1a
*.memos.api.v1.ListUserAccessTokensResponse
\"
6
\xda
A
\x06
parent
\x82\xd3\xe4\x93\x02
'
\x12
%/api/v1/{parent=users/*}/accessTokens
\x12\xb5\x01\n
"
+
"
\x15
CreateUserAccessToken
\x12
*.memos.api.v1.CreateUserAccessTokenRequest
\x1a\x1d
.memos.api.v1.UserAccessToken
\"
Q
\xda
A
\x13
parent,access_token
\x82\xd3\xe4\x93\x02
5:
\f
access_token
\"
%/api/v1/{parent=users/*}/accessTokens
\x12\x91\x01\n
"
+
"
\x15
CreateUserAccessToken
\x12
*.memos.api.v1.CreateUserAccessTokenRequest
\x1a\x1d
.memos.api.v1.UserAccessToken
\"
Q
\xda
A
\x13
parent,access_token
\x82\xd3\xe4\x93\x02
5:
\f
access_token
\"
%/api/v1/{parent=users/*}/accessTokens
\x12\x91\x01\n
"
+
"
\x15
DeleteUserAccessToken
\x12
*.memos.api.v1.DeleteUserAccessTokenRequest
\x1a\x16
.google.protobuf.Empty
\"
4
\xda
A
\x04
name
\x82\xd3\xe4\x93\x02
'*%/api/v1/{name=users/*/accessTokens/*}B
\xa8\x01\n
"
+
"
\x15
DeleteUserAccessToken
\x12
*.memos.api.v1.DeleteUserAccessTokenRequest
\x1a\x16
.google.protobuf.Empty
\"
4
\xda
A
\x04
name
\x82\xd3\xe4\x93\x02
'*%/api/v1/{name=users/*/accessTokens/*}
\x12\x95\x01\n
"
+
"
\x10
ListUserSessions
\x12
%.memos.api.v1.ListUserSessionsRequest
\x1a
&.memos.api.v1.ListUserSessionsResponse
\"
2
\xda
A
\x06
parent
\x82\xd3\xe4\x93\x02
#
\x12
!/api/v1/{parent=users/*}/sessions
\x12\x85\x01\n
"
+
"
\x11
RevokeUserSession
\x12
&.memos.api.v1.RevokeUserSessionRequest
\x1a\x16
.google.protobuf.Empty
\"
0
\xda
A
\x04
name
\x82\xd3\xe4\x93\x02
#*!/api/v1/{name=users/*/sessions/*}B
\xa8\x01\n
"
+
"
\x10
com.memos.api.v1B
\x10
UserServiceProtoP
\x01
Z0github.com/usememos/memos/proto/gen/api/v1;apiv1
\xa2\x02\x03
MAX
\xaa\x02\f
Memos.Api.V1
\xca\x02\f
Memos
\\
Api
\\
V1
\xe2\x02\x18
Memos
\\
Api
\\
V1
\\
GPBMetadata
\xea\x02\x0e
Memos::Api::V1b
\x06
proto3"
"
\x10
com.memos.api.v1B
\x10
UserServiceProtoP
\x01
Z0github.com/usememos/memos/proto/gen/api/v1;apiv1
\xa2\x02\x03
MAX
\xaa\x02\f
Memos.Api.V1
\xca\x02\f
Memos
\\
Api
\\
V1
\xe2\x02\x18
Memos
\\
Api
\\
V1
\\
GPBMetadata
\xea\x02\x0e
Memos::Api::V1b
\x06
proto3"
var
(
var
(
...
@@ -1810,7 +2161,7 @@ func file_api_v1_user_service_proto_rawDescGZIP() []byte {
...
@@ -1810,7 +2161,7 @@ func file_api_v1_user_service_proto_rawDescGZIP() []byte {
}
}
var
file_api_v1_user_service_proto_enumTypes
=
make
([]
protoimpl
.
EnumInfo
,
1
)
var
file_api_v1_user_service_proto_enumTypes
=
make
([]
protoimpl
.
EnumInfo
,
1
)
var
file_api_v1_user_service_proto_msgTypes
=
make
([]
protoimpl
.
MessageInfo
,
2
4
)
var
file_api_v1_user_service_proto_msgTypes
=
make
([]
protoimpl
.
MessageInfo
,
2
9
)
var
file_api_v1_user_service_proto_goTypes
=
[]
any
{
var
file_api_v1_user_service_proto_goTypes
=
[]
any
{
(
User_Role
)(
0
),
// 0: memos.api.v1.User.Role
(
User_Role
)(
0
),
// 0: memos.api.v1.User.Role
(
*
User
)(
nil
),
// 1: memos.api.v1.User
(
*
User
)(
nil
),
// 1: memos.api.v1.User
...
@@ -1833,70 +2184,84 @@ var file_api_v1_user_service_proto_goTypes = []any{
...
@@ -1833,70 +2184,84 @@ var file_api_v1_user_service_proto_goTypes = []any{
(
*
ListUserAccessTokensResponse
)(
nil
),
// 18: memos.api.v1.ListUserAccessTokensResponse
(
*
ListUserAccessTokensResponse
)(
nil
),
// 18: memos.api.v1.ListUserAccessTokensResponse
(
*
CreateUserAccessTokenRequest
)(
nil
),
// 19: memos.api.v1.CreateUserAccessTokenRequest
(
*
CreateUserAccessTokenRequest
)(
nil
),
// 19: memos.api.v1.CreateUserAccessTokenRequest
(
*
DeleteUserAccessTokenRequest
)(
nil
),
// 20: memos.api.v1.DeleteUserAccessTokenRequest
(
*
DeleteUserAccessTokenRequest
)(
nil
),
// 20: memos.api.v1.DeleteUserAccessTokenRequest
(
*
ListAllUserStatsRequest
)(
nil
),
// 21: memos.api.v1.ListAllUserStatsRequest
(
*
UserSession
)(
nil
),
// 21: memos.api.v1.UserSession
(
*
ListAllUserStatsResponse
)(
nil
),
// 22: memos.api.v1.ListAllUserStatsResponse
(
*
ListUserSessionsRequest
)(
nil
),
// 22: memos.api.v1.ListUserSessionsRequest
nil
,
// 23: memos.api.v1.UserStats.TagCountEntry
(
*
ListUserSessionsResponse
)(
nil
),
// 23: memos.api.v1.ListUserSessionsResponse
(
*
UserStats_MemoTypeStats
)(
nil
),
// 24: memos.api.v1.UserStats.MemoTypeStats
(
*
RevokeUserSessionRequest
)(
nil
),
// 24: memos.api.v1.RevokeUserSessionRequest
(
State
)(
0
),
// 25: memos.api.v1.State
(
*
ListAllUserStatsRequest
)(
nil
),
// 25: memos.api.v1.ListAllUserStatsRequest
(
*
timestamppb
.
Timestamp
)(
nil
),
// 26: google.protobuf.Timestamp
(
*
ListAllUserStatsResponse
)(
nil
),
// 26: memos.api.v1.ListAllUserStatsResponse
(
*
fieldmaskpb
.
FieldMask
)(
nil
),
// 27: google.protobuf.FieldMask
nil
,
// 27: memos.api.v1.UserStats.TagCountEntry
(
*
emptypb
.
Empty
)(
nil
),
// 28: google.protobuf.Empty
(
*
UserStats_MemoTypeStats
)(
nil
),
// 28: memos.api.v1.UserStats.MemoTypeStats
(
*
httpbody
.
HttpBody
)(
nil
),
// 29: google.api.HttpBody
(
*
UserSession_ClientInfo
)(
nil
),
// 29: memos.api.v1.UserSession.ClientInfo
(
State
)(
0
),
// 30: memos.api.v1.State
(
*
timestamppb
.
Timestamp
)(
nil
),
// 31: google.protobuf.Timestamp
(
*
fieldmaskpb
.
FieldMask
)(
nil
),
// 32: google.protobuf.FieldMask
(
*
emptypb
.
Empty
)(
nil
),
// 33: google.protobuf.Empty
(
*
httpbody
.
HttpBody
)(
nil
),
// 34: google.api.HttpBody
}
}
var
file_api_v1_user_service_proto_depIdxs
=
[]
int32
{
var
file_api_v1_user_service_proto_depIdxs
=
[]
int32
{
0
,
// 0: memos.api.v1.User.role:type_name -> memos.api.v1.User.Role
0
,
// 0: memos.api.v1.User.role:type_name -> memos.api.v1.User.Role
25
,
// 1: memos.api.v1.User.state:type_name -> memos.api.v1.State
30
,
// 1: memos.api.v1.User.state:type_name -> memos.api.v1.State
26
,
// 2: memos.api.v1.User.create_time:type_name -> google.protobuf.Timestamp
31
,
// 2: memos.api.v1.User.create_time:type_name -> google.protobuf.Timestamp
26
,
// 3: memos.api.v1.User.update_time:type_name -> google.protobuf.Timestamp
31
,
// 3: memos.api.v1.User.update_time:type_name -> google.protobuf.Timestamp
1
,
// 4: memos.api.v1.ListUsersResponse.users:type_name -> memos.api.v1.User
1
,
// 4: memos.api.v1.ListUsersResponse.users:type_name -> memos.api.v1.User
27
,
// 5: memos.api.v1.GetUserRequest.read_mask:type_name -> google.protobuf.FieldMask
32
,
// 5: memos.api.v1.GetUserRequest.read_mask:type_name -> google.protobuf.FieldMask
1
,
// 6: memos.api.v1.CreateUserRequest.user:type_name -> memos.api.v1.User
1
,
// 6: memos.api.v1.CreateUserRequest.user:type_name -> memos.api.v1.User
1
,
// 7: memos.api.v1.UpdateUserRequest.user:type_name -> memos.api.v1.User
1
,
// 7: memos.api.v1.UpdateUserRequest.user:type_name -> memos.api.v1.User
27
,
// 8: memos.api.v1.UpdateUserRequest.update_mask:type_name -> google.protobuf.FieldMask
32
,
// 8: memos.api.v1.UpdateUserRequest.update_mask:type_name -> google.protobuf.FieldMask
1
,
// 9: memos.api.v1.SearchUsersResponse.users:type_name -> memos.api.v1.User
1
,
// 9: memos.api.v1.SearchUsersResponse.users:type_name -> memos.api.v1.User
26
,
// 10: memos.api.v1.UserStats.memo_display_timestamps:type_name -> google.protobuf.Timestamp
31
,
// 10: memos.api.v1.UserStats.memo_display_timestamps:type_name -> google.protobuf.Timestamp
2
4
,
// 11: memos.api.v1.UserStats.memo_type_stats:type_name -> memos.api.v1.UserStats.MemoTypeStats
2
8
,
// 11: memos.api.v1.UserStats.memo_type_stats:type_name -> memos.api.v1.UserStats.MemoTypeStats
2
3
,
// 12: memos.api.v1.UserStats.tag_count:type_name -> memos.api.v1.UserStats.TagCountEntry
2
7
,
// 12: memos.api.v1.UserStats.tag_count:type_name -> memos.api.v1.UserStats.TagCountEntry
13
,
// 13: memos.api.v1.UpdateUserSettingRequest.setting:type_name -> memos.api.v1.UserSetting
13
,
// 13: memos.api.v1.UpdateUserSettingRequest.setting:type_name -> memos.api.v1.UserSetting
27
,
// 14: memos.api.v1.UpdateUserSettingRequest.update_mask:type_name -> google.protobuf.FieldMask
32
,
// 14: memos.api.v1.UpdateUserSettingRequest.update_mask:type_name -> google.protobuf.FieldMask
26
,
// 15: memos.api.v1.UserAccessToken.issued_at:type_name -> google.protobuf.Timestamp
31
,
// 15: memos.api.v1.UserAccessToken.issued_at:type_name -> google.protobuf.Timestamp
26
,
// 16: memos.api.v1.UserAccessToken.expires_at:type_name -> google.protobuf.Timestamp
31
,
// 16: memos.api.v1.UserAccessToken.expires_at:type_name -> google.protobuf.Timestamp
16
,
// 17: memos.api.v1.ListUserAccessTokensResponse.access_tokens:type_name -> memos.api.v1.UserAccessToken
16
,
// 17: memos.api.v1.ListUserAccessTokensResponse.access_tokens:type_name -> memos.api.v1.UserAccessToken
16
,
// 18: memos.api.v1.CreateUserAccessTokenRequest.access_token:type_name -> memos.api.v1.UserAccessToken
16
,
// 18: memos.api.v1.CreateUserAccessTokenRequest.access_token:type_name -> memos.api.v1.UserAccessToken
11
,
// 19: memos.api.v1.ListAllUserStatsResponse.user_stats:type_name -> memos.api.v1.UserStats
31
,
// 19: memos.api.v1.UserSession.create_time:type_name -> google.protobuf.Timestamp
2
,
// 20: memos.api.v1.UserService.ListUsers:input_type -> memos.api.v1.ListUsersRequest
31
,
// 20: memos.api.v1.UserSession.expire_time:type_name -> google.protobuf.Timestamp
4
,
// 21: memos.api.v1.UserService.GetUser:input_type -> memos.api.v1.GetUserRequest
31
,
// 21: memos.api.v1.UserSession.last_accessed_time:type_name -> google.protobuf.Timestamp
5
,
// 22: memos.api.v1.UserService.CreateUser:input_type -> memos.api.v1.CreateUserRequest
29
,
// 22: memos.api.v1.UserSession.client_info:type_name -> memos.api.v1.UserSession.ClientInfo
6
,
// 23: memos.api.v1.UserService.UpdateUser:input_type -> memos.api.v1.UpdateUserRequest
21
,
// 23: memos.api.v1.ListUserSessionsResponse.sessions:type_name -> memos.api.v1.UserSession
7
,
// 24: memos.api.v1.UserService.DeleteUser:input_type -> memos.api.v1.DeleteUserRequest
11
,
// 24: memos.api.v1.ListAllUserStatsResponse.user_stats:type_name -> memos.api.v1.UserStats
8
,
// 25: memos.api.v1.UserService.SearchUsers:input_type -> memos.api.v1.SearchUsersRequest
2
,
// 25: memos.api.v1.UserService.ListUsers:input_type -> memos.api.v1.ListUsersRequest
10
,
// 26: memos.api.v1.UserService.GetUserAvatar:input_type -> memos.api.v1.GetUserAvatarRequest
4
,
// 26: memos.api.v1.UserService.GetUser:input_type -> memos.api.v1.GetUserRequest
21
,
// 27: memos.api.v1.UserService.ListAllUserStats:input_type -> memos.api.v1.ListAllUserStatsRequest
5
,
// 27: memos.api.v1.UserService.CreateUser:input_type -> memos.api.v1.CreateUserRequest
12
,
// 28: memos.api.v1.UserService.GetUserStats:input_type -> memos.api.v1.GetUserStatsRequest
6
,
// 28: memos.api.v1.UserService.UpdateUser:input_type -> memos.api.v1.UpdateUserRequest
14
,
// 29: memos.api.v1.UserService.GetUserSetting:input_type -> memos.api.v1.GetUserSettingRequest
7
,
// 29: memos.api.v1.UserService.DeleteUser:input_type -> memos.api.v1.DeleteUserRequest
15
,
// 30: memos.api.v1.UserService.UpdateUserSetting:input_type -> memos.api.v1.UpdateUserSettingRequest
8
,
// 30: memos.api.v1.UserService.SearchUsers:input_type -> memos.api.v1.SearchUsersRequest
17
,
// 31: memos.api.v1.UserService.ListUserAccessTokens:input_type -> memos.api.v1.ListUserAccessTokensRequest
10
,
// 31: memos.api.v1.UserService.GetUserAvatar:input_type -> memos.api.v1.GetUserAvatarRequest
19
,
// 32: memos.api.v1.UserService.CreateUserAccessToken:input_type -> memos.api.v1.CreateUserAccessTokenRequest
25
,
// 32: memos.api.v1.UserService.ListAllUserStats:input_type -> memos.api.v1.ListAllUserStatsRequest
20
,
// 33: memos.api.v1.UserService.DeleteUserAccessToken:input_type -> memos.api.v1.DeleteUserAccessTokenRequest
12
,
// 33: memos.api.v1.UserService.GetUserStats:input_type -> memos.api.v1.GetUserStatsRequest
3
,
// 34: memos.api.v1.UserService.ListUsers:output_type -> memos.api.v1.ListUsersResponse
14
,
// 34: memos.api.v1.UserService.GetUserSetting:input_type -> memos.api.v1.GetUserSettingRequest
1
,
// 35: memos.api.v1.UserService.GetUser:output_type -> memos.api.v1.User
15
,
// 35: memos.api.v1.UserService.UpdateUserSetting:input_type -> memos.api.v1.UpdateUserSettingRequest
1
,
// 36: memos.api.v1.UserService.CreateUser:output_type -> memos.api.v1.User
17
,
// 36: memos.api.v1.UserService.ListUserAccessTokens:input_type -> memos.api.v1.ListUserAccessTokensRequest
1
,
// 37: memos.api.v1.UserService.UpdateUser:output_type -> memos.api.v1.User
19
,
// 37: memos.api.v1.UserService.CreateUserAccessToken:input_type -> memos.api.v1.CreateUserAccessTokenRequest
28
,
// 38: memos.api.v1.UserService.DeleteUser:output_type -> google.protobuf.Empty
20
,
// 38: memos.api.v1.UserService.DeleteUserAccessToken:input_type -> memos.api.v1.DeleteUserAccessTokenRequest
9
,
// 39: memos.api.v1.UserService.SearchUsers:output_type -> memos.api.v1.SearchUsersResponse
22
,
// 39: memos.api.v1.UserService.ListUserSessions:input_type -> memos.api.v1.ListUserSessionsRequest
29
,
// 40: memos.api.v1.UserService.GetUserAvatar:output_type -> google.api.HttpBody
24
,
// 40: memos.api.v1.UserService.RevokeUserSession:input_type -> memos.api.v1.RevokeUserSessionRequest
22
,
// 41: memos.api.v1.UserService.ListAllUserStats:output_type -> memos.api.v1.ListAllUserStatsResponse
3
,
// 41: memos.api.v1.UserService.ListUsers:output_type -> memos.api.v1.ListUsersResponse
11
,
// 42: memos.api.v1.UserService.GetUserStats:output_type -> memos.api.v1.UserStats
1
,
// 42: memos.api.v1.UserService.GetUser:output_type -> memos.api.v1.User
13
,
// 43: memos.api.v1.UserService.GetUserSetting:output_type -> memos.api.v1.UserSetting
1
,
// 43: memos.api.v1.UserService.CreateUser:output_type -> memos.api.v1.User
13
,
// 44: memos.api.v1.UserService.UpdateUserSetting:output_type -> memos.api.v1.UserSetting
1
,
// 44: memos.api.v1.UserService.UpdateUser:output_type -> memos.api.v1.User
18
,
// 45: memos.api.v1.UserService.ListUserAccessTokens:output_type -> memos.api.v1.ListUserAccessTokensResponse
33
,
// 45: memos.api.v1.UserService.DeleteUser:output_type -> google.protobuf.Empty
16
,
// 46: memos.api.v1.UserService.CreateUserAccessToken:output_type -> memos.api.v1.UserAccessToken
9
,
// 46: memos.api.v1.UserService.SearchUsers:output_type -> memos.api.v1.SearchUsersResponse
28
,
// 47: memos.api.v1.UserService.DeleteUserAccessToken:output_type -> google.protobuf.Empty
34
,
// 47: memos.api.v1.UserService.GetUserAvatar:output_type -> google.api.HttpBody
34
,
// [34:48] is the sub-list for method output_type
26
,
// 48: memos.api.v1.UserService.ListAllUserStats:output_type -> memos.api.v1.ListAllUserStatsResponse
20
,
// [20:34] is the sub-list for method input_type
11
,
// 49: memos.api.v1.UserService.GetUserStats:output_type -> memos.api.v1.UserStats
20
,
// [20:20] is the sub-list for extension type_name
13
,
// 50: memos.api.v1.UserService.GetUserSetting:output_type -> memos.api.v1.UserSetting
20
,
// [20:20] is the sub-list for extension extendee
13
,
// 51: memos.api.v1.UserService.UpdateUserSetting:output_type -> memos.api.v1.UserSetting
0
,
// [0:20] is the sub-list for field type_name
18
,
// 52: memos.api.v1.UserService.ListUserAccessTokens:output_type -> memos.api.v1.ListUserAccessTokensResponse
16
,
// 53: memos.api.v1.UserService.CreateUserAccessToken:output_type -> memos.api.v1.UserAccessToken
33
,
// 54: memos.api.v1.UserService.DeleteUserAccessToken:output_type -> google.protobuf.Empty
23
,
// 55: memos.api.v1.UserService.ListUserSessions:output_type -> memos.api.v1.ListUserSessionsResponse
33
,
// 56: memos.api.v1.UserService.RevokeUserSession:output_type -> google.protobuf.Empty
41
,
// [41:57] is the sub-list for method output_type
25
,
// [25:41] is the sub-list for method input_type
25
,
// [25:25] is the sub-list for extension type_name
25
,
// [25:25] is the sub-list for extension extendee
0
,
// [0:25] is the sub-list for field type_name
}
}
func
init
()
{
file_api_v1_user_service_proto_init
()
}
func
init
()
{
file_api_v1_user_service_proto_init
()
}
...
@@ -1911,7 +2276,7 @@ func file_api_v1_user_service_proto_init() {
...
@@ -1911,7 +2276,7 @@ func file_api_v1_user_service_proto_init() {
GoPackagePath
:
reflect
.
TypeOf
(
x
{})
.
PkgPath
(),
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
)),
RawDescriptor
:
unsafe
.
Slice
(
unsafe
.
StringData
(
file_api_v1_user_service_proto_rawDesc
),
len
(
file_api_v1_user_service_proto_rawDesc
)),
NumEnums
:
1
,
NumEnums
:
1
,
NumMessages
:
2
4
,
NumMessages
:
2
9
,
NumExtensions
:
0
,
NumExtensions
:
0
,
NumServices
:
1
,
NumServices
:
1
,
},
},
...
...
proto/gen/api/v1/user_service.pb.gw.go
View file @
77b7fc44
...
@@ -717,6 +717,84 @@ func local_request_UserService_DeleteUserAccessToken_0(ctx context.Context, mars
...
@@ -717,6 +717,84 @@ func local_request_UserService_DeleteUserAccessToken_0(ctx context.Context, mars
return
msg
,
metadata
,
err
return
msg
,
metadata
,
err
}
}
func
request_UserService_ListUserSessions_0
(
ctx
context
.
Context
,
marshaler
runtime
.
Marshaler
,
client
UserServiceClient
,
req
*
http
.
Request
,
pathParams
map
[
string
]
string
)
(
proto
.
Message
,
runtime
.
ServerMetadata
,
error
)
{
var
(
protoReq
ListUserSessionsRequest
metadata
runtime
.
ServerMetadata
err
error
)
if
req
.
Body
!=
nil
{
_
,
_
=
io
.
Copy
(
io
.
Discard
,
req
.
Body
)
}
val
,
ok
:=
pathParams
[
"parent"
]
if
!
ok
{
return
nil
,
metadata
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"missing parameter %s"
,
"parent"
)
}
protoReq
.
Parent
,
err
=
runtime
.
String
(
val
)
if
err
!=
nil
{
return
nil
,
metadata
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"type mismatch, parameter: %s, error: %v"
,
"parent"
,
err
)
}
msg
,
err
:=
client
.
ListUserSessions
(
ctx
,
&
protoReq
,
grpc
.
Header
(
&
metadata
.
HeaderMD
),
grpc
.
Trailer
(
&
metadata
.
TrailerMD
))
return
msg
,
metadata
,
err
}
func
local_request_UserService_ListUserSessions_0
(
ctx
context
.
Context
,
marshaler
runtime
.
Marshaler
,
server
UserServiceServer
,
req
*
http
.
Request
,
pathParams
map
[
string
]
string
)
(
proto
.
Message
,
runtime
.
ServerMetadata
,
error
)
{
var
(
protoReq
ListUserSessionsRequest
metadata
runtime
.
ServerMetadata
err
error
)
val
,
ok
:=
pathParams
[
"parent"
]
if
!
ok
{
return
nil
,
metadata
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"missing parameter %s"
,
"parent"
)
}
protoReq
.
Parent
,
err
=
runtime
.
String
(
val
)
if
err
!=
nil
{
return
nil
,
metadata
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"type mismatch, parameter: %s, error: %v"
,
"parent"
,
err
)
}
msg
,
err
:=
server
.
ListUserSessions
(
ctx
,
&
protoReq
)
return
msg
,
metadata
,
err
}
func
request_UserService_RevokeUserSession_0
(
ctx
context
.
Context
,
marshaler
runtime
.
Marshaler
,
client
UserServiceClient
,
req
*
http
.
Request
,
pathParams
map
[
string
]
string
)
(
proto
.
Message
,
runtime
.
ServerMetadata
,
error
)
{
var
(
protoReq
RevokeUserSessionRequest
metadata
runtime
.
ServerMetadata
err
error
)
if
req
.
Body
!=
nil
{
_
,
_
=
io
.
Copy
(
io
.
Discard
,
req
.
Body
)
}
val
,
ok
:=
pathParams
[
"name"
]
if
!
ok
{
return
nil
,
metadata
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"missing parameter %s"
,
"name"
)
}
protoReq
.
Name
,
err
=
runtime
.
String
(
val
)
if
err
!=
nil
{
return
nil
,
metadata
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"type mismatch, parameter: %s, error: %v"
,
"name"
,
err
)
}
msg
,
err
:=
client
.
RevokeUserSession
(
ctx
,
&
protoReq
,
grpc
.
Header
(
&
metadata
.
HeaderMD
),
grpc
.
Trailer
(
&
metadata
.
TrailerMD
))
return
msg
,
metadata
,
err
}
func
local_request_UserService_RevokeUserSession_0
(
ctx
context
.
Context
,
marshaler
runtime
.
Marshaler
,
server
UserServiceServer
,
req
*
http
.
Request
,
pathParams
map
[
string
]
string
)
(
proto
.
Message
,
runtime
.
ServerMetadata
,
error
)
{
var
(
protoReq
RevokeUserSessionRequest
metadata
runtime
.
ServerMetadata
err
error
)
val
,
ok
:=
pathParams
[
"name"
]
if
!
ok
{
return
nil
,
metadata
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"missing parameter %s"
,
"name"
)
}
protoReq
.
Name
,
err
=
runtime
.
String
(
val
)
if
err
!=
nil
{
return
nil
,
metadata
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"type mismatch, parameter: %s, error: %v"
,
"name"
,
err
)
}
msg
,
err
:=
server
.
RevokeUserSession
(
ctx
,
&
protoReq
)
return
msg
,
metadata
,
err
}
// RegisterUserServiceHandlerServer registers the http handlers for service UserService to "mux".
// RegisterUserServiceHandlerServer registers the http handlers for service UserService to "mux".
// UnaryRPC :call UserServiceServer directly.
// UnaryRPC :call UserServiceServer directly.
// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
...
@@ -1003,6 +1081,46 @@ func RegisterUserServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux
...
@@ -1003,6 +1081,46 @@ func RegisterUserServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux
}
}
forward_UserService_DeleteUserAccessToken_0
(
annotatedContext
,
mux
,
outboundMarshaler
,
w
,
req
,
resp
,
mux
.
GetForwardResponseOptions
()
...
)
forward_UserService_DeleteUserAccessToken_0
(
annotatedContext
,
mux
,
outboundMarshaler
,
w
,
req
,
resp
,
mux
.
GetForwardResponseOptions
()
...
)
})
})
mux
.
Handle
(
http
.
MethodGet
,
pattern_UserService_ListUserSessions_0
,
func
(
w
http
.
ResponseWriter
,
req
*
http
.
Request
,
pathParams
map
[
string
]
string
)
{
ctx
,
cancel
:=
context
.
WithCancel
(
req
.
Context
())
defer
cancel
()
var
stream
runtime
.
ServerTransportStream
ctx
=
grpc
.
NewContextWithServerTransportStream
(
ctx
,
&
stream
)
inboundMarshaler
,
outboundMarshaler
:=
runtime
.
MarshalerForRequest
(
mux
,
req
)
annotatedContext
,
err
:=
runtime
.
AnnotateIncomingContext
(
ctx
,
mux
,
req
,
"/memos.api.v1.UserService/ListUserSessions"
,
runtime
.
WithHTTPPathPattern
(
"/api/v1/{parent=users/*}/sessions"
))
if
err
!=
nil
{
runtime
.
HTTPError
(
ctx
,
mux
,
outboundMarshaler
,
w
,
req
,
err
)
return
}
resp
,
md
,
err
:=
local_request_UserService_ListUserSessions_0
(
annotatedContext
,
inboundMarshaler
,
server
,
req
,
pathParams
)
md
.
HeaderMD
,
md
.
TrailerMD
=
metadata
.
Join
(
md
.
HeaderMD
,
stream
.
Header
()),
metadata
.
Join
(
md
.
TrailerMD
,
stream
.
Trailer
())
annotatedContext
=
runtime
.
NewServerMetadataContext
(
annotatedContext
,
md
)
if
err
!=
nil
{
runtime
.
HTTPError
(
annotatedContext
,
mux
,
outboundMarshaler
,
w
,
req
,
err
)
return
}
forward_UserService_ListUserSessions_0
(
annotatedContext
,
mux
,
outboundMarshaler
,
w
,
req
,
resp
,
mux
.
GetForwardResponseOptions
()
...
)
})
mux
.
Handle
(
http
.
MethodDelete
,
pattern_UserService_RevokeUserSession_0
,
func
(
w
http
.
ResponseWriter
,
req
*
http
.
Request
,
pathParams
map
[
string
]
string
)
{
ctx
,
cancel
:=
context
.
WithCancel
(
req
.
Context
())
defer
cancel
()
var
stream
runtime
.
ServerTransportStream
ctx
=
grpc
.
NewContextWithServerTransportStream
(
ctx
,
&
stream
)
inboundMarshaler
,
outboundMarshaler
:=
runtime
.
MarshalerForRequest
(
mux
,
req
)
annotatedContext
,
err
:=
runtime
.
AnnotateIncomingContext
(
ctx
,
mux
,
req
,
"/memos.api.v1.UserService/RevokeUserSession"
,
runtime
.
WithHTTPPathPattern
(
"/api/v1/{name=users/*/sessions/*}"
))
if
err
!=
nil
{
runtime
.
HTTPError
(
ctx
,
mux
,
outboundMarshaler
,
w
,
req
,
err
)
return
}
resp
,
md
,
err
:=
local_request_UserService_RevokeUserSession_0
(
annotatedContext
,
inboundMarshaler
,
server
,
req
,
pathParams
)
md
.
HeaderMD
,
md
.
TrailerMD
=
metadata
.
Join
(
md
.
HeaderMD
,
stream
.
Header
()),
metadata
.
Join
(
md
.
TrailerMD
,
stream
.
Trailer
())
annotatedContext
=
runtime
.
NewServerMetadataContext
(
annotatedContext
,
md
)
if
err
!=
nil
{
runtime
.
HTTPError
(
annotatedContext
,
mux
,
outboundMarshaler
,
w
,
req
,
err
)
return
}
forward_UserService_RevokeUserSession_0
(
annotatedContext
,
mux
,
outboundMarshaler
,
w
,
req
,
resp
,
mux
.
GetForwardResponseOptions
()
...
)
})
return
nil
return
nil
}
}
...
@@ -1281,6 +1399,40 @@ func RegisterUserServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux
...
@@ -1281,6 +1399,40 @@ func RegisterUserServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux
}
}
forward_UserService_DeleteUserAccessToken_0
(
annotatedContext
,
mux
,
outboundMarshaler
,
w
,
req
,
resp
,
mux
.
GetForwardResponseOptions
()
...
)
forward_UserService_DeleteUserAccessToken_0
(
annotatedContext
,
mux
,
outboundMarshaler
,
w
,
req
,
resp
,
mux
.
GetForwardResponseOptions
()
...
)
})
})
mux
.
Handle
(
http
.
MethodGet
,
pattern_UserService_ListUserSessions_0
,
func
(
w
http
.
ResponseWriter
,
req
*
http
.
Request
,
pathParams
map
[
string
]
string
)
{
ctx
,
cancel
:=
context
.
WithCancel
(
req
.
Context
())
defer
cancel
()
inboundMarshaler
,
outboundMarshaler
:=
runtime
.
MarshalerForRequest
(
mux
,
req
)
annotatedContext
,
err
:=
runtime
.
AnnotateContext
(
ctx
,
mux
,
req
,
"/memos.api.v1.UserService/ListUserSessions"
,
runtime
.
WithHTTPPathPattern
(
"/api/v1/{parent=users/*}/sessions"
))
if
err
!=
nil
{
runtime
.
HTTPError
(
ctx
,
mux
,
outboundMarshaler
,
w
,
req
,
err
)
return
}
resp
,
md
,
err
:=
request_UserService_ListUserSessions_0
(
annotatedContext
,
inboundMarshaler
,
client
,
req
,
pathParams
)
annotatedContext
=
runtime
.
NewServerMetadataContext
(
annotatedContext
,
md
)
if
err
!=
nil
{
runtime
.
HTTPError
(
annotatedContext
,
mux
,
outboundMarshaler
,
w
,
req
,
err
)
return
}
forward_UserService_ListUserSessions_0
(
annotatedContext
,
mux
,
outboundMarshaler
,
w
,
req
,
resp
,
mux
.
GetForwardResponseOptions
()
...
)
})
mux
.
Handle
(
http
.
MethodDelete
,
pattern_UserService_RevokeUserSession_0
,
func
(
w
http
.
ResponseWriter
,
req
*
http
.
Request
,
pathParams
map
[
string
]
string
)
{
ctx
,
cancel
:=
context
.
WithCancel
(
req
.
Context
())
defer
cancel
()
inboundMarshaler
,
outboundMarshaler
:=
runtime
.
MarshalerForRequest
(
mux
,
req
)
annotatedContext
,
err
:=
runtime
.
AnnotateContext
(
ctx
,
mux
,
req
,
"/memos.api.v1.UserService/RevokeUserSession"
,
runtime
.
WithHTTPPathPattern
(
"/api/v1/{name=users/*/sessions/*}"
))
if
err
!=
nil
{
runtime
.
HTTPError
(
ctx
,
mux
,
outboundMarshaler
,
w
,
req
,
err
)
return
}
resp
,
md
,
err
:=
request_UserService_RevokeUserSession_0
(
annotatedContext
,
inboundMarshaler
,
client
,
req
,
pathParams
)
annotatedContext
=
runtime
.
NewServerMetadataContext
(
annotatedContext
,
md
)
if
err
!=
nil
{
runtime
.
HTTPError
(
annotatedContext
,
mux
,
outboundMarshaler
,
w
,
req
,
err
)
return
}
forward_UserService_RevokeUserSession_0
(
annotatedContext
,
mux
,
outboundMarshaler
,
w
,
req
,
resp
,
mux
.
GetForwardResponseOptions
()
...
)
})
return
nil
return
nil
}
}
...
@@ -1299,6 +1451,8 @@ var (
...
@@ -1299,6 +1451,8 @@ var (
pattern_UserService_ListUserAccessTokens_0
=
runtime
.
MustPattern
(
runtime
.
NewPattern
(
1
,
[]
int
{
2
,
0
,
2
,
1
,
2
,
2
,
1
,
0
,
4
,
2
,
5
,
3
,
2
,
4
},
[]
string
{
"api"
,
"v1"
,
"users"
,
"parent"
,
"accessTokens"
},
""
))
pattern_UserService_ListUserAccessTokens_0
=
runtime
.
MustPattern
(
runtime
.
NewPattern
(
1
,
[]
int
{
2
,
0
,
2
,
1
,
2
,
2
,
1
,
0
,
4
,
2
,
5
,
3
,
2
,
4
},
[]
string
{
"api"
,
"v1"
,
"users"
,
"parent"
,
"accessTokens"
},
""
))
pattern_UserService_CreateUserAccessToken_0
=
runtime
.
MustPattern
(
runtime
.
NewPattern
(
1
,
[]
int
{
2
,
0
,
2
,
1
,
2
,
2
,
1
,
0
,
4
,
2
,
5
,
3
,
2
,
4
},
[]
string
{
"api"
,
"v1"
,
"users"
,
"parent"
,
"accessTokens"
},
""
))
pattern_UserService_CreateUserAccessToken_0
=
runtime
.
MustPattern
(
runtime
.
NewPattern
(
1
,
[]
int
{
2
,
0
,
2
,
1
,
2
,
2
,
1
,
0
,
4
,
2
,
5
,
3
,
2
,
4
},
[]
string
{
"api"
,
"v1"
,
"users"
,
"parent"
,
"accessTokens"
},
""
))
pattern_UserService_DeleteUserAccessToken_0
=
runtime
.
MustPattern
(
runtime
.
NewPattern
(
1
,
[]
int
{
2
,
0
,
2
,
1
,
2
,
2
,
1
,
0
,
2
,
3
,
1
,
0
,
4
,
4
,
5
,
4
},
[]
string
{
"api"
,
"v1"
,
"users"
,
"accessTokens"
,
"name"
},
""
))
pattern_UserService_DeleteUserAccessToken_0
=
runtime
.
MustPattern
(
runtime
.
NewPattern
(
1
,
[]
int
{
2
,
0
,
2
,
1
,
2
,
2
,
1
,
0
,
2
,
3
,
1
,
0
,
4
,
4
,
5
,
4
},
[]
string
{
"api"
,
"v1"
,
"users"
,
"accessTokens"
,
"name"
},
""
))
pattern_UserService_ListUserSessions_0
=
runtime
.
MustPattern
(
runtime
.
NewPattern
(
1
,
[]
int
{
2
,
0
,
2
,
1
,
2
,
2
,
1
,
0
,
4
,
2
,
5
,
3
,
2
,
4
},
[]
string
{
"api"
,
"v1"
,
"users"
,
"parent"
,
"sessions"
},
""
))
pattern_UserService_RevokeUserSession_0
=
runtime
.
MustPattern
(
runtime
.
NewPattern
(
1
,
[]
int
{
2
,
0
,
2
,
1
,
2
,
2
,
1
,
0
,
2
,
3
,
1
,
0
,
4
,
4
,
5
,
4
},
[]
string
{
"api"
,
"v1"
,
"users"
,
"sessions"
,
"name"
},
""
))
)
)
var
(
var
(
...
@@ -1316,4 +1470,6 @@ var (
...
@@ -1316,4 +1470,6 @@ var (
forward_UserService_ListUserAccessTokens_0
=
runtime
.
ForwardResponseMessage
forward_UserService_ListUserAccessTokens_0
=
runtime
.
ForwardResponseMessage
forward_UserService_CreateUserAccessToken_0
=
runtime
.
ForwardResponseMessage
forward_UserService_CreateUserAccessToken_0
=
runtime
.
ForwardResponseMessage
forward_UserService_DeleteUserAccessToken_0
=
runtime
.
ForwardResponseMessage
forward_UserService_DeleteUserAccessToken_0
=
runtime
.
ForwardResponseMessage
forward_UserService_ListUserSessions_0
=
runtime
.
ForwardResponseMessage
forward_UserService_RevokeUserSession_0
=
runtime
.
ForwardResponseMessage
)
)
proto/gen/api/v1/user_service_grpc.pb.go
View file @
77b7fc44
...
@@ -35,6 +35,8 @@ const (
...
@@ -35,6 +35,8 @@ const (
UserService_ListUserAccessTokens_FullMethodName
=
"/memos.api.v1.UserService/ListUserAccessTokens"
UserService_ListUserAccessTokens_FullMethodName
=
"/memos.api.v1.UserService/ListUserAccessTokens"
UserService_CreateUserAccessToken_FullMethodName
=
"/memos.api.v1.UserService/CreateUserAccessToken"
UserService_CreateUserAccessToken_FullMethodName
=
"/memos.api.v1.UserService/CreateUserAccessToken"
UserService_DeleteUserAccessToken_FullMethodName
=
"/memos.api.v1.UserService/DeleteUserAccessToken"
UserService_DeleteUserAccessToken_FullMethodName
=
"/memos.api.v1.UserService/DeleteUserAccessToken"
UserService_ListUserSessions_FullMethodName
=
"/memos.api.v1.UserService/ListUserSessions"
UserService_RevokeUserSession_FullMethodName
=
"/memos.api.v1.UserService/RevokeUserSession"
)
)
// UserServiceClient is the client API for UserService service.
// UserServiceClient is the client API for UserService service.
...
@@ -69,6 +71,10 @@ type UserServiceClient interface {
...
@@ -69,6 +71,10 @@ type UserServiceClient interface {
CreateUserAccessToken
(
ctx
context
.
Context
,
in
*
CreateUserAccessTokenRequest
,
opts
...
grpc
.
CallOption
)
(
*
UserAccessToken
,
error
)
CreateUserAccessToken
(
ctx
context
.
Context
,
in
*
CreateUserAccessTokenRequest
,
opts
...
grpc
.
CallOption
)
(
*
UserAccessToken
,
error
)
// DeleteUserAccessToken deletes an access token.
// DeleteUserAccessToken deletes an access token.
DeleteUserAccessToken
(
ctx
context
.
Context
,
in
*
DeleteUserAccessTokenRequest
,
opts
...
grpc
.
CallOption
)
(
*
emptypb
.
Empty
,
error
)
DeleteUserAccessToken
(
ctx
context
.
Context
,
in
*
DeleteUserAccessTokenRequest
,
opts
...
grpc
.
CallOption
)
(
*
emptypb
.
Empty
,
error
)
// ListUserSessions returns a list of active sessions for a user.
ListUserSessions
(
ctx
context
.
Context
,
in
*
ListUserSessionsRequest
,
opts
...
grpc
.
CallOption
)
(
*
ListUserSessionsResponse
,
error
)
// RevokeUserSession revokes a specific session for a user.
RevokeUserSession
(
ctx
context
.
Context
,
in
*
RevokeUserSessionRequest
,
opts
...
grpc
.
CallOption
)
(
*
emptypb
.
Empty
,
error
)
}
}
type
userServiceClient
struct
{
type
userServiceClient
struct
{
...
@@ -219,6 +225,26 @@ func (c *userServiceClient) DeleteUserAccessToken(ctx context.Context, in *Delet
...
@@ -219,6 +225,26 @@ func (c *userServiceClient) DeleteUserAccessToken(ctx context.Context, in *Delet
return
out
,
nil
return
out
,
nil
}
}
func
(
c
*
userServiceClient
)
ListUserSessions
(
ctx
context
.
Context
,
in
*
ListUserSessionsRequest
,
opts
...
grpc
.
CallOption
)
(
*
ListUserSessionsResponse
,
error
)
{
cOpts
:=
append
([]
grpc
.
CallOption
{
grpc
.
StaticMethod
()},
opts
...
)
out
:=
new
(
ListUserSessionsResponse
)
err
:=
c
.
cc
.
Invoke
(
ctx
,
UserService_ListUserSessions_FullMethodName
,
in
,
out
,
cOpts
...
)
if
err
!=
nil
{
return
nil
,
err
}
return
out
,
nil
}
func
(
c
*
userServiceClient
)
RevokeUserSession
(
ctx
context
.
Context
,
in
*
RevokeUserSessionRequest
,
opts
...
grpc
.
CallOption
)
(
*
emptypb
.
Empty
,
error
)
{
cOpts
:=
append
([]
grpc
.
CallOption
{
grpc
.
StaticMethod
()},
opts
...
)
out
:=
new
(
emptypb
.
Empty
)
err
:=
c
.
cc
.
Invoke
(
ctx
,
UserService_RevokeUserSession_FullMethodName
,
in
,
out
,
cOpts
...
)
if
err
!=
nil
{
return
nil
,
err
}
return
out
,
nil
}
// UserServiceServer is the server API for UserService service.
// UserServiceServer is the server API for UserService service.
// All implementations must embed UnimplementedUserServiceServer
// All implementations must embed UnimplementedUserServiceServer
// for forward compatibility.
// for forward compatibility.
...
@@ -251,6 +277,10 @@ type UserServiceServer interface {
...
@@ -251,6 +277,10 @@ type UserServiceServer interface {
CreateUserAccessToken
(
context
.
Context
,
*
CreateUserAccessTokenRequest
)
(
*
UserAccessToken
,
error
)
CreateUserAccessToken
(
context
.
Context
,
*
CreateUserAccessTokenRequest
)
(
*
UserAccessToken
,
error
)
// DeleteUserAccessToken deletes an access token.
// DeleteUserAccessToken deletes an access token.
DeleteUserAccessToken
(
context
.
Context
,
*
DeleteUserAccessTokenRequest
)
(
*
emptypb
.
Empty
,
error
)
DeleteUserAccessToken
(
context
.
Context
,
*
DeleteUserAccessTokenRequest
)
(
*
emptypb
.
Empty
,
error
)
// ListUserSessions returns a list of active sessions for a user.
ListUserSessions
(
context
.
Context
,
*
ListUserSessionsRequest
)
(
*
ListUserSessionsResponse
,
error
)
// RevokeUserSession revokes a specific session for a user.
RevokeUserSession
(
context
.
Context
,
*
RevokeUserSessionRequest
)
(
*
emptypb
.
Empty
,
error
)
mustEmbedUnimplementedUserServiceServer
()
mustEmbedUnimplementedUserServiceServer
()
}
}
...
@@ -303,6 +333,12 @@ func (UnimplementedUserServiceServer) CreateUserAccessToken(context.Context, *Cr
...
@@ -303,6 +333,12 @@ func (UnimplementedUserServiceServer) CreateUserAccessToken(context.Context, *Cr
func
(
UnimplementedUserServiceServer
)
DeleteUserAccessToken
(
context
.
Context
,
*
DeleteUserAccessTokenRequest
)
(
*
emptypb
.
Empty
,
error
)
{
func
(
UnimplementedUserServiceServer
)
DeleteUserAccessToken
(
context
.
Context
,
*
DeleteUserAccessTokenRequest
)
(
*
emptypb
.
Empty
,
error
)
{
return
nil
,
status
.
Errorf
(
codes
.
Unimplemented
,
"method DeleteUserAccessToken not implemented"
)
return
nil
,
status
.
Errorf
(
codes
.
Unimplemented
,
"method DeleteUserAccessToken not implemented"
)
}
}
func
(
UnimplementedUserServiceServer
)
ListUserSessions
(
context
.
Context
,
*
ListUserSessionsRequest
)
(
*
ListUserSessionsResponse
,
error
)
{
return
nil
,
status
.
Errorf
(
codes
.
Unimplemented
,
"method ListUserSessions not implemented"
)
}
func
(
UnimplementedUserServiceServer
)
RevokeUserSession
(
context
.
Context
,
*
RevokeUserSessionRequest
)
(
*
emptypb
.
Empty
,
error
)
{
return
nil
,
status
.
Errorf
(
codes
.
Unimplemented
,
"method RevokeUserSession not implemented"
)
}
func
(
UnimplementedUserServiceServer
)
mustEmbedUnimplementedUserServiceServer
()
{}
func
(
UnimplementedUserServiceServer
)
mustEmbedUnimplementedUserServiceServer
()
{}
func
(
UnimplementedUserServiceServer
)
testEmbeddedByValue
()
{}
func
(
UnimplementedUserServiceServer
)
testEmbeddedByValue
()
{}
...
@@ -576,6 +612,42 @@ func _UserService_DeleteUserAccessToken_Handler(srv interface{}, ctx context.Con
...
@@ -576,6 +612,42 @@ func _UserService_DeleteUserAccessToken_Handler(srv interface{}, ctx context.Con
return
interceptor
(
ctx
,
in
,
info
,
handler
)
return
interceptor
(
ctx
,
in
,
info
,
handler
)
}
}
func
_UserService_ListUserSessions_Handler
(
srv
interface
{},
ctx
context
.
Context
,
dec
func
(
interface
{})
error
,
interceptor
grpc
.
UnaryServerInterceptor
)
(
interface
{},
error
)
{
in
:=
new
(
ListUserSessionsRequest
)
if
err
:=
dec
(
in
);
err
!=
nil
{
return
nil
,
err
}
if
interceptor
==
nil
{
return
srv
.
(
UserServiceServer
)
.
ListUserSessions
(
ctx
,
in
)
}
info
:=
&
grpc
.
UnaryServerInfo
{
Server
:
srv
,
FullMethod
:
UserService_ListUserSessions_FullMethodName
,
}
handler
:=
func
(
ctx
context
.
Context
,
req
interface
{})
(
interface
{},
error
)
{
return
srv
.
(
UserServiceServer
)
.
ListUserSessions
(
ctx
,
req
.
(
*
ListUserSessionsRequest
))
}
return
interceptor
(
ctx
,
in
,
info
,
handler
)
}
func
_UserService_RevokeUserSession_Handler
(
srv
interface
{},
ctx
context
.
Context
,
dec
func
(
interface
{})
error
,
interceptor
grpc
.
UnaryServerInterceptor
)
(
interface
{},
error
)
{
in
:=
new
(
RevokeUserSessionRequest
)
if
err
:=
dec
(
in
);
err
!=
nil
{
return
nil
,
err
}
if
interceptor
==
nil
{
return
srv
.
(
UserServiceServer
)
.
RevokeUserSession
(
ctx
,
in
)
}
info
:=
&
grpc
.
UnaryServerInfo
{
Server
:
srv
,
FullMethod
:
UserService_RevokeUserSession_FullMethodName
,
}
handler
:=
func
(
ctx
context
.
Context
,
req
interface
{})
(
interface
{},
error
)
{
return
srv
.
(
UserServiceServer
)
.
RevokeUserSession
(
ctx
,
req
.
(
*
RevokeUserSessionRequest
))
}
return
interceptor
(
ctx
,
in
,
info
,
handler
)
}
// UserService_ServiceDesc is the grpc.ServiceDesc for UserService service.
// UserService_ServiceDesc is the grpc.ServiceDesc for UserService service.
// It's only intended for direct use with grpc.RegisterService,
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
// and not to be introspected or modified (even as a copy)
...
@@ -639,6 +711,14 @@ var UserService_ServiceDesc = grpc.ServiceDesc{
...
@@ -639,6 +711,14 @@ var UserService_ServiceDesc = grpc.ServiceDesc{
MethodName
:
"DeleteUserAccessToken"
,
MethodName
:
"DeleteUserAccessToken"
,
Handler
:
_UserService_DeleteUserAccessToken_Handler
,
Handler
:
_UserService_DeleteUserAccessToken_Handler
,
},
},
{
MethodName
:
"ListUserSessions"
,
Handler
:
_UserService_ListUserSessions_Handler
,
},
{
MethodName
:
"RevokeUserSession"
,
Handler
:
_UserService_RevokeUserSession_Handler
,
},
},
},
Streams
:
[]
grpc
.
StreamDesc
{},
Streams
:
[]
grpc
.
StreamDesc
{},
Metadata
:
"api/v1/user_service.proto"
,
Metadata
:
"api/v1/user_service.proto"
,
...
...
proto/gen/apidocs.swagger.yaml
View file @
77b7fc44
...
@@ -1193,8 +1193,8 @@ paths:
...
@@ -1193,8 +1193,8 @@ paths:
tags
:
tags
:
-
IdentityProviderService
-
IdentityProviderService
delete
:
delete
:
summary
:
DeleteIdentityProvider deletes an identity provid
er.
summary
:
RevokeUserSession revokes a specific session for a us
er.
operationId
:
IdentityProviderService_DeleteIdentityProvider
operationId
:
UserService_RevokeUserSession
responses
:
responses
:
"
200"
:
"
200"
:
description
:
A successful response.
description
:
A successful response.
...
@@ -1208,14 +1208,14 @@ paths:
...
@@ -1208,14 +1208,14 @@ paths:
parameters
:
parameters
:
-
name
:
name_3
-
name
:
name_3
description
:
|-
description
:
|-
Required. The resource name of the
identity provider to delet
e.
Required. The resource name of the
session to revok
e.
Format:
identityProviders/{idp
}
Format:
users/{user}/sessions/{session
}
in: path
in: path
required: true
required: true
type: string
type: string
pattern:
identityProvider
s/[^/]+
pattern:
users/[^/]+/session
s/[^/]+
tags
:
tags
:
-
IdentityProvid
erService
-
Us
erService
/api/v1/{name_4}
:
/api/v1/{name_4}
:
get
:
get
:
summary
:
GetMemo gets a memo.
summary
:
GetMemo gets a memo.
...
@@ -1248,8 +1248,8 @@ paths:
...
@@ -1248,8 +1248,8 @@ paths:
tags
:
tags
:
-
MemoService
-
MemoService
delete
:
delete
:
summary
:
DeleteI
nbox deletes an inbox
.
summary
:
DeleteI
dentityProvider deletes an identity provider
.
operationId
:
I
nboxService_DeleteInbox
operationId
:
I
dentityProviderService_DeleteIdentityProvider
responses
:
responses
:
"
200"
:
"
200"
:
description
:
A successful response.
description
:
A successful response.
...
@@ -1263,14 +1263,14 @@ paths:
...
@@ -1263,14 +1263,14 @@ paths:
parameters
:
parameters
:
-
name
:
name_4
-
name
:
name_4
description
:
|-
description
:
|-
Required. The resource name of the i
nbox
to delete.
Required. The resource name of the i
dentity provider
to delete.
Format: i
nboxes/{inbox
}
Format: i
dentityProviders/{idp
}
in: path
in: path
required: true
required: true
type: string
type: string
pattern: i
nboxe
s/[^/]+
pattern: i
dentityProvider
s/[^/]+
tags
:
tags
:
-
I
nbox
Service
-
I
dentityProvider
Service
/api/v1/{name_5}
:
/api/v1/{name_5}
:
get
:
get
:
summary
:
GetShortcut gets a shortcut by name.
summary
:
GetShortcut gets a shortcut by name.
...
@@ -1296,8 +1296,8 @@ paths:
...
@@ -1296,8 +1296,8 @@ paths:
tags
:
tags
:
-
ShortcutService
-
ShortcutService
delete
:
delete
:
summary
:
Delete
Memo deletes a memo
.
summary
:
Delete
Inbox deletes an inbox
.
operationId
:
MemoService_DeleteMemo
operationId
:
InboxService_DeleteInbox
responses
:
responses
:
"
200"
:
"
200"
:
description
:
A successful response.
description
:
A successful response.
...
@@ -1311,19 +1311,14 @@ paths:
...
@@ -1311,19 +1311,14 @@ paths:
parameters
:
parameters
:
-
name
:
name_5
-
name
:
name_5
description
:
|-
description
:
|-
Required. The resource name of the
memo
to delete.
Required. The resource name of the
inbox
to delete.
Format:
memos/{memo
}
Format:
inboxes/{inbox
}
in: path
in: path
required: true
required: true
type: string
type: string
pattern: memos/[^/]+
pattern: inboxes/[^/]+
-
name
:
force
description
:
Optional. If set to
true
, the memo will be deleted even if it has associated data.
in
:
query
required
:
false
type
:
boolean
tags
:
tags
:
-
Memo
Service
-
Inbox
Service
/api/v1/{name_6}
:
/api/v1/{name_6}
:
get
:
get
:
summary
:
GetWebhook gets a webhook by name.
summary
:
GetWebhook gets a webhook by name.
...
@@ -1356,8 +1351,8 @@ paths:
...
@@ -1356,8 +1351,8 @@ paths:
tags
:
tags
:
-
WebhookService
-
WebhookService
delete
:
delete
:
summary
:
DeleteMemo
Reaction deletes a reaction for
a memo.
summary
:
DeleteMemo
deletes
a memo.
operationId
:
MemoService_DeleteMemo
Reaction
operationId
:
MemoService_DeleteMemo
responses
:
responses
:
"
200"
:
"
200"
:
description
:
A successful response.
description
:
A successful response.
...
@@ -1371,12 +1366,17 @@ paths:
...
@@ -1371,12 +1366,17 @@ paths:
parameters
:
parameters
:
-
name
:
name_6
-
name
:
name_6
description
:
|-
description
:
|-
Required. The resource name of the
reaction
to delete.
Required. The resource name of the
memo
to delete.
Format:
reactions/{reaction
}
Format:
memos/{memo
}
in: path
in: path
required: true
required: true
type: string
type: string
pattern: reactions/[^/]+
pattern: memos/[^/]+
-
name
:
force
description
:
Optional. If set to
true
, the memo will be deleted even if it has associated data.
in
:
query
required
:
false
type
:
boolean
tags
:
tags
:
-
MemoService
-
MemoService
/api/v1/{name_7}
:
/api/v1/{name_7}
:
...
@@ -1403,6 +1403,31 @@ paths:
...
@@ -1403,6 +1403,31 @@ paths:
pattern: workspace/settings/[^/]+
pattern: workspace/settings/[^/]+
tags
:
tags
:
-
WorkspaceService
-
WorkspaceService
delete
:
summary
:
DeleteMemoReaction deletes a reaction for a memo.
operationId
:
MemoService_DeleteMemoReaction
responses
:
"
200"
:
description
:
A successful response.
schema
:
type
:
object
properties
:
{}
default
:
description
:
An unexpected error response.
schema
:
$ref
:
'
#/definitions/googlerpcStatus'
parameters
:
-
name
:
name_7
description
:
|-
Required. The resource name of the reaction to delete.
Format: reactions/{reaction}
in: path
required: true
type: string
pattern: reactions/[^/]+
tags
:
-
MemoService
/api/v1/{name_8}
:
delete
:
delete
:
summary
:
DeleteShortcut deletes a shortcut for a user.
summary
:
DeleteShortcut deletes a shortcut for a user.
operationId
:
ShortcutService_DeleteShortcut
operationId
:
ShortcutService_DeleteShortcut
...
@@ -1417,7 +1442,7 @@ paths:
...
@@ -1417,7 +1442,7 @@ paths:
schema
:
schema
:
$ref
:
'
#/definitions/googlerpcStatus'
$ref
:
'
#/definitions/googlerpcStatus'
parameters
:
parameters
:
-
name
:
name_
7
-
name
:
name_
8
description
:
|-
description
:
|-
Required. The resource name of the shortcut to delete.
Required. The resource name of the shortcut to delete.
Format: users/{user}/shortcuts/{shortcut}
Format: users/{user}/shortcuts/{shortcut}
...
@@ -1427,7 +1452,7 @@ paths:
...
@@ -1427,7 +1452,7 @@ paths:
pattern: users/[^/]+/shortcuts/[^/]+
pattern: users/[^/]+/shortcuts/[^/]+
tags
:
tags
:
-
ShortcutService
-
ShortcutService
/api/v1/{name_
8
}
:
/api/v1/{name_
9
}
:
delete
:
delete
:
summary
:
DeleteWebhook deletes a webhook.
summary
:
DeleteWebhook deletes a webhook.
operationId
:
WebhookService_DeleteWebhook
operationId
:
WebhookService_DeleteWebhook
...
@@ -1442,7 +1467,7 @@ paths:
...
@@ -1442,7 +1467,7 @@ paths:
schema
:
schema
:
$ref
:
'
#/definitions/googlerpcStatus'
$ref
:
'
#/definitions/googlerpcStatus'
parameters
:
parameters
:
-
name
:
name_
8
-
name
:
name_
9
description
:
|-
description
:
|-
Required. The resource name of the webhook to delete.
Required. The resource name of the webhook to delete.
Format: webhooks/{webhook}
Format: webhooks/{webhook}
...
@@ -2054,6 +2079,30 @@ paths:
...
@@ -2054,6 +2079,30 @@ paths:
type: string
type: string
tags
:
tags
:
-
MemoService
-
MemoService
/api/v1/{parent}/sessions
:
get
:
summary
:
ListUserSessions returns a list of active sessions for a user.
operationId
:
UserService_ListUserSessions
responses
:
"
200"
:
description
:
A successful response.
schema
:
$ref
:
'
#/definitions/v1ListUserSessionsResponse'
default
:
description
:
An unexpected error response.
schema
:
$ref
:
'
#/definitions/googlerpcStatus'
parameters
:
-
name
:
parent
description
:
|-
Required. The resource name of the parent.
Format: users/{user}
in: path
required: true
type: string
pattern: users/[^/]+
tags
:
-
UserService
/api/v1/{parent}/shortcuts
:
/api/v1/{parent}/shortcuts
:
get
:
get
:
summary
:
ListShortcuts returns a list of shortcuts for a user.
summary
:
ListShortcuts returns a list of shortcuts for a user.
...
@@ -3676,6 +3725,15 @@ definitions:
...
@@ -3676,6 +3725,15 @@ definitions:
type
:
integer
type
:
integer
format
:
int32
format
:
int32
description
:
The total count of access tokens.
description
:
The total count of access tokens.
v1ListUserSessionsResponse
:
type
:
object
properties
:
sessions
:
type
:
array
items
:
type
:
object
$ref
:
'
#/definitions/v1UserSession'
description
:
The list of user sessions.
v1ListUsersResponse
:
v1ListUsersResponse
:
type
:
object
type
:
object
properties
:
properties
:
...
@@ -4233,6 +4291,58 @@ definitions:
...
@@ -4233,6 +4291,58 @@ definitions:
format
:
date-time
format
:
date-time
description
:
Optional. The expiration timestamp.
description
:
Optional. The expiration timestamp.
title
:
User access token message
title
:
User access token message
v1UserSession
:
type
:
object
properties
:
name
:
type
:
string
title
:
|-
The resource name of the session.
Format: users/{user}/sessions/{session}
sessionId
:
type
:
string
description
:
The session ID.
readOnly
:
true
createTime
:
type
:
string
format
:
date-time
description
:
The timestamp when the session was created.
readOnly
:
true
expireTime
:
type
:
string
format
:
date-time
description
:
The timestamp when the session expires.
readOnly
:
true
lastAccessedTime
:
type
:
string
format
:
date-time
description
:
The timestamp when the session was last accessed.
readOnly
:
true
clientInfo
:
$ref
:
'
#/definitions/v1UserSessionClientInfo'
description
:
Client information associated with this session.
readOnly
:
true
v1UserSessionClientInfo
:
type
:
object
properties
:
userAgent
:
type
:
string
description
:
User agent string of the client.
ipAddress
:
type
:
string
description
:
IP address of the client.
deviceType
:
type
:
string
description
:
Optional. Device type (e.g., "mobile", "desktop", "tablet").
os
:
type
:
string
description
:
Optional. Operating system (e.g., "iOS 17.0", "Windows 11").
browser
:
type
:
string
description
:
Optional. Browser name and version (e.g., "Chrome 119.0").
country
:
type
:
string
description
:
Optional. Geographic location (country code, e.g., "US").
v1UserStats
:
v1UserStats
:
type
:
object
type
:
object
properties
:
properties
:
...
...
server/router/api/v1/auth_service.go
View file @
77b7fc44
...
@@ -15,6 +15,7 @@ import (
...
@@ -15,6 +15,7 @@ import (
"google.golang.org/grpc/metadata"
"google.golang.org/grpc/metadata"
"google.golang.org/grpc/status"
"google.golang.org/grpc/status"
"google.golang.org/protobuf/types/known/emptypb"
"google.golang.org/protobuf/types/known/emptypb"
"google.golang.org/protobuf/types/known/timestamppb"
"github.com/usememos/memos/internal/base"
"github.com/usememos/memos/internal/base"
"github.com/usememos/memos/internal/util"
"github.com/usememos/memos/internal/util"
...
@@ -176,6 +177,13 @@ func (s *APIV1Service) doSignIn(ctx context.Context, user *store.User, expireTim
...
@@ -176,6 +177,13 @@ func (s *APIV1Service) doSignIn(ctx context.Context, user *store.User, expireTim
return
status
.
Errorf
(
codes
.
Internal
,
"failed to upsert access token to store, error: %v"
,
err
)
return
status
.
Errorf
(
codes
.
Internal
,
"failed to upsert access token to store, error: %v"
,
err
)
}
}
// Track session in user settings
if
err
:=
s
.
trackUserSession
(
ctx
,
user
.
ID
,
accessToken
,
expireTime
);
err
!=
nil
{
// Log the error but don't fail the login if session tracking fails
// This ensures backward compatibility
// TODO: Add proper logging here
}
cookie
,
err
:=
s
.
buildAccessTokenCookie
(
ctx
,
accessToken
,
expireTime
)
cookie
,
err
:=
s
.
buildAccessTokenCookie
(
ctx
,
accessToken
,
expireTime
)
if
err
!=
nil
{
if
err
!=
nil
{
return
status
.
Errorf
(
codes
.
Internal
,
"failed to build access token cookie, error: %v"
,
err
)
return
status
.
Errorf
(
codes
.
Internal
,
"failed to build access token cookie, error: %v"
,
err
)
...
@@ -313,3 +321,41 @@ func (s *APIV1Service) GetCurrentUser(ctx context.Context) (*store.User, error)
...
@@ -313,3 +321,41 @@ func (s *APIV1Service) GetCurrentUser(ctx context.Context) (*store.User, error)
}
}
return
user
,
nil
return
user
,
nil
}
}
// Helper function to track user session for session management
func
(
s
*
APIV1Service
)
trackUserSession
(
ctx
context
.
Context
,
userID
int32
,
sessionID
string
,
expireTime
time
.
Time
)
error
{
// Extract client information from the context
clientInfo
:=
s
.
extractClientInfo
(
ctx
)
session
:=
&
storepb
.
SessionsUserSetting_Session
{
SessionId
:
sessionID
,
CreateTime
:
timestamppb
.
Now
(),
ExpireTime
:
timestamppb
.
New
(
expireTime
),
LastAccessedTime
:
timestamppb
.
Now
(),
ClientInfo
:
clientInfo
,
}
return
s
.
Store
.
AddUserSession
(
ctx
,
userID
,
session
)
}
// Helper function to extract client information from the gRPC context
func
(
s
*
APIV1Service
)
extractClientInfo
(
ctx
context
.
Context
)
*
storepb
.
SessionsUserSetting_ClientInfo
{
clientInfo
:=
&
storepb
.
SessionsUserSetting_ClientInfo
{}
// Extract user agent from metadata if available
if
md
,
ok
:=
metadata
.
FromIncomingContext
(
ctx
);
ok
{
if
userAgents
:=
md
.
Get
(
"user-agent"
);
len
(
userAgents
)
>
0
{
clientInfo
.
UserAgent
=
userAgents
[
0
]
}
if
forwardedFor
:=
md
.
Get
(
"x-forwarded-for"
);
len
(
forwardedFor
)
>
0
{
clientInfo
.
IpAddress
=
forwardedFor
[
0
]
}
else
if
realIP
:=
md
.
Get
(
"x-real-ip"
);
len
(
realIP
)
>
0
{
clientInfo
.
IpAddress
=
realIP
[
0
]
}
}
// TODO: Parse user agent to extract device type, OS, browser info
// This could be done using a user agent parsing library
return
clientInfo
}
server/router/api/v1/user_service.go
View file @
77b7fc44
...
@@ -588,6 +588,108 @@ func (s *APIV1Service) DeleteUserAccessToken(ctx context.Context, request *v1pb.
...
@@ -588,6 +588,108 @@ func (s *APIV1Service) DeleteUserAccessToken(ctx context.Context, request *v1pb.
return
&
emptypb
.
Empty
{},
nil
return
&
emptypb
.
Empty
{},
nil
}
}
func
(
s
*
APIV1Service
)
ListUserSessions
(
ctx
context
.
Context
,
request
*
v1pb
.
ListUserSessionsRequest
)
(
*
v1pb
.
ListUserSessionsResponse
,
error
)
{
userID
,
err
:=
ExtractUserIDFromName
(
request
.
Parent
)
if
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"invalid user name: %v"
,
err
)
}
currentUser
,
err
:=
s
.
GetCurrentUser
(
ctx
)
if
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
Internal
,
"failed to get current user: %v"
,
err
)
}
if
currentUser
==
nil
{
return
nil
,
status
.
Errorf
(
codes
.
PermissionDenied
,
"permission denied"
)
}
if
currentUser
.
ID
!=
userID
{
return
nil
,
status
.
Errorf
(
codes
.
PermissionDenied
,
"permission denied"
)
}
userSessions
,
err
:=
s
.
Store
.
GetUserSessions
(
ctx
,
userID
)
if
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
Internal
,
"failed to list sessions: %v"
,
err
)
}
sessions
:=
[]
*
v1pb
.
UserSession
{}
for
_
,
userSession
:=
range
userSessions
{
sessionResponse
:=
&
v1pb
.
UserSession
{
Name
:
fmt
.
Sprintf
(
"users/%d/sessions/%s"
,
userID
,
userSession
.
SessionId
),
SessionId
:
userSession
.
SessionId
,
CreateTime
:
userSession
.
CreateTime
,
ExpireTime
:
userSession
.
ExpireTime
,
LastAccessedTime
:
userSession
.
LastAccessedTime
,
}
if
userSession
.
ClientInfo
!=
nil
{
sessionResponse
.
ClientInfo
=
&
v1pb
.
UserSession_ClientInfo
{
UserAgent
:
userSession
.
ClientInfo
.
UserAgent
,
IpAddress
:
userSession
.
ClientInfo
.
IpAddress
,
DeviceType
:
userSession
.
ClientInfo
.
DeviceType
,
Os
:
userSession
.
ClientInfo
.
Os
,
Browser
:
userSession
.
ClientInfo
.
Browser
,
Country
:
userSession
.
ClientInfo
.
Country
,
}
}
sessions
=
append
(
sessions
,
sessionResponse
)
}
// Sort by last accessed time in descending order.
slices
.
SortFunc
(
sessions
,
func
(
i
,
j
*
v1pb
.
UserSession
)
int
{
return
int
(
j
.
LastAccessedTime
.
Seconds
-
i
.
LastAccessedTime
.
Seconds
)
})
response
:=
&
v1pb
.
ListUserSessionsResponse
{
Sessions
:
sessions
,
}
return
response
,
nil
}
func
(
s
*
APIV1Service
)
RevokeUserSession
(
ctx
context
.
Context
,
request
*
v1pb
.
RevokeUserSessionRequest
)
(
*
emptypb
.
Empty
,
error
)
{
// Extract user ID and session ID from the session resource name
// Format: users/{user}/sessions/{session}
parts
:=
strings
.
Split
(
request
.
Name
,
"/"
)
if
len
(
parts
)
!=
4
||
parts
[
0
]
!=
"users"
||
parts
[
2
]
!=
"sessions"
{
return
nil
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"invalid session name format: %s"
,
request
.
Name
)
}
userID
,
err
:=
ExtractUserIDFromName
(
fmt
.
Sprintf
(
"users/%s"
,
parts
[
1
]))
if
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"invalid user name: %v"
,
err
)
}
sessionIDToRevoke
:=
parts
[
3
]
currentUser
,
err
:=
s
.
GetCurrentUser
(
ctx
)
if
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
Internal
,
"failed to get current user: %v"
,
err
)
}
if
currentUser
==
nil
{
return
nil
,
status
.
Errorf
(
codes
.
PermissionDenied
,
"permission denied"
)
}
if
currentUser
.
ID
!=
userID
{
return
nil
,
status
.
Errorf
(
codes
.
PermissionDenied
,
"permission denied"
)
}
if
err
:=
s
.
Store
.
RemoveUserSession
(
ctx
,
userID
,
sessionIDToRevoke
);
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
Internal
,
"failed to revoke session: %v"
,
err
)
}
return
&
emptypb
.
Empty
{},
nil
}
// Helper function to add or update a user session
func
(
s
*
APIV1Service
)
UpsertUserSession
(
ctx
context
.
Context
,
userID
int32
,
sessionID
string
,
clientInfo
*
storepb
.
SessionsUserSetting_ClientInfo
)
error
{
session
:=
&
storepb
.
SessionsUserSetting_Session
{
SessionId
:
sessionID
,
CreateTime
:
timestamppb
.
Now
(),
ExpireTime
:
timestamppb
.
New
(
time
.
Now
()
.
Add
(
30
*
24
*
time
.
Hour
)),
// 30 days default
LastAccessedTime
:
timestamppb
.
Now
(),
ClientInfo
:
clientInfo
,
}
return
s
.
Store
.
AddUserSession
(
ctx
,
userID
,
session
)
}
func
(
s
*
APIV1Service
)
UpsertAccessTokenToStore
(
ctx
context
.
Context
,
user
*
store
.
User
,
accessToken
,
description
string
)
error
{
func
(
s
*
APIV1Service
)
UpsertAccessTokenToStore
(
ctx
context
.
Context
,
user
*
store
.
User
,
accessToken
,
description
string
)
error
{
userAccessTokens
,
err
:=
s
.
Store
.
GetUserAccessTokens
(
ctx
,
user
.
ID
)
userAccessTokens
,
err
:=
s
.
Store
.
GetUserAccessTokens
(
ctx
,
user
.
ID
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -598,6 +700,7 @@ func (s *APIV1Service) UpsertAccessTokenToStore(ctx context.Context, user *store
...
@@ -598,6 +700,7 @@ func (s *APIV1Service) UpsertAccessTokenToStore(ctx context.Context, user *store
Description
:
description
,
Description
:
description
,
}
}
userAccessTokens
=
append
(
userAccessTokens
,
&
userAccessToken
)
userAccessTokens
=
append
(
userAccessTokens
,
&
userAccessToken
)
if
_
,
err
:=
s
.
Store
.
UpsertUserSetting
(
ctx
,
&
storepb
.
UserSetting
{
if
_
,
err
:=
s
.
Store
.
UpsertUserSetting
(
ctx
,
&
storepb
.
UserSetting
{
UserId
:
user
.
ID
,
UserId
:
user
.
ID
,
Key
:
storepb
.
UserSettingKey_ACCESS_TOKENS
,
Key
:
storepb
.
UserSettingKey_ACCESS_TOKENS
,
...
...
store/user_setting.go
View file @
77b7fc44
...
@@ -5,6 +5,7 @@ import (
...
@@ -5,6 +5,7 @@ import (
"github.com/pkg/errors"
"github.com/pkg/errors"
"google.golang.org/protobuf/encoding/protojson"
"google.golang.org/protobuf/encoding/protojson"
"google.golang.org/protobuf/types/known/timestamppb"
storepb
"github.com/usememos/memos/proto/gen/store"
storepb
"github.com/usememos/memos/proto/gen/store"
)
)
...
@@ -132,6 +133,114 @@ func (s *Store) RemoveUserAccessToken(ctx context.Context, userID int32, token s
...
@@ -132,6 +133,114 @@ func (s *Store) RemoveUserAccessToken(ctx context.Context, userID int32, token s
return
err
return
err
}
}
// GetUserSessions returns the sessions of the user.
func
(
s
*
Store
)
GetUserSessions
(
ctx
context
.
Context
,
userID
int32
)
([]
*
storepb
.
SessionsUserSetting_Session
,
error
)
{
userSetting
,
err
:=
s
.
GetUserSetting
(
ctx
,
&
FindUserSetting
{
UserID
:
&
userID
,
Key
:
storepb
.
UserSettingKey_SESSIONS
,
})
if
err
!=
nil
{
return
nil
,
err
}
if
userSetting
==
nil
{
return
[]
*
storepb
.
SessionsUserSetting_Session
{},
nil
}
sessionsUserSetting
:=
userSetting
.
GetSessions
()
return
sessionsUserSetting
.
Sessions
,
nil
}
// RemoveUserSession removes the session of the user.
func
(
s
*
Store
)
RemoveUserSession
(
ctx
context
.
Context
,
userID
int32
,
sessionID
string
)
error
{
oldSessions
,
err
:=
s
.
GetUserSessions
(
ctx
,
userID
)
if
err
!=
nil
{
return
err
}
newSessions
:=
make
([]
*
storepb
.
SessionsUserSetting_Session
,
0
,
len
(
oldSessions
))
for
_
,
session
:=
range
oldSessions
{
if
sessionID
!=
session
.
SessionId
{
newSessions
=
append
(
newSessions
,
session
)
}
}
_
,
err
=
s
.
UpsertUserSetting
(
ctx
,
&
storepb
.
UserSetting
{
UserId
:
userID
,
Key
:
storepb
.
UserSettingKey_SESSIONS
,
Value
:
&
storepb
.
UserSetting_Sessions
{
Sessions
:
&
storepb
.
SessionsUserSetting
{
Sessions
:
newSessions
,
},
},
})
return
err
}
// AddUserSession adds a new session for the user.
func
(
s
*
Store
)
AddUserSession
(
ctx
context
.
Context
,
userID
int32
,
session
*
storepb
.
SessionsUserSetting_Session
)
error
{
existingSessions
,
err
:=
s
.
GetUserSessions
(
ctx
,
userID
)
if
err
!=
nil
{
return
err
}
// Check if session already exists, update if it does
var
updatedSessions
[]
*
storepb
.
SessionsUserSetting_Session
sessionExists
:=
false
for
_
,
existing
:=
range
existingSessions
{
if
existing
.
SessionId
==
session
.
SessionId
{
updatedSessions
=
append
(
updatedSessions
,
session
)
sessionExists
=
true
}
else
{
updatedSessions
=
append
(
updatedSessions
,
existing
)
}
}
// If session doesn't exist, add it
if
!
sessionExists
{
updatedSessions
=
append
(
updatedSessions
,
session
)
}
_
,
err
=
s
.
UpsertUserSetting
(
ctx
,
&
storepb
.
UserSetting
{
UserId
:
userID
,
Key
:
storepb
.
UserSettingKey_SESSIONS
,
Value
:
&
storepb
.
UserSetting_Sessions
{
Sessions
:
&
storepb
.
SessionsUserSetting
{
Sessions
:
updatedSessions
,
},
},
})
return
err
}
// UpdateUserSessionLastAccessed updates the last accessed time of a session.
func
(
s
*
Store
)
UpdateUserSessionLastAccessed
(
ctx
context
.
Context
,
userID
int32
,
sessionID
string
,
lastAccessedTime
*
timestamppb
.
Timestamp
)
error
{
sessions
,
err
:=
s
.
GetUserSessions
(
ctx
,
userID
)
if
err
!=
nil
{
return
err
}
for
_
,
session
:=
range
sessions
{
if
session
.
SessionId
==
sessionID
{
session
.
LastAccessedTime
=
lastAccessedTime
break
}
}
_
,
err
=
s
.
UpsertUserSetting
(
ctx
,
&
storepb
.
UserSetting
{
UserId
:
userID
,
Key
:
storepb
.
UserSettingKey_SESSIONS
,
Value
:
&
storepb
.
UserSetting_Sessions
{
Sessions
:
&
storepb
.
SessionsUserSetting
{
Sessions
:
sessions
,
},
},
})
return
err
}
func
convertUserSettingFromRaw
(
raw
*
UserSetting
)
(
*
storepb
.
UserSetting
,
error
)
{
func
convertUserSettingFromRaw
(
raw
*
UserSetting
)
(
*
storepb
.
UserSetting
,
error
)
{
userSetting
:=
&
storepb
.
UserSetting
{
userSetting
:=
&
storepb
.
UserSetting
{
UserId
:
raw
.
UserID
,
UserId
:
raw
.
UserID
,
...
@@ -145,6 +254,12 @@ func convertUserSettingFromRaw(raw *UserSetting) (*storepb.UserSetting, error) {
...
@@ -145,6 +254,12 @@ func convertUserSettingFromRaw(raw *UserSetting) (*storepb.UserSetting, error) {
return
nil
,
err
return
nil
,
err
}
}
userSetting
.
Value
=
&
storepb
.
UserSetting_AccessTokens
{
AccessTokens
:
accessTokensUserSetting
}
userSetting
.
Value
=
&
storepb
.
UserSetting_AccessTokens
{
AccessTokens
:
accessTokensUserSetting
}
case
storepb
.
UserSettingKey_SESSIONS
:
sessionsUserSetting
:=
&
storepb
.
SessionsUserSetting
{}
if
err
:=
protojsonUnmarshaler
.
Unmarshal
([]
byte
(
raw
.
Value
),
sessionsUserSetting
);
err
!=
nil
{
return
nil
,
err
}
userSetting
.
Value
=
&
storepb
.
UserSetting_Sessions
{
Sessions
:
sessionsUserSetting
}
case
storepb
.
UserSettingKey_SHORTCUTS
:
case
storepb
.
UserSettingKey_SHORTCUTS
:
shortcutsUserSetting
:=
&
storepb
.
ShortcutsUserSetting
{}
shortcutsUserSetting
:=
&
storepb
.
ShortcutsUserSetting
{}
if
err
:=
protojsonUnmarshaler
.
Unmarshal
([]
byte
(
raw
.
Value
),
shortcutsUserSetting
);
err
!=
nil
{
if
err
:=
protojsonUnmarshaler
.
Unmarshal
([]
byte
(
raw
.
Value
),
shortcutsUserSetting
);
err
!=
nil
{
...
@@ -177,6 +292,13 @@ func convertUserSettingToRaw(userSetting *storepb.UserSetting) (*UserSetting, er
...
@@ -177,6 +292,13 @@ func convertUserSettingToRaw(userSetting *storepb.UserSetting) (*UserSetting, er
return
nil
,
err
return
nil
,
err
}
}
raw
.
Value
=
string
(
value
)
raw
.
Value
=
string
(
value
)
case
storepb
.
UserSettingKey_SESSIONS
:
sessionsUserSetting
:=
userSetting
.
GetSessions
()
value
,
err
:=
protojson
.
Marshal
(
sessionsUserSetting
)
if
err
!=
nil
{
return
nil
,
err
}
raw
.
Value
=
string
(
value
)
case
storepb
.
UserSettingKey_SHORTCUTS
:
case
storepb
.
UserSettingKey_SHORTCUTS
:
shortcutsUserSetting
:=
userSetting
.
GetShortcuts
()
shortcutsUserSetting
:=
userSetting
.
GetShortcuts
()
value
,
err
:=
protojson
.
Marshal
(
shortcutsUserSetting
)
value
,
err
:=
protojson
.
Marshal
(
shortcutsUserSetting
)
...
...
web/src/types/proto/api/v1/user_service.ts
View file @
77b7fc44
...
@@ -359,6 +359,66 @@ export interface DeleteUserAccessTokenRequest {
...
@@ -359,6 +359,66 @@ export interface DeleteUserAccessTokenRequest {
name
:
string
;
name
:
string
;
}
}
export
interface
UserSession
{
/**
* The resource name of the session.
* Format: users/{user}/sessions/{session}
*/
name
:
string
;
/** The session ID. */
sessionId
:
string
;
/** The timestamp when the session was created. */
createTime
?:
|
Date
|
undefined
;
/** The timestamp when the session expires. */
expireTime
?:
|
Date
|
undefined
;
/** The timestamp when the session was last accessed. */
lastAccessedTime
?:
|
Date
|
undefined
;
/** Client information associated with this session. */
clientInfo
?:
UserSession_ClientInfo
|
undefined
;
}
export
interface
UserSession_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
;
/** Optional. Geographic location (country code, e.g., "US"). */
country
:
string
;
}
export
interface
ListUserSessionsRequest
{
/**
* Required. The resource name of the parent.
* Format: users/{user}
*/
parent
:
string
;
}
export
interface
ListUserSessionsResponse
{
/** The list of user sessions. */
sessions
:
UserSession
[];
}
export
interface
RevokeUserSessionRequest
{
/**
* Required. The resource name of the session to revoke.
* Format: users/{user}/sessions/{session}
*/
name
:
string
;
}
export
interface
ListAllUserStatsRequest
{
export
interface
ListAllUserStatsRequest
{
/** Optional. The maximum number of user stats to return. */
/** Optional. The maximum number of user stats to return. */
pageSize
:
number
;
pageSize
:
number
;
...
@@ -2046,6 +2106,365 @@ export const DeleteUserAccessTokenRequest: MessageFns<DeleteUserAccessTokenReque
...
@@ -2046,6 +2106,365 @@ export const DeleteUserAccessTokenRequest: MessageFns<DeleteUserAccessTokenReque
},
},
};
};
function
createBaseUserSession
():
UserSession
{
return
{
name
:
""
,
sessionId
:
""
,
createTime
:
undefined
,
expireTime
:
undefined
,
lastAccessedTime
:
undefined
,
clientInfo
:
undefined
,
};
}
export
const
UserSession
:
MessageFns
<
UserSession
>
=
{
encode
(
message
:
UserSession
,
writer
:
BinaryWriter
=
new
BinaryWriter
()):
BinaryWriter
{
if
(
message
.
name
!==
""
)
{
writer
.
uint32
(
10
).
string
(
message
.
name
);
}
if
(
message
.
sessionId
!==
""
)
{
writer
.
uint32
(
18
).
string
(
message
.
sessionId
);
}
if
(
message
.
createTime
!==
undefined
)
{
Timestamp
.
encode
(
toTimestamp
(
message
.
createTime
),
writer
.
uint32
(
26
).
fork
()).
join
();
}
if
(
message
.
expireTime
!==
undefined
)
{
Timestamp
.
encode
(
toTimestamp
(
message
.
expireTime
),
writer
.
uint32
(
34
).
fork
()).
join
();
}
if
(
message
.
lastAccessedTime
!==
undefined
)
{
Timestamp
.
encode
(
toTimestamp
(
message
.
lastAccessedTime
),
writer
.
uint32
(
42
).
fork
()).
join
();
}
if
(
message
.
clientInfo
!==
undefined
)
{
UserSession_ClientInfo
.
encode
(
message
.
clientInfo
,
writer
.
uint32
(
50
).
fork
()).
join
();
}
return
writer
;
},
decode
(
input
:
BinaryReader
|
Uint8Array
,
length
?:
number
):
UserSession
{
const
reader
=
input
instanceof
BinaryReader
?
input
:
new
BinaryReader
(
input
);
let
end
=
length
===
undefined
?
reader
.
len
:
reader
.
pos
+
length
;
const
message
=
createBaseUserSession
();
while
(
reader
.
pos
<
end
)
{
const
tag
=
reader
.
uint32
();
switch
(
tag
>>>
3
)
{
case
1
:
{
if
(
tag
!==
10
)
{
break
;
}
message
.
name
=
reader
.
string
();
continue
;
}
case
2
:
{
if
(
tag
!==
18
)
{
break
;
}
message
.
sessionId
=
reader
.
string
();
continue
;
}
case
3
:
{
if
(
tag
!==
26
)
{
break
;
}
message
.
createTime
=
fromTimestamp
(
Timestamp
.
decode
(
reader
,
reader
.
uint32
()));
continue
;
}
case
4
:
{
if
(
tag
!==
34
)
{
break
;
}
message
.
expireTime
=
fromTimestamp
(
Timestamp
.
decode
(
reader
,
reader
.
uint32
()));
continue
;
}
case
5
:
{
if
(
tag
!==
42
)
{
break
;
}
message
.
lastAccessedTime
=
fromTimestamp
(
Timestamp
.
decode
(
reader
,
reader
.
uint32
()));
continue
;
}
case
6
:
{
if
(
tag
!==
50
)
{
break
;
}
message
.
clientInfo
=
UserSession_ClientInfo
.
decode
(
reader
,
reader
.
uint32
());
continue
;
}
}
if
((
tag
&
7
)
===
4
||
tag
===
0
)
{
break
;
}
reader
.
skip
(
tag
&
7
);
}
return
message
;
},
create
(
base
?:
DeepPartial
<
UserSession
>
):
UserSession
{
return
UserSession
.
fromPartial
(
base
??
{});
},
fromPartial
(
object
:
DeepPartial
<
UserSession
>
):
UserSession
{
const
message
=
createBaseUserSession
();
message
.
name
=
object
.
name
??
""
;
message
.
sessionId
=
object
.
sessionId
??
""
;
message
.
createTime
=
object
.
createTime
??
undefined
;
message
.
expireTime
=
object
.
expireTime
??
undefined
;
message
.
lastAccessedTime
=
object
.
lastAccessedTime
??
undefined
;
message
.
clientInfo
=
(
object
.
clientInfo
!==
undefined
&&
object
.
clientInfo
!==
null
)
?
UserSession_ClientInfo
.
fromPartial
(
object
.
clientInfo
)
:
undefined
;
return
message
;
},
};
function
createBaseUserSession_ClientInfo
():
UserSession_ClientInfo
{
return
{
userAgent
:
""
,
ipAddress
:
""
,
deviceType
:
""
,
os
:
""
,
browser
:
""
,
country
:
""
};
}
export
const
UserSession_ClientInfo
:
MessageFns
<
UserSession_ClientInfo
>
=
{
encode
(
message
:
UserSession_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
);
}
if
(
message
.
country
!==
""
)
{
writer
.
uint32
(
50
).
string
(
message
.
country
);
}
return
writer
;
},
decode
(
input
:
BinaryReader
|
Uint8Array
,
length
?:
number
):
UserSession_ClientInfo
{
const
reader
=
input
instanceof
BinaryReader
?
input
:
new
BinaryReader
(
input
);
let
end
=
length
===
undefined
?
reader
.
len
:
reader
.
pos
+
length
;
const
message
=
createBaseUserSession_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
;
}
case
6
:
{
if
(
tag
!==
50
)
{
break
;
}
message
.
country
=
reader
.
string
();
continue
;
}
}
if
((
tag
&
7
)
===
4
||
tag
===
0
)
{
break
;
}
reader
.
skip
(
tag
&
7
);
}
return
message
;
},
create
(
base
?:
DeepPartial
<
UserSession_ClientInfo
>
):
UserSession_ClientInfo
{
return
UserSession_ClientInfo
.
fromPartial
(
base
??
{});
},
fromPartial
(
object
:
DeepPartial
<
UserSession_ClientInfo
>
):
UserSession_ClientInfo
{
const
message
=
createBaseUserSession_ClientInfo
();
message
.
userAgent
=
object
.
userAgent
??
""
;
message
.
ipAddress
=
object
.
ipAddress
??
""
;
message
.
deviceType
=
object
.
deviceType
??
""
;
message
.
os
=
object
.
os
??
""
;
message
.
browser
=
object
.
browser
??
""
;
message
.
country
=
object
.
country
??
""
;
return
message
;
},
};
function
createBaseListUserSessionsRequest
():
ListUserSessionsRequest
{
return
{
parent
:
""
};
}
export
const
ListUserSessionsRequest
:
MessageFns
<
ListUserSessionsRequest
>
=
{
encode
(
message
:
ListUserSessionsRequest
,
writer
:
BinaryWriter
=
new
BinaryWriter
()):
BinaryWriter
{
if
(
message
.
parent
!==
""
)
{
writer
.
uint32
(
10
).
string
(
message
.
parent
);
}
return
writer
;
},
decode
(
input
:
BinaryReader
|
Uint8Array
,
length
?:
number
):
ListUserSessionsRequest
{
const
reader
=
input
instanceof
BinaryReader
?
input
:
new
BinaryReader
(
input
);
let
end
=
length
===
undefined
?
reader
.
len
:
reader
.
pos
+
length
;
const
message
=
createBaseListUserSessionsRequest
();
while
(
reader
.
pos
<
end
)
{
const
tag
=
reader
.
uint32
();
switch
(
tag
>>>
3
)
{
case
1
:
{
if
(
tag
!==
10
)
{
break
;
}
message
.
parent
=
reader
.
string
();
continue
;
}
}
if
((
tag
&
7
)
===
4
||
tag
===
0
)
{
break
;
}
reader
.
skip
(
tag
&
7
);
}
return
message
;
},
create
(
base
?:
DeepPartial
<
ListUserSessionsRequest
>
):
ListUserSessionsRequest
{
return
ListUserSessionsRequest
.
fromPartial
(
base
??
{});
},
fromPartial
(
object
:
DeepPartial
<
ListUserSessionsRequest
>
):
ListUserSessionsRequest
{
const
message
=
createBaseListUserSessionsRequest
();
message
.
parent
=
object
.
parent
??
""
;
return
message
;
},
};
function
createBaseListUserSessionsResponse
():
ListUserSessionsResponse
{
return
{
sessions
:
[]
};
}
export
const
ListUserSessionsResponse
:
MessageFns
<
ListUserSessionsResponse
>
=
{
encode
(
message
:
ListUserSessionsResponse
,
writer
:
BinaryWriter
=
new
BinaryWriter
()):
BinaryWriter
{
for
(
const
v
of
message
.
sessions
)
{
UserSession
.
encode
(
v
!
,
writer
.
uint32
(
10
).
fork
()).
join
();
}
return
writer
;
},
decode
(
input
:
BinaryReader
|
Uint8Array
,
length
?:
number
):
ListUserSessionsResponse
{
const
reader
=
input
instanceof
BinaryReader
?
input
:
new
BinaryReader
(
input
);
let
end
=
length
===
undefined
?
reader
.
len
:
reader
.
pos
+
length
;
const
message
=
createBaseListUserSessionsResponse
();
while
(
reader
.
pos
<
end
)
{
const
tag
=
reader
.
uint32
();
switch
(
tag
>>>
3
)
{
case
1
:
{
if
(
tag
!==
10
)
{
break
;
}
message
.
sessions
.
push
(
UserSession
.
decode
(
reader
,
reader
.
uint32
()));
continue
;
}
}
if
((
tag
&
7
)
===
4
||
tag
===
0
)
{
break
;
}
reader
.
skip
(
tag
&
7
);
}
return
message
;
},
create
(
base
?:
DeepPartial
<
ListUserSessionsResponse
>
):
ListUserSessionsResponse
{
return
ListUserSessionsResponse
.
fromPartial
(
base
??
{});
},
fromPartial
(
object
:
DeepPartial
<
ListUserSessionsResponse
>
):
ListUserSessionsResponse
{
const
message
=
createBaseListUserSessionsResponse
();
message
.
sessions
=
object
.
sessions
?.
map
((
e
)
=>
UserSession
.
fromPartial
(
e
))
||
[];
return
message
;
},
};
function
createBaseRevokeUserSessionRequest
():
RevokeUserSessionRequest
{
return
{
name
:
""
};
}
export
const
RevokeUserSessionRequest
:
MessageFns
<
RevokeUserSessionRequest
>
=
{
encode
(
message
:
RevokeUserSessionRequest
,
writer
:
BinaryWriter
=
new
BinaryWriter
()):
BinaryWriter
{
if
(
message
.
name
!==
""
)
{
writer
.
uint32
(
10
).
string
(
message
.
name
);
}
return
writer
;
},
decode
(
input
:
BinaryReader
|
Uint8Array
,
length
?:
number
):
RevokeUserSessionRequest
{
const
reader
=
input
instanceof
BinaryReader
?
input
:
new
BinaryReader
(
input
);
let
end
=
length
===
undefined
?
reader
.
len
:
reader
.
pos
+
length
;
const
message
=
createBaseRevokeUserSessionRequest
();
while
(
reader
.
pos
<
end
)
{
const
tag
=
reader
.
uint32
();
switch
(
tag
>>>
3
)
{
case
1
:
{
if
(
tag
!==
10
)
{
break
;
}
message
.
name
=
reader
.
string
();
continue
;
}
}
if
((
tag
&
7
)
===
4
||
tag
===
0
)
{
break
;
}
reader
.
skip
(
tag
&
7
);
}
return
message
;
},
create
(
base
?:
DeepPartial
<
RevokeUserSessionRequest
>
):
RevokeUserSessionRequest
{
return
RevokeUserSessionRequest
.
fromPartial
(
base
??
{});
},
fromPartial
(
object
:
DeepPartial
<
RevokeUserSessionRequest
>
):
RevokeUserSessionRequest
{
const
message
=
createBaseRevokeUserSessionRequest
();
message
.
name
=
object
.
name
??
""
;
return
message
;
},
};
function
createBaseListAllUserStatsRequest
():
ListAllUserStatsRequest
{
function
createBaseListAllUserStatsRequest
():
ListAllUserStatsRequest
{
return
{
pageSize
:
0
,
pageToken
:
""
};
return
{
pageSize
:
0
,
pageToken
:
""
};
}
}
...
@@ -2903,6 +3322,112 @@ export const UserServiceDefinition = {
...
@@ -2903,6 +3322,112 @@ export const UserServiceDefinition = {
},
},
},
},
},
},
/** ListUserSessions returns a list of active sessions for a user. */
listUserSessions
:
{
name
:
"ListUserSessions"
,
requestType
:
ListUserSessionsRequest
,
requestStream
:
false
,
responseType
:
ListUserSessionsResponse
,
responseStream
:
false
,
options
:
{
_unknownFields
:
{
8410
:
[
new
Uint8Array
([
6
,
112
,
97
,
114
,
101
,
110
,
116
])],
578365826
:
[
new
Uint8Array
([
35
,
18
,
33
,
47
,
97
,
112
,
105
,
47
,
118
,
49
,
47
,
123
,
112
,
97
,
114
,
101
,
110
,
116
,
61
,
117
,
115
,
101
,
114
,
115
,
47
,
42
,
125
,
47
,
115
,
101
,
115
,
115
,
105
,
111
,
110
,
115
,
]),
],
},
},
},
/** RevokeUserSession revokes a specific session for a user. */
revokeUserSession
:
{
name
:
"RevokeUserSession"
,
requestType
:
RevokeUserSessionRequest
,
requestStream
:
false
,
responseType
:
Empty
,
responseStream
:
false
,
options
:
{
_unknownFields
:
{
8410
:
[
new
Uint8Array
([
4
,
110
,
97
,
109
,
101
])],
578365826
:
[
new
Uint8Array
([
35
,
42
,
33
,
47
,
97
,
112
,
105
,
47
,
118
,
49
,
47
,
123
,
110
,
97
,
109
,
101
,
61
,
117
,
115
,
101
,
114
,
115
,
47
,
42
,
47
,
115
,
101
,
115
,
115
,
105
,
111
,
110
,
115
,
47
,
42
,
125
,
]),
],
},
},
},
},
},
}
as
const
;
}
as
const
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment