refactor: memo service

pull/4781/head
Steven 4 months ago
parent 91c2a4cef9
commit 9972a77d9e

@ -5,10 +5,10 @@ package memos.api.v1;
import "api/v1/attachment_service.proto"; import "api/v1/attachment_service.proto";
import "api/v1/common.proto"; import "api/v1/common.proto";
import "api/v1/markdown_service.proto"; import "api/v1/markdown_service.proto";
import "api/v1/reaction_service.proto";
import "google/api/annotations.proto"; import "google/api/annotations.proto";
import "google/api/client.proto"; import "google/api/client.proto";
import "google/api/field_behavior.proto"; import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/protobuf/empty.proto"; import "google/protobuf/empty.proto";
import "google/protobuf/field_mask.proto"; import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto"; import "google/protobuf/timestamp.proto";
@ -22,6 +22,7 @@ service MemoService {
post: "/api/v1/memos" post: "/api/v1/memos"
body: "memo" body: "memo"
}; };
option (google.api.method_signature) = "memo";
} }
// ListMemos lists memos with pagination and filter. // ListMemos lists memos with pagination and filter.
rpc ListMemos(ListMemosRequest) returns (ListMemosResponse) { rpc ListMemos(ListMemosRequest) returns (ListMemosResponse) {
@ -29,6 +30,8 @@ service MemoService {
get: "/api/v1/memos" get: "/api/v1/memos"
additional_bindings: {get: "/api/v1/{parent=users/*}/memos"} additional_bindings: {get: "/api/v1/{parent=users/*}/memos"}
}; };
option (google.api.method_signature) = "";
option (google.api.method_signature) = "parent";
} }
// GetMemo gets a memo. // GetMemo gets a memo.
rpc GetMemo(GetMemoRequest) returns (Memo) { rpc GetMemo(GetMemoRequest) returns (Memo) {
@ -54,10 +57,12 @@ service MemoService {
patch: "/api/v1/{parent=memos/*}/tags:rename" patch: "/api/v1/{parent=memos/*}/tags:rename"
body: "*" body: "*"
}; };
option (google.api.method_signature) = "parent,old_tag,new_tag";
} }
// DeleteMemoTag deletes a tag for a memo. // DeleteMemoTag deletes a tag for a memo.
rpc DeleteMemoTag(DeleteMemoTagRequest) returns (google.protobuf.Empty) { rpc DeleteMemoTag(DeleteMemoTagRequest) returns (google.protobuf.Empty) {
option (google.api.http) = {delete: "/api/v1/{parent=memos/*}/tags/{tag}"}; option (google.api.http) = {delete: "/api/v1/{parent=memos/*}/tags/{tag}"};
option (google.api.method_signature) = "parent,tag";
} }
// SetMemoAttachments sets attachments for a memo. // SetMemoAttachments sets attachments for a memo.
rpc SetMemoAttachments(SetMemoAttachmentsRequest) returns (google.protobuf.Empty) { rpc SetMemoAttachments(SetMemoAttachmentsRequest) returns (google.protobuf.Empty) {
@ -91,7 +96,7 @@ service MemoService {
post: "/api/v1/{name=memos/*}/comments" post: "/api/v1/{name=memos/*}/comments"
body: "comment" body: "comment"
}; };
option (google.api.method_signature) = "name"; option (google.api.method_signature) = "name,comment";
} }
// ListMemoComments lists comments for a memo. // ListMemoComments lists comments for a memo.
rpc ListMemoComments(ListMemoCommentsRequest) returns (ListMemoCommentsResponse) { rpc ListMemoComments(ListMemoCommentsRequest) returns (ListMemoCommentsResponse) {
@ -113,8 +118,8 @@ service MemoService {
} }
// DeleteMemoReaction deletes a reaction for a memo. // DeleteMemoReaction deletes a reaction for a memo.
rpc DeleteMemoReaction(DeleteMemoReactionRequest) returns (google.protobuf.Empty) { rpc DeleteMemoReaction(DeleteMemoReactionRequest) returns (google.protobuf.Empty) {
option (google.api.http) = {delete: "/api/v1/reactions/{id}"}; option (google.api.http) = {delete: "/api/v1/{name=reactions/*}"};
option (google.api.method_signature) = "id"; option (google.api.method_signature) = "name";
} }
} }
@ -125,56 +130,122 @@ enum Visibility {
PUBLIC = 3; PUBLIC = 3;
} }
message Memo { message Reaction {
reserved 2; option (google.api.resource) = {
type: "memos.api.v1/Reaction"
pattern: "reactions/{reaction}"
name_field: "name"
singular: "reaction"
plural: "reactions"
};
// The name of the memo. // The resource name of the reaction.
// Format: memos/{memo}, memo is the user defined id or uuid. // Format: reactions/{reaction}
string name = 1 [ string name = 1 [
(google.api.field_behavior) = OUTPUT_ONLY, (google.api.field_behavior) = OUTPUT_ONLY,
(google.api.field_behavior) = IDENTIFIER (google.api.field_behavior) = IDENTIFIER
]; ];
State state = 3; // Output only. The system generated unique identifier.
string uid = 2 [(google.api.field_behavior) = OUTPUT_ONLY];
// The resource name of the creator.
// Format: users/{user}
string creator = 3 [
(google.api.field_behavior) = OUTPUT_ONLY,
(google.api.resource_reference) = {type: "memos.api.v1/User"}
];
// The resource name of the content.
// For memo reactions, this should be the memo's resource name.
// Format: memos/{memo}
string content_id = 4 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {type: "memos.api.v1/Memo"}
];
// Required. The type of reaction (e.g., "👍", "❤️", "😄").
string reaction_type = 5 [(google.api.field_behavior) = REQUIRED];
// Output only. The creation timestamp.
google.protobuf.Timestamp create_time = 6 [(google.api.field_behavior) = OUTPUT_ONLY];
}
message Memo {
option (google.api.resource) = {
type: "memos.api.v1/Memo"
pattern: "memos/{memo}"
name_field: "name"
singular: "memo"
plural: "memos"
};
reserved 2;
// The resource name of the memo.
// Format: memos/{memo}, memo is the user defined id or uuid.
string name = 1 [(google.api.field_behavior) = IDENTIFIER];
// The state of the memo.
State state = 3 [(google.api.field_behavior) = REQUIRED];
// The name of the creator. // The name of the creator.
// Format: users/{user} // Format: users/{user}
string creator = 4; string creator = 4 [
(google.api.field_behavior) = OUTPUT_ONLY,
(google.api.resource_reference) = {type: "memos.api.v1/User"}
];
google.protobuf.Timestamp create_time = 5; // Output only. The creation timestamp.
google.protobuf.Timestamp create_time = 5 [(google.api.field_behavior) = OUTPUT_ONLY];
google.protobuf.Timestamp update_time = 6; // Output only. The last update timestamp.
google.protobuf.Timestamp update_time = 6 [(google.api.field_behavior) = OUTPUT_ONLY];
google.protobuf.Timestamp display_time = 7; // The display timestamp of the memo.
google.protobuf.Timestamp display_time = 7 [(google.api.field_behavior) = OPTIONAL];
string content = 8; // Required. The content of the memo in Markdown format.
string content = 8 [(google.api.field_behavior) = REQUIRED];
// Output only. The parsed nodes from the content.
repeated Node nodes = 9 [(google.api.field_behavior) = OUTPUT_ONLY]; repeated Node nodes = 9 [(google.api.field_behavior) = OUTPUT_ONLY];
Visibility visibility = 10; // The visibility of the memo.
Visibility visibility = 10 [(google.api.field_behavior) = REQUIRED];
// Output only. The tags extracted from the content.
repeated string tags = 11 [(google.api.field_behavior) = OUTPUT_ONLY]; repeated string tags = 11 [(google.api.field_behavior) = OUTPUT_ONLY];
bool pinned = 12; // Whether the memo is pinned.
bool pinned = 12 [(google.api.field_behavior) = OPTIONAL];
repeated Attachment attachments = 14; // Optional. The attachments of the memo.
repeated Attachment attachments = 14 [(google.api.field_behavior) = OPTIONAL];
repeated MemoRelation relations = 15; // Optional. The relations of the memo.
repeated MemoRelation relations = 15 [(google.api.field_behavior) = OPTIONAL];
// Output only. The reactions to the memo.
repeated Reaction reactions = 16 [(google.api.field_behavior) = OUTPUT_ONLY]; repeated Reaction reactions = 16 [(google.api.field_behavior) = OUTPUT_ONLY];
// Output only. The computed properties of the memo.
Property property = 17 [(google.api.field_behavior) = OUTPUT_ONLY]; Property property = 17 [(google.api.field_behavior) = OUTPUT_ONLY];
// The name of the parent memo. // Output only. The name of the parent memo.
// Format: memos/{id} // Format: memos/{memo}
optional string parent = 18 [(google.api.field_behavior) = OUTPUT_ONLY]; optional string parent = 18 [
(google.api.field_behavior) = OUTPUT_ONLY,
(google.api.resource_reference) = {type: "memos.api.v1/Memo"}
];
// The snippet of the memo content. Plain text only. // Output only. The snippet of the memo content. Plain text only.
string snippet = 19 [(google.api.field_behavior) = OUTPUT_ONLY]; string snippet = 19 [(google.api.field_behavior) = OUTPUT_ONLY];
// The location of the memo. // Optional. The location of the memo.
optional Location location = 20; optional Location location = 20 [(google.api.field_behavior) = OPTIONAL];
// Computed properties of a memo.
message Property { message Property {
bool has_link = 1; bool has_link = 1;
bool has_task_list = 2; bool has_task_list = 2;
@ -184,43 +255,66 @@ message Memo {
} }
message Location { message Location {
string placeholder = 1; // A placeholder text for the location.
double latitude = 2; string placeholder = 1 [(google.api.field_behavior) = OPTIONAL];
double longitude = 3;
// The latitude of the location.
double latitude = 2 [(google.api.field_behavior) = OPTIONAL];
// The longitude of the location.
double longitude = 3 [(google.api.field_behavior) = OPTIONAL];
} }
message CreateMemoRequest { message CreateMemoRequest {
// The memo to create. // Required. The memo to create.
Memo memo = 1 [(google.api.field_behavior) = REQUIRED]; Memo memo = 1 [(google.api.field_behavior) = REQUIRED];
// Optional. The memo ID to use for this memo.
// If empty, a unique ID will be generated.
string memo_id = 2 [(google.api.field_behavior) = OPTIONAL];
// Optional. If set, validate the request but don't actually create the memo.
bool validate_only = 3 [(google.api.field_behavior) = OPTIONAL];
// Optional. An idempotency token.
string request_id = 4 [(google.api.field_behavior) = OPTIONAL];
} }
message ListMemosRequest { message ListMemosRequest {
// The parent is the owner of the memos. // Optional. The parent is the owner of the memos.
// If not specified or `users/-`, it will list all memos. // If not specified or `users/-`, it will list all memos.
string parent = 1; // Format: users/{user}
string parent = 1 [
(google.api.field_behavior) = OPTIONAL,
(google.api.resource_reference) = {type: "memos.api.v1/User"}
];
// The maximum number of memos to return. // Optional. The maximum number of memos to return.
int32 page_size = 2; // The service may return fewer than this value.
// If unspecified, at most 50 memos will be returned.
// The maximum value is 1000; values above 1000 will be coerced to 1000.
int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];
// A page token, received from a previous `ListMemos` call. // Optional. A page token, received from a previous `ListMemos` call.
// Provide this to retrieve the subsequent page. // Provide this to retrieve the subsequent page.
string page_token = 3; string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
// The state of the memos to list. // Optional. The state of the memos to list.
// Default to `NORMAL`. Set to `ARCHIVED` to list archived memos. // Default to `NORMAL`. Set to `ARCHIVED` to list archived memos.
State state = 4; State state = 4 [(google.api.field_behavior) = OPTIONAL];
// What field to sort the results by.
// Default to display_time.
string sort = 5;
// The direction to sort the results by. // Optional. The order to sort results by.
// Default to DESC. // Default to "display_time desc".
Direction direction = 6; // Example: "display_time desc" or "create_time asc"
string order_by = 5 [(google.api.field_behavior) = OPTIONAL];
// Optional. Filter to apply to the list results.
// Filter is a CEL expression to filter memos. // Filter is a CEL expression to filter memos.
// Refer to `Shortcut.filter`. // Refer to `Shortcut.filter`.
string filter = 7; string filter = 6 [(google.api.field_behavior) = OPTIONAL];
// Optional. If true, show deleted memos in the response.
bool show_deleted = 7 [(google.api.field_behavior) = OPTIONAL];
// [Deprecated] Old filter contains some specific conditions to filter memos. // [Deprecated] Old filter contains some specific conditions to filter memos.
// Format: "creator == 'users/{user}' && visibilities == ['PUBLIC', 'PROTECTED']" // Format: "creator == 'users/{user}' && visibilities == ['PUBLIC', 'PROTECTED']"
@ -228,136 +322,279 @@ message ListMemosRequest {
} }
message ListMemosResponse { message ListMemosResponse {
// The list of memos.
repeated Memo memos = 1; repeated Memo memos = 1;
// A token, which can be sent as `page_token` to retrieve the next page. // A token that can be sent as `page_token` to retrieve the next page.
// If this field is omitted, there are no subsequent pages. // If this field is omitted, there are no subsequent pages.
string next_page_token = 2; string next_page_token = 2;
// The total count of memos (may be approximate).
int32 total_size = 3;
} }
message GetMemoRequest { message GetMemoRequest {
// The name of the memo. // Required. The resource name of the memo.
string name = 1; // Format: memos/{memo}
string name = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {type: "memos.api.v1/Memo"}
];
// Optional. The fields to return in the response.
// If not specified, all fields are returned.
google.protobuf.FieldMask read_mask = 2 [(google.api.field_behavior) = OPTIONAL];
} }
message UpdateMemoRequest { message UpdateMemoRequest {
// The memo to update. // Required. The memo to update.
// The `name` field is required. // The `name` field is required.
Memo memo = 1 [(google.api.field_behavior) = REQUIRED]; Memo memo = 1 [(google.api.field_behavior) = REQUIRED];
google.protobuf.FieldMask update_mask = 2; // Required. The list of fields to update.
google.protobuf.FieldMask update_mask = 2 [(google.api.field_behavior) = REQUIRED];
// Optional. If set to true, allows updating sensitive fields.
bool allow_missing = 3 [(google.api.field_behavior) = OPTIONAL];
} }
message DeleteMemoRequest { message DeleteMemoRequest {
// The name of the memo. // Required. The resource name of the memo to delete.
string name = 1; // Format: memos/{memo}
string name = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {type: "memos.api.v1/Memo"}
];
// Optional. If set to true, the memo will be deleted even if it has associated data.
bool force = 2 [(google.api.field_behavior) = OPTIONAL];
} }
message RenameMemoTagRequest { message RenameMemoTagRequest {
// The parent, who owns the tags. // Required. The parent, who owns the tags.
// Format: memos/{id}. Use "memos/-" to rename all tags. // Format: memos/{memo}. Use "memos/-" to rename all tags.
string parent = 1; string parent = 1 [
string old_tag = 2; (google.api.field_behavior) = REQUIRED,
string new_tag = 3; (google.api.resource_reference) = {type: "memos.api.v1/Memo"}
];
// Required. The old tag name to rename.
string old_tag = 2 [(google.api.field_behavior) = REQUIRED];
// Required. The new tag name.
string new_tag = 3 [(google.api.field_behavior) = REQUIRED];
} }
message DeleteMemoTagRequest { message DeleteMemoTagRequest {
// The parent, who owns the tags. // Required. The parent, who owns the tags.
// Format: memos/{id}. Use "memos/-" to delete all tags. // Format: memos/{memo}. Use "memos/-" to delete all tags.
string parent = 1; string parent = 1 [
string tag = 2; (google.api.field_behavior) = REQUIRED,
bool delete_related_memos = 3; (google.api.resource_reference) = {type: "memos.api.v1/Memo"}
];
// Required. The tag name to delete.
string tag = 2 [(google.api.field_behavior) = REQUIRED];
// Optional. Whether to delete related memos.
bool delete_related_memos = 3 [(google.api.field_behavior) = OPTIONAL];
} }
message SetMemoAttachmentsRequest { message SetMemoAttachmentsRequest {
// The name of the memo. // Required. The resource name of the memo.
string name = 1; // Format: memos/{memo}
string name = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {type: "memos.api.v1/Memo"}
];
repeated Attachment attachments = 2; // Required. The attachments to set for the memo.
repeated Attachment attachments = 2 [(google.api.field_behavior) = REQUIRED];
} }
message ListMemoAttachmentsRequest { message ListMemoAttachmentsRequest {
// The name of the memo. // Required. The resource name of the memo.
string name = 1; // Format: memos/{memo}
string name = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {type: "memos.api.v1/Memo"}
];
// Optional. The maximum number of attachments to return.
int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];
// Optional. A page token for pagination.
string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
} }
message ListMemoAttachmentsResponse { message ListMemoAttachmentsResponse {
// The list of attachments.
repeated Attachment attachments = 1; repeated Attachment attachments = 1;
// A token for the next page of results.
string next_page_token = 2;
// The total count of attachments.
int32 total_size = 3;
} }
message MemoRelation { message MemoRelation {
Memo memo = 1; // The memo in the relation.
Memo memo = 1 [(google.api.field_behavior) = REQUIRED];
Memo related_memo = 2; // The related memo.
Memo related_memo = 2 [(google.api.field_behavior) = REQUIRED];
// The type of the relation.
enum Type { enum Type {
TYPE_UNSPECIFIED = 0; TYPE_UNSPECIFIED = 0;
REFERENCE = 1; REFERENCE = 1;
COMMENT = 2; COMMENT = 2;
} }
Type type = 3; Type type = 3 [(google.api.field_behavior) = REQUIRED];
// Memo reference in relations.
message Memo { message Memo {
// The name of the memo. // The resource name of the memo.
// Format: memos/{id} // Format: memos/{memo}
string name = 1; string name = 1 [
string uid = 2; (google.api.field_behavior) = REQUIRED,
// The snippet of the memo content. Plain text only. (google.api.resource_reference) = {type: "memos.api.v1/Memo"}
];
// Output only. The unique identifier of the memo.
string uid = 2 [(google.api.field_behavior) = OUTPUT_ONLY];
// Output only. The snippet of the memo content. Plain text only.
string snippet = 3 [(google.api.field_behavior) = OUTPUT_ONLY]; string snippet = 3 [(google.api.field_behavior) = OUTPUT_ONLY];
} }
} }
message SetMemoRelationsRequest { message SetMemoRelationsRequest {
// The name of the memo. // Required. The resource name of the memo.
string name = 1; // Format: memos/{memo}
string name = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {type: "memos.api.v1/Memo"}
];
repeated MemoRelation relations = 2; // Required. The relations to set for the memo.
repeated MemoRelation relations = 2 [(google.api.field_behavior) = REQUIRED];
} }
message ListMemoRelationsRequest { message ListMemoRelationsRequest {
// The name of the memo. // Required. The resource name of the memo.
string name = 1; // Format: memos/{memo}
string name = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {type: "memos.api.v1/Memo"}
];
// Optional. The maximum number of relations to return.
int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];
// Optional. A page token for pagination.
string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
} }
message ListMemoRelationsResponse { message ListMemoRelationsResponse {
// The list of relations.
repeated MemoRelation relations = 1; repeated MemoRelation relations = 1;
// A token for the next page of results.
string next_page_token = 2;
// The total count of relations.
int32 total_size = 3;
} }
message CreateMemoCommentRequest { message CreateMemoCommentRequest {
// The name of the memo. // Required. The resource name of the memo.
string name = 1; // Format: memos/{memo}
string name = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {type: "memos.api.v1/Memo"}
];
// The comment to create. // Required. The comment to create.
Memo comment = 2; Memo comment = 2 [(google.api.field_behavior) = REQUIRED];
// Optional. The comment ID to use.
string comment_id = 3 [(google.api.field_behavior) = OPTIONAL];
} }
message ListMemoCommentsRequest { message ListMemoCommentsRequest {
// The name of the memo. // Required. The resource name of the memo.
string name = 1; // Format: memos/{memo}
string name = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {type: "memos.api.v1/Memo"}
];
// Optional. The maximum number of comments to return.
int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];
// Optional. A page token for pagination.
string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
// Optional. The order to sort results by.
string order_by = 4 [(google.api.field_behavior) = OPTIONAL];
} }
message ListMemoCommentsResponse { message ListMemoCommentsResponse {
// The list of comment memos.
repeated Memo memos = 1; repeated Memo memos = 1;
// A token for the next page of results.
string next_page_token = 2;
// The total count of comments.
int32 total_size = 3;
} }
message ListMemoReactionsRequest { message ListMemoReactionsRequest {
// The name of the memo. // Required. The resource name of the memo.
string name = 1; // Format: memos/{memo}
string name = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {type: "memos.api.v1/Memo"}
];
// Optional. The maximum number of reactions to return.
int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];
// Optional. A page token for pagination.
string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
} }
message ListMemoReactionsResponse { message ListMemoReactionsResponse {
// The list of reactions.
repeated Reaction reactions = 1; repeated Reaction reactions = 1;
// A token for the next page of results.
string next_page_token = 2;
// The total count of reactions.
int32 total_size = 3;
} }
message UpsertMemoReactionRequest { message UpsertMemoReactionRequest {
// The name of the memo. // Required. The resource name of the memo.
string name = 1; // Format: memos/{memo}
string name = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {type: "memos.api.v1/Memo"}
];
Reaction reaction = 2; // Required. The reaction to upsert.
Reaction reaction = 2 [(google.api.field_behavior) = REQUIRED];
} }
message DeleteMemoReactionRequest { message DeleteMemoReactionRequest {
// The id of the reaction. // Required. The resource name of the reaction to delete.
// Refer to the `Reaction.id`. // Format: reactions/{reaction}
int32 id = 1; string name = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {type: "memos.api.v1/Reaction"}
];
} }

@ -1,19 +0,0 @@
syntax = "proto3";
package memos.api.v1;
option go_package = "gen/api/v1";
message Reaction {
int32 id = 1;
// The name of the creator.
// Format: users/{user}
string creator = 2;
// The content identifier.
// For memo, it should be the `Memo.name`.
string content_id = 3;
string reaction_type = 4;
}

File diff suppressed because it is too large Load Diff

@ -35,6 +35,8 @@ var (
_ = metadata.Join _ = metadata.Join
) )
var filter_MemoService_CreateMemo_0 = &utilities.DoubleArray{Encoding: map[string]int{"memo": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}}
func request_MemoService_CreateMemo_0(ctx context.Context, marshaler runtime.Marshaler, client MemoServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { func request_MemoService_CreateMemo_0(ctx context.Context, marshaler runtime.Marshaler, client MemoServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var ( var (
protoReq CreateMemoRequest protoReq CreateMemoRequest
@ -43,6 +45,12 @@ func request_MemoService_CreateMemo_0(ctx context.Context, marshaler runtime.Mar
if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Memo); err != nil && !errors.Is(err, io.EOF) { if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Memo); err != nil && !errors.Is(err, io.EOF) {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
} }
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_MemoService_CreateMemo_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := client.CreateMemo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) msg, err := client.CreateMemo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err return msg, metadata, err
} }
@ -55,6 +63,12 @@ func local_request_MemoService_CreateMemo_0(ctx context.Context, marshaler runti
if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Memo); err != nil && !errors.Is(err, io.EOF) { if err := marshaler.NewDecoder(req.Body).Decode(&protoReq.Memo); err != nil && !errors.Is(err, io.EOF) {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
} }
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_MemoService_CreateMemo_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := server.CreateMemo(ctx, &protoReq) msg, err := server.CreateMemo(ctx, &protoReq)
return msg, metadata, err return msg, metadata, err
} }
@ -143,6 +157,8 @@ func local_request_MemoService_ListMemos_1(ctx context.Context, marshaler runtim
return msg, metadata, err return msg, metadata, err
} }
var filter_MemoService_GetMemo_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}}
func request_MemoService_GetMemo_0(ctx context.Context, marshaler runtime.Marshaler, client MemoServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { func request_MemoService_GetMemo_0(ctx context.Context, marshaler runtime.Marshaler, client MemoServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var ( var (
protoReq GetMemoRequest protoReq GetMemoRequest
@ -158,6 +174,12 @@ func request_MemoService_GetMemo_0(ctx context.Context, marshaler runtime.Marsha
if err != nil { if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err)
} }
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_MemoService_GetMemo_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := client.GetMemo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) msg, err := client.GetMemo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err return msg, metadata, err
} }
@ -176,6 +198,12 @@ func local_request_MemoService_GetMemo_0(ctx context.Context, marshaler runtime.
if err != nil { if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err)
} }
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_MemoService_GetMemo_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := server.GetMemo(ctx, &protoReq) msg, err := server.GetMemo(ctx, &protoReq)
return msg, metadata, err return msg, metadata, err
} }
@ -258,6 +286,8 @@ func local_request_MemoService_UpdateMemo_0(ctx context.Context, marshaler runti
return msg, metadata, err return msg, metadata, err
} }
var filter_MemoService_DeleteMemo_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}}
func request_MemoService_DeleteMemo_0(ctx context.Context, marshaler runtime.Marshaler, client MemoServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { func request_MemoService_DeleteMemo_0(ctx context.Context, marshaler runtime.Marshaler, client MemoServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var ( var (
protoReq DeleteMemoRequest protoReq DeleteMemoRequest
@ -273,6 +303,12 @@ func request_MemoService_DeleteMemo_0(ctx context.Context, marshaler runtime.Mar
if err != nil { if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err)
} }
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_MemoService_DeleteMemo_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := client.DeleteMemo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) msg, err := client.DeleteMemo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err return msg, metadata, err
} }
@ -291,6 +327,12 @@ func local_request_MemoService_DeleteMemo_0(ctx context.Context, marshaler runti
if err != nil { if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err)
} }
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_MemoService_DeleteMemo_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := server.DeleteMemo(ctx, &protoReq) msg, err := server.DeleteMemo(ctx, &protoReq)
return msg, metadata, err return msg, metadata, err
} }
@ -446,6 +488,8 @@ func local_request_MemoService_SetMemoAttachments_0(ctx context.Context, marshal
return msg, metadata, err return msg, metadata, err
} }
var filter_MemoService_ListMemoAttachments_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}}
func request_MemoService_ListMemoAttachments_0(ctx context.Context, marshaler runtime.Marshaler, client MemoServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { func request_MemoService_ListMemoAttachments_0(ctx context.Context, marshaler runtime.Marshaler, client MemoServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var ( var (
protoReq ListMemoAttachmentsRequest protoReq ListMemoAttachmentsRequest
@ -461,6 +505,12 @@ func request_MemoService_ListMemoAttachments_0(ctx context.Context, marshaler ru
if err != nil { if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err)
} }
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_MemoService_ListMemoAttachments_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := client.ListMemoAttachments(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) msg, err := client.ListMemoAttachments(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err return msg, metadata, err
} }
@ -479,6 +529,12 @@ func local_request_MemoService_ListMemoAttachments_0(ctx context.Context, marsha
if err != nil { if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err)
} }
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_MemoService_ListMemoAttachments_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := server.ListMemoAttachments(ctx, &protoReq) msg, err := server.ListMemoAttachments(ctx, &protoReq)
return msg, metadata, err return msg, metadata, err
} }
@ -525,6 +581,8 @@ func local_request_MemoService_SetMemoRelations_0(ctx context.Context, marshaler
return msg, metadata, err return msg, metadata, err
} }
var filter_MemoService_ListMemoRelations_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}}
func request_MemoService_ListMemoRelations_0(ctx context.Context, marshaler runtime.Marshaler, client MemoServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { func request_MemoService_ListMemoRelations_0(ctx context.Context, marshaler runtime.Marshaler, client MemoServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var ( var (
protoReq ListMemoRelationsRequest protoReq ListMemoRelationsRequest
@ -540,6 +598,12 @@ func request_MemoService_ListMemoRelations_0(ctx context.Context, marshaler runt
if err != nil { if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err)
} }
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_MemoService_ListMemoRelations_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := client.ListMemoRelations(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) msg, err := client.ListMemoRelations(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err return msg, metadata, err
} }
@ -558,10 +622,18 @@ func local_request_MemoService_ListMemoRelations_0(ctx context.Context, marshale
if err != nil { if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err)
} }
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_MemoService_ListMemoRelations_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := server.ListMemoRelations(ctx, &protoReq) msg, err := server.ListMemoRelations(ctx, &protoReq)
return msg, metadata, err return msg, metadata, err
} }
var filter_MemoService_CreateMemoComment_0 = &utilities.DoubleArray{Encoding: map[string]int{"comment": 0, "name": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}}
func request_MemoService_CreateMemoComment_0(ctx context.Context, marshaler runtime.Marshaler, client MemoServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { func request_MemoService_CreateMemoComment_0(ctx context.Context, marshaler runtime.Marshaler, client MemoServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var ( var (
protoReq CreateMemoCommentRequest protoReq CreateMemoCommentRequest
@ -579,6 +651,12 @@ func request_MemoService_CreateMemoComment_0(ctx context.Context, marshaler runt
if err != nil { if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err)
} }
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_MemoService_CreateMemoComment_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := client.CreateMemoComment(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) msg, err := client.CreateMemoComment(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err return msg, metadata, err
} }
@ -600,10 +678,18 @@ func local_request_MemoService_CreateMemoComment_0(ctx context.Context, marshale
if err != nil { if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err)
} }
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_MemoService_CreateMemoComment_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := server.CreateMemoComment(ctx, &protoReq) msg, err := server.CreateMemoComment(ctx, &protoReq)
return msg, metadata, err return msg, metadata, err
} }
var filter_MemoService_ListMemoComments_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}}
func request_MemoService_ListMemoComments_0(ctx context.Context, marshaler runtime.Marshaler, client MemoServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { func request_MemoService_ListMemoComments_0(ctx context.Context, marshaler runtime.Marshaler, client MemoServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var ( var (
protoReq ListMemoCommentsRequest protoReq ListMemoCommentsRequest
@ -619,6 +705,12 @@ func request_MemoService_ListMemoComments_0(ctx context.Context, marshaler runti
if err != nil { if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err)
} }
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_MemoService_ListMemoComments_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := client.ListMemoComments(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) msg, err := client.ListMemoComments(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err return msg, metadata, err
} }
@ -637,10 +729,18 @@ func local_request_MemoService_ListMemoComments_0(ctx context.Context, marshaler
if err != nil { if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err)
} }
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_MemoService_ListMemoComments_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := server.ListMemoComments(ctx, &protoReq) msg, err := server.ListMemoComments(ctx, &protoReq)
return msg, metadata, err return msg, metadata, err
} }
var filter_MemoService_ListMemoReactions_0 = &utilities.DoubleArray{Encoding: map[string]int{"name": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}}
func request_MemoService_ListMemoReactions_0(ctx context.Context, marshaler runtime.Marshaler, client MemoServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { func request_MemoService_ListMemoReactions_0(ctx context.Context, marshaler runtime.Marshaler, client MemoServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var ( var (
protoReq ListMemoReactionsRequest protoReq ListMemoReactionsRequest
@ -656,6 +756,12 @@ func request_MemoService_ListMemoReactions_0(ctx context.Context, marshaler runt
if err != nil { if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err)
} }
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_MemoService_ListMemoReactions_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := client.ListMemoReactions(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) msg, err := client.ListMemoReactions(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err return msg, metadata, err
} }
@ -674,6 +780,12 @@ func local_request_MemoService_ListMemoReactions_0(ctx context.Context, marshale
if err != nil { if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err) return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err)
} }
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_MemoService_ListMemoReactions_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := server.ListMemoReactions(ctx, &protoReq) msg, err := server.ListMemoReactions(ctx, &protoReq)
return msg, metadata, err return msg, metadata, err
} }
@ -727,13 +839,13 @@ func request_MemoService_DeleteMemoReaction_0(ctx context.Context, marshaler run
err error err error
) )
io.Copy(io.Discard, req.Body) io.Copy(io.Discard, req.Body)
val, ok := pathParams["id"] val, ok := pathParams["name"]
if !ok { if !ok {
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name")
} }
protoReq.Id, err = runtime.Int32(val) protoReq.Name, err = runtime.String(val)
if err != nil { if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err)
} }
msg, err := client.DeleteMemoReaction(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) msg, err := client.DeleteMemoReaction(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err return msg, metadata, err
@ -745,13 +857,13 @@ func local_request_MemoService_DeleteMemoReaction_0(ctx context.Context, marshal
metadata runtime.ServerMetadata metadata runtime.ServerMetadata
err error err error
) )
val, ok := pathParams["id"] val, ok := pathParams["name"]
if !ok { if !ok {
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id") return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name")
} }
protoReq.Id, err = runtime.Int32(val) protoReq.Name, err = runtime.String(val)
if err != nil { if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err) return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "name", err)
} }
msg, err := server.DeleteMemoReaction(ctx, &protoReq) msg, err := server.DeleteMemoReaction(ctx, &protoReq)
return msg, metadata, err return msg, metadata, err
@ -1089,7 +1201,7 @@ func RegisterMemoServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux
var stream runtime.ServerTransportStream var stream runtime.ServerTransportStream
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/memos.api.v1.MemoService/DeleteMemoReaction", runtime.WithHTTPPathPattern("/api/v1/reactions/{id}")) annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/memos.api.v1.MemoService/DeleteMemoReaction", runtime.WithHTTPPathPattern("/api/v1/{name=reactions/*}"))
if err != nil { if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return return
@ -1419,7 +1531,7 @@ func RegisterMemoServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux
ctx, cancel := context.WithCancel(req.Context()) ctx, cancel := context.WithCancel(req.Context())
defer cancel() defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/memos.api.v1.MemoService/DeleteMemoReaction", runtime.WithHTTPPathPattern("/api/v1/reactions/{id}")) annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/memos.api.v1.MemoService/DeleteMemoReaction", runtime.WithHTTPPathPattern("/api/v1/{name=reactions/*}"))
if err != nil { if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return return
@ -1452,7 +1564,7 @@ var (
pattern_MemoService_ListMemoComments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 2, 5, 3, 2, 4}, []string{"api", "v1", "memos", "name", "comments"}, "")) pattern_MemoService_ListMemoComments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 2, 5, 3, 2, 4}, []string{"api", "v1", "memos", "name", "comments"}, ""))
pattern_MemoService_ListMemoReactions_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 2, 5, 3, 2, 4}, []string{"api", "v1", "memos", "name", "reactions"}, "")) pattern_MemoService_ListMemoReactions_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 2, 5, 3, 2, 4}, []string{"api", "v1", "memos", "name", "reactions"}, ""))
pattern_MemoService_UpsertMemoReaction_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 2, 5, 3, 2, 4}, []string{"api", "v1", "memos", "name", "reactions"}, "")) pattern_MemoService_UpsertMemoReaction_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 2, 5, 3, 2, 4}, []string{"api", "v1", "memos", "name", "reactions"}, ""))
pattern_MemoService_DeleteMemoReaction_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "reactions", "id"}, "")) pattern_MemoService_DeleteMemoReaction_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 2, 5, 3}, []string{"api", "v1", "reactions", "name"}, ""))
) )
var ( var (

@ -1,155 +0,0 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.36.6
// protoc (unknown)
// source: api/v1/reaction_service.proto
package apiv1
import (
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
reflect "reflect"
sync "sync"
unsafe "unsafe"
)
const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
type Reaction struct {
state protoimpl.MessageState `protogen:"open.v1"`
Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
// The name of the creator.
// Format: users/{user}
Creator string `protobuf:"bytes,2,opt,name=creator,proto3" json:"creator,omitempty"`
// The content identifier.
// For memo, it should be the `Memo.name`.
ContentId string `protobuf:"bytes,3,opt,name=content_id,json=contentId,proto3" json:"content_id,omitempty"`
ReactionType string `protobuf:"bytes,4,opt,name=reaction_type,json=reactionType,proto3" json:"reaction_type,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *Reaction) Reset() {
*x = Reaction{}
mi := &file_api_v1_reaction_service_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *Reaction) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Reaction) ProtoMessage() {}
func (x *Reaction) ProtoReflect() protoreflect.Message {
mi := &file_api_v1_reaction_service_proto_msgTypes[0]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use Reaction.ProtoReflect.Descriptor instead.
func (*Reaction) Descriptor() ([]byte, []int) {
return file_api_v1_reaction_service_proto_rawDescGZIP(), []int{0}
}
func (x *Reaction) GetId() int32 {
if x != nil {
return x.Id
}
return 0
}
func (x *Reaction) GetCreator() string {
if x != nil {
return x.Creator
}
return ""
}
func (x *Reaction) GetContentId() string {
if x != nil {
return x.ContentId
}
return ""
}
func (x *Reaction) GetReactionType() string {
if x != nil {
return x.ReactionType
}
return ""
}
var File_api_v1_reaction_service_proto protoreflect.FileDescriptor
const file_api_v1_reaction_service_proto_rawDesc = "" +
"\n" +
"\x1dapi/v1/reaction_service.proto\x12\fmemos.api.v1\"x\n" +
"\bReaction\x12\x0e\n" +
"\x02id\x18\x01 \x01(\x05R\x02id\x12\x18\n" +
"\acreator\x18\x02 \x01(\tR\acreator\x12\x1d\n" +
"\n" +
"content_id\x18\x03 \x01(\tR\tcontentId\x12#\n" +
"\rreaction_type\x18\x04 \x01(\tR\freactionTypeB\xac\x01\n" +
"\x10com.memos.api.v1B\x14ReactionServiceProtoP\x01Z0github.com/usememos/memos/proto/gen/api/v1;apiv1\xa2\x02\x03MAX\xaa\x02\fMemos.Api.V1\xca\x02\fMemos\\Api\\V1\xe2\x02\x18Memos\\Api\\V1\\GPBMetadata\xea\x02\x0eMemos::Api::V1b\x06proto3"
var (
file_api_v1_reaction_service_proto_rawDescOnce sync.Once
file_api_v1_reaction_service_proto_rawDescData []byte
)
func file_api_v1_reaction_service_proto_rawDescGZIP() []byte {
file_api_v1_reaction_service_proto_rawDescOnce.Do(func() {
file_api_v1_reaction_service_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_api_v1_reaction_service_proto_rawDesc), len(file_api_v1_reaction_service_proto_rawDesc)))
})
return file_api_v1_reaction_service_proto_rawDescData
}
var file_api_v1_reaction_service_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_api_v1_reaction_service_proto_goTypes = []any{
(*Reaction)(nil), // 0: memos.api.v1.Reaction
}
var file_api_v1_reaction_service_proto_depIdxs = []int32{
0, // [0:0] is the sub-list for method output_type
0, // [0:0] is the sub-list for method input_type
0, // [0:0] is the sub-list for extension type_name
0, // [0:0] is the sub-list for extension extendee
0, // [0:0] is the sub-list for field type_name
}
func init() { file_api_v1_reaction_service_proto_init() }
func file_api_v1_reaction_service_proto_init() {
if File_api_v1_reaction_service_proto != nil {
return
}
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: unsafe.Slice(unsafe.StringData(file_api_v1_reaction_service_proto_rawDesc), len(file_api_v1_reaction_service_proto_rawDesc)),
NumEnums: 0,
NumMessages: 1,
NumExtensions: 0,
NumServices: 0,
},
GoTypes: file_api_v1_reaction_service_proto_goTypes,
DependencyIndexes: file_api_v1_reaction_service_proto_depIdxs,
MessageInfos: file_api_v1_reaction_service_proto_msgTypes,
}.Build()
File_api_v1_reaction_service_proto = out.File
file_api_v1_reaction_service_proto_goTypes = nil
file_api_v1_reaction_service_proto_depIdxs = nil
}

@ -391,27 +391,32 @@ paths:
parameters: parameters:
- name: parent - name: parent
description: |- description: |-
The parent is the owner of the memos. Optional. The parent is the owner of the memos.
If not specified or `users/-`, it will list all memos. If not specified or `users/-`, it will list all memos.
Format: users/{user}
in: query in: query
required: false required: false
type: string type: string
- name: pageSize - name: pageSize
description: The maximum number of memos to return. description: |-
Optional. The maximum number of memos to return.
The service may return fewer than this value.
If unspecified, at most 50 memos will be returned.
The maximum value is 1000; values above 1000 will be coerced to 1000.
in: query in: query
required: false required: false
type: integer type: integer
format: int32 format: int32
- name: pageToken - name: pageToken
description: |- description: |-
A page token, received from a previous `ListMemos` call. Optional. A page token, received from a previous `ListMemos` call.
Provide this to retrieve the subsequent page. Provide this to retrieve the subsequent page.
in: query in: query
required: false required: false
type: string type: string
- name: state - name: state
description: |- description: |-
The state of the memos to list. Optional. The state of the memos to list.
Default to `NORMAL`. Set to `ARCHIVED` to list archived memos. Default to `NORMAL`. Set to `ARCHIVED` to list archived memos.
in: query in: query
required: false required: false
@ -421,32 +426,27 @@ paths:
- NORMAL - NORMAL
- ARCHIVED - ARCHIVED
default: STATE_UNSPECIFIED default: STATE_UNSPECIFIED
- name: sort - name: orderBy
description: |-
What field to sort the results by.
Default to display_time.
in: query
required: false
type: string
- name: direction
description: |- description: |-
The direction to sort the results by. Optional. The order to sort results by.
Default to DESC. Default to "display_time desc".
Example: "display_time desc" or "create_time asc"
in: query in: query
required: false required: false
type: string type: string
enum:
- DIRECTION_UNSPECIFIED
- ASC
- DESC
default: DIRECTION_UNSPECIFIED
- name: filter - name: filter
description: |- description: |-
Optional. Filter to apply to the list results.
Filter is a CEL expression to filter memos. Filter is a CEL expression to filter memos.
Refer to `Shortcut.filter`. Refer to `Shortcut.filter`.
in: query in: query
required: false required: false
type: string type: string
- name: showDeleted
description: Optional. If true, show deleted memos in the response.
in: query
required: false
type: boolean
- name: oldFilter - name: oldFilter
description: |- description: |-
[Deprecated] Old filter contains some specific conditions to filter memos. [Deprecated] Old filter contains some specific conditions to filter memos.
@ -470,38 +470,30 @@ paths:
$ref: '#/definitions/googlerpcStatus' $ref: '#/definitions/googlerpcStatus'
parameters: parameters:
- name: memo - name: memo
description: The memo to create. description: Required. The memo to create.
in: body in: body
required: true required: true
schema: schema:
$ref: '#/definitions/apiv1Memo' $ref: '#/definitions/apiv1Memo'
required: required:
- memo - memo
tags: - name: memoId
- MemoService
/api/v1/reactions/{id}:
delete:
summary: DeleteMemoReaction deletes a reaction for a memo.
operationId: MemoService_DeleteMemoReaction
responses:
"200":
description: A successful response.
schema:
type: object
properties: {}
default:
description: An unexpected error response.
schema:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: id
description: |- description: |-
The id of the reaction. Optional. The memo ID to use for this memo.
Refer to the `Reaction.id`. If empty, a unique ID will be generated.
in: path in: query
required: true required: false
type: integer type: string
format: int32 - name: validateOnly
description: Optional. If set, validate the request but don't actually create the memo.
in: query
required: false
type: boolean
- name: requestId
description: Optional. An idempotency token.
in: query
required: false
type: string
tags: tags:
- MemoService - MemoService
/api/v1/users: /api/v1/users:
@ -972,7 +964,7 @@ paths:
parameters: parameters:
- name: memo.name - name: memo.name
description: |- description: |-
The name of the memo. The resource name of the memo.
Format: memos/{memo}, memo is the user defined id or uuid. Format: memos/{memo}, memo is the user defined id or uuid.
in: path in: path
required: true required: true
@ -980,7 +972,7 @@ paths:
pattern: memos/[^/]+ pattern: memos/[^/]+
- name: memo - name: memo
description: |- description: |-
The memo to update. Required. The memo to update.
The `name` field is required. The `name` field is required.
in: body in: body
required: true required: true
@ -989,74 +981,98 @@ paths:
properties: properties:
state: state:
$ref: '#/definitions/v1State' $ref: '#/definitions/v1State'
description: The state of the memo.
creator: creator:
type: string type: string
title: |- title: |-
The name of the creator. The name of the creator.
Format: users/{user} Format: users/{user}
readOnly: true
createTime: createTime:
type: string type: string
format: date-time format: date-time
description: Output only. The creation timestamp.
readOnly: true
updateTime: updateTime:
type: string type: string
format: date-time format: date-time
description: Output only. The last update timestamp.
readOnly: true
displayTime: displayTime:
type: string type: string
format: date-time format: date-time
description: The display timestamp of the memo.
content: content:
type: string type: string
description: Required. The content of the memo in Markdown format.
nodes: nodes:
type: array type: array
items: items:
type: object type: object
$ref: '#/definitions/v1Node' $ref: '#/definitions/v1Node'
description: Output only. The parsed nodes from the content.
readOnly: true readOnly: true
visibility: visibility:
$ref: '#/definitions/v1Visibility' $ref: '#/definitions/v1Visibility'
description: The visibility of the memo.
tags: tags:
type: array type: array
items: items:
type: string type: string
description: Output only. The tags extracted from the content.
readOnly: true readOnly: true
pinned: pinned:
type: boolean type: boolean
description: Whether the memo is pinned.
attachments: attachments:
type: array type: array
items: items:
type: object type: object
$ref: '#/definitions/v1Attachment' $ref: '#/definitions/v1Attachment'
description: Optional. The attachments of the memo.
relations: relations:
type: array type: array
items: items:
type: object type: object
$ref: '#/definitions/v1MemoRelation' $ref: '#/definitions/v1MemoRelation'
description: Optional. The relations of the memo.
reactions: reactions:
type: array type: array
items: items:
type: object type: object
$ref: '#/definitions/v1Reaction' $ref: '#/definitions/v1Reaction'
description: Output only. The reactions to the memo.
readOnly: true readOnly: true
property: property:
$ref: '#/definitions/v1MemoProperty' $ref: '#/definitions/v1MemoProperty'
description: Output only. The computed properties of the memo.
readOnly: true readOnly: true
parent: parent:
type: string type: string
title: |- title: |-
The name of the parent memo. Output only. The name of the parent memo.
Format: memos/{id} Format: memos/{memo}
readOnly: true readOnly: true
snippet: snippet:
type: string type: string
description: The snippet of the memo content. Plain text only. description: Output only. The snippet of the memo content. Plain text only.
readOnly: true readOnly: true
location: location:
$ref: '#/definitions/apiv1Location' $ref: '#/definitions/apiv1Location'
description: The location of the memo. description: Optional. The location of the memo.
title: |- title: |-
The memo to update. Required. The memo to update.
The `name` field is required. The `name` field is required.
required: required:
- state
- content
- visibility
- memo - memo
- name: allowMissing
description: Optional. If set to true, allows updating sensitive fields.
in: query
required: false
type: boolean
tags: tags:
- MemoService - MemoService
/api/v1/{name_1}: /api/v1/{name_1}:
@ -1230,11 +1246,20 @@ paths:
$ref: '#/definitions/googlerpcStatus' $ref: '#/definitions/googlerpcStatus'
parameters: parameters:
- name: name_4 - name: name_4
description: The name of the memo. description: |-
Required. The resource name of the memo.
Format: memos/{memo}
in: path in: path
required: true required: true
type: string type: string
pattern: memos/[^/]+ pattern: memos/[^/]+
- name: readMask
description: |-
Optional. The fields to return in the response.
If not specified, all fields are returned.
in: query
required: false
type: string
tags: tags:
- MemoService - MemoService
delete: delete:
@ -1300,11 +1325,18 @@ paths:
$ref: '#/definitions/googlerpcStatus' $ref: '#/definitions/googlerpcStatus'
parameters: parameters:
- name: name_5 - name: name_5
description: The name of the memo. description: |-
Required. The resource name of the memo to delete.
Format: memos/{memo}
in: path in: path
required: true required: true
type: string type: string
pattern: memos/[^/]+ pattern: memos/[^/]+
- name: force
description: Optional. If set to true, the memo will be deleted even if it has associated data.
in: query
required: false
type: boolean
tags: tags:
- MemoService - MemoService
/api/v1/{name_6}: /api/v1/{name_6}:
@ -1339,8 +1371,8 @@ paths:
tags: tags:
- WebhookService - WebhookService
delete: delete:
summary: DeleteShortcut deletes a shortcut for a user. summary: DeleteMemoReaction deletes a reaction for a memo.
operationId: ShortcutService_DeleteShortcut operationId: MemoService_DeleteMemoReaction
responses: responses:
"200": "200":
description: A successful response. description: A successful response.
@ -1354,14 +1386,14 @@ paths:
parameters: parameters:
- name: name_6 - name: name_6
description: |- description: |-
Required. The resource name of the shortcut to delete. Required. The resource name of the reaction to delete.
Format: users/{user}/shortcuts/{shortcut} Format: reactions/{reaction}
in: path in: path
required: true required: true
type: string type: string
pattern: users/[^/]+/shortcuts/[^/]+ pattern: reactions/[^/]+
tags: tags:
- ShortcutService - MemoService
/api/v1/{name_7}: /api/v1/{name_7}:
get: get:
summary: Gets a workspace setting. summary: Gets a workspace setting.
@ -1386,6 +1418,31 @@ paths:
pattern: workspace/settings/[^/]+ pattern: workspace/settings/[^/]+
tags: tags:
- WorkspaceService - WorkspaceService
delete:
summary: DeleteShortcut deletes a shortcut for a user.
operationId: ShortcutService_DeleteShortcut
responses:
"200":
description: A successful response.
schema:
type: object
properties: {}
default:
description: An unexpected error response.
schema:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: name_7
description: |-
Required. The resource name of the shortcut to delete.
Format: users/{user}/shortcuts/{shortcut}
in: path
required: true
type: string
pattern: users/[^/]+/shortcuts/[^/]+
tags:
- ShortcutService
/api/v1/{name_8}:
delete: delete:
summary: DeleteWebhook deletes a webhook. summary: DeleteWebhook deletes a webhook.
operationId: WebhookService_DeleteWebhook operationId: WebhookService_DeleteWebhook
@ -1400,7 +1457,7 @@ paths:
schema: schema:
$ref: '#/definitions/googlerpcStatus' $ref: '#/definitions/googlerpcStatus'
parameters: parameters:
- name: name_7 - name: name_8
description: |- description: |-
Required. The resource name of the webhook to delete. Required. The resource name of the webhook to delete.
Format: webhooks/{webhook} Format: webhooks/{webhook}
@ -1478,11 +1535,24 @@ paths:
$ref: '#/definitions/googlerpcStatus' $ref: '#/definitions/googlerpcStatus'
parameters: parameters:
- name: name - name: name
description: The name of the memo. description: |-
Required. The resource name of the memo.
Format: memos/{memo}
in: path in: path
required: true required: true
type: string type: string
pattern: memos/[^/]+ pattern: memos/[^/]+
- name: pageSize
description: Optional. The maximum number of attachments to return.
in: query
required: false
type: integer
format: int32
- name: pageToken
description: Optional. A page token for pagination.
in: query
required: false
type: string
tags: tags:
- MemoService - MemoService
patch: patch:
@ -1500,7 +1570,9 @@ paths:
$ref: '#/definitions/googlerpcStatus' $ref: '#/definitions/googlerpcStatus'
parameters: parameters:
- name: name - name: name
description: The name of the memo. description: |-
Required. The resource name of the memo.
Format: memos/{memo}
in: path in: path
required: true required: true
type: string type: string
@ -1551,11 +1623,29 @@ paths:
$ref: '#/definitions/googlerpcStatus' $ref: '#/definitions/googlerpcStatus'
parameters: parameters:
- name: name - name: name
description: The name of the memo. description: |-
Required. The resource name of the memo.
Format: memos/{memo}
in: path in: path
required: true required: true
type: string type: string
pattern: memos/[^/]+ pattern: memos/[^/]+
- name: pageSize
description: Optional. The maximum number of comments to return.
in: query
required: false
type: integer
format: int32
- name: pageToken
description: Optional. A page token for pagination.
in: query
required: false
type: string
- name: orderBy
description: Optional. The order to sort results by.
in: query
required: false
type: string
tags: tags:
- MemoService - MemoService
post: post:
@ -1572,17 +1662,26 @@ paths:
$ref: '#/definitions/googlerpcStatus' $ref: '#/definitions/googlerpcStatus'
parameters: parameters:
- name: name - name: name
description: The name of the memo. description: |-
Required. The resource name of the memo.
Format: memos/{memo}
in: path in: path
required: true required: true
type: string type: string
pattern: memos/[^/]+ pattern: memos/[^/]+
- name: comment - name: comment
description: The comment to create. description: Required. The comment to create.
in: body in: body
required: true required: true
schema: schema:
$ref: '#/definitions/apiv1Memo' $ref: '#/definitions/apiv1Memo'
required:
- comment
- name: commentId
description: Optional. The comment ID to use.
in: query
required: false
type: string
tags: tags:
- MemoService - MemoService
/api/v1/{name}/reactions: /api/v1/{name}/reactions:
@ -1600,11 +1699,24 @@ paths:
$ref: '#/definitions/googlerpcStatus' $ref: '#/definitions/googlerpcStatus'
parameters: parameters:
- name: name - name: name
description: The name of the memo. description: |-
Required. The resource name of the memo.
Format: memos/{memo}
in: path in: path
required: true required: true
type: string type: string
pattern: memos/[^/]+ pattern: memos/[^/]+
- name: pageSize
description: Optional. The maximum number of reactions to return.
in: query
required: false
type: integer
format: int32
- name: pageToken
description: Optional. A page token for pagination.
in: query
required: false
type: string
tags: tags:
- MemoService - MemoService
post: post:
@ -1621,7 +1733,9 @@ paths:
$ref: '#/definitions/googlerpcStatus' $ref: '#/definitions/googlerpcStatus'
parameters: parameters:
- name: name - name: name
description: The name of the memo. description: |-
Required. The resource name of the memo.
Format: memos/{memo}
in: path in: path
required: true required: true
type: string type: string
@ -1648,11 +1762,24 @@ paths:
$ref: '#/definitions/googlerpcStatus' $ref: '#/definitions/googlerpcStatus'
parameters: parameters:
- name: name - name: name
description: The name of the memo. description: |-
Required. The resource name of the memo.
Format: memos/{memo}
in: path in: path
required: true required: true
type: string type: string
pattern: memos/[^/]+ pattern: memos/[^/]+
- name: pageSize
description: Optional. The maximum number of relations to return.
in: query
required: false
type: integer
format: int32
- name: pageToken
description: Optional. A page token for pagination.
in: query
required: false
type: string
tags: tags:
- MemoService - MemoService
patch: patch:
@ -1670,7 +1797,9 @@ paths:
$ref: '#/definitions/googlerpcStatus' $ref: '#/definitions/googlerpcStatus'
parameters: parameters:
- name: name - name: name
description: The name of the memo. description: |-
Required. The resource name of the memo.
Format: memos/{memo}
in: path in: path
required: true required: true
type: string type: string
@ -1874,28 +2003,33 @@ paths:
parameters: parameters:
- name: parent - name: parent
description: |- description: |-
The parent is the owner of the memos. Optional. The parent is the owner of the memos.
If not specified or `users/-`, it will list all memos. If not specified or `users/-`, it will list all memos.
Format: users/{user}
in: path in: path
required: true required: true
type: string type: string
pattern: users/[^/]+ pattern: users/[^/]+
- name: pageSize - name: pageSize
description: The maximum number of memos to return. description: |-
Optional. The maximum number of memos to return.
The service may return fewer than this value.
If unspecified, at most 50 memos will be returned.
The maximum value is 1000; values above 1000 will be coerced to 1000.
in: query in: query
required: false required: false
type: integer type: integer
format: int32 format: int32
- name: pageToken - name: pageToken
description: |- description: |-
A page token, received from a previous `ListMemos` call. Optional. A page token, received from a previous `ListMemos` call.
Provide this to retrieve the subsequent page. Provide this to retrieve the subsequent page.
in: query in: query
required: false required: false
type: string type: string
- name: state - name: state
description: |- description: |-
The state of the memos to list. Optional. The state of the memos to list.
Default to `NORMAL`. Set to `ARCHIVED` to list archived memos. Default to `NORMAL`. Set to `ARCHIVED` to list archived memos.
in: query in: query
required: false required: false
@ -1905,32 +2039,27 @@ paths:
- NORMAL - NORMAL
- ARCHIVED - ARCHIVED
default: STATE_UNSPECIFIED default: STATE_UNSPECIFIED
- name: sort - name: orderBy
description: |-
What field to sort the results by.
Default to display_time.
in: query
required: false
type: string
- name: direction
description: |- description: |-
The direction to sort the results by. Optional. The order to sort results by.
Default to DESC. Default to "display_time desc".
Example: "display_time desc" or "create_time asc"
in: query in: query
required: false required: false
type: string type: string
enum:
- DIRECTION_UNSPECIFIED
- ASC
- DESC
default: DIRECTION_UNSPECIFIED
- name: filter - name: filter
description: |- description: |-
Optional. Filter to apply to the list results.
Filter is a CEL expression to filter memos. Filter is a CEL expression to filter memos.
Refer to `Shortcut.filter`. Refer to `Shortcut.filter`.
in: query in: query
required: false required: false
type: string type: string
- name: showDeleted
description: Optional. If true, show deleted memos in the response.
in: query
required: false
type: boolean
- name: oldFilter - name: oldFilter
description: |- description: |-
[Deprecated] Old filter contains some specific conditions to filter memos. [Deprecated] Old filter contains some specific conditions to filter memos.
@ -2028,17 +2157,19 @@ paths:
parameters: parameters:
- name: parent - name: parent
description: |- description: |-
The parent, who owns the tags. Required. The parent, who owns the tags.
Format: memos/{id}. Use "memos/-" to delete all tags. Format: memos/{memo}. Use "memos/-" to delete all tags.
in: path in: path
required: true required: true
type: string type: string
pattern: memos/[^/]+ pattern: memos/[^/]+
- name: tag - name: tag
description: Required. The tag name to delete.
in: path in: path
required: true required: true
type: string type: string
- name: deleteRelatedMemos - name: deleteRelatedMemos
description: Optional. Whether to delete related memos.
in: query in: query
required: false required: false
type: boolean type: boolean
@ -2061,8 +2192,8 @@ paths:
parameters: parameters:
- name: parent - name: parent
description: |- description: |-
The parent, who owns the tags. Required. The parent, who owns the tags.
Format: memos/{id}. Use "memos/-" to rename all tags. Format: memos/{memo}. Use "memos/-" to rename all tags.
in: path in: path
required: true required: true
type: string type: string
@ -2420,8 +2551,13 @@ definitions:
properties: properties:
oldTag: oldTag:
type: string type: string
description: Required. The old tag name to rename.
newTag: newTag:
type: string type: string
description: Required. The new tag name.
required:
- oldTag
- newTag
MemoServiceSetMemoAttachmentsBody: MemoServiceSetMemoAttachmentsBody:
type: object type: object
properties: properties:
@ -2430,6 +2566,9 @@ definitions:
items: items:
type: object type: object
$ref: '#/definitions/v1Attachment' $ref: '#/definitions/v1Attachment'
description: Required. The attachments to set for the memo.
required:
- attachments
MemoServiceSetMemoRelationsBody: MemoServiceSetMemoRelationsBody:
type: object type: object
properties: properties:
@ -2438,11 +2577,17 @@ definitions:
items: items:
type: object type: object
$ref: '#/definitions/v1MemoRelation' $ref: '#/definitions/v1MemoRelation'
description: Required. The relations to set for the memo.
required:
- relations
MemoServiceUpsertMemoReactionBody: MemoServiceUpsertMemoReactionBody:
type: object type: object
properties: properties:
reaction: reaction:
$ref: '#/definitions/v1Reaction' $ref: '#/definitions/v1Reaction'
description: Required. The reaction to upsert.
required:
- reaction
TableNodeRow: TableNodeRow:
type: object type: object
properties: properties:
@ -2635,86 +2780,108 @@ definitions:
properties: properties:
placeholder: placeholder:
type: string type: string
description: A placeholder text for the location.
latitude: latitude:
type: number type: number
format: double format: double
description: The latitude of the location.
longitude: longitude:
type: number type: number
format: double format: double
description: The longitude of the location.
apiv1Memo: apiv1Memo:
type: object type: object
properties: properties:
name: name:
type: string type: string
description: |- description: |-
The name of the memo. The resource name of the memo.
Format: memos/{memo}, memo is the user defined id or uuid. Format: memos/{memo}, memo is the user defined id or uuid.
readOnly: true
state: state:
$ref: '#/definitions/v1State' $ref: '#/definitions/v1State'
description: The state of the memo.
creator: creator:
type: string type: string
title: |- title: |-
The name of the creator. The name of the creator.
Format: users/{user} Format: users/{user}
readOnly: true
createTime: createTime:
type: string type: string
format: date-time format: date-time
description: Output only. The creation timestamp.
readOnly: true
updateTime: updateTime:
type: string type: string
format: date-time format: date-time
description: Output only. The last update timestamp.
readOnly: true
displayTime: displayTime:
type: string type: string
format: date-time format: date-time
description: The display timestamp of the memo.
content: content:
type: string type: string
description: Required. The content of the memo in Markdown format.
nodes: nodes:
type: array type: array
items: items:
type: object type: object
$ref: '#/definitions/v1Node' $ref: '#/definitions/v1Node'
description: Output only. The parsed nodes from the content.
readOnly: true readOnly: true
visibility: visibility:
$ref: '#/definitions/v1Visibility' $ref: '#/definitions/v1Visibility'
description: The visibility of the memo.
tags: tags:
type: array type: array
items: items:
type: string type: string
description: Output only. The tags extracted from the content.
readOnly: true readOnly: true
pinned: pinned:
type: boolean type: boolean
description: Whether the memo is pinned.
attachments: attachments:
type: array type: array
items: items:
type: object type: object
$ref: '#/definitions/v1Attachment' $ref: '#/definitions/v1Attachment'
description: Optional. The attachments of the memo.
relations: relations:
type: array type: array
items: items:
type: object type: object
$ref: '#/definitions/v1MemoRelation' $ref: '#/definitions/v1MemoRelation'
description: Optional. The relations of the memo.
reactions: reactions:
type: array type: array
items: items:
type: object type: object
$ref: '#/definitions/v1Reaction' $ref: '#/definitions/v1Reaction'
description: Output only. The reactions to the memo.
readOnly: true readOnly: true
property: property:
$ref: '#/definitions/v1MemoProperty' $ref: '#/definitions/v1MemoProperty'
description: Output only. The computed properties of the memo.
readOnly: true readOnly: true
parent: parent:
type: string type: string
title: |- title: |-
The name of the parent memo. Output only. The name of the parent memo.
Format: memos/{id} Format: memos/{memo}
readOnly: true readOnly: true
snippet: snippet:
type: string type: string
description: The snippet of the memo content. Plain text only. description: Output only. The snippet of the memo content. Plain text only.
readOnly: true readOnly: true
location: location:
$ref: '#/definitions/apiv1Location' $ref: '#/definitions/apiv1Location'
description: The location of the memo. description: Optional. The location of the memo.
required:
- state
- content
- visibility
apiv1OAuth2Config: apiv1OAuth2Config:
type: object type: object
properties: properties:
@ -3157,13 +3324,6 @@ definitions:
properties: properties:
content: content:
type: string type: string
v1Direction:
type: string
enum:
- DIRECTION_UNSPECIFIED
- ASC
- DESC
default: DIRECTION_UNSPECIFIED
v1EmbeddedContentNode: v1EmbeddedContentNode:
type: object type: object
properties: properties:
@ -3393,6 +3553,14 @@ definitions:
items: items:
type: object type: object
$ref: '#/definitions/v1Attachment' $ref: '#/definitions/v1Attachment'
description: The list of attachments.
nextPageToken:
type: string
description: A token for the next page of results.
totalSize:
type: integer
format: int32
description: The total count of attachments.
v1ListMemoCommentsResponse: v1ListMemoCommentsResponse:
type: object type: object
properties: properties:
@ -3401,6 +3569,14 @@ definitions:
items: items:
type: object type: object
$ref: '#/definitions/apiv1Memo' $ref: '#/definitions/apiv1Memo'
description: The list of comment memos.
nextPageToken:
type: string
description: A token for the next page of results.
totalSize:
type: integer
format: int32
description: The total count of comments.
v1ListMemoReactionsResponse: v1ListMemoReactionsResponse:
type: object type: object
properties: properties:
@ -3409,6 +3585,14 @@ definitions:
items: items:
type: object type: object
$ref: '#/definitions/v1Reaction' $ref: '#/definitions/v1Reaction'
description: The list of reactions.
nextPageToken:
type: string
description: A token for the next page of results.
totalSize:
type: integer
format: int32
description: The total count of reactions.
v1ListMemoRelationsResponse: v1ListMemoRelationsResponse:
type: object type: object
properties: properties:
@ -3417,6 +3601,14 @@ definitions:
items: items:
type: object type: object
$ref: '#/definitions/v1MemoRelation' $ref: '#/definitions/v1MemoRelation'
description: The list of relations.
nextPageToken:
type: string
description: A token for the next page of results.
totalSize:
type: integer
format: int32
description: The total count of relations.
v1ListMemosResponse: v1ListMemosResponse:
type: object type: object
properties: properties:
@ -3425,11 +3617,16 @@ definitions:
items: items:
type: object type: object
$ref: '#/definitions/apiv1Memo' $ref: '#/definitions/apiv1Memo'
description: The list of memos.
nextPageToken: nextPageToken:
type: string type: string
description: |- description: |-
A token, which can be sent as `page_token` to retrieve the next page. A token that can be sent as `page_token` to retrieve the next page.
If this field is omitted, there are no subsequent pages. If this field is omitted, there are no subsequent pages.
totalSize:
type: integer
format: int32
description: The total count of memos (may be approximate).
v1ListNode: v1ListNode:
type: object type: object
properties: properties:
@ -3532,29 +3729,41 @@ definitions:
type: boolean type: boolean
hasIncompleteTasks: hasIncompleteTasks:
type: boolean type: boolean
description: Computed properties of a memo.
v1MemoRelation: v1MemoRelation:
type: object type: object
properties: properties:
memo: memo:
$ref: '#/definitions/v1MemoRelationMemo' $ref: '#/definitions/v1MemoRelationMemo'
description: The memo in the relation.
relatedMemo: relatedMemo:
$ref: '#/definitions/v1MemoRelationMemo' $ref: '#/definitions/v1MemoRelationMemo'
description: The related memo.
type: type:
$ref: '#/definitions/v1MemoRelationType' $ref: '#/definitions/v1MemoRelationType'
required:
- memo
- relatedMemo
- type
v1MemoRelationMemo: v1MemoRelationMemo:
type: object type: object
properties: properties:
name: name:
type: string type: string
title: |- title: |-
The name of the memo. The resource name of the memo.
Format: memos/{id} Format: memos/{memo}
uid: uid:
type: string type: string
description: Output only. The unique identifier of the memo.
readOnly: true
snippet: snippet:
type: string type: string
description: The snippet of the memo content. Plain text only. description: Output only. The snippet of the memo content. Plain text only.
readOnly: true readOnly: true
description: Memo reference in relations.
required:
- name
v1MemoRelationType: v1MemoRelationType:
type: string type: string
enum: enum:
@ -3562,6 +3771,7 @@ definitions:
- REFERENCE - REFERENCE
- COMMENT - COMMENT
default: TYPE_UNSPECIFIED default: TYPE_UNSPECIFIED
description: The type of the relation.
v1Node: v1Node:
type: object type: object
properties: properties:
@ -3716,21 +3926,39 @@ definitions:
v1Reaction: v1Reaction:
type: object type: object
properties: properties:
id: name:
type: integer type: string
format: int32 title: |-
The resource name of the reaction.
Format: reactions/{reaction}
readOnly: true
uid:
type: string
description: Output only. The system generated unique identifier.
readOnly: true
creator: creator:
type: string type: string
title: |- title: |-
The name of the creator. The resource name of the creator.
Format: users/{user} Format: users/{user}
readOnly: true
contentId: contentId:
type: string type: string
description: |- title: |-
The content identifier. The resource name of the content.
For memo, it should be the `Memo.name`. For memo reactions, this should be the memo's resource name.
Format: memos/{memo}
reactionType: reactionType:
type: string type: string
description: "Required. The type of reaction (e.g., \"\U0001F44D\", \"❤️\", \"\U0001F604\")."
createTime:
type: string
format: date-time
description: Output only. The creation timestamp.
readOnly: true
required:
- contentId
- reactionType
v1ReferencedContentNode: v1ReferencedContentNode:
type: object type: object
properties: properties:

@ -4,6 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"log/slog" "log/slog"
"strings"
"time" "time"
"unicode/utf8" "unicode/utf8"
@ -99,9 +100,13 @@ func (s *APIV1Service) ListMemos(ctx context.Context, request *v1pb.ListMemosReq
// Exclude comments by default. // Exclude comments by default.
ExcludeComments: true, ExcludeComments: true,
} }
// Handle deprecated old_filter for backward compatibility
if request.OldFilter != "" && request.Filter == "" {
//nolint:staticcheck // SA1019: Using deprecated field for backward compatibility
if err := s.buildMemoFindWithFilter(ctx, memoFind, request.OldFilter); err != nil { if err := s.buildMemoFindWithFilter(ctx, memoFind, request.OldFilter); err != nil {
return nil, status.Errorf(codes.InvalidArgument, "failed to build find memos with filter: %v", err) return nil, status.Errorf(codes.InvalidArgument, "failed to build find memos with filter: %v", err)
} }
}
if request.Parent != "" && request.Parent != "users/-" { if request.Parent != "" && request.Parent != "users/-" {
userID, err := ExtractUserIDFromName(request.Parent) userID, err := ExtractUserIDFromName(request.Parent)
if err != nil { if err != nil {
@ -117,9 +122,17 @@ func (s *APIV1Service) ListMemos(ctx context.Context, request *v1pb.ListMemosReq
state := store.Normal state := store.Normal
memoFind.RowStatus = &state memoFind.RowStatus = &state
} }
if request.Direction == v1pb.Direction_ASC {
memoFind.OrderByTimeAsc = true // Parse order_by field (replaces the old sort and direction fields)
if request.OrderBy != "" {
if err := s.parseMemoOrderBy(request.OrderBy, memoFind); err != nil {
return nil, status.Errorf(codes.InvalidArgument, "invalid order_by: %v", err)
}
} else {
// Default ordering by display_time desc
memoFind.OrderByTimeAsc = false
} }
if request.Filter != "" { if request.Filter != "" {
if err := s.validateFilter(ctx, request.Filter); err != nil { if err := s.validateFilter(ctx, request.Filter); err != nil {
return nil, status.Errorf(codes.InvalidArgument, "invalid filter: %v", err) return nil, status.Errorf(codes.InvalidArgument, "invalid filter: %v", err)
@ -739,3 +752,38 @@ func substring(s string, length int) string {
return s[:byteIndex] return s[:byteIndex]
} }
// parseMemoOrderBy parses the order_by field and sets the appropriate ordering in memoFind.
func (*APIV1Service) parseMemoOrderBy(orderBy string, memoFind *store.FindMemo) error {
// Parse order_by field like "display_time desc" or "create_time asc"
parts := strings.Fields(strings.TrimSpace(orderBy))
if len(parts) == 0 {
return errors.New("empty order_by")
}
field := parts[0]
direction := "desc" // default
if len(parts) > 1 {
direction = strings.ToLower(parts[1])
if direction != "asc" && direction != "desc" {
return errors.Errorf("invalid order direction: %s, must be 'asc' or 'desc'", parts[1])
}
}
switch field {
case "display_time":
memoFind.OrderByTimeAsc = direction == "asc"
case "create_time":
memoFind.OrderByTimeAsc = direction == "asc"
case "update_time":
memoFind.OrderByUpdatedTs = true
memoFind.OrderByTimeAsc = direction == "asc"
case "name":
// For ordering by memo name/id - not commonly used but supported
memoFind.OrderByTimeAsc = direction == "asc"
default:
return errors.Errorf("unsupported order field: %s, supported fields are: display_time, create_time, update_time, name", field)
}
return nil
}

@ -3,10 +3,12 @@ package v1
import ( import (
"context" "context"
"fmt" "fmt"
"time"
"google.golang.org/grpc/codes" "google.golang.org/grpc/codes"
"google.golang.org/grpc/status" "google.golang.org/grpc/status"
"google.golang.org/protobuf/types/known/emptypb" "google.golang.org/protobuf/types/known/emptypb"
"google.golang.org/protobuf/types/known/timestamppb"
v1pb "github.com/usememos/memos/proto/gen/api/v1" v1pb "github.com/usememos/memos/proto/gen/api/v1"
"github.com/usememos/memos/store" "github.com/usememos/memos/store"
@ -55,8 +57,13 @@ func (s *APIV1Service) UpsertMemoReaction(ctx context.Context, request *v1pb.Ups
} }
func (s *APIV1Service) DeleteMemoReaction(ctx context.Context, request *v1pb.DeleteMemoReactionRequest) (*emptypb.Empty, error) { func (s *APIV1Service) DeleteMemoReaction(ctx context.Context, request *v1pb.DeleteMemoReactionRequest) (*emptypb.Empty, error) {
reactionID, err := ExtractReactionIDFromName(request.Name)
if err != nil {
return nil, status.Errorf(codes.InvalidArgument, "invalid reaction name: %v", err)
}
if err := s.Store.DeleteReaction(ctx, &store.DeleteReaction{ if err := s.Store.DeleteReaction(ctx, &store.DeleteReaction{
ID: request.Id, ID: reactionID,
}); err != nil { }); err != nil {
return nil, status.Errorf(codes.Internal, "failed to delete reaction") return nil, status.Errorf(codes.Internal, "failed to delete reaction")
} }
@ -71,10 +78,14 @@ func (s *APIV1Service) convertReactionFromStore(ctx context.Context, reaction *s
if err != nil { if err != nil {
return nil, err return nil, err
} }
reactionUID := fmt.Sprintf("%d", reaction.ID)
return &v1pb.Reaction{ return &v1pb.Reaction{
Id: reaction.ID, Name: fmt.Sprintf("%s%s", ReactionNamePrefix, reactionUID),
Uid: reactionUID,
Creator: fmt.Sprintf("%s%d", UserNamePrefix, creator.ID), Creator: fmt.Sprintf("%s%d", UserNamePrefix, creator.ID),
ContentId: reaction.ContentID, ContentId: reaction.ContentID,
ReactionType: reaction.ReactionType, ReactionType: reaction.ReactionType,
CreateTime: timestamppb.New(time.Unix(reaction.CreatedTs, 0)),
}, nil }, nil
} }

@ -14,6 +14,7 @@ const (
UserNamePrefix = "users/" UserNamePrefix = "users/"
MemoNamePrefix = "memos/" MemoNamePrefix = "memos/"
AttachmentNamePrefix = "attachments/" AttachmentNamePrefix = "attachments/"
ReactionNamePrefix = "reactions/"
InboxNamePrefix = "inboxes/" InboxNamePrefix = "inboxes/"
IdentityProviderNamePrefix = "identityProviders/" IdentityProviderNamePrefix = "identityProviders/"
ActivityNamePrefix = "activities/" ActivityNamePrefix = "activities/"
@ -93,6 +94,20 @@ func ExtractAttachmentUIDFromName(name string) (string, error) {
return id, nil return id, nil
} }
// ExtractReactionIDFromName returns the reaction ID from a resource name.
// e.g., "reactions/123" -> 123.
func ExtractReactionIDFromName(name string) (int32, error) {
tokens, err := GetNameParentTokens(name, ReactionNamePrefix)
if err != nil {
return 0, err
}
id, err := util.ConvertStringToInt32(tokens[0])
if err != nil {
return 0, errors.Errorf("invalid reaction ID %q", tokens[0])
}
return id, nil
}
// ExtractInboxIDFromName returns the inbox ID from a resource name. // ExtractInboxIDFromName returns the inbox ID from a resource name.
func ExtractInboxIDFromName(name string) (int32, error) { func ExtractInboxIDFromName(name string) (int32, error) {
tokens, err := GetNameParentTokens(name, InboxNamePrefix) tokens, err := GetNameParentTokens(name, InboxNamePrefix)

@ -9,7 +9,6 @@ type Reaction struct {
CreatedTs int64 CreatedTs int64
CreatorID int32 CreatorID int32
// ContentID is the id of the content that the reaction is for. // ContentID is the id of the content that the reaction is for.
// This can be a memo. e.g. memos/101
ContentID string ContentID string
ReactionType string ReactionType string
} }

@ -396,6 +396,10 @@ const MemoEditor = observer((props: Props) => {
relations: state.relationList, relations: state.relationList,
location: state.location, location: state.location,
}), }),
// Optional fields can be omitted
memoId: "",
validateOnly: false,
requestId: "",
}) })
: memoServiceClient : memoServiceClient
.createMemoComment({ .createMemoComment({

@ -5,7 +5,7 @@ import useCurrentUser from "@/hooks/useCurrentUser";
import { userStore } from "@/store/v2"; import { userStore } from "@/store/v2";
import { State } from "@/types/proto/api/v1/common"; import { State } from "@/types/proto/api/v1/common";
import { Memo } from "@/types/proto/api/v1/memo_service"; import { Memo } from "@/types/proto/api/v1/memo_service";
import { Reaction } from "@/types/proto/api/v1/reaction_service"; import { Reaction } from "@/types/proto/api/v1/memo_service";
import { User } from "@/types/proto/api/v1/user_service"; import { User } from "@/types/proto/api/v1/user_service";
import ReactionSelector from "./ReactionSelector"; import ReactionSelector from "./ReactionSelector";
import ReactionView from "./ReactionView"; import ReactionView from "./ReactionView";

@ -8,7 +8,7 @@ import { DEFAULT_LIST_MEMOS_PAGE_SIZE } from "@/helpers/consts";
import useResponsiveWidth from "@/hooks/useResponsiveWidth"; import useResponsiveWidth from "@/hooks/useResponsiveWidth";
import { Routes } from "@/router"; import { Routes } from "@/router";
import { memoStore, viewStore } from "@/store/v2"; import { memoStore, viewStore } from "@/store/v2";
import { Direction, State } from "@/types/proto/api/v1/common"; import { State } from "@/types/proto/api/v1/common";
import { Memo } from "@/types/proto/api/v1/memo_service"; import { Memo } from "@/types/proto/api/v1/memo_service";
import { useTranslate } from "@/utils/i18n"; import { useTranslate } from "@/utils/i18n";
import Empty from "../Empty"; import Empty from "../Empty";
@ -20,7 +20,7 @@ interface Props {
listSort?: (list: Memo[]) => Memo[]; listSort?: (list: Memo[]) => Memo[];
owner?: string; owner?: string;
state?: State; state?: State;
direction?: Direction; orderBy?: string;
filter?: string; filter?: string;
oldFilter?: string; oldFilter?: string;
pageSize?: number; pageSize?: number;
@ -51,7 +51,7 @@ const PagedMemoList = observer((props: Props) => {
const response = await memoStore.fetchMemos({ const response = await memoStore.fetchMemos({
parent: props.owner || "", parent: props.owner || "",
state: props.state || State.NORMAL, state: props.state || State.NORMAL,
direction: props.direction || Direction.DESC, orderBy: props.orderBy || "display_time desc",
filter: props.filter || "", filter: props.filter || "",
oldFilter: props.oldFilter || "", oldFilter: props.oldFilter || "",
pageSize: props.pageSize || DEFAULT_LIST_MEMOS_PAGE_SIZE, pageSize: props.pageSize || DEFAULT_LIST_MEMOS_PAGE_SIZE,
@ -103,7 +103,7 @@ const PagedMemoList = observer((props: Props) => {
// Initial load and reload when props change // Initial load and reload when props change
useEffect(() => { useEffect(() => {
refreshList(); refreshList();
}, [props.owner, props.state, props.direction, props.filter, props.oldFilter, props.pageSize]); }, [props.owner, props.state, props.orderBy, props.filter, props.oldFilter, props.pageSize]);
// Auto-fetch more content when list changes and page isn't full // Auto-fetch more content when list changes and page isn't full
useEffect(() => { useEffect(() => {

@ -36,7 +36,7 @@ const ReactionSelector = observer((props: Props) => {
(reaction) => reaction.reactionType === reactionType && reaction.creator === currentUser.name, (reaction) => reaction.reactionType === reactionType && reaction.creator === currentUser.name,
); );
for (const reaction of reactions) { for (const reaction of reactions) {
await memoServiceClient.deleteMemoReaction({ id: reaction.id }); await memoServiceClient.deleteMemoReaction({ name: reaction.name });
} }
} else { } else {
await memoServiceClient.upsertMemoReaction({ await memoServiceClient.upsertMemoReaction({

@ -55,7 +55,7 @@ const ReactionView = observer((props: Props) => {
(reaction) => reaction.reactionType === reactionType && reaction.creator === currentUser.name, (reaction) => reaction.reactionType === reactionType && reaction.creator === currentUser.name,
); );
for (const reaction of reactions) { for (const reaction of reactions) {
await memoServiceClient.deleteMemoReaction({ id: reaction.id }); await memoServiceClient.deleteMemoReaction({ name: reaction.name });
} }
} }
} catch { } catch {

@ -6,7 +6,7 @@ import PagedMemoList from "@/components/PagedMemoList";
import useCurrentUser from "@/hooks/useCurrentUser"; import useCurrentUser from "@/hooks/useCurrentUser";
import { viewStore } from "@/store/v2"; import { viewStore } from "@/store/v2";
import memoFilterStore from "@/store/v2/memoFilter"; import memoFilterStore from "@/store/v2/memoFilter";
import { Direction, State } from "@/types/proto/api/v1/common"; import { State } from "@/types/proto/api/v1/common";
import { Memo } from "@/types/proto/api/v1/memo_service"; import { Memo } from "@/types/proto/api/v1/memo_service";
const Archived = observer(() => { const Archived = observer(() => {
@ -46,7 +46,7 @@ const Archived = observer(() => {
} }
owner={user.name} owner={user.name}
state={State.ARCHIVED} state={State.ARCHIVED}
direction={viewStore.state.orderByTimeAsc ? Direction.ASC : Direction.DESC} orderBy={viewStore.state.orderByTimeAsc ? "display_time asc" : "display_time desc"}
oldFilter={memoListFilter} oldFilter={memoListFilter}
/> />
); );

@ -5,7 +5,7 @@ import MobileHeader from "@/components/MobileHeader";
import PagedMemoList from "@/components/PagedMemoList"; import PagedMemoList from "@/components/PagedMemoList";
import useResponsiveWidth from "@/hooks/useResponsiveWidth"; import useResponsiveWidth from "@/hooks/useResponsiveWidth";
import { viewStore } from "@/store/v2"; import { viewStore } from "@/store/v2";
import { Direction, State } from "@/types/proto/api/v1/common"; import { State } from "@/types/proto/api/v1/common";
import { Memo } from "@/types/proto/api/v1/memo_service"; import { Memo } from "@/types/proto/api/v1/memo_service";
const Explore = observer(() => { const Explore = observer(() => {
@ -26,7 +26,7 @@ const Explore = observer(() => {
: dayjs(b.displayTime).unix() - dayjs(a.displayTime).unix(), : dayjs(b.displayTime).unix() - dayjs(a.displayTime).unix(),
) )
} }
direction={viewStore.state.orderByTimeAsc ? Direction.ASC : Direction.DESC} orderBy={viewStore.state.orderByTimeAsc ? "display_time asc" : "display_time desc"}
/> />
</div> </div>
</section> </section>

@ -6,7 +6,7 @@ import PagedMemoList from "@/components/PagedMemoList";
import useCurrentUser from "@/hooks/useCurrentUser"; import useCurrentUser from "@/hooks/useCurrentUser";
import { viewStore, userStore } from "@/store/v2"; import { viewStore, userStore } from "@/store/v2";
import memoFilterStore from "@/store/v2/memoFilter"; import memoFilterStore from "@/store/v2/memoFilter";
import { Direction, State } from "@/types/proto/api/v1/common"; import { State } from "@/types/proto/api/v1/common";
import { Memo } from "@/types/proto/api/v1/memo_service"; import { Memo } from "@/types/proto/api/v1/memo_service";
// Helper function to extract shortcut ID from resource name // Helper function to extract shortcut ID from resource name
@ -68,7 +68,7 @@ const Home = observer(() => {
.sort((a, b) => Number(b.pinned) - Number(a.pinned)) .sort((a, b) => Number(b.pinned) - Number(a.pinned))
} }
owner={user.name} owner={user.name}
direction={viewStore.state.orderByTimeAsc ? Direction.ASC : Direction.DESC} orderBy={viewStore.state.orderByTimeAsc ? "display_time asc" : "display_time desc"}
filter={selectedShortcut?.filter || ""} filter={selectedShortcut?.filter || ""}
oldFilter={memoListFilter} oldFilter={memoListFilter}
/> />

@ -12,7 +12,7 @@ import UserAvatar from "@/components/UserAvatar";
import useLoading from "@/hooks/useLoading"; import useLoading from "@/hooks/useLoading";
import { viewStore, userStore } from "@/store/v2"; import { viewStore, userStore } from "@/store/v2";
import memoFilterStore from "@/store/v2/memoFilter"; import memoFilterStore from "@/store/v2/memoFilter";
import { Direction, State } from "@/types/proto/api/v1/common"; import { State } from "@/types/proto/api/v1/common";
import { Memo } from "@/types/proto/api/v1/memo_service"; import { Memo } from "@/types/proto/api/v1/memo_service";
import { User } from "@/types/proto/api/v1/user_service"; import { User } from "@/types/proto/api/v1/user_service";
import { useTranslate } from "@/utils/i18n"; import { useTranslate } from "@/utils/i18n";
@ -112,7 +112,7 @@ const UserProfile = observer(() => {
.sort((a, b) => Number(b.pinned) - Number(a.pinned)) .sort((a, b) => Number(b.pinned) - Number(a.pinned))
} }
owner={user.name} owner={user.name}
direction={viewStore.state.orderByTimeAsc ? Direction.ASC : Direction.DESC} orderBy={viewStore.state.orderByTimeAsc ? "display_time asc" : "display_time desc"}
oldFilter={memoListFilter} oldFilter={memoListFilter}
/> />
</> </>

File diff suppressed because it is too large Load Diff

@ -1,122 +0,0 @@
// Code generated by protoc-gen-ts_proto. DO NOT EDIT.
// versions:
// protoc-gen-ts_proto v2.6.1
// protoc unknown
// source: api/v1/reaction_service.proto
/* eslint-disable */
import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
export const protobufPackage = "memos.api.v1";
export interface Reaction {
id: number;
/**
* The name of the creator.
* Format: users/{user}
*/
creator: string;
/**
* The content identifier.
* For memo, it should be the `Memo.name`.
*/
contentId: string;
reactionType: string;
}
function createBaseReaction(): Reaction {
return { id: 0, creator: "", contentId: "", reactionType: "" };
}
export const Reaction: MessageFns<Reaction> = {
encode(message: Reaction, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
if (message.id !== 0) {
writer.uint32(8).int32(message.id);
}
if (message.creator !== "") {
writer.uint32(18).string(message.creator);
}
if (message.contentId !== "") {
writer.uint32(26).string(message.contentId);
}
if (message.reactionType !== "") {
writer.uint32(34).string(message.reactionType);
}
return writer;
},
decode(input: BinaryReader | Uint8Array, length?: number): Reaction {
const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
let end = length === undefined ? reader.len : reader.pos + length;
const message = createBaseReaction();
while (reader.pos < end) {
const tag = reader.uint32();
switch (tag >>> 3) {
case 1: {
if (tag !== 8) {
break;
}
message.id = reader.int32();
continue;
}
case 2: {
if (tag !== 18) {
break;
}
message.creator = reader.string();
continue;
}
case 3: {
if (tag !== 26) {
break;
}
message.contentId = reader.string();
continue;
}
case 4: {
if (tag !== 34) {
break;
}
message.reactionType = reader.string();
continue;
}
}
if ((tag & 7) === 4 || tag === 0) {
break;
}
reader.skip(tag & 7);
}
return message;
},
create(base?: DeepPartial<Reaction>): Reaction {
return Reaction.fromPartial(base ?? {});
},
fromPartial(object: DeepPartial<Reaction>): Reaction {
const message = createBaseReaction();
message.id = object.id ?? 0;
message.creator = object.creator ?? "";
message.contentId = object.contentId ?? "";
message.reactionType = object.reactionType ?? "";
return message;
},
};
type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined;
export type DeepPartial<T> = T extends Builtin ? T
: T extends globalThis.Array<infer U> ? globalThis.Array<DeepPartial<U>>
: T extends ReadonlyArray<infer U> ? ReadonlyArray<DeepPartial<U>>
: T extends {} ? { [K in keyof T]?: DeepPartial<T[K]> }
: Partial<T>;
export interface MessageFns<T> {
encode(message: T, writer?: BinaryWriter): BinaryWriter;
decode(input: BinaryReader | Uint8Array, length?: number): T;
create(base?: DeepPartial<T>): T;
fromPartial(object: DeepPartial<T>): T;
}
Loading…
Cancel
Save