chore: tweak memo structure

This commit is contained in:
Steven
2024-03-18 23:23:53 +08:00
parent 2dc8ed773c
commit 5f2d6b22be
40 changed files with 1758 additions and 1499 deletions

View File

@@ -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 |

View File

@@ -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:

View File

@@ -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

View File

@@ -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")

View File

@@ -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: &currentTs,
}
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,

View File

@@ -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

View File

@@ -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)

View File

@@ -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
}