mirror of
https://github.com/usememos/memos.git
synced 2025-06-05 22:09:59 +02:00
chore: tweak memo structure
This commit is contained in:
@@ -161,6 +161,25 @@ DeleteInbox deletes an inbox.
|
||||
| 200 | A successful response. | [v2DeleteInboxResponse](#v2deleteinboxresponse) |
|
||||
| default | An unexpected error response. | [googlerpcStatus](#googlerpcstatus) |
|
||||
|
||||
---
|
||||
## LinkService
|
||||
|
||||
### /api/v2/link_metadata
|
||||
|
||||
#### GET
|
||||
##### Parameters
|
||||
|
||||
| Name | Located in | Description | Required | Schema |
|
||||
| ---- | ---------- | ----------- | -------- | ------ |
|
||||
| link | query | | No | string |
|
||||
|
||||
##### Responses
|
||||
|
||||
| Code | Description | Schema |
|
||||
| ---- | ----------- | ------ |
|
||||
| 200 | A successful response. | [v2GetLinkMetadataResponse](#v2getlinkmetadataresponse) |
|
||||
| default | An unexpected error response. | [googlerpcStatus](#googlerpcstatus) |
|
||||
|
||||
---
|
||||
## MemoService
|
||||
|
||||
@@ -177,7 +196,7 @@ ListMemos lists memos with pagination and filter.
|
||||
| ---- | ---------- | ----------- | -------- | ------ |
|
||||
| pageSize | query | The maximum number of memos to return. | No | integer |
|
||||
| pageToken | query | A page token, received from a previous `ListMemos` call. Provide this to retrieve the subsequent page. | No | string |
|
||||
| filter | query | Filter is used to filter memos returned in the list. Format: "creator == users/{username} && visibilities == ['PUBLIC', 'PROTECTED']" | No | string |
|
||||
| filter | query | Filter is used to filter memos returned in the list. Format: "creator == users/{uid} && visibilities == ['PUBLIC', 'PROTECTED']" | No | string |
|
||||
|
||||
##### Responses
|
||||
|
||||
@@ -355,7 +374,7 @@ UpsertMemoReaction upserts a reaction for a memo.
|
||||
| ---- | ---------- | ----------- | -------- | ------ |
|
||||
| id | path | | Yes | integer |
|
||||
| reaction.id | query | | No | integer |
|
||||
| reaction.creator | query | | No | string |
|
||||
| reaction.creator | query | The name of the creator. Format: users/{uid} | No | string |
|
||||
| reaction.contentId | query | | No | string |
|
||||
| reaction.reactionType | query | | No | string |
|
||||
|
||||
@@ -477,7 +496,7 @@ UpdateMemo updates a memo.
|
||||
| Name | Located in | Description | Required | Schema |
|
||||
| ---- | ---------- | ----------- | -------- | ------ |
|
||||
| memo.id | path | id is the system generated unique identifier. | Yes | integer |
|
||||
| memo | body | | Yes | { **"name"**: string, **"rowStatus"**: [apiv2RowStatus](#apiv2rowstatus), **"creator"**: string, **"creatorId"**: integer, **"createTime"**: dateTime, **"updateTime"**: dateTime, **"displayTime"**: dateTime, **"content"**: string, **"visibility"**: [v2Visibility](#v2visibility), **"pinned"**: boolean, **"parentId"**: integer, **"resources"**: [ [v2Resource](#v2resource) ], **"relations"**: [ [v2MemoRelation](#v2memorelation) ], **"reactions"**: [ [apiv2Reaction](#apiv2reaction) ] } |
|
||||
| memo | body | | Yes | { **"name"**: string, **"rowStatus"**: [apiv2RowStatus](#apiv2rowstatus), **"creator"**: string, **"createTime"**: dateTime, **"updateTime"**: dateTime, **"displayTime"**: dateTime, **"content"**: string, **"visibility"**: [v2Visibility](#v2visibility), **"pinned"**: boolean, **"parentId"**: integer, **"resources"**: [ [v2Resource](#v2resource) ], **"relations"**: [ [v2MemoRelation](#v2memorelation) ], **"reactions"**: [ [apiv2Reaction](#apiv2reaction) ] } |
|
||||
|
||||
##### Responses
|
||||
|
||||
@@ -506,6 +525,26 @@ ExportMemos exports memos.
|
||||
| 200 | A successful response. | [v2ExportMemosResponse](#v2exportmemosresponse) |
|
||||
| default | An unexpected error response. | [googlerpcStatus](#googlerpcstatus) |
|
||||
|
||||
### /api/v2/memos:search
|
||||
|
||||
#### GET
|
||||
##### Summary
|
||||
|
||||
SearchMemosRequest searches memos.
|
||||
|
||||
##### Parameters
|
||||
|
||||
| Name | Located in | Description | Required | Schema |
|
||||
| ---- | ---------- | ----------- | -------- | ------ |
|
||||
| filter | query | Filter is used to filter memos returned. Format: "creator == users/{uid} && visibilities == ['PUBLIC', 'PROTECTED']" | No | string |
|
||||
|
||||
##### Responses
|
||||
|
||||
| Code | Description | Schema |
|
||||
| ---- | ----------- | ------ |
|
||||
| 200 | A successful response. | [v2SearchMemosResponse](#v2searchmemosresponse) |
|
||||
| default | An unexpected error response. | [googlerpcStatus](#googlerpcstatus) |
|
||||
|
||||
---
|
||||
## ResourceService
|
||||
|
||||
@@ -637,7 +676,7 @@ ListTags lists tags.
|
||||
|
||||
| Name | Located in | Description | Required | Schema |
|
||||
| ---- | ---------- | ----------- | -------- | ------ |
|
||||
| user | query | The creator of tags. Format: users/{username} | No | string |
|
||||
| user | query | The creator of tags. Format: users/{uid} | No | string |
|
||||
|
||||
##### Responses
|
||||
|
||||
@@ -656,7 +695,7 @@ DeleteTag deletes a tag.
|
||||
| Name | Located in | Description | Required | Schema |
|
||||
| ---- | ---------- | ----------- | -------- | ------ |
|
||||
| tag.name | query | | No | string |
|
||||
| tag.creator | query | The creator of tags. Format: users/{username} | No | string |
|
||||
| tag.creator | query | The creator of tags. Format: users/{uid} | No | string |
|
||||
|
||||
##### Responses
|
||||
|
||||
@@ -694,7 +733,7 @@ GetTagSuggestions gets tag suggestions from the user's memos.
|
||||
|
||||
| Name | Located in | Description | Required | Schema |
|
||||
| ---- | ---------- | ----------- | -------- | ------ |
|
||||
| user | query | The creator of tags. Format: users/{username} | No | string |
|
||||
| user | query | The creator of tags. Format: users/{uid} | No | string |
|
||||
|
||||
##### Responses
|
||||
|
||||
@@ -729,7 +768,7 @@ All related memos will be updated.
|
||||
|
||||
| Name | Located in | Description | Required | Schema |
|
||||
| ---- | ---------- | ----------- | -------- | ------ |
|
||||
| user | query | The creator of tags. Format: users/{username} | No | string |
|
||||
| user | query | The creator of tags. Format: users/{uid} | No | string |
|
||||
| oldName | query | | No | string |
|
||||
| newName | query | | No | string |
|
||||
|
||||
@@ -775,6 +814,26 @@ CreateUser creates a new user.
|
||||
| 200 | A successful response. | [v2CreateUserResponse](#v2createuserresponse) |
|
||||
| default | An unexpected error response. | [googlerpcStatus](#googlerpcstatus) |
|
||||
|
||||
### /api/v2/users:search
|
||||
|
||||
#### GET
|
||||
##### Summary
|
||||
|
||||
SearchUsers searches users by filter.
|
||||
|
||||
##### Parameters
|
||||
|
||||
| Name | Located in | Description | Required | Schema |
|
||||
| ---- | ---------- | ----------- | -------- | ------ |
|
||||
| filter | query | | No | string |
|
||||
|
||||
##### Responses
|
||||
|
||||
| Code | Description | Schema |
|
||||
| ---- | ----------- | ------ |
|
||||
| 200 | A successful response. | [v2SearchUsersResponse](#v2searchusersresponse) |
|
||||
| default | An unexpected error response. | [googlerpcStatus](#googlerpcstatus) |
|
||||
|
||||
### /api/v2/{name}
|
||||
|
||||
#### GET
|
||||
@@ -786,7 +845,7 @@ GetUser gets a user by name.
|
||||
|
||||
| Name | Located in | Description | Required | Schema |
|
||||
| ---- | ---------- | ----------- | -------- | ------ |
|
||||
| name | path | The name of the user. Format: users/{username} | Yes | string |
|
||||
| name | path | The name of the user. Format: users/{uid} | Yes | string |
|
||||
|
||||
##### Responses
|
||||
|
||||
@@ -804,7 +863,7 @@ DeleteUser deletes a user.
|
||||
|
||||
| Name | Located in | Description | Required | Schema |
|
||||
| ---- | ---------- | ----------- | -------- | ------ |
|
||||
| name | path | The name of the user. Format: users/{username} | Yes | string |
|
||||
| name | path | The name of the user. Format: users/{uid} | Yes | string |
|
||||
|
||||
##### Responses
|
||||
|
||||
@@ -824,7 +883,7 @@ ListUserAccessTokens returns a list of access tokens for a user.
|
||||
|
||||
| Name | Located in | Description | Required | Schema |
|
||||
| ---- | ---------- | ----------- | -------- | ------ |
|
||||
| name | path | The name of the user. Format: users/{username} | Yes | string |
|
||||
| name | path | The name of the user. Format: users/{uid} | Yes | string |
|
||||
|
||||
##### Responses
|
||||
|
||||
@@ -842,7 +901,7 @@ CreateUserAccessToken creates a new access token for a user.
|
||||
|
||||
| Name | Located in | Description | Required | Schema |
|
||||
| ---- | ---------- | ----------- | -------- | ------ |
|
||||
| name | path | The name of the user. Format: users/{username} | Yes | string |
|
||||
| name | path | The name of the user. Format: users/{uid} | Yes | string |
|
||||
| body | body | | Yes | [UserServiceCreateUserAccessTokenBody](#userservicecreateuseraccesstokenbody) |
|
||||
|
||||
##### Responses
|
||||
@@ -863,7 +922,7 @@ DeleteUserAccessToken deletes an access token for a user.
|
||||
|
||||
| Name | Located in | Description | Required | Schema |
|
||||
| ---- | ---------- | ----------- | -------- | ------ |
|
||||
| name | path | The name of the user. Format: users/{username} | Yes | string |
|
||||
| name | path | The name of the user. Format: users/{uid} | Yes | string |
|
||||
| accessToken | path | access_token is the access token to delete. | Yes | string |
|
||||
|
||||
##### Responses
|
||||
@@ -884,7 +943,7 @@ GetUserSetting gets the setting of a user.
|
||||
|
||||
| Name | Located in | Description | Required | Schema |
|
||||
| ---- | ---------- | ----------- | -------- | ------ |
|
||||
| name | path | The name of the user. Format: users/{username} | Yes | string |
|
||||
| name | path | The name of the user. Format: users/{uid} | Yes | string |
|
||||
|
||||
##### Responses
|
||||
|
||||
@@ -904,8 +963,8 @@ UpdateUserSetting updates the setting of a user.
|
||||
|
||||
| Name | Located in | Description | Required | Schema |
|
||||
| ---- | ---------- | ----------- | -------- | ------ |
|
||||
| setting.name | path | The name of the user. Format: users/{username} | Yes | string |
|
||||
| setting | body | | Yes | { **"locale"**: string, **"appearance"**: string, **"memoVisibility"**: string, **"telegramUserId"**: string, **"compactView"**: boolean } |
|
||||
| setting.name | path | The name of the user. Format: users/{uid} | Yes | string |
|
||||
| setting | body | | Yes | { **"locale"**: string, **"appearance"**: string, **"memoVisibility"**: string, **"telegramUserId"**: string } |
|
||||
|
||||
##### Responses
|
||||
|
||||
@@ -925,8 +984,8 @@ UpdateUser updates a user.
|
||||
|
||||
| Name | Located in | Description | Required | Schema |
|
||||
| ---- | ---------- | ----------- | -------- | ------ |
|
||||
| user.name | path | The name of the user. Format: users/{username} | Yes | string |
|
||||
| user | body | | Yes | { **"id"**: integer, **"role"**: [UserRole](#userrole), **"username"**: string, **"email"**: string, **"nickname"**: string, **"avatarUrl"**: string, **"password"**: string, **"rowStatus"**: [apiv2RowStatus](#apiv2rowstatus), **"createTime"**: dateTime, **"updateTime"**: dateTime } |
|
||||
| user.name | path | The name of the user. Format: users/{uid} | Yes | string |
|
||||
| user | body | | Yes | { **"id"**: integer, **"role"**: [UserRole](#userrole), **"username"**: string, **"email"**: string, **"nickname"**: string, **"avatarUrl"**: string, **"description"**: string, **"password"**: string, **"rowStatus"**: [apiv2RowStatus](#apiv2rowstatus), **"createTime"**: dateTime, **"updateTime"**: dateTime } |
|
||||
|
||||
##### Responses
|
||||
|
||||
@@ -1197,7 +1256,6 @@ GetActivity returns the activity with the given id.
|
||||
| appearance | string | The preferred appearance of the user. | No |
|
||||
| memoVisibility | string | The default visibility of the memo. | No |
|
||||
| telegramUserId | string | The telegram user id of the user. | No |
|
||||
| compactView | boolean | The compact view for a memo. | No |
|
||||
|
||||
#### apiv2Webhook
|
||||
|
||||
@@ -1375,6 +1433,12 @@ GetActivity returns the activity with the given id.
|
||||
| ---- | ---- | ----------- | -------- |
|
||||
| user | [v2User](#v2user) | | No |
|
||||
|
||||
#### v2GetLinkMetadataResponse
|
||||
|
||||
| Name | Type | Description | Required |
|
||||
| ---- | ---- | ----------- | -------- |
|
||||
| linkMetadata | [v2LinkMetadata](#v2linkmetadata) | | No |
|
||||
|
||||
#### v2GetMemoByNameResponse
|
||||
|
||||
| Name | Type | Description | Required |
|
||||
@@ -1465,6 +1529,14 @@ GetActivity returns the activity with the given id.
|
||||
| ---- | ---- | ----------- | -------- |
|
||||
| v2InboxType | string | | |
|
||||
|
||||
#### v2LinkMetadata
|
||||
|
||||
| Name | Type | Description | Required |
|
||||
| ---- | ---- | ----------- | -------- |
|
||||
| title | string | | No |
|
||||
| description | string | | No |
|
||||
| image | string | | No |
|
||||
|
||||
#### v2ListInboxesResponse
|
||||
|
||||
| Name | Type | Description | Required |
|
||||
@@ -1540,7 +1612,6 @@ GetActivity returns the activity with the given id.
|
||||
| name | string | name is the user provided name. | No |
|
||||
| rowStatus | [apiv2RowStatus](#apiv2rowstatus) | | No |
|
||||
| creator | string | | No |
|
||||
| creatorId | integer | | No |
|
||||
| createTime | dateTime | | No |
|
||||
| updateTime | dateTime | | No |
|
||||
| displayTime | dateTime | | No |
|
||||
@@ -1585,6 +1656,18 @@ GetActivity returns the activity with the given id.
|
||||
| size | string (int64) | | No |
|
||||
| memoId | integer | | No |
|
||||
|
||||
#### v2SearchMemosResponse
|
||||
|
||||
| Name | Type | Description | Required |
|
||||
| ---- | ---- | ----------- | -------- |
|
||||
| memos | [ [v2Memo](#v2memo) ] | | No |
|
||||
|
||||
#### v2SearchUsersResponse
|
||||
|
||||
| Name | Type | Description | Required |
|
||||
| ---- | ---- | ----------- | -------- |
|
||||
| users | [ [v2User](#v2user) ] | | No |
|
||||
|
||||
#### v2SetMemoRelationsResponse
|
||||
|
||||
| Name | Type | Description | Required |
|
||||
@@ -1693,12 +1776,13 @@ GetActivity returns the activity with the given id.
|
||||
| Name | Type | Description | Required |
|
||||
| ---- | ---- | ----------- | -------- |
|
||||
| name | string | | No |
|
||||
| id | integer | | No |
|
||||
| id | integer | The system generated uid of the user. | No |
|
||||
| role | [UserRole](#userrole) | | No |
|
||||
| username | string | | No |
|
||||
| email | string | | No |
|
||||
| nickname | string | | No |
|
||||
| avatarUrl | string | | No |
|
||||
| description | string | | No |
|
||||
| password | string | | No |
|
||||
| rowStatus | [apiv2RowStatus](#apiv2rowstatus) | | No |
|
||||
| createTime | dateTime | | No |
|
||||
|
@@ -226,26 +226,6 @@ paths:
|
||||
$ref: '#/definitions/v2CreateMemoRequest'
|
||||
tags:
|
||||
- MemoService
|
||||
/api/v2/memos/name/{name}:
|
||||
get:
|
||||
summary: GetMemoByName gets a memo by name.
|
||||
operationId: MemoService_GetMemoByName
|
||||
responses:
|
||||
"200":
|
||||
description: A successful response.
|
||||
schema:
|
||||
$ref: '#/definitions/v2GetMemoByNameResponse'
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
$ref: '#/definitions/googlerpcStatus'
|
||||
parameters:
|
||||
- name: name
|
||||
in: path
|
||||
required: true
|
||||
type: string
|
||||
tags:
|
||||
- MemoService
|
||||
/api/v2/memos/stats:
|
||||
get:
|
||||
summary: GetUserMemosStats gets stats of memos for a user.
|
||||
@@ -263,7 +243,7 @@ paths:
|
||||
- name: name
|
||||
description: |-
|
||||
name is the name of the user to get stats for.
|
||||
Format: users/{username}
|
||||
Format: users/{uid}
|
||||
in: query
|
||||
required: false
|
||||
type: string
|
||||
@@ -282,372 +262,6 @@ paths:
|
||||
type: string
|
||||
tags:
|
||||
- MemoService
|
||||
/api/v2/memos/{id}:
|
||||
get:
|
||||
summary: GetMemo gets a memo by id.
|
||||
operationId: MemoService_GetMemo
|
||||
responses:
|
||||
"200":
|
||||
description: A successful response.
|
||||
schema:
|
||||
$ref: '#/definitions/v2GetMemoResponse'
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
$ref: '#/definitions/googlerpcStatus'
|
||||
parameters:
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
type: integer
|
||||
format: int32
|
||||
tags:
|
||||
- MemoService
|
||||
delete:
|
||||
summary: DeleteMemo deletes a memo by id.
|
||||
operationId: MemoService_DeleteMemo
|
||||
responses:
|
||||
"200":
|
||||
description: A successful response.
|
||||
schema:
|
||||
$ref: '#/definitions/v2DeleteMemoResponse'
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
$ref: '#/definitions/googlerpcStatus'
|
||||
parameters:
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
type: integer
|
||||
format: int32
|
||||
tags:
|
||||
- MemoService
|
||||
/api/v2/memos/{id}/comments:
|
||||
get:
|
||||
summary: ListMemoComments lists comments for a memo.
|
||||
operationId: MemoService_ListMemoComments
|
||||
responses:
|
||||
"200":
|
||||
description: A successful response.
|
||||
schema:
|
||||
$ref: '#/definitions/v2ListMemoCommentsResponse'
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
$ref: '#/definitions/googlerpcStatus'
|
||||
parameters:
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
type: integer
|
||||
format: int32
|
||||
tags:
|
||||
- MemoService
|
||||
post:
|
||||
summary: CreateMemoComment creates a comment for a memo.
|
||||
operationId: MemoService_CreateMemoComment
|
||||
responses:
|
||||
"200":
|
||||
description: A successful response.
|
||||
schema:
|
||||
$ref: '#/definitions/v2CreateMemoCommentResponse'
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
$ref: '#/definitions/googlerpcStatus'
|
||||
parameters:
|
||||
- name: id
|
||||
description: id is the memo id to create comment for.
|
||||
in: path
|
||||
required: true
|
||||
type: integer
|
||||
format: int32
|
||||
- name: create.content
|
||||
in: query
|
||||
required: false
|
||||
type: string
|
||||
- name: create.visibility
|
||||
in: query
|
||||
required: false
|
||||
type: string
|
||||
enum:
|
||||
- VISIBILITY_UNSPECIFIED
|
||||
- PRIVATE
|
||||
- PROTECTED
|
||||
- PUBLIC
|
||||
default: VISIBILITY_UNSPECIFIED
|
||||
tags:
|
||||
- MemoService
|
||||
/api/v2/memos/{id}/reactions:
|
||||
get:
|
||||
summary: ListMemoReactions lists reactions for a memo.
|
||||
operationId: MemoService_ListMemoReactions
|
||||
responses:
|
||||
"200":
|
||||
description: A successful response.
|
||||
schema:
|
||||
$ref: '#/definitions/v2ListMemoReactionsResponse'
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
$ref: '#/definitions/googlerpcStatus'
|
||||
parameters:
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
type: integer
|
||||
format: int32
|
||||
tags:
|
||||
- MemoService
|
||||
post:
|
||||
summary: UpsertMemoReaction upserts a reaction for a memo.
|
||||
operationId: MemoService_UpsertMemoReaction
|
||||
responses:
|
||||
"200":
|
||||
description: A successful response.
|
||||
schema:
|
||||
$ref: '#/definitions/v2UpsertMemoReactionResponse'
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
$ref: '#/definitions/googlerpcStatus'
|
||||
parameters:
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
type: integer
|
||||
format: int32
|
||||
- name: reaction.id
|
||||
in: query
|
||||
required: false
|
||||
type: integer
|
||||
format: int32
|
||||
- name: reaction.creator
|
||||
description: |-
|
||||
The name of the creator.
|
||||
Format: users/{uid}
|
||||
in: query
|
||||
required: false
|
||||
type: string
|
||||
- name: reaction.contentId
|
||||
in: query
|
||||
required: false
|
||||
type: string
|
||||
- name: reaction.reactionType
|
||||
in: query
|
||||
required: false
|
||||
type: string
|
||||
enum:
|
||||
- TYPE_UNSPECIFIED
|
||||
- THUMBS_UP
|
||||
- THUMBS_DOWN
|
||||
- HEART
|
||||
- FIRE
|
||||
- CLAPPING_HANDS
|
||||
- LAUGH
|
||||
- OK_HAND
|
||||
- ROCKET
|
||||
- EYES
|
||||
- THINKING_FACE
|
||||
- CLOWN_FACE
|
||||
- QUESTION_MARK
|
||||
default: TYPE_UNSPECIFIED
|
||||
tags:
|
||||
- MemoService
|
||||
/api/v2/memos/{id}/reactions/{reactionId}:
|
||||
delete:
|
||||
summary: DeleteMemoReaction deletes a reaction for a memo.
|
||||
operationId: MemoService_DeleteMemoReaction
|
||||
responses:
|
||||
"200":
|
||||
description: A successful response.
|
||||
schema:
|
||||
$ref: '#/definitions/v2DeleteMemoReactionResponse'
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
$ref: '#/definitions/googlerpcStatus'
|
||||
parameters:
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
type: integer
|
||||
format: int32
|
||||
- name: reactionId
|
||||
in: path
|
||||
required: true
|
||||
type: integer
|
||||
format: int32
|
||||
tags:
|
||||
- MemoService
|
||||
/api/v2/memos/{id}/relations:
|
||||
get:
|
||||
summary: ListMemoRelations lists relations for a memo.
|
||||
operationId: MemoService_ListMemoRelations
|
||||
responses:
|
||||
"200":
|
||||
description: A successful response.
|
||||
schema:
|
||||
$ref: '#/definitions/v2ListMemoRelationsResponse'
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
$ref: '#/definitions/googlerpcStatus'
|
||||
parameters:
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
type: integer
|
||||
format: int32
|
||||
tags:
|
||||
- MemoService
|
||||
post:
|
||||
summary: SetMemoRelations sets relations for a memo.
|
||||
operationId: MemoService_SetMemoRelations
|
||||
responses:
|
||||
"200":
|
||||
description: A successful response.
|
||||
schema:
|
||||
$ref: '#/definitions/v2SetMemoRelationsResponse'
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
$ref: '#/definitions/googlerpcStatus'
|
||||
parameters:
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
type: integer
|
||||
format: int32
|
||||
- name: body
|
||||
in: body
|
||||
required: true
|
||||
schema:
|
||||
$ref: '#/definitions/MemoServiceSetMemoRelationsBody'
|
||||
tags:
|
||||
- MemoService
|
||||
/api/v2/memos/{id}/resources:
|
||||
get:
|
||||
summary: ListMemoResources lists resources for a memo.
|
||||
operationId: MemoService_ListMemoResources
|
||||
responses:
|
||||
"200":
|
||||
description: A successful response.
|
||||
schema:
|
||||
$ref: '#/definitions/v2ListMemoResourcesResponse'
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
$ref: '#/definitions/googlerpcStatus'
|
||||
parameters:
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
type: integer
|
||||
format: int32
|
||||
tags:
|
||||
- MemoService
|
||||
post:
|
||||
summary: SetMemoResources sets resources for a memo.
|
||||
operationId: MemoService_SetMemoResources
|
||||
responses:
|
||||
"200":
|
||||
description: A successful response.
|
||||
schema:
|
||||
$ref: '#/definitions/v2SetMemoResourcesResponse'
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
$ref: '#/definitions/googlerpcStatus'
|
||||
parameters:
|
||||
- name: id
|
||||
in: path
|
||||
required: true
|
||||
type: integer
|
||||
format: int32
|
||||
- name: body
|
||||
in: body
|
||||
required: true
|
||||
schema:
|
||||
$ref: '#/definitions/MemoServiceSetMemoResourcesBody'
|
||||
tags:
|
||||
- MemoService
|
||||
/api/v2/memos/{memo.id}:
|
||||
patch:
|
||||
summary: UpdateMemo updates a memo.
|
||||
operationId: MemoService_UpdateMemo
|
||||
responses:
|
||||
"200":
|
||||
description: A successful response.
|
||||
schema:
|
||||
$ref: '#/definitions/v2UpdateMemoResponse'
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
$ref: '#/definitions/googlerpcStatus'
|
||||
parameters:
|
||||
- name: memo.id
|
||||
description: id is the system generated unique identifier.
|
||||
in: path
|
||||
required: true
|
||||
type: integer
|
||||
format: int32
|
||||
- name: memo
|
||||
in: body
|
||||
required: true
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
description: name is the user provided name.
|
||||
rowStatus:
|
||||
$ref: '#/definitions/apiv2RowStatus'
|
||||
creator:
|
||||
type: string
|
||||
title: |-
|
||||
The name of the creator.
|
||||
Format: users/{uid}
|
||||
createTime:
|
||||
type: string
|
||||
format: date-time
|
||||
updateTime:
|
||||
type: string
|
||||
format: date-time
|
||||
displayTime:
|
||||
type: string
|
||||
format: date-time
|
||||
content:
|
||||
type: string
|
||||
visibility:
|
||||
$ref: '#/definitions/v2Visibility'
|
||||
pinned:
|
||||
type: boolean
|
||||
parentId:
|
||||
type: integer
|
||||
format: int32
|
||||
readOnly: true
|
||||
resources:
|
||||
type: array
|
||||
items:
|
||||
type: object
|
||||
$ref: '#/definitions/v2Resource'
|
||||
readOnly: true
|
||||
relations:
|
||||
type: array
|
||||
items:
|
||||
type: object
|
||||
$ref: '#/definitions/v2MemoRelation'
|
||||
readOnly: true
|
||||
reactions:
|
||||
type: array
|
||||
items:
|
||||
type: object
|
||||
$ref: '#/definitions/apiv2Reaction'
|
||||
readOnly: true
|
||||
tags:
|
||||
- MemoService
|
||||
/api/v2/memos:export:
|
||||
post:
|
||||
summary: ExportMemos exports memos.
|
||||
@@ -669,6 +283,29 @@ paths:
|
||||
type: string
|
||||
tags:
|
||||
- MemoService
|
||||
/api/v2/memos:search:
|
||||
get:
|
||||
summary: SearchMemosRequest searches memos.
|
||||
operationId: MemoService_SearchMemos
|
||||
responses:
|
||||
"200":
|
||||
description: A successful response.
|
||||
schema:
|
||||
$ref: '#/definitions/v2SearchMemosResponse'
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
$ref: '#/definitions/googlerpcStatus'
|
||||
parameters:
|
||||
- name: filter
|
||||
description: |-
|
||||
Filter is used to filter memos returned.
|
||||
Format: "creator == users/{uid} && visibilities == ['PUBLIC', 'PROTECTED']"
|
||||
in: query
|
||||
required: false
|
||||
type: string
|
||||
tags:
|
||||
- MemoService
|
||||
/api/v2/resources:
|
||||
get:
|
||||
summary: ListResources lists all resources.
|
||||
@@ -997,7 +634,7 @@ paths:
|
||||
$ref: '#/definitions/v2User'
|
||||
tags:
|
||||
- UserService
|
||||
/api/v2/users/search:
|
||||
/api/v2/users:search:
|
||||
get:
|
||||
summary: SearchUsers searches users by filter.
|
||||
operationId: UserService_SearchUsers
|
||||
@@ -1261,7 +898,106 @@ paths:
|
||||
format: int32
|
||||
tags:
|
||||
- InboxService
|
||||
/api/v2/{memo.name}:
|
||||
patch:
|
||||
summary: UpdateMemo updates a memo.
|
||||
operationId: MemoService_UpdateMemo
|
||||
responses:
|
||||
"200":
|
||||
description: A successful response.
|
||||
schema:
|
||||
$ref: '#/definitions/v2UpdateMemoResponse'
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
$ref: '#/definitions/googlerpcStatus'
|
||||
parameters:
|
||||
- name: memo.name
|
||||
description: |-
|
||||
The name of the memo.
|
||||
Format: memos/{uid}
|
||||
in: path
|
||||
required: true
|
||||
type: string
|
||||
pattern: memos/[^/]+
|
||||
- name: memo
|
||||
in: body
|
||||
required: true
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
resourceId:
|
||||
type: string
|
||||
rowStatus:
|
||||
$ref: '#/definitions/apiv2RowStatus'
|
||||
creator:
|
||||
type: string
|
||||
title: |-
|
||||
The name of the creator.
|
||||
Format: users/{uid}
|
||||
createTime:
|
||||
type: string
|
||||
format: date-time
|
||||
updateTime:
|
||||
type: string
|
||||
format: date-time
|
||||
displayTime:
|
||||
type: string
|
||||
format: date-time
|
||||
content:
|
||||
type: string
|
||||
visibility:
|
||||
$ref: '#/definitions/v2Visibility'
|
||||
pinned:
|
||||
type: boolean
|
||||
parentId:
|
||||
type: integer
|
||||
format: int32
|
||||
readOnly: true
|
||||
resources:
|
||||
type: array
|
||||
items:
|
||||
type: object
|
||||
$ref: '#/definitions/v2Resource'
|
||||
readOnly: true
|
||||
relations:
|
||||
type: array
|
||||
items:
|
||||
type: object
|
||||
$ref: '#/definitions/v2MemoRelation'
|
||||
readOnly: true
|
||||
reactions:
|
||||
type: array
|
||||
items:
|
||||
type: object
|
||||
$ref: '#/definitions/apiv2Reaction'
|
||||
readOnly: true
|
||||
tags:
|
||||
- MemoService
|
||||
/api/v2/{name_1}:
|
||||
get:
|
||||
summary: GetMemo gets a memo.
|
||||
operationId: MemoService_GetMemo
|
||||
responses:
|
||||
"200":
|
||||
description: A successful response.
|
||||
schema:
|
||||
$ref: '#/definitions/v2GetMemoResponse'
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
$ref: '#/definitions/googlerpcStatus'
|
||||
parameters:
|
||||
- name: name_1
|
||||
description: |-
|
||||
The name of the memo.
|
||||
Format: memos/{uid}
|
||||
in: path
|
||||
required: true
|
||||
type: string
|
||||
pattern: memos/[^/]+
|
||||
tags:
|
||||
- MemoService
|
||||
delete:
|
||||
summary: DeleteInbox deletes an inbox.
|
||||
operationId: InboxService_DeleteInbox
|
||||
@@ -1285,6 +1021,30 @@ paths:
|
||||
pattern: inboxes/[^/]+
|
||||
tags:
|
||||
- InboxService
|
||||
/api/v2/{name_2}:
|
||||
delete:
|
||||
summary: DeleteMemo deletes a memo.
|
||||
operationId: MemoService_DeleteMemo
|
||||
responses:
|
||||
"200":
|
||||
description: A successful response.
|
||||
schema:
|
||||
$ref: '#/definitions/v2DeleteMemoResponse'
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
$ref: '#/definitions/googlerpcStatus'
|
||||
parameters:
|
||||
- name: name_2
|
||||
description: |-
|
||||
The name of the memo.
|
||||
Format: memos/{uid}
|
||||
in: path
|
||||
required: true
|
||||
type: string
|
||||
pattern: memos/[^/]+
|
||||
tags:
|
||||
- MemoService
|
||||
/api/v2/{name}:
|
||||
get:
|
||||
summary: GetUser gets a user by name.
|
||||
@@ -1413,6 +1173,282 @@ paths:
|
||||
type: string
|
||||
tags:
|
||||
- UserService
|
||||
/api/v2/{name}/comments:
|
||||
get:
|
||||
summary: ListMemoComments lists comments for a memo.
|
||||
operationId: MemoService_ListMemoComments
|
||||
responses:
|
||||
"200":
|
||||
description: A successful response.
|
||||
schema:
|
||||
$ref: '#/definitions/v2ListMemoCommentsResponse'
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
$ref: '#/definitions/googlerpcStatus'
|
||||
parameters:
|
||||
- name: name
|
||||
description: |-
|
||||
The name of the memo.
|
||||
Format: memos/{uid}
|
||||
in: path
|
||||
required: true
|
||||
type: string
|
||||
pattern: memos/[^/]+
|
||||
tags:
|
||||
- MemoService
|
||||
post:
|
||||
summary: CreateMemoComment creates a comment for a memo.
|
||||
operationId: MemoService_CreateMemoComment
|
||||
responses:
|
||||
"200":
|
||||
description: A successful response.
|
||||
schema:
|
||||
$ref: '#/definitions/v2CreateMemoCommentResponse'
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
$ref: '#/definitions/googlerpcStatus'
|
||||
parameters:
|
||||
- name: name
|
||||
description: |-
|
||||
The name of the memo.
|
||||
Format: memos/{uid}
|
||||
in: path
|
||||
required: true
|
||||
type: string
|
||||
pattern: memos/[^/]+
|
||||
- name: comment.content
|
||||
in: query
|
||||
required: false
|
||||
type: string
|
||||
- name: comment.visibility
|
||||
in: query
|
||||
required: false
|
||||
type: string
|
||||
enum:
|
||||
- VISIBILITY_UNSPECIFIED
|
||||
- PRIVATE
|
||||
- PROTECTED
|
||||
- PUBLIC
|
||||
default: VISIBILITY_UNSPECIFIED
|
||||
tags:
|
||||
- MemoService
|
||||
/api/v2/{name}/reactions:
|
||||
get:
|
||||
summary: ListMemoReactions lists reactions for a memo.
|
||||
operationId: MemoService_ListMemoReactions
|
||||
responses:
|
||||
"200":
|
||||
description: A successful response.
|
||||
schema:
|
||||
$ref: '#/definitions/v2ListMemoReactionsResponse'
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
$ref: '#/definitions/googlerpcStatus'
|
||||
parameters:
|
||||
- name: name
|
||||
description: |-
|
||||
The name of the memo.
|
||||
Format: memos/{uid}
|
||||
in: path
|
||||
required: true
|
||||
type: string
|
||||
pattern: memos/[^/]+
|
||||
tags:
|
||||
- MemoService
|
||||
post:
|
||||
summary: UpsertMemoReaction upserts a reaction for a memo.
|
||||
operationId: MemoService_UpsertMemoReaction
|
||||
responses:
|
||||
"200":
|
||||
description: A successful response.
|
||||
schema:
|
||||
$ref: '#/definitions/v2UpsertMemoReactionResponse'
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
$ref: '#/definitions/googlerpcStatus'
|
||||
parameters:
|
||||
- name: name
|
||||
description: |-
|
||||
The name of the memo.
|
||||
Format: memos/{uid}
|
||||
in: path
|
||||
required: true
|
||||
type: string
|
||||
pattern: memos/[^/]+
|
||||
- name: reaction.id
|
||||
in: query
|
||||
required: false
|
||||
type: integer
|
||||
format: int32
|
||||
- name: reaction.creator
|
||||
description: |-
|
||||
The name of the creator.
|
||||
Format: users/{uid}
|
||||
in: query
|
||||
required: false
|
||||
type: string
|
||||
- name: reaction.contentId
|
||||
in: query
|
||||
required: false
|
||||
type: string
|
||||
- name: reaction.reactionType
|
||||
in: query
|
||||
required: false
|
||||
type: string
|
||||
enum:
|
||||
- TYPE_UNSPECIFIED
|
||||
- THUMBS_UP
|
||||
- THUMBS_DOWN
|
||||
- HEART
|
||||
- FIRE
|
||||
- CLAPPING_HANDS
|
||||
- LAUGH
|
||||
- OK_HAND
|
||||
- ROCKET
|
||||
- EYES
|
||||
- THINKING_FACE
|
||||
- CLOWN_FACE
|
||||
- QUESTION_MARK
|
||||
default: TYPE_UNSPECIFIED
|
||||
tags:
|
||||
- MemoService
|
||||
/api/v2/{name}/reactions/{reactionId}:
|
||||
delete:
|
||||
summary: DeleteMemoReaction deletes a reaction for a memo.
|
||||
operationId: MemoService_DeleteMemoReaction
|
||||
responses:
|
||||
"200":
|
||||
description: A successful response.
|
||||
schema:
|
||||
$ref: '#/definitions/v2DeleteMemoReactionResponse'
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
$ref: '#/definitions/googlerpcStatus'
|
||||
parameters:
|
||||
- name: name
|
||||
description: |-
|
||||
The name of the memo.
|
||||
Format: memos/{uid}
|
||||
in: path
|
||||
required: true
|
||||
type: string
|
||||
pattern: memos/[^/]+
|
||||
- name: reactionId
|
||||
in: path
|
||||
required: true
|
||||
type: integer
|
||||
format: int32
|
||||
tags:
|
||||
- MemoService
|
||||
/api/v2/{name}/relations:
|
||||
get:
|
||||
summary: ListMemoRelations lists relations for a memo.
|
||||
operationId: MemoService_ListMemoRelations
|
||||
responses:
|
||||
"200":
|
||||
description: A successful response.
|
||||
schema:
|
||||
$ref: '#/definitions/v2ListMemoRelationsResponse'
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
$ref: '#/definitions/googlerpcStatus'
|
||||
parameters:
|
||||
- name: name
|
||||
description: |-
|
||||
The name of the memo.
|
||||
Format: memos/{uid}
|
||||
in: path
|
||||
required: true
|
||||
type: string
|
||||
pattern: memos/[^/]+
|
||||
tags:
|
||||
- MemoService
|
||||
post:
|
||||
summary: SetMemoRelations sets relations for a memo.
|
||||
operationId: MemoService_SetMemoRelations
|
||||
responses:
|
||||
"200":
|
||||
description: A successful response.
|
||||
schema:
|
||||
$ref: '#/definitions/v2SetMemoRelationsResponse'
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
$ref: '#/definitions/googlerpcStatus'
|
||||
parameters:
|
||||
- name: name
|
||||
description: |-
|
||||
The name of the memo.
|
||||
Format: memos/{uid}
|
||||
in: path
|
||||
required: true
|
||||
type: string
|
||||
pattern: memos/[^/]+
|
||||
- name: body
|
||||
in: body
|
||||
required: true
|
||||
schema:
|
||||
$ref: '#/definitions/MemoServiceSetMemoRelationsBody'
|
||||
tags:
|
||||
- MemoService
|
||||
/api/v2/{name}/resources:
|
||||
get:
|
||||
summary: ListMemoResources lists resources for a memo.
|
||||
operationId: MemoService_ListMemoResources
|
||||
responses:
|
||||
"200":
|
||||
description: A successful response.
|
||||
schema:
|
||||
$ref: '#/definitions/v2ListMemoResourcesResponse'
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
$ref: '#/definitions/googlerpcStatus'
|
||||
parameters:
|
||||
- name: name
|
||||
description: |-
|
||||
The name of the memo.
|
||||
Format: memos/{uid}
|
||||
in: path
|
||||
required: true
|
||||
type: string
|
||||
pattern: memos/[^/]+
|
||||
tags:
|
||||
- MemoService
|
||||
post:
|
||||
summary: SetMemoResources sets resources for a memo.
|
||||
operationId: MemoService_SetMemoResources
|
||||
responses:
|
||||
"200":
|
||||
description: A successful response.
|
||||
schema:
|
||||
$ref: '#/definitions/v2SetMemoResourcesResponse'
|
||||
default:
|
||||
description: An unexpected error response.
|
||||
schema:
|
||||
$ref: '#/definitions/googlerpcStatus'
|
||||
parameters:
|
||||
- name: name
|
||||
description: |-
|
||||
The name of the memo.
|
||||
Format: memos/{uid}
|
||||
in: path
|
||||
required: true
|
||||
type: string
|
||||
pattern: memos/[^/]+
|
||||
- name: body
|
||||
in: body
|
||||
required: true
|
||||
schema:
|
||||
$ref: '#/definitions/MemoServiceSetMemoResourcesBody'
|
||||
tags:
|
||||
- MemoService
|
||||
/api/v2/{name}/setting:
|
||||
get:
|
||||
summary: GetUserSetting gets the setting of a user.
|
||||
@@ -1839,11 +1875,6 @@ definitions:
|
||||
properties:
|
||||
linkMetadata:
|
||||
$ref: '#/definitions/v2LinkMetadata'
|
||||
v2GetMemoByNameResponse:
|
||||
type: object
|
||||
properties:
|
||||
memo:
|
||||
$ref: '#/definitions/v2Memo'
|
||||
v2GetMemoResponse:
|
||||
type: object
|
||||
properties:
|
||||
@@ -2045,13 +2076,13 @@ definitions:
|
||||
v2Memo:
|
||||
type: object
|
||||
properties:
|
||||
id:
|
||||
type: integer
|
||||
format: int32
|
||||
description: id is the system generated unique identifier.
|
||||
name:
|
||||
type: string
|
||||
description: name is the user provided name.
|
||||
title: |-
|
||||
The name of the memo.
|
||||
Format: memos/{uid}
|
||||
resourceId:
|
||||
type: string
|
||||
rowStatus:
|
||||
$ref: '#/definitions/apiv2RowStatus'
|
||||
creator:
|
||||
@@ -2144,6 +2175,14 @@ definitions:
|
||||
memoId:
|
||||
type: integer
|
||||
format: int32
|
||||
v2SearchMemosResponse:
|
||||
type: object
|
||||
properties:
|
||||
memos:
|
||||
type: array
|
||||
items:
|
||||
type: object
|
||||
$ref: '#/definitions/v2Memo'
|
||||
v2SearchUsersResponse:
|
||||
type: object
|
||||
properties:
|
||||
|
@@ -11,10 +11,14 @@ import (
|
||||
)
|
||||
|
||||
func (s *APIV2Service) SetMemoRelations(ctx context.Context, request *apiv2pb.SetMemoRelationsRequest) (*apiv2pb.SetMemoRelationsResponse, error) {
|
||||
id, err := ExtractMemoIDFromName(request.Name)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.InvalidArgument, "invalid memo name: %v", err)
|
||||
}
|
||||
referenceType := store.MemoRelationReference
|
||||
// Delete all reference relations first.
|
||||
if err := s.Store.DeleteMemoRelation(ctx, &store.DeleteMemoRelation{
|
||||
MemoID: &request.Id,
|
||||
MemoID: &id,
|
||||
Type: &referenceType,
|
||||
}); err != nil {
|
||||
return nil, status.Errorf(codes.Internal, "failed to delete memo relation")
|
||||
@@ -22,7 +26,7 @@ func (s *APIV2Service) SetMemoRelations(ctx context.Context, request *apiv2pb.Se
|
||||
|
||||
for _, relation := range request.Relations {
|
||||
// Ignore reflexive relations.
|
||||
if request.Id == relation.RelatedMemoId {
|
||||
if id == relation.RelatedMemoId {
|
||||
continue
|
||||
}
|
||||
// Ignore comment relations as there's no need to update a comment's relation.
|
||||
@@ -31,7 +35,7 @@ func (s *APIV2Service) SetMemoRelations(ctx context.Context, request *apiv2pb.Se
|
||||
continue
|
||||
}
|
||||
if _, err := s.Store.UpsertMemoRelation(ctx, &store.MemoRelation{
|
||||
MemoID: request.Id,
|
||||
MemoID: id,
|
||||
RelatedMemoID: relation.RelatedMemoId,
|
||||
Type: convertMemoRelationTypeToStore(relation.Type),
|
||||
}); err != nil {
|
||||
@@ -43,9 +47,13 @@ func (s *APIV2Service) SetMemoRelations(ctx context.Context, request *apiv2pb.Se
|
||||
}
|
||||
|
||||
func (s *APIV2Service) ListMemoRelations(ctx context.Context, request *apiv2pb.ListMemoRelationsRequest) (*apiv2pb.ListMemoRelationsResponse, error) {
|
||||
id, err := ExtractMemoIDFromName(request.Name)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.InvalidArgument, "invalid memo name: %v", err)
|
||||
}
|
||||
relationList := []*apiv2pb.MemoRelation{}
|
||||
tempList, err := s.Store.ListMemoRelations(ctx, &store.FindMemoRelation{
|
||||
MemoID: &request.Id,
|
||||
MemoID: &id,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -54,7 +62,7 @@ func (s *APIV2Service) ListMemoRelations(ctx context.Context, request *apiv2pb.L
|
||||
relationList = append(relationList, convertMemoRelationFromStore(relation))
|
||||
}
|
||||
tempList, err = s.Store.ListMemoRelations(ctx, &store.FindMemoRelation{
|
||||
RelatedMemoID: &request.Id,
|
||||
RelatedMemoID: &id,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@@ -13,8 +13,12 @@ import (
|
||||
)
|
||||
|
||||
func (s *APIV2Service) SetMemoResources(ctx context.Context, request *apiv2pb.SetMemoResourcesRequest) (*apiv2pb.SetMemoResourcesResponse, error) {
|
||||
id, err := ExtractMemoIDFromName(request.Name)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.InvalidArgument, "invalid memo name: %v", err)
|
||||
}
|
||||
resources, err := s.Store.ListResources(ctx, &store.FindResource{
|
||||
MemoID: &request.Id,
|
||||
MemoID: &id,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, "failed to list resources")
|
||||
@@ -32,7 +36,7 @@ func (s *APIV2Service) SetMemoResources(ctx context.Context, request *apiv2pb.Se
|
||||
if !found {
|
||||
if err = s.Store.DeleteResource(ctx, &store.DeleteResource{
|
||||
ID: int32(resource.ID),
|
||||
MemoID: &request.Id,
|
||||
MemoID: &id,
|
||||
}); err != nil {
|
||||
return nil, status.Errorf(codes.Internal, "failed to delete resource")
|
||||
}
|
||||
@@ -45,7 +49,7 @@ func (s *APIV2Service) SetMemoResources(ctx context.Context, request *apiv2pb.Se
|
||||
updatedTs := time.Now().Unix() + int64(index)
|
||||
if _, err := s.Store.UpdateResource(ctx, &store.UpdateResource{
|
||||
ID: resource.Id,
|
||||
MemoID: &request.Id,
|
||||
MemoID: &id,
|
||||
UpdatedTs: &updatedTs,
|
||||
}); err != nil {
|
||||
return nil, status.Errorf(codes.Internal, "failed to update resource: %v", err)
|
||||
@@ -56,8 +60,12 @@ func (s *APIV2Service) SetMemoResources(ctx context.Context, request *apiv2pb.Se
|
||||
}
|
||||
|
||||
func (s *APIV2Service) ListMemoResources(ctx context.Context, request *apiv2pb.ListMemoResourcesRequest) (*apiv2pb.ListMemoResourcesResponse, error) {
|
||||
id, err := ExtractMemoIDFromName(request.Name)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.InvalidArgument, "invalid memo name: %v", err)
|
||||
}
|
||||
resources, err := s.Store.ListResources(ctx, &store.FindResource{
|
||||
MemoID: &request.Id,
|
||||
MemoID: &id,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, "failed to list resources")
|
||||
|
@@ -133,9 +133,44 @@ func (s *APIV2Service) ListMemos(ctx context.Context, request *apiv2pb.ListMemos
|
||||
return response, nil
|
||||
}
|
||||
|
||||
func (s *APIV2Service) SearchMemos(ctx context.Context, request *apiv2pb.SearchMemosRequest) (*apiv2pb.SearchMemosResponse, error) {
|
||||
memoFind := &store.FindMemo{
|
||||
// Exclude comments by default.
|
||||
ExcludeComments: true,
|
||||
}
|
||||
if err := s.buildMemoFindWithFilter(ctx, memoFind, request.Filter); err != nil {
|
||||
return nil, status.Errorf(codes.InvalidArgument, "failed to build find memos with filter")
|
||||
}
|
||||
|
||||
defaultSearchLimit := 10
|
||||
memoFind.Limit = &defaultSearchLimit
|
||||
memos, err := s.Store.ListMemos(ctx, memoFind)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, "failed to search memos")
|
||||
}
|
||||
|
||||
memoMessages := []*apiv2pb.Memo{}
|
||||
for _, memo := range memos {
|
||||
memoMessage, err := s.convertMemoFromStore(ctx, memo)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to convert memo")
|
||||
}
|
||||
memoMessages = append(memoMessages, memoMessage)
|
||||
}
|
||||
|
||||
response := &apiv2pb.SearchMemosResponse{
|
||||
Memos: memoMessages,
|
||||
}
|
||||
return response, nil
|
||||
}
|
||||
|
||||
func (s *APIV2Service) GetMemo(ctx context.Context, request *apiv2pb.GetMemoRequest) (*apiv2pb.GetMemoResponse, error) {
|
||||
id, err := ExtractMemoIDFromName(request.Name)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.InvalidArgument, "invalid memo name: %v", err)
|
||||
}
|
||||
memo, err := s.Store.GetMemo(ctx, &store.FindMemo{
|
||||
ID: &request.Id,
|
||||
ID: &id,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -166,47 +201,16 @@ func (s *APIV2Service) GetMemo(ctx context.Context, request *apiv2pb.GetMemoRequ
|
||||
return response, nil
|
||||
}
|
||||
|
||||
func (s *APIV2Service) GetMemoByName(ctx context.Context, request *apiv2pb.GetMemoByNameRequest) (*apiv2pb.GetMemoByNameResponse, error) {
|
||||
memo, err := s.Store.GetMemo(ctx, &store.FindMemo{
|
||||
ResourceName: &request.Name,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if memo == nil {
|
||||
return nil, status.Errorf(codes.NotFound, "memo not found")
|
||||
}
|
||||
if memo.Visibility != store.Public {
|
||||
user, err := getCurrentUser(ctx, s.Store)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, "failed to get user")
|
||||
}
|
||||
if user == nil {
|
||||
return nil, status.Errorf(codes.PermissionDenied, "permission denied")
|
||||
}
|
||||
if memo.Visibility == store.Private && memo.CreatorID != user.ID {
|
||||
return nil, status.Errorf(codes.PermissionDenied, "permission denied")
|
||||
}
|
||||
}
|
||||
|
||||
memoMessage, err := s.convertMemoFromStore(ctx, memo)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to convert memo")
|
||||
}
|
||||
response := &apiv2pb.GetMemoByNameResponse{
|
||||
Memo: memoMessage,
|
||||
}
|
||||
return response, nil
|
||||
}
|
||||
|
||||
func (s *APIV2Service) UpdateMemo(ctx context.Context, request *apiv2pb.UpdateMemoRequest) (*apiv2pb.UpdateMemoResponse, error) {
|
||||
id, err := ExtractMemoIDFromName(request.Memo.Name)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.InvalidArgument, "invalid memo name: %v", err)
|
||||
}
|
||||
if request.UpdateMask == nil || len(request.UpdateMask.Paths) == 0 {
|
||||
return nil, status.Errorf(codes.InvalidArgument, "update mask is required")
|
||||
}
|
||||
|
||||
memo, err := s.Store.GetMemo(ctx, &store.FindMemo{
|
||||
ID: &request.Memo.Id,
|
||||
})
|
||||
memo, err := s.Store.GetMemo(ctx, &store.FindMemo{ID: &id})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -221,7 +225,7 @@ func (s *APIV2Service) UpdateMemo(ctx context.Context, request *apiv2pb.UpdateMe
|
||||
|
||||
currentTs := time.Now().Unix()
|
||||
update := &store.UpdateMemo{
|
||||
ID: request.Memo.Id,
|
||||
ID: id,
|
||||
UpdatedTs: ¤tTs,
|
||||
}
|
||||
for _, path := range request.UpdateMask.Paths {
|
||||
@@ -251,7 +255,7 @@ func (s *APIV2Service) UpdateMemo(ctx context.Context, request *apiv2pb.UpdateMe
|
||||
update.CreatedTs = &createdTs
|
||||
} else if path == "pinned" {
|
||||
if _, err := s.Store.UpsertMemoOrganizer(ctx, &store.MemoOrganizer{
|
||||
MemoID: request.Memo.Id,
|
||||
MemoID: id,
|
||||
UserID: user.ID,
|
||||
Pinned: request.Memo.Pinned,
|
||||
}); err != nil {
|
||||
@@ -268,7 +272,7 @@ func (s *APIV2Service) UpdateMemo(ctx context.Context, request *apiv2pb.UpdateMe
|
||||
}
|
||||
|
||||
memo, err = s.Store.GetMemo(ctx, &store.FindMemo{
|
||||
ID: &request.Memo.Id,
|
||||
ID: &id,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to get memo")
|
||||
@@ -288,8 +292,12 @@ func (s *APIV2Service) UpdateMemo(ctx context.Context, request *apiv2pb.UpdateMe
|
||||
}
|
||||
|
||||
func (s *APIV2Service) DeleteMemo(ctx context.Context, request *apiv2pb.DeleteMemoRequest) (*apiv2pb.DeleteMemoResponse, error) {
|
||||
id, err := ExtractMemoIDFromName(request.Name)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.InvalidArgument, "invalid memo name: %v", err)
|
||||
}
|
||||
memo, err := s.Store.GetMemo(ctx, &store.FindMemo{
|
||||
ID: &request.Id,
|
||||
ID: &id,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -310,9 +318,7 @@ func (s *APIV2Service) DeleteMemo(ctx context.Context, request *apiv2pb.DeleteMe
|
||||
}
|
||||
}
|
||||
|
||||
if err = s.Store.DeleteMemo(ctx, &store.DeleteMemo{
|
||||
ID: request.Id,
|
||||
}); err != nil {
|
||||
if err = s.Store.DeleteMemo(ctx, &store.DeleteMemo{ID: id}); err != nil {
|
||||
return nil, status.Errorf(codes.Internal, "failed to delete memo")
|
||||
}
|
||||
|
||||
@@ -320,22 +326,30 @@ func (s *APIV2Service) DeleteMemo(ctx context.Context, request *apiv2pb.DeleteMe
|
||||
}
|
||||
|
||||
func (s *APIV2Service) CreateMemoComment(ctx context.Context, request *apiv2pb.CreateMemoCommentRequest) (*apiv2pb.CreateMemoCommentResponse, error) {
|
||||
relatedMemo, err := s.Store.GetMemo(ctx, &store.FindMemo{ID: &request.Id})
|
||||
id, err := ExtractMemoIDFromName(request.Name)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.InvalidArgument, "invalid memo name: %v", err)
|
||||
}
|
||||
relatedMemo, err := s.Store.GetMemo(ctx, &store.FindMemo{ID: &id})
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, "failed to get memo")
|
||||
}
|
||||
|
||||
// Create the comment memo first.
|
||||
createMemoResponse, err := s.CreateMemo(ctx, request.Create)
|
||||
createMemoResponse, err := s.CreateMemo(ctx, request.Comment)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, "failed to create memo")
|
||||
}
|
||||
|
||||
// Build the relation between the comment memo and the original memo.
|
||||
memo := createMemoResponse.Memo
|
||||
memoId, err := ExtractMemoIDFromName(memo.Name)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.InvalidArgument, "invalid memo name: %v", err)
|
||||
}
|
||||
_, err = s.Store.UpsertMemoRelation(ctx, &store.MemoRelation{
|
||||
MemoID: memo.Id,
|
||||
RelatedMemoID: request.Id,
|
||||
MemoID: memoId,
|
||||
RelatedMemoID: relatedMemo.ID,
|
||||
Type: store.MemoRelationComment,
|
||||
})
|
||||
if err != nil {
|
||||
@@ -352,8 +366,8 @@ func (s *APIV2Service) CreateMemoComment(ctx context.Context, request *apiv2pb.C
|
||||
Level: store.ActivityLevelInfo,
|
||||
Payload: &storepb.ActivityPayload{
|
||||
MemoComment: &storepb.ActivityMemoCommentPayload{
|
||||
MemoId: memo.Id,
|
||||
RelatedMemoId: request.Id,
|
||||
MemoId: memoId,
|
||||
RelatedMemoId: relatedMemo.ID,
|
||||
},
|
||||
},
|
||||
})
|
||||
@@ -380,9 +394,13 @@ func (s *APIV2Service) CreateMemoComment(ctx context.Context, request *apiv2pb.C
|
||||
}
|
||||
|
||||
func (s *APIV2Service) ListMemoComments(ctx context.Context, request *apiv2pb.ListMemoCommentsRequest) (*apiv2pb.ListMemoCommentsResponse, error) {
|
||||
id, err := ExtractMemoIDFromName(request.Name)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.InvalidArgument, "invalid memo name: %v", err)
|
||||
}
|
||||
memoRelationComment := store.MemoRelationComment
|
||||
memoRelations, err := s.Store.ListMemoRelations(ctx, &store.FindMemoRelation{
|
||||
RelatedMemoID: &request.Id,
|
||||
RelatedMemoID: &id,
|
||||
Type: &memoRelationComment,
|
||||
})
|
||||
if err != nil {
|
||||
@@ -519,24 +537,25 @@ func (s *APIV2Service) convertMemoFromStore(ctx context.Context, memo *store.Mem
|
||||
return nil, errors.Wrap(err, "failed to get creator")
|
||||
}
|
||||
|
||||
listMemoRelationsResponse, err := s.ListMemoRelations(ctx, &apiv2pb.ListMemoRelationsRequest{Id: memo.ID})
|
||||
name := fmt.Sprintf("%s%d", MemoNamePrefix, memo.ID)
|
||||
listMemoRelationsResponse, err := s.ListMemoRelations(ctx, &apiv2pb.ListMemoRelationsRequest{Name: name})
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to list memo relations")
|
||||
}
|
||||
|
||||
listMemoResourcesResponse, err := s.ListMemoResources(ctx, &apiv2pb.ListMemoResourcesRequest{Id: memo.ID})
|
||||
listMemoResourcesResponse, err := s.ListMemoResources(ctx, &apiv2pb.ListMemoResourcesRequest{Name: name})
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to list memo resources")
|
||||
}
|
||||
|
||||
listMemoReactionsResponse, err := s.ListMemoReactions(ctx, &apiv2pb.ListMemoReactionsRequest{Id: memo.ID})
|
||||
listMemoReactionsResponse, err := s.ListMemoReactions(ctx, &apiv2pb.ListMemoReactionsRequest{Name: name})
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to list memo reactions")
|
||||
}
|
||||
|
||||
return &apiv2pb.Memo{
|
||||
Id: int32(memo.ID),
|
||||
Name: memo.ResourceName,
|
||||
Name: name,
|
||||
ResourceId: memo.ResourceName,
|
||||
RowStatus: convertRowStatusFromStore(memo.RowStatus),
|
||||
Creator: fmt.Sprintf("%s%d", UserNamePrefix, creator.ID),
|
||||
CreateTime: timestamppb.New(time.Unix(memo.CreatedTs, 0)),
|
||||
@@ -620,7 +639,7 @@ func (s *APIV2Service) buildMemoFindWithFilter(ctx context.Context, find *store.
|
||||
find = &store.FindMemo{}
|
||||
}
|
||||
if filter != "" {
|
||||
filter, err := parseListMemosFilter(filter)
|
||||
filter, err := parseSearchMemosFilter(filter)
|
||||
if err != nil {
|
||||
return status.Errorf(codes.InvalidArgument, "invalid filter: %v", err)
|
||||
}
|
||||
@@ -671,6 +690,9 @@ func (s *APIV2Service) buildMemoFindWithFilter(ctx context.Context, find *store.
|
||||
}
|
||||
find.CreatorID = &user.ID
|
||||
}
|
||||
if filter.ResourceName != nil {
|
||||
find.ResourceName = filter.ResourceName
|
||||
}
|
||||
if filter.RowStatus != nil {
|
||||
find.RowStatus = filter.RowStatus
|
||||
}
|
||||
@@ -698,29 +720,31 @@ func (s *APIV2Service) buildMemoFindWithFilter(ctx context.Context, find *store.
|
||||
return nil
|
||||
}
|
||||
|
||||
// ListMemosFilterCELAttributes are the CEL attributes for ListMemosFilter.
|
||||
var ListMemosFilterCELAttributes = []cel.EnvOption{
|
||||
// SearchMemosFilterCELAttributes are the CEL attributes.
|
||||
var SearchMemosFilterCELAttributes = []cel.EnvOption{
|
||||
cel.Variable("content_search", cel.ListType(cel.StringType)),
|
||||
cel.Variable("visibilities", cel.ListType(cel.StringType)),
|
||||
cel.Variable("order_by_pinned", cel.BoolType),
|
||||
cel.Variable("display_time_before", cel.IntType),
|
||||
cel.Variable("display_time_after", cel.IntType),
|
||||
cel.Variable("creator", cel.StringType),
|
||||
cel.Variable("resource_name", cel.StringType),
|
||||
cel.Variable("row_status", cel.StringType),
|
||||
}
|
||||
|
||||
type ListMemosFilter struct {
|
||||
type SearchMemosFilter struct {
|
||||
ContentSearch []string
|
||||
Visibilities []store.Visibility
|
||||
OrderByPinned bool
|
||||
DisplayTimeBefore *int64
|
||||
DisplayTimeAfter *int64
|
||||
Creator *string
|
||||
ResourceName *string
|
||||
RowStatus *store.RowStatus
|
||||
}
|
||||
|
||||
func parseListMemosFilter(expression string) (*ListMemosFilter, error) {
|
||||
e, err := cel.NewEnv(ListMemosFilterCELAttributes...)
|
||||
func parseSearchMemosFilter(expression string) (*SearchMemosFilter, error) {
|
||||
e, err := cel.NewEnv(SearchMemosFilterCELAttributes...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -728,17 +752,17 @@ func parseListMemosFilter(expression string) (*ListMemosFilter, error) {
|
||||
if issues != nil {
|
||||
return nil, errors.Errorf("found issue %v", issues)
|
||||
}
|
||||
filter := &ListMemosFilter{}
|
||||
filter := &SearchMemosFilter{}
|
||||
expr, err := cel.AstToParsedExpr(ast)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
callExpr := expr.GetExpr().GetCallExpr()
|
||||
findListMemosField(callExpr, filter)
|
||||
findSearchMemosField(callExpr, filter)
|
||||
return filter, nil
|
||||
}
|
||||
|
||||
func findListMemosField(callExpr *expr.Expr_Call, filter *ListMemosFilter) {
|
||||
func findSearchMemosField(callExpr *expr.Expr_Call, filter *SearchMemosFilter) {
|
||||
if len(callExpr.Args) == 2 {
|
||||
idExpr := callExpr.Args[0].GetIdentExpr()
|
||||
if idExpr != nil {
|
||||
@@ -768,6 +792,9 @@ func findListMemosField(callExpr *expr.Expr_Call, filter *ListMemosFilter) {
|
||||
} else if idExpr.Name == "creator" {
|
||||
creator := callExpr.Args[1].GetConstExpr().GetStringValue()
|
||||
filter.Creator = &creator
|
||||
} else if idExpr.Name == "resource_name" {
|
||||
resourceName := callExpr.Args[1].GetConstExpr().GetStringValue()
|
||||
filter.ResourceName = &resourceName
|
||||
} else if idExpr.Name == "row_status" {
|
||||
rowStatus := store.RowStatus(callExpr.Args[1].GetConstExpr().GetStringValue())
|
||||
filter.RowStatus = &rowStatus
|
||||
@@ -778,7 +805,7 @@ func findListMemosField(callExpr *expr.Expr_Call, filter *ListMemosFilter) {
|
||||
for _, arg := range callExpr.Args {
|
||||
callExpr := arg.GetCallExpr()
|
||||
if callExpr != nil {
|
||||
findListMemosField(callExpr, filter)
|
||||
findSearchMemosField(callExpr, filter)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -828,11 +855,15 @@ func convertMemoToWebhookPayload(memo *apiv2pb.Memo) (*webhook.WebhookPayload, e
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "invalid memo creator")
|
||||
}
|
||||
id, err := ExtractMemoIDFromName(memo.Name)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "invalid memo name")
|
||||
}
|
||||
return &webhook.WebhookPayload{
|
||||
CreatorID: creatorID,
|
||||
CreatedTs: time.Now().Unix(),
|
||||
Memo: &webhook.Memo{
|
||||
ID: memo.Id,
|
||||
ID: id,
|
||||
CreatorID: creatorID,
|
||||
CreatedTs: memo.CreateTime.Seconds,
|
||||
UpdatedTs: memo.UpdateTime.Seconds,
|
||||
|
@@ -13,9 +13,8 @@ import (
|
||||
)
|
||||
|
||||
func (s *APIV2Service) ListMemoReactions(ctx context.Context, request *apiv2pb.ListMemoReactionsRequest) (*apiv2pb.ListMemoReactionsResponse, error) {
|
||||
contentID := fmt.Sprintf("memos/%d", request.Id)
|
||||
reactions, err := s.Store.ListReactions(ctx, &store.FindReaction{
|
||||
ContentID: &contentID,
|
||||
ContentID: &request.Name,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, "failed to list reactions")
|
||||
@@ -58,8 +57,12 @@ func (s *APIV2Service) UpsertMemoReaction(ctx context.Context, request *apiv2pb.
|
||||
}
|
||||
|
||||
func (s *APIV2Service) DeleteMemoReaction(ctx context.Context, request *apiv2pb.DeleteMemoReactionRequest) (*apiv2pb.DeleteMemoReactionResponse, error) {
|
||||
id, err := ExtractMemoIDFromName(request.Name)
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.InvalidArgument, "invalid memo name: %v", err)
|
||||
}
|
||||
if err := s.Store.DeleteReaction(ctx, &store.DeleteReaction{
|
||||
ID: request.Id,
|
||||
ID: id,
|
||||
}); err != nil {
|
||||
return nil, status.Errorf(codes.Internal, "failed to delete reaction")
|
||||
}
|
||||
@@ -76,7 +79,7 @@ func (s *APIV2Service) convertReactionFromStore(ctx context.Context, reaction *s
|
||||
}
|
||||
return &apiv2pb.Reaction{
|
||||
Id: reaction.Id,
|
||||
Creator: fmt.Sprintf("%s%s", UserNamePrefix, creator.Username),
|
||||
Creator: fmt.Sprintf("%s%d", UserNamePrefix, creator.ID),
|
||||
ContentId: reaction.ContentId,
|
||||
ReactionType: apiv2pb.Reaction_Type(reaction.ReactionType),
|
||||
}, nil
|
||||
|
@@ -12,6 +12,7 @@ import (
|
||||
const (
|
||||
WorkspaceSettingNamePrefix = "settings/"
|
||||
UserNamePrefix = "users/"
|
||||
MemoNamePrefix = "memos/"
|
||||
InboxNamePrefix = "inboxes/"
|
||||
)
|
||||
|
||||
@@ -56,6 +57,19 @@ func ExtractUserIDFromName(name string) (int32, error) {
|
||||
return id, nil
|
||||
}
|
||||
|
||||
// ExtractMemoIDFromName returns the memo ID from a resource name.
|
||||
func ExtractMemoIDFromName(name string) (int32, error) {
|
||||
tokens, err := GetNameParentTokens(name, MemoNamePrefix)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
id, err := util.ConvertStringToInt32(tokens[0])
|
||||
if err != nil {
|
||||
return 0, errors.Errorf("invalid memo ID %q", tokens[0])
|
||||
}
|
||||
return id, nil
|
||||
}
|
||||
|
||||
// ExtractInboxIDFromName returns the inbox ID from a resource name.
|
||||
func ExtractInboxIDFromName(name string) (int32, error) {
|
||||
tokens, err := GetNameParentTokens(name, InboxNamePrefix)
|
||||
|
@@ -244,7 +244,7 @@ func (s *APIV2Service) convertTagFromStore(ctx context.Context, tag *store.Tag)
|
||||
}
|
||||
return &apiv2pb.Tag{
|
||||
Name: tag.Name,
|
||||
Creator: fmt.Sprintf("%s%s", UserNamePrefix, user.Username),
|
||||
Creator: fmt.Sprintf("%s%d", UserNamePrefix, user.ID),
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user