diff --git a/proto/api/v1/inbox_service.proto b/proto/api/v1/inbox_service.proto index f916c0fa..2541281f 100644 --- a/proto/api/v1/inbox_service.proto +++ b/proto/api/v1/inbox_service.proto @@ -34,9 +34,9 @@ message Inbox { // The name of the inbox. // Format: inboxes/{id} string name = 1; - // Format: users/{id} + // Format: users/{user} string sender = 2; - // Format: users/{id} + // Format: users/{user} string receiver = 3; enum Status { @@ -59,7 +59,7 @@ message Inbox { } message ListInboxesRequest { - // Format: users/{id} + // Format: users/{user} string user = 1; // The maximum number of inbox to return. diff --git a/proto/api/v1/memo_service.proto b/proto/api/v1/memo_service.proto index ca395b73..8fe942ef 100644 --- a/proto/api/v1/memo_service.proto +++ b/proto/api/v1/memo_service.proto @@ -140,7 +140,7 @@ message Memo { State state = 3; // The name of the creator. - // Format: users/{id} + // Format: users/{user} string creator = 4; google.protobuf.Timestamp create_time = 5; @@ -222,7 +222,7 @@ message ListMemosRequest { string page_token = 2; // Filter is used to filter memos returned in the list. - // Format: "creator == 'users/{uid}' && visibilities == ['PUBLIC', 'PROTECTED']" + // Format: "creator == 'users/{user}' && visibilities == ['PUBLIC', 'PROTECTED']" string filter = 3; // The view of the memo. diff --git a/proto/api/v1/reaction_service.proto b/proto/api/v1/reaction_service.proto index c16df1d1..7283fddb 100644 --- a/proto/api/v1/reaction_service.proto +++ b/proto/api/v1/reaction_service.proto @@ -8,7 +8,7 @@ message Reaction { int32 id = 1; // The name of the creator. - // Format: users/{id} + // Format: users/{user} string creator = 2; string content_id = 3; diff --git a/proto/api/v1/user_service.proto b/proto/api/v1/user_service.proto index cb782b6c..ab1144aa 100644 --- a/proto/api/v1/user_service.proto +++ b/proto/api/v1/user_service.proto @@ -88,12 +88,9 @@ service UserService { message User { // The name of the user. - // Format: users/{id} + // Format: users/{user}. {user} is a system-generated auto-increment id. string name = 1; - // The system generated uid of the user. - int32 id = 2; - enum Role { ROLE_UNSPECIFIED = 0; HOST = 1; @@ -139,13 +136,13 @@ message SearchUsersResponse { message GetUserRequest { // The name of the user. - // Format: users/{id} + // Format: users/{user} string name = 1; } message GetUserAvatarBinaryRequest { // The name of the user. - // Format: users/{id} + // Format: users/{user} string name = 1; // The raw HTTP body is bound to this field. @@ -164,13 +161,13 @@ message UpdateUserRequest { message DeleteUserRequest { // The name of the user. - // Format: users/{id} + // Format: users/{user} string name = 1; } message UserSetting { // The name of the user. - // Format: users/{id} + // Format: users/{user} string name = 1; // The preferred locale of the user. string locale = 2; @@ -182,7 +179,7 @@ message UserSetting { message GetUserSettingRequest { // The name of the user. - // Format: users/{id} + // Format: users/{user} string name = 1; } @@ -201,7 +198,7 @@ message UserAccessToken { message ListUserAccessTokensRequest { // The name of the user. - // Format: users/{id} + // Format: users/{user} string name = 1; } @@ -211,7 +208,7 @@ message ListUserAccessTokensResponse { message CreateUserAccessTokenRequest { // The name of the user. - // Format: users/{id} + // Format: users/{user} string name = 1; string description = 2; @@ -221,7 +218,7 @@ message CreateUserAccessTokenRequest { message DeleteUserAccessTokenRequest { // The name of the user. - // Format: users/{id} + // Format: users/{user} string name = 1; // access_token is the access token to delete. string access_token = 2; diff --git a/proto/api/v1/workspace_service.proto b/proto/api/v1/workspace_service.proto index e6e48880..091f4c02 100644 --- a/proto/api/v1/workspace_service.proto +++ b/proto/api/v1/workspace_service.proto @@ -15,7 +15,7 @@ service WorkspaceService { message WorkspaceProfile { // The name of instance owner. - // Format: "users/{id}" + // Format: users/{user} string owner = 1; // version is the current version of instance string version = 2; diff --git a/proto/gen/api/v1/inbox_service.pb.go b/proto/gen/api/v1/inbox_service.pb.go index 1c2e6e86..a2407bd8 100644 --- a/proto/gen/api/v1/inbox_service.pb.go +++ b/proto/gen/api/v1/inbox_service.pb.go @@ -127,9 +127,9 @@ type Inbox struct { // The name of the inbox. // Format: inboxes/{id} Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // Format: users/{id} + // Format: users/{user} Sender string `protobuf:"bytes,2,opt,name=sender,proto3" json:"sender,omitempty"` - // Format: users/{id} + // Format: users/{user} Receiver string `protobuf:"bytes,3,opt,name=receiver,proto3" json:"receiver,omitempty"` Status Inbox_Status `protobuf:"varint,4,opt,name=status,proto3,enum=memos.api.v1.Inbox_Status" json:"status,omitempty"` CreateTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` @@ -220,7 +220,7 @@ func (x *Inbox) GetActivityId() int32 { type ListInboxesRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - // Format: users/{id} + // Format: users/{user} User string `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` // The maximum number of inbox to return. PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` diff --git a/proto/gen/api/v1/memo_service.pb.go b/proto/gen/api/v1/memo_service.pb.go index e11940fa..bca24575 100644 --- a/proto/gen/api/v1/memo_service.pb.go +++ b/proto/gen/api/v1/memo_service.pb.go @@ -137,7 +137,7 @@ type Memo struct { Uid string `protobuf:"bytes,2,opt,name=uid,proto3" json:"uid,omitempty"` State State `protobuf:"varint,3,opt,name=state,proto3,enum=memos.api.v1.State" json:"state,omitempty"` // The name of the creator. - // Format: users/{id} + // Format: users/{user} Creator string `protobuf:"bytes,4,opt,name=creator,proto3" json:"creator,omitempty"` CreateTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` UpdateTime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"` @@ -537,7 +537,7 @@ type ListMemosRequest struct { // Provide this to retrieve the subsequent page. PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` // Filter is used to filter memos returned in the list. - // Format: "creator == 'users/{uid}' && visibilities == ['PUBLIC', 'PROTECTED']" + // Format: "creator == 'users/{user}' && visibilities == ['PUBLIC', 'PROTECTED']" Filter string `protobuf:"bytes,3,opt,name=filter,proto3" json:"filter,omitempty"` // The view of the memo. View MemoView `protobuf:"varint,4,opt,name=view,proto3,enum=memos.api.v1.MemoView" json:"view,omitempty"` diff --git a/proto/gen/api/v1/reaction_service.pb.go b/proto/gen/api/v1/reaction_service.pb.go index d6099b91..2f810a4b 100644 --- a/proto/gen/api/v1/reaction_service.pb.go +++ b/proto/gen/api/v1/reaction_service.pb.go @@ -24,7 +24,7 @@ type Reaction struct { state protoimpl.MessageState `protogen:"open.v1"` Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` // The name of the creator. - // Format: users/{id} + // Format: users/{user} Creator string `protobuf:"bytes,2,opt,name=creator,proto3" json:"creator,omitempty"` ContentId string `protobuf:"bytes,3,opt,name=content_id,json=contentId,proto3" json:"content_id,omitempty"` ReactionType string `protobuf:"bytes,4,opt,name=reaction_type,json=reactionType,proto3" json:"reaction_type,omitempty"` diff --git a/proto/gen/api/v1/user_service.pb.go b/proto/gen/api/v1/user_service.pb.go index 36240fe6..39c74a8b 100644 --- a/proto/gen/api/v1/user_service.pb.go +++ b/proto/gen/api/v1/user_service.pb.go @@ -80,10 +80,8 @@ func (User_Role) EnumDescriptor() ([]byte, []int) { type User struct { state protoimpl.MessageState `protogen:"open.v1"` // The name of the user. - // Format: users/{id} - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // The system generated uid of the user. - Id int32 `protobuf:"varint,2,opt,name=id,proto3" json:"id,omitempty"` + // Format: users/{user}. {user} is a system-generated auto-increment id. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Role User_Role `protobuf:"varint,3,opt,name=role,proto3,enum=memos.api.v1.User_Role" json:"role,omitempty"` Username string `protobuf:"bytes,4,opt,name=username,proto3" json:"username,omitempty"` Email string `protobuf:"bytes,5,opt,name=email,proto3" json:"email,omitempty"` @@ -135,13 +133,6 @@ func (x *User) GetName() string { return "" } -func (x *User) GetId() int32 { - if x != nil { - return x.Id - } - return 0 -} - func (x *User) GetRole() User_Role { if x != nil { return x.Role @@ -385,7 +376,7 @@ func (x *SearchUsersResponse) GetUsers() []*User { type GetUserRequest struct { state protoimpl.MessageState `protogen:"open.v1"` // The name of the user. - // Format: users/{id} + // Format: users/{user} Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -431,7 +422,7 @@ func (x *GetUserRequest) GetName() string { type GetUserAvatarBinaryRequest struct { state protoimpl.MessageState `protogen:"open.v1"` // The name of the user. - // Format: users/{id} + // Format: users/{user} Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // The raw HTTP body is bound to this field. HttpBody *httpbody.HttpBody `protobuf:"bytes,2,opt,name=http_body,json=httpBody,proto3" json:"http_body,omitempty"` @@ -582,7 +573,7 @@ func (x *UpdateUserRequest) GetUpdateMask() *fieldmaskpb.FieldMask { type DeleteUserRequest struct { state protoimpl.MessageState `protogen:"open.v1"` // The name of the user. - // Format: users/{id} + // Format: users/{user} Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -628,7 +619,7 @@ func (x *DeleteUserRequest) GetName() string { type UserSetting struct { state protoimpl.MessageState `protogen:"open.v1"` // The name of the user. - // Format: users/{id} + // Format: users/{user} Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // The preferred locale of the user. Locale string `protobuf:"bytes,2,opt,name=locale,proto3" json:"locale,omitempty"` @@ -701,7 +692,7 @@ func (x *UserSetting) GetMemoVisibility() string { type GetUserSettingRequest struct { state protoimpl.MessageState `protogen:"open.v1"` // The name of the user. - // Format: users/{id} + // Format: users/{user} Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -867,7 +858,7 @@ func (x *UserAccessToken) GetExpiresAt() *timestamppb.Timestamp { type ListUserAccessTokensRequest struct { state protoimpl.MessageState `protogen:"open.v1"` // The name of the user. - // Format: users/{id} + // Format: users/{user} Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -957,7 +948,7 @@ func (x *ListUserAccessTokensResponse) GetAccessTokens() []*UserAccessToken { type CreateUserAccessTokenRequest struct { state protoimpl.MessageState `protogen:"open.v1"` // The name of the user. - // Format: users/{id} + // Format: users/{user} Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=expires_at,json=expiresAt,proto3,oneof" json:"expires_at,omitempty"` @@ -1019,7 +1010,7 @@ func (x *CreateUserAccessTokenRequest) GetExpiresAt() *timestamppb.Timestamp { type DeleteUserAccessTokenRequest struct { state protoimpl.MessageState `protogen:"open.v1"` // The name of the user. - // Format: users/{id} + // Format: users/{user} Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // access_token is the access token to delete. AccessToken string `protobuf:"bytes,2,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"` @@ -1091,9 +1082,8 @@ var file_api_v1_user_service_proto_rawDesc = []byte{ 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x22, 0xea, 0x03, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, + 0x6f, 0x22, 0xda, 0x03, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, diff --git a/proto/gen/api/v1/workspace_service.pb.go b/proto/gen/api/v1/workspace_service.pb.go index cc9655a8..54a683ff 100644 --- a/proto/gen/api/v1/workspace_service.pb.go +++ b/proto/gen/api/v1/workspace_service.pb.go @@ -24,7 +24,7 @@ const ( type WorkspaceProfile struct { state protoimpl.MessageState `protogen:"open.v1"` // The name of instance owner. - // Format: "users/{id}" + // Format: users/{user} Owner string `protobuf:"bytes,1,opt,name=owner,proto3" json:"owner,omitempty"` // version is the current version of instance Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` diff --git a/proto/gen/apidocs.swagger.yaml b/proto/gen/apidocs.swagger.yaml index 220b82ec..a2cbeac7 100644 --- a/proto/gen/apidocs.swagger.yaml +++ b/proto/gen/apidocs.swagger.yaml @@ -190,7 +190,7 @@ paths: $ref: '#/definitions/googlerpcStatus' parameters: - name: user - description: 'Format: users/{id}' + description: 'Format: users/{user}' in: query required: false type: string @@ -320,7 +320,7 @@ paths: - name: filter description: |- Filter is used to filter memos returned in the list. - Format: "creator == 'users/{uid}' && visibilities == ['PUBLIC', 'PROTECTED']" + Format: "creator == 'users/{user}' && visibilities == ['PUBLIC', 'PROTECTED']" in: query required: false type: string @@ -787,10 +787,10 @@ paths: properties: sender: type: string - title: 'Format: users/{id}' + title: 'Format: users/{user}' receiver: type: string - title: 'Format: users/{id}' + title: 'Format: users/{user}' status: $ref: '#/definitions/v1InboxStatus' createTime: @@ -841,7 +841,7 @@ paths: type: string title: |- The name of the creator. - Format: users/{id} + Format: users/{user} createTime: type: string format: date-time @@ -919,7 +919,7 @@ paths: - name: name_1 description: |- The name of the user. - Format: users/{id} + Format: users/{user} in: path required: true type: string @@ -1137,7 +1137,7 @@ paths: - name: name description: |- The name of the user. - Format: users/{id} + Format: users/{user} in: path required: true type: string @@ -1161,7 +1161,7 @@ paths: - name: name description: |- The name of the user. - Format: users/{id} + Format: users/{user} in: path required: true type: string @@ -1184,7 +1184,7 @@ paths: - name: name description: |- The name of the user. - Format: users/{id} + Format: users/{user} in: path required: true type: string @@ -1214,7 +1214,7 @@ paths: - name: name description: |- The name of the user. - Format: users/{id} + Format: users/{user} in: path required: true type: string @@ -1453,7 +1453,7 @@ paths: - name: name description: |- The name of the user. - Format: users/{id} + Format: users/{user} in: path required: true type: string @@ -1595,7 +1595,7 @@ paths: - name: setting.name description: |- The name of the user. - Format: users/{id} + Format: users/{user} in: path required: true type: string @@ -1636,7 +1636,7 @@ paths: - name: user.name description: |- The name of the user. - Format: users/{id} + Format: users/{user}. {user} is a system-generated auto-increment id. in: path required: true type: string @@ -1647,10 +1647,6 @@ paths: schema: type: object properties: - id: - type: integer - format: int32 - description: The system generated uid of the user. role: $ref: '#/definitions/UserRole' username: @@ -1694,7 +1690,7 @@ paths: - name: name description: |- The name of the user. - Format: users/{id} + Format: users/{user} in: path required: true type: string @@ -1975,7 +1971,7 @@ definitions: type: string title: |- The name of the creator. - Format: users/{id} + Format: users/{user} createTime: type: string format: date-time @@ -2060,7 +2056,7 @@ definitions: type: string title: |- The name of the user. - Format: users/{id} + Format: users/{user} locale: type: string description: The preferred locale of the user. @@ -2486,10 +2482,10 @@ definitions: Format: inboxes/{id} sender: type: string - title: 'Format: users/{id}' + title: 'Format: users/{user}' receiver: type: string - title: 'Format: users/{id}' + title: 'Format: users/{user}' status: $ref: '#/definitions/v1InboxStatus' createTime: @@ -2869,7 +2865,7 @@ definitions: type: string title: |- The name of the creator. - Format: users/{id} + Format: users/{user} contentId: type: string reactionType: @@ -3035,13 +3031,9 @@ definitions: properties: name: type: string - title: |- + description: |- The name of the user. - Format: users/{id} - id: - type: integer - format: int32 - description: The system generated uid of the user. + Format: users/{user}. {user} is a system-generated auto-increment id. role: $ref: '#/definitions/UserRole' username: @@ -3111,7 +3103,7 @@ definitions: type: string title: |- The name of instance owner. - Format: "users/{id}" + Format: users/{user} version: type: string title: version is the current version of instance diff --git a/server/router/api/v1/user_service.go b/server/router/api/v1/user_service.go index cc9cf22e..b2e68a01 100644 --- a/server/router/api/v1/user_service.go +++ b/server/router/api/v1/user_service.go @@ -556,7 +556,6 @@ func (s *APIV1Service) UpsertAccessTokenToStore(ctx context.Context, user *store func convertUserFromStore(user *store.User) *v1pb.User { userpb := &v1pb.User{ Name: fmt.Sprintf("%s%d", UserNamePrefix, user.ID), - Id: user.ID, State: convertStateFromStore(user.RowStatus), CreateTime: timestamppb.New(time.Unix(user.CreatedTs, 0)), UpdateTime: timestamppb.New(time.Unix(user.UpdatedTs, 0)), diff --git a/store/memo_filter.go b/store/memo_filter.go new file mode 100644 index 00000000..82939661 --- /dev/null +++ b/store/memo_filter.go @@ -0,0 +1,13 @@ +package store + +type LogicOperator string + +const ( + AND LogicOperator = "AND" + OR LogicOperator = "OR" +) + +type QueryExpression struct { + Operator LogicOperator + Children []*QueryExpression +} diff --git a/web/src/components/Settings/MemberSection.tsx b/web/src/components/Settings/MemberSection.tsx index 1dcd6619..07e01789 100644 --- a/web/src/components/Settings/MemberSection.tsx +++ b/web/src/components/Settings/MemberSection.tsx @@ -173,14 +173,11 @@ const MemberSection = () => { - ID + {t("common.username")} {t("common.role")} - - {t("common.username")} - {t("common.nickname")} @@ -192,17 +189,16 @@ const MemberSection = () => { {sortedUsers.map((user) => ( - - {user.id} - {stringifyUserRole(user.role)} + {user.username} {user.state === State.ARCHIVED && "(Archived)"} + {stringifyUserRole(user.role)} {user.nickname} {user.email} - {currentUser?.id === user.id ? ( + {currentUser?.name === user.name ? ( {t("common.yourself")} ) : ( diff --git a/web/src/components/Settings/WebhookSection.tsx b/web/src/components/Settings/WebhookSection.tsx index 64074ab2..92e4e69a 100644 --- a/web/src/components/Settings/WebhookSection.tsx +++ b/web/src/components/Settings/WebhookSection.tsx @@ -4,6 +4,7 @@ import { useEffect, useState } from "react"; import { Link } from "react-router-dom"; import { webhookServiceClient } from "@/grpcweb"; import useCurrentUser from "@/hooks/useCurrentUser"; +import { extractUserIdFromName } from "@/store/v1"; import { Webhook } from "@/types/proto/api/v1/webhook_service"; import { useTranslate } from "@/utils/i18n"; import showCreateWebhookDialog from "../CreateWebhookDialog"; @@ -21,13 +22,13 @@ const WebhookSection = () => { const [webhooks, setWebhooks] = useState([]); useEffect(() => { - listWebhooks(currentUser.id).then((webhooks) => { + listWebhooks(extractUserIdFromName(currentUser.name)).then((webhooks) => { setWebhooks(webhooks); }); }, []); const handleCreateAccessTokenDialogConfirm = async () => { - const webhooks = await listWebhooks(currentUser.id); + const webhooks = await listWebhooks(extractUserIdFromName(currentUser.name)); setWebhooks(webhooks); }; diff --git a/web/src/store/v1/resourceName.ts b/web/src/store/v1/resourceName.ts index f4871574..6cb052ac 100644 --- a/web/src/store/v1/resourceName.ts +++ b/web/src/store/v1/resourceName.ts @@ -4,6 +4,10 @@ export const memoNamePrefix = "memos/"; export const identityProviderNamePrefix = "identityProviders/"; export const activityNamePrefix = "activities/"; +export const extractUserIdFromName = (name: string) => { + return parseInt(name.split(userNamePrefix).pop() || "", 10); +}; + export const extractMemoIdFromName = (name: string) => { return parseInt(name.split(memoNamePrefix).pop() || "", 10); };