diff --git a/proto/api/v1/memo_service.proto b/proto/api/v1/memo_service.proto index e1bfa665..81c54b0e 100644 --- a/proto/api/v1/memo_service.proto +++ b/proto/api/v1/memo_service.proto @@ -128,10 +128,10 @@ service MemoService { option (google.api.http) = {delete: "/api/v1/{name=memos/*/shares/*}"}; option (google.api.method_signature) = "name"; } - // GetMemoByShare resolves a share token to its memo. No authentication required. + // GetSharedMemo resolves a share token to its memo. No authentication required. // Returns NOT_FOUND if the token is invalid or expired. - rpc GetMemoByShare(GetMemoByShareRequest) returns (Memo) { - option (google.api.http) = {get: "/api/v1/shares/{share_id}"}; + rpc GetSharedMemo(GetSharedMemoRequest) returns (Memo) { + option (google.api.http) = {get: "/api/v1/shares/{share_token}/memo"}; } // GetLinkMetadata gets metadata for a link. rpc GetLinkMetadata(GetLinkMetadataRequest) returns (LinkMetadata) { @@ -622,9 +622,9 @@ message DeleteMemoShareRequest { ]; } -message GetMemoByShareRequest { - // Required. The share token extracted from the share URL (/s/{share_id}). - string share_id = 1 [(google.api.field_behavior) = REQUIRED]; +message GetSharedMemoRequest { + // Required. The opaque bearer token extracted from the share URL. + string share_token = 1 [(google.api.field_behavior) = REQUIRED]; } message GetLinkMetadataRequest { diff --git a/proto/buf.gen.yaml b/proto/buf.gen.yaml index 749386f9..b7a25698 100644 --- a/proto/buf.gen.yaml +++ b/proto/buf.gen.yaml @@ -23,7 +23,7 @@ plugins: - remote: buf.build/community/google-gnostic-openapi out: gen opt: enum_type=string - - remote: buf.build/bufbuild/es + - remote: buf.build/bufbuild/es:v2.12.1 out: ../web/src/types/proto opt: - target=ts diff --git a/proto/gen/api/v1/apiv1connect/memo_service.connect.go b/proto/gen/api/v1/apiv1connect/memo_service.connect.go index d7f29c57..35951a8f 100644 --- a/proto/gen/api/v1/apiv1connect/memo_service.connect.go +++ b/proto/gen/api/v1/apiv1connect/memo_service.connect.go @@ -80,9 +80,9 @@ const ( // MemoServiceDeleteMemoShareProcedure is the fully-qualified name of the MemoService's // DeleteMemoShare RPC. MemoServiceDeleteMemoShareProcedure = "/memos.api.v1.MemoService/DeleteMemoShare" - // MemoServiceGetMemoByShareProcedure is the fully-qualified name of the MemoService's - // GetMemoByShare RPC. - MemoServiceGetMemoByShareProcedure = "/memos.api.v1.MemoService/GetMemoByShare" + // MemoServiceGetSharedMemoProcedure is the fully-qualified name of the MemoService's GetSharedMemo + // RPC. + MemoServiceGetSharedMemoProcedure = "/memos.api.v1.MemoService/GetSharedMemo" // MemoServiceGetLinkMetadataProcedure is the fully-qualified name of the MemoService's // GetLinkMetadata RPC. MemoServiceGetLinkMetadataProcedure = "/memos.api.v1.MemoService/GetLinkMetadata" @@ -134,9 +134,9 @@ type MemoServiceClient interface { ListMemoShares(context.Context, *connect.Request[v1.ListMemoSharesRequest]) (*connect.Response[v1.ListMemoSharesResponse], error) // DeleteMemoShare revokes a share link. Requires authentication as the memo creator. DeleteMemoShare(context.Context, *connect.Request[v1.DeleteMemoShareRequest]) (*connect.Response[emptypb.Empty], error) - // GetMemoByShare resolves a share token to its memo. No authentication required. + // GetSharedMemo resolves a share token to its memo. No authentication required. // Returns NOT_FOUND if the token is invalid or expired. - GetMemoByShare(context.Context, *connect.Request[v1.GetMemoByShareRequest]) (*connect.Response[v1.Memo], error) + GetSharedMemo(context.Context, *connect.Request[v1.GetSharedMemoRequest]) (*connect.Response[v1.Memo], error) // GetLinkMetadata gets metadata for a link. GetLinkMetadata(context.Context, *connect.Request[v1.GetLinkMetadataRequest]) (*connect.Response[v1.LinkMetadata], error) // BatchGetLinkMetadata gets metadata for links. @@ -256,10 +256,10 @@ func NewMemoServiceClient(httpClient connect.HTTPClient, baseURL string, opts .. connect.WithSchema(memoServiceMethods.ByName("DeleteMemoShare")), connect.WithClientOptions(opts...), ), - getMemoByShare: connect.NewClient[v1.GetMemoByShareRequest, v1.Memo]( + getSharedMemo: connect.NewClient[v1.GetSharedMemoRequest, v1.Memo]( httpClient, - baseURL+MemoServiceGetMemoByShareProcedure, - connect.WithSchema(memoServiceMethods.ByName("GetMemoByShare")), + baseURL+MemoServiceGetSharedMemoProcedure, + connect.WithSchema(memoServiceMethods.ByName("GetSharedMemo")), connect.WithClientOptions(opts...), ), getLinkMetadata: connect.NewClient[v1.GetLinkMetadataRequest, v1.LinkMetadata]( @@ -296,7 +296,7 @@ type memoServiceClient struct { createMemoShare *connect.Client[v1.CreateMemoShareRequest, v1.MemoShare] listMemoShares *connect.Client[v1.ListMemoSharesRequest, v1.ListMemoSharesResponse] deleteMemoShare *connect.Client[v1.DeleteMemoShareRequest, emptypb.Empty] - getMemoByShare *connect.Client[v1.GetMemoByShareRequest, v1.Memo] + getSharedMemo *connect.Client[v1.GetSharedMemoRequest, v1.Memo] getLinkMetadata *connect.Client[v1.GetLinkMetadataRequest, v1.LinkMetadata] batchGetLinkMetadata *connect.Client[v1.BatchGetLinkMetadataRequest, v1.BatchGetLinkMetadataResponse] } @@ -386,9 +386,9 @@ func (c *memoServiceClient) DeleteMemoShare(ctx context.Context, req *connect.Re return c.deleteMemoShare.CallUnary(ctx, req) } -// GetMemoByShare calls memos.api.v1.MemoService.GetMemoByShare. -func (c *memoServiceClient) GetMemoByShare(ctx context.Context, req *connect.Request[v1.GetMemoByShareRequest]) (*connect.Response[v1.Memo], error) { - return c.getMemoByShare.CallUnary(ctx, req) +// GetSharedMemo calls memos.api.v1.MemoService.GetSharedMemo. +func (c *memoServiceClient) GetSharedMemo(ctx context.Context, req *connect.Request[v1.GetSharedMemoRequest]) (*connect.Response[v1.Memo], error) { + return c.getSharedMemo.CallUnary(ctx, req) } // GetLinkMetadata calls memos.api.v1.MemoService.GetLinkMetadata. @@ -444,9 +444,9 @@ type MemoServiceHandler interface { ListMemoShares(context.Context, *connect.Request[v1.ListMemoSharesRequest]) (*connect.Response[v1.ListMemoSharesResponse], error) // DeleteMemoShare revokes a share link. Requires authentication as the memo creator. DeleteMemoShare(context.Context, *connect.Request[v1.DeleteMemoShareRequest]) (*connect.Response[emptypb.Empty], error) - // GetMemoByShare resolves a share token to its memo. No authentication required. + // GetSharedMemo resolves a share token to its memo. No authentication required. // Returns NOT_FOUND if the token is invalid or expired. - GetMemoByShare(context.Context, *connect.Request[v1.GetMemoByShareRequest]) (*connect.Response[v1.Memo], error) + GetSharedMemo(context.Context, *connect.Request[v1.GetSharedMemoRequest]) (*connect.Response[v1.Memo], error) // GetLinkMetadata gets metadata for a link. GetLinkMetadata(context.Context, *connect.Request[v1.GetLinkMetadataRequest]) (*connect.Response[v1.LinkMetadata], error) // BatchGetLinkMetadata gets metadata for links. @@ -562,10 +562,10 @@ func NewMemoServiceHandler(svc MemoServiceHandler, opts ...connect.HandlerOption connect.WithSchema(memoServiceMethods.ByName("DeleteMemoShare")), connect.WithHandlerOptions(opts...), ) - memoServiceGetMemoByShareHandler := connect.NewUnaryHandler( - MemoServiceGetMemoByShareProcedure, - svc.GetMemoByShare, - connect.WithSchema(memoServiceMethods.ByName("GetMemoByShare")), + memoServiceGetSharedMemoHandler := connect.NewUnaryHandler( + MemoServiceGetSharedMemoProcedure, + svc.GetSharedMemo, + connect.WithSchema(memoServiceMethods.ByName("GetSharedMemo")), connect.WithHandlerOptions(opts...), ) memoServiceGetLinkMetadataHandler := connect.NewUnaryHandler( @@ -616,8 +616,8 @@ func NewMemoServiceHandler(svc MemoServiceHandler, opts ...connect.HandlerOption memoServiceListMemoSharesHandler.ServeHTTP(w, r) case MemoServiceDeleteMemoShareProcedure: memoServiceDeleteMemoShareHandler.ServeHTTP(w, r) - case MemoServiceGetMemoByShareProcedure: - memoServiceGetMemoByShareHandler.ServeHTTP(w, r) + case MemoServiceGetSharedMemoProcedure: + memoServiceGetSharedMemoHandler.ServeHTTP(w, r) case MemoServiceGetLinkMetadataProcedure: memoServiceGetLinkMetadataHandler.ServeHTTP(w, r) case MemoServiceBatchGetLinkMetadataProcedure: @@ -699,8 +699,8 @@ func (UnimplementedMemoServiceHandler) DeleteMemoShare(context.Context, *connect return nil, connect.NewError(connect.CodeUnimplemented, errors.New("memos.api.v1.MemoService.DeleteMemoShare is not implemented")) } -func (UnimplementedMemoServiceHandler) GetMemoByShare(context.Context, *connect.Request[v1.GetMemoByShareRequest]) (*connect.Response[v1.Memo], error) { - return nil, connect.NewError(connect.CodeUnimplemented, errors.New("memos.api.v1.MemoService.GetMemoByShare is not implemented")) +func (UnimplementedMemoServiceHandler) GetSharedMemo(context.Context, *connect.Request[v1.GetSharedMemoRequest]) (*connect.Response[v1.Memo], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("memos.api.v1.MemoService.GetSharedMemo is not implemented")) } func (UnimplementedMemoServiceHandler) GetLinkMetadata(context.Context, *connect.Request[v1.GetLinkMetadataRequest]) (*connect.Response[v1.LinkMetadata], error) { diff --git a/proto/gen/api/v1/memo_service.pb.go b/proto/gen/api/v1/memo_service.pb.go index 713fe8ae..aecc9e5b 100644 --- a/proto/gen/api/v1/memo_service.pb.go +++ b/proto/gen/api/v1/memo_service.pb.go @@ -1925,28 +1925,28 @@ func (x *DeleteMemoShareRequest) GetName() string { return "" } -type GetMemoByShareRequest struct { +type GetSharedMemoRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - // Required. The share token extracted from the share URL (/s/{share_id}). - ShareId string `protobuf:"bytes,1,opt,name=share_id,json=shareId,proto3" json:"share_id,omitempty"` + // Required. The opaque bearer token extracted from the share URL. + ShareToken string `protobuf:"bytes,1,opt,name=share_token,json=shareToken,proto3" json:"share_token,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *GetMemoByShareRequest) Reset() { - *x = GetMemoByShareRequest{} +func (x *GetSharedMemoRequest) Reset() { + *x = GetSharedMemoRequest{} mi := &file_api_v1_memo_service_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GetMemoByShareRequest) String() string { +func (x *GetSharedMemoRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetMemoByShareRequest) ProtoMessage() {} +func (*GetSharedMemoRequest) ProtoMessage() {} -func (x *GetMemoByShareRequest) ProtoReflect() protoreflect.Message { +func (x *GetSharedMemoRequest) ProtoReflect() protoreflect.Message { mi := &file_api_v1_memo_service_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1958,14 +1958,14 @@ func (x *GetMemoByShareRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetMemoByShareRequest.ProtoReflect.Descriptor instead. -func (*GetMemoByShareRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use GetSharedMemoRequest.ProtoReflect.Descriptor instead. +func (*GetSharedMemoRequest) Descriptor() ([]byte, []int) { return file_api_v1_memo_service_proto_rawDescGZIP(), []int{28} } -func (x *GetMemoByShareRequest) GetShareId() string { +func (x *GetSharedMemoRequest) GetShareToken() string { if x != nil { - return x.ShareId + return x.ShareToken } return "" } @@ -2480,9 +2480,10 @@ const file_api_v1_memo_service_proto_rawDesc = "" + "memoShares\"L\n" + "\x16DeleteMemoShareRequest\x122\n" + "\x04name\x18\x01 \x01(\tB\x1e\xe0A\x02\xfaA\x18\n" + - "\x16memos.api.v1/MemoShareR\x04name\"7\n" + - "\x15GetMemoByShareRequest\x12\x1e\n" + - "\bshare_id\x18\x01 \x01(\tB\x03\xe0A\x02R\ashareId\"/\n" + + "\x16memos.api.v1/MemoShareR\x04name\"<\n" + + "\x14GetSharedMemoRequest\x12$\n" + + "\vshare_token\x18\x01 \x01(\tB\x03\xe0A\x02R\n" + + "shareToken\"/\n" + "\x16GetLinkMetadataRequest\x12\x15\n" + "\x03url\x18\x01 \x01(\tB\x03\xe0A\x02R\x03url\"6\n" + "\x1bBatchGetLinkMetadataRequest\x12\x17\n" + @@ -2500,7 +2501,7 @@ const file_api_v1_memo_service_proto_rawDesc = "" + "\aPRIVATE\x10\x01\x12\r\n" + "\tPROTECTED\x10\x02\x12\n" + "\n" + - "\x06PUBLIC\x10\x032\x8b\x15\n" + + "\x06PUBLIC\x10\x032\x91\x15\n" + "\vMemoService\x12e\n" + "\n" + "CreateMemo\x12\x1f.memos.api.v1.CreateMemoRequest\x1a\x12.memos.api.v1.Memo\"\"\xdaA\x04memo\x82\xd3\xe4\x93\x02\x15:\x04memo\"\r/api/v1/memos\x12f\n" + @@ -2522,8 +2523,8 @@ const file_api_v1_memo_service_proto_rawDesc = "" + "\x0fCreateMemoShare\x12$.memos.api.v1.CreateMemoShareRequest\x1a\x17.memos.api.v1.MemoShare\"G\xdaA\x11parent,memo_share\x82\xd3\xe4\x93\x02-:\n" + "memo_share\"\x1f/api/v1/{parent=memos/*}/shares\x12\x8d\x01\n" + "\x0eListMemoShares\x12#.memos.api.v1.ListMemoSharesRequest\x1a$.memos.api.v1.ListMemoSharesResponse\"0\xdaA\x06parent\x82\xd3\xe4\x93\x02!\x12\x1f/api/v1/{parent=memos/*}/shares\x12\x7f\n" + - "\x0fDeleteMemoShare\x12$.memos.api.v1.DeleteMemoShareRequest\x1a\x16.google.protobuf.Empty\".\xdaA\x04name\x82\xd3\xe4\x93\x02!*\x1f/api/v1/{name=memos/*/shares/*}\x12l\n" + - "\x0eGetMemoByShare\x12#.memos.api.v1.GetMemoByShareRequest\x1a\x12.memos.api.v1.Memo\"!\x82\xd3\xe4\x93\x02\x1b\x12\x19/api/v1/shares/{share_id}\x12y\n" + + "\x0fDeleteMemoShare\x12$.memos.api.v1.DeleteMemoShareRequest\x1a\x16.google.protobuf.Empty\".\xdaA\x04name\x82\xd3\xe4\x93\x02!*\x1f/api/v1/{name=memos/*/shares/*}\x12r\n" + + "\rGetSharedMemo\x12\".memos.api.v1.GetSharedMemoRequest\x1a\x12.memos.api.v1.Memo\")\x82\xd3\xe4\x93\x02#\x12!/api/v1/shares/{share_token}/memo\x12y\n" + "\x0fGetLinkMetadata\x12$.memos.api.v1.GetLinkMetadataRequest\x1a\x1a.memos.api.v1.LinkMetadata\"$\x82\xd3\xe4\x93\x02\x1e\x12\x1c/api/v1/memos/-/linkMetadata\x12\x9f\x01\n" + "\x14BatchGetLinkMetadata\x12).memos.api.v1.BatchGetLinkMetadataRequest\x1a*.memos.api.v1.BatchGetLinkMetadataResponse\"0\x82\xd3\xe4\x93\x02*:\x01*\"%/api/v1/memos/-/linkMetadata:batchGetB\xa8\x01\n" + "\x10com.memos.api.v1B\x10MemoServiceProtoP\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" @@ -2573,7 +2574,7 @@ var file_api_v1_memo_service_proto_goTypes = []any{ (*ListMemoSharesRequest)(nil), // 27: memos.api.v1.ListMemoSharesRequest (*ListMemoSharesResponse)(nil), // 28: memos.api.v1.ListMemoSharesResponse (*DeleteMemoShareRequest)(nil), // 29: memos.api.v1.DeleteMemoShareRequest - (*GetMemoByShareRequest)(nil), // 30: memos.api.v1.GetMemoByShareRequest + (*GetSharedMemoRequest)(nil), // 30: memos.api.v1.GetSharedMemoRequest (*GetLinkMetadataRequest)(nil), // 31: memos.api.v1.GetLinkMetadataRequest (*BatchGetLinkMetadataRequest)(nil), // 32: memos.api.v1.BatchGetLinkMetadataRequest (*BatchGetLinkMetadataResponse)(nil), // 33: memos.api.v1.BatchGetLinkMetadataResponse @@ -2635,7 +2636,7 @@ var file_api_v1_memo_service_proto_depIdxs = []int32{ 26, // 45: memos.api.v1.MemoService.CreateMemoShare:input_type -> memos.api.v1.CreateMemoShareRequest 27, // 46: memos.api.v1.MemoService.ListMemoShares:input_type -> memos.api.v1.ListMemoSharesRequest 29, // 47: memos.api.v1.MemoService.DeleteMemoShare:input_type -> memos.api.v1.DeleteMemoShareRequest - 30, // 48: memos.api.v1.MemoService.GetMemoByShare:input_type -> memos.api.v1.GetMemoByShareRequest + 30, // 48: memos.api.v1.MemoService.GetSharedMemo:input_type -> memos.api.v1.GetSharedMemoRequest 31, // 49: memos.api.v1.MemoService.GetLinkMetadata:input_type -> memos.api.v1.GetLinkMetadataRequest 32, // 50: memos.api.v1.MemoService.BatchGetLinkMetadata:input_type -> memos.api.v1.BatchGetLinkMetadataRequest 3, // 51: memos.api.v1.MemoService.CreateMemo:output_type -> memos.api.v1.Memo @@ -2655,7 +2656,7 @@ var file_api_v1_memo_service_proto_depIdxs = []int32{ 25, // 65: memos.api.v1.MemoService.CreateMemoShare:output_type -> memos.api.v1.MemoShare 28, // 66: memos.api.v1.MemoService.ListMemoShares:output_type -> memos.api.v1.ListMemoSharesResponse 41, // 67: memos.api.v1.MemoService.DeleteMemoShare:output_type -> google.protobuf.Empty - 3, // 68: memos.api.v1.MemoService.GetMemoByShare:output_type -> memos.api.v1.Memo + 3, // 68: memos.api.v1.MemoService.GetSharedMemo:output_type -> memos.api.v1.Memo 34, // 69: memos.api.v1.MemoService.GetLinkMetadata:output_type -> memos.api.v1.LinkMetadata 33, // 70: memos.api.v1.MemoService.BatchGetLinkMetadata:output_type -> memos.api.v1.BatchGetLinkMetadataResponse 51, // [51:71] is the sub-list for method output_type diff --git a/proto/gen/api/v1/memo_service.pb.gw.go b/proto/gen/api/v1/memo_service.pb.gw.go index b0beb9f7..596e8dc0 100644 --- a/proto/gen/api/v1/memo_service.pb.gw.go +++ b/proto/gen/api/v1/memo_service.pb.gw.go @@ -852,42 +852,42 @@ func local_request_MemoService_DeleteMemoShare_0(ctx context.Context, marshaler return msg, metadata, err } -func request_MemoService_GetMemoByShare_0(ctx context.Context, marshaler runtime.Marshaler, client MemoServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func request_MemoService_GetSharedMemo_0(ctx context.Context, marshaler runtime.Marshaler, client MemoServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var ( - protoReq GetMemoByShareRequest + protoReq GetSharedMemoRequest metadata runtime.ServerMetadata err error ) if req.Body != nil { _, _ = io.Copy(io.Discard, req.Body) } - val, ok := pathParams["share_id"] + val, ok := pathParams["share_token"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "share_id") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "share_token") } - protoReq.ShareId, err = runtime.String(val) + protoReq.ShareToken, err = runtime.String(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "share_id", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "share_token", err) } - msg, err := client.GetMemoByShare(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.GetSharedMemo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func local_request_MemoService_GetMemoByShare_0(ctx context.Context, marshaler runtime.Marshaler, server MemoServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { +func local_request_MemoService_GetSharedMemo_0(ctx context.Context, marshaler runtime.Marshaler, server MemoServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var ( - protoReq GetMemoByShareRequest + protoReq GetSharedMemoRequest metadata runtime.ServerMetadata err error ) - val, ok := pathParams["share_id"] + val, ok := pathParams["share_token"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "share_id") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "share_token") } - protoReq.ShareId, err = runtime.String(val) + protoReq.ShareToken, err = runtime.String(val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "share_id", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "share_token", err) } - msg, err := server.GetMemoByShare(ctx, &protoReq) + msg, err := server.GetSharedMemo(ctx, &protoReq) return msg, metadata, err } @@ -1299,25 +1299,25 @@ func RegisterMemoServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux } forward_MemoService_DeleteMemoShare_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle(http.MethodGet, pattern_MemoService_GetMemoByShare_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_MemoService_GetSharedMemo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/memos.api.v1.MemoService/GetMemoByShare", runtime.WithHTTPPathPattern("/api/v1/shares/{share_id}")) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/memos.api.v1.MemoService/GetSharedMemo", runtime.WithHTTPPathPattern("/api/v1/shares/{share_token}/memo")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := local_request_MemoService_GetMemoByShare_0(annotatedContext, inboundMarshaler, server, req, pathParams) + resp, md, err := local_request_MemoService_GetSharedMemo_0(annotatedContext, inboundMarshaler, server, req, pathParams) md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_MemoService_GetMemoByShare_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_MemoService_GetSharedMemo_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) mux.Handle(http.MethodGet, pattern_MemoService_GetLinkMetadata_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) @@ -1688,22 +1688,22 @@ func RegisterMemoServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux } forward_MemoService_DeleteMemoShare_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) - mux.Handle(http.MethodGet, pattern_MemoService_GetMemoByShare_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + mux.Handle(http.MethodGet, pattern_MemoService_GetSharedMemo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/memos.api.v1.MemoService/GetMemoByShare", runtime.WithHTTPPathPattern("/api/v1/shares/{share_id}")) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/memos.api.v1.MemoService/GetSharedMemo", runtime.WithHTTPPathPattern("/api/v1/shares/{share_token}/memo")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return } - resp, md, err := request_MemoService_GetMemoByShare_0(annotatedContext, inboundMarshaler, client, req, pathParams) + resp, md, err := request_MemoService_GetSharedMemo_0(annotatedContext, inboundMarshaler, client, req, pathParams) annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) if err != nil { runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_MemoService_GetMemoByShare_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_MemoService_GetSharedMemo_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) mux.Handle(http.MethodGet, pattern_MemoService_GetLinkMetadata_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) @@ -1760,7 +1760,7 @@ var ( pattern_MemoService_CreateMemoShare_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", "parent", "shares"}, "")) pattern_MemoService_ListMemoShares_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", "parent", "shares"}, "")) pattern_MemoService_DeleteMemoShare_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 2, 3, 1, 0, 4, 4, 5, 4}, []string{"api", "v1", "memos", "shares", "name"}, "")) - pattern_MemoService_GetMemoByShare_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "shares", "share_id"}, "")) + pattern_MemoService_GetSharedMemo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 2, 4}, []string{"api", "v1", "shares", "share_token", "memo"}, "")) pattern_MemoService_GetLinkMetadata_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"api", "v1", "memos", "-", "linkMetadata"}, "")) pattern_MemoService_BatchGetLinkMetadata_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4}, []string{"api", "v1", "memos", "-", "linkMetadata"}, "batchGet")) ) @@ -1783,7 +1783,7 @@ var ( forward_MemoService_CreateMemoShare_0 = runtime.ForwardResponseMessage forward_MemoService_ListMemoShares_0 = runtime.ForwardResponseMessage forward_MemoService_DeleteMemoShare_0 = runtime.ForwardResponseMessage - forward_MemoService_GetMemoByShare_0 = runtime.ForwardResponseMessage + forward_MemoService_GetSharedMemo_0 = runtime.ForwardResponseMessage forward_MemoService_GetLinkMetadata_0 = runtime.ForwardResponseMessage forward_MemoService_BatchGetLinkMetadata_0 = runtime.ForwardResponseMessage ) diff --git a/proto/gen/api/v1/memo_service_grpc.pb.go b/proto/gen/api/v1/memo_service_grpc.pb.go index e370acc9..57aa8f35 100644 --- a/proto/gen/api/v1/memo_service_grpc.pb.go +++ b/proto/gen/api/v1/memo_service_grpc.pb.go @@ -37,7 +37,7 @@ const ( MemoService_CreateMemoShare_FullMethodName = "/memos.api.v1.MemoService/CreateMemoShare" MemoService_ListMemoShares_FullMethodName = "/memos.api.v1.MemoService/ListMemoShares" MemoService_DeleteMemoShare_FullMethodName = "/memos.api.v1.MemoService/DeleteMemoShare" - MemoService_GetMemoByShare_FullMethodName = "/memos.api.v1.MemoService/GetMemoByShare" + MemoService_GetSharedMemo_FullMethodName = "/memos.api.v1.MemoService/GetSharedMemo" MemoService_GetLinkMetadata_FullMethodName = "/memos.api.v1.MemoService/GetLinkMetadata" MemoService_BatchGetLinkMetadata_FullMethodName = "/memos.api.v1.MemoService/BatchGetLinkMetadata" ) @@ -87,9 +87,9 @@ type MemoServiceClient interface { ListMemoShares(ctx context.Context, in *ListMemoSharesRequest, opts ...grpc.CallOption) (*ListMemoSharesResponse, error) // DeleteMemoShare revokes a share link. Requires authentication as the memo creator. DeleteMemoShare(ctx context.Context, in *DeleteMemoShareRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - // GetMemoByShare resolves a share token to its memo. No authentication required. + // GetSharedMemo resolves a share token to its memo. No authentication required. // Returns NOT_FOUND if the token is invalid or expired. - GetMemoByShare(ctx context.Context, in *GetMemoByShareRequest, opts ...grpc.CallOption) (*Memo, error) + GetSharedMemo(ctx context.Context, in *GetSharedMemoRequest, opts ...grpc.CallOption) (*Memo, error) // GetLinkMetadata gets metadata for a link. GetLinkMetadata(ctx context.Context, in *GetLinkMetadataRequest, opts ...grpc.CallOption) (*LinkMetadata, error) // BatchGetLinkMetadata gets metadata for links. @@ -274,10 +274,10 @@ func (c *memoServiceClient) DeleteMemoShare(ctx context.Context, in *DeleteMemoS return out, nil } -func (c *memoServiceClient) GetMemoByShare(ctx context.Context, in *GetMemoByShareRequest, opts ...grpc.CallOption) (*Memo, error) { +func (c *memoServiceClient) GetSharedMemo(ctx context.Context, in *GetSharedMemoRequest, opts ...grpc.CallOption) (*Memo, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(Memo) - err := c.cc.Invoke(ctx, MemoService_GetMemoByShare_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, MemoService_GetSharedMemo_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -349,9 +349,9 @@ type MemoServiceServer interface { ListMemoShares(context.Context, *ListMemoSharesRequest) (*ListMemoSharesResponse, error) // DeleteMemoShare revokes a share link. Requires authentication as the memo creator. DeleteMemoShare(context.Context, *DeleteMemoShareRequest) (*emptypb.Empty, error) - // GetMemoByShare resolves a share token to its memo. No authentication required. + // GetSharedMemo resolves a share token to its memo. No authentication required. // Returns NOT_FOUND if the token is invalid or expired. - GetMemoByShare(context.Context, *GetMemoByShareRequest) (*Memo, error) + GetSharedMemo(context.Context, *GetSharedMemoRequest) (*Memo, error) // GetLinkMetadata gets metadata for a link. GetLinkMetadata(context.Context, *GetLinkMetadataRequest) (*LinkMetadata, error) // BatchGetLinkMetadata gets metadata for links. @@ -417,8 +417,8 @@ func (UnimplementedMemoServiceServer) ListMemoShares(context.Context, *ListMemoS func (UnimplementedMemoServiceServer) DeleteMemoShare(context.Context, *DeleteMemoShareRequest) (*emptypb.Empty, error) { return nil, status.Error(codes.Unimplemented, "method DeleteMemoShare not implemented") } -func (UnimplementedMemoServiceServer) GetMemoByShare(context.Context, *GetMemoByShareRequest) (*Memo, error) { - return nil, status.Error(codes.Unimplemented, "method GetMemoByShare not implemented") +func (UnimplementedMemoServiceServer) GetSharedMemo(context.Context, *GetSharedMemoRequest) (*Memo, error) { + return nil, status.Error(codes.Unimplemented, "method GetSharedMemo not implemented") } func (UnimplementedMemoServiceServer) GetLinkMetadata(context.Context, *GetLinkMetadataRequest) (*LinkMetadata, error) { return nil, status.Error(codes.Unimplemented, "method GetLinkMetadata not implemented") @@ -753,20 +753,20 @@ func _MemoService_DeleteMemoShare_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } -func _MemoService_GetMemoByShare_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetMemoByShareRequest) +func _MemoService_GetSharedMemo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetSharedMemoRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(MemoServiceServer).GetMemoByShare(ctx, in) + return srv.(MemoServiceServer).GetSharedMemo(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: MemoService_GetMemoByShare_FullMethodName, + FullMethod: MemoService_GetSharedMemo_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MemoServiceServer).GetMemoByShare(ctx, req.(*GetMemoByShareRequest)) + return srv.(MemoServiceServer).GetSharedMemo(ctx, req.(*GetSharedMemoRequest)) } return interceptor(ctx, in, info, handler) } @@ -883,8 +883,8 @@ var MemoService_ServiceDesc = grpc.ServiceDesc{ Handler: _MemoService_DeleteMemoShare_Handler, }, { - MethodName: "GetMemoByShare", - Handler: _MemoService_GetMemoByShare_Handler, + MethodName: "GetSharedMemo", + Handler: _MemoService_GetSharedMemo_Handler, }, { MethodName: "GetLinkMetadata", diff --git a/proto/gen/openapi.yaml b/proto/gen/openapi.yaml index 421ceeed..b8e4d0a2 100644 --- a/proto/gen/openapi.yaml +++ b/proto/gen/openapi.yaml @@ -1266,18 +1266,18 @@ paths: application/json: schema: $ref: '#/components/schemas/Status' - /api/v1/shares/{shareId}: + /api/v1/shares/{shareToken}/memo: get: tags: - MemoService description: |- - GetMemoByShare resolves a share token to its memo. No authentication required. + GetSharedMemo resolves a share token to its memo. No authentication required. Returns NOT_FOUND if the token is invalid or expired. - operationId: MemoService_GetMemoByShare + operationId: MemoService_GetSharedMemo parameters: - - name: shareId + - name: shareToken in: path - description: Required. The share token extracted from the share URL (/s/{share_id}). + description: Required. The opaque bearer token extracted from the share URL. required: true schema: type: string diff --git a/server/router/api/v1/acl_config.go b/server/router/api/v1/acl_config.go index 5076e2c6..a9233cbc 100644 --- a/server/router/api/v1/acl_config.go +++ b/server/router/api/v1/acl_config.go @@ -37,7 +37,7 @@ var PublicMethods = map[string]struct{}{ "/memos.api.v1.MemoService/BatchGetLinkMetadata": {}, // Memo sharing - share-token endpoints require no authentication - "/memos.api.v1.MemoService/GetMemoByShare": {}, + "/memos.api.v1.MemoService/GetSharedMemo": {}, } // IsPublicMethod checks if a procedure path is public (no authentication required). @@ -70,7 +70,7 @@ var AuthBootstrapMethods = map[string]struct{}{ "/memos.api.v1.UserService/CreateUser": {}, // Memo sharing - share-token access stays public even on a private instance. - "/memos.api.v1.MemoService/GetMemoByShare": {}, + "/memos.api.v1.MemoService/GetSharedMemo": {}, } // IsAuthBootstrapMethod reports whether an anonymous request to procedure is one diff --git a/server/router/api/v1/acl_config_test.go b/server/router/api/v1/acl_config_test.go index 3322c7bd..0f0b86b7 100644 --- a/server/router/api/v1/acl_config_test.go +++ b/server/router/api/v1/acl_config_test.go @@ -112,7 +112,7 @@ func TestAuthBootstrapClassification(t *testing.T) { "/memos.api.v1.InstanceService/GetInstanceSetting", "/memos.api.v1.InstanceService/BatchGetInstanceSettings", "/memos.api.v1.IdentityProviderService/ListIdentityProviders", - "/memos.api.v1.MemoService/GetMemoByShare", + "/memos.api.v1.MemoService/GetSharedMemo", } for _, method := range bootstrap { t.Run("bootstrap/"+method, func(t *testing.T) { diff --git a/server/router/api/v1/authz_test.go b/server/router/api/v1/authz_test.go index c18a8e3b..9c679a3d 100644 --- a/server/router/api/v1/authz_test.go +++ b/server/router/api/v1/authz_test.go @@ -25,7 +25,7 @@ func TestAuthorizerCheckAccess(t *testing.T) { publicMethod = "/memos.api.v1.MemoService/ListMemos" bootstrapMethod = "/memos.api.v1.AuthService/SignIn" createUser = "/memos.api.v1.UserService/CreateUser" - shareMethod = "/memos.api.v1.MemoService/GetMemoByShare" + shareMethod = "/memos.api.v1.MemoService/GetSharedMemo" ) cases := []struct { diff --git a/server/router/api/v1/connect_services.go b/server/router/api/v1/connect_services.go index 0c266fa9..4402ece2 100644 --- a/server/router/api/v1/connect_services.go +++ b/server/router/api/v1/connect_services.go @@ -439,8 +439,8 @@ func (s *ConnectServiceHandler) DeleteMemoShare(ctx context.Context, req *connec return connect.NewResponse(resp), nil } -func (s *ConnectServiceHandler) GetMemoByShare(ctx context.Context, req *connect.Request[v1pb.GetMemoByShareRequest]) (*connect.Response[v1pb.Memo], error) { - resp, err := s.APIV1Service.GetMemoByShare(ctx, req.Msg) +func (s *ConnectServiceHandler) GetSharedMemo(ctx context.Context, req *connect.Request[v1pb.GetSharedMemoRequest]) (*connect.Response[v1pb.Memo], error) { + resp, err := s.APIV1Service.GetSharedMemo(ctx, req.Msg) if err != nil { return nil, convertGRPCError(err) } diff --git a/server/router/api/v1/memo_share_service.go b/server/router/api/v1/memo_share_service.go index 3784c74e..d7b93b69 100644 --- a/server/router/api/v1/memo_share_service.go +++ b/server/router/api/v1/memo_share_service.go @@ -148,10 +148,10 @@ func (s *APIV1Service) DeleteMemoShare(ctx context.Context, request *v1pb.Delete return &emptypb.Empty{}, nil } -// GetMemoByShare resolves a share token to its memo. No authentication required. +// GetSharedMemo resolves a share token to its memo. No authentication required. // Returns NOT_FOUND for invalid or expired tokens (no information leakage). -func (s *APIV1Service) GetMemoByShare(ctx context.Context, request *v1pb.GetMemoByShareRequest) (*v1pb.Memo, error) { - ms, err := s.getActiveMemoShare(ctx, request.ShareId) +func (s *APIV1Service) GetSharedMemo(ctx context.Context, request *v1pb.GetSharedMemoRequest) (*v1pb.Memo, error) { + ms, err := s.getActiveMemoShare(ctx, request.ShareToken) if err != nil { return nil, err } diff --git a/server/router/api/v1/test/authz_test.go b/server/router/api/v1/test/authz_test.go index 4304a683..c5b8ecd1 100644 --- a/server/router/api/v1/test/authz_test.go +++ b/server/router/api/v1/test/authz_test.go @@ -26,10 +26,10 @@ func TestAuthorizerPrivateInstanceRegistration(t *testing.T) { authorizer := apiv1.NewAuthorizer(ts.Store, ts.Secret, &profile.Profile{InstanceURL: ""}) const ( - createUser = "/memos.api.v1.UserService/CreateUser" - signIn = "/memos.api.v1.AuthService/SignIn" - listMemos = "/memos.api.v1.MemoService/ListMemos" - getMemoShare = "/memos.api.v1.MemoService/GetMemoByShare" + createUser = "/memos.api.v1.UserService/CreateUser" + signIn = "/memos.api.v1.AuthService/SignIn" + listMemos = "/memos.api.v1.MemoService/ListMemos" + getSharedMemo = "/memos.api.v1.MemoService/GetSharedMemo" ) // Anonymous request with no Authorization header resolves to no identity. @@ -38,7 +38,7 @@ func TestAuthorizerPrivateInstanceRegistration(t *testing.T) { // Registration and other bootstrap methods are allowed; browsing is still gated. require.NoError(t, authorizer.CheckAccess(ctx, createUser, nil)) require.NoError(t, authorizer.CheckAccess(ctx, signIn, nil)) - require.NoError(t, authorizer.CheckAccess(ctx, getMemoShare, nil)) + require.NoError(t, authorizer.CheckAccess(ctx, getSharedMemo, nil)) require.ErrorIs(t, authorizer.CheckAccess(ctx, listMemos, nil), apiv1.ErrUnauthenticated) // Once a user exists, CreateUser remains reachable so UserService can enforce diff --git a/server/router/api/v1/test/memo_share_service_test.go b/server/router/api/v1/test/memo_share_service_test.go index 661a7699..5549be66 100644 --- a/server/router/api/v1/test/memo_share_service_test.go +++ b/server/router/api/v1/test/memo_share_service_test.go @@ -59,14 +59,14 @@ func TestDeleteMemoShare_VerifiesShareBelongsToMemo(t *testing.T) { require.Error(t, err) require.Equal(t, codes.NotFound, status.Code(err)) - sharedMemo, err := ts.Service.GetMemoByShare(ctx, &apiv1.GetMemoByShareRequest{ - ShareId: shareToken, + sharedMemo, err := ts.Service.GetSharedMemo(ctx, &apiv1.GetSharedMemoRequest{ + ShareToken: shareToken, }) require.NoError(t, err) require.Equal(t, memoTwo.Name, sharedMemo.Name) } -func TestGetMemoByShare_IncludesReactions(t *testing.T) { +func TestGetSharedMemo_IncludesReactions(t *testing.T) { ctx := context.Background() ts := NewTestService(t) @@ -101,8 +101,8 @@ func TestGetMemoByShare_IncludesReactions(t *testing.T) { require.NoError(t, err) shareToken := share.Name[strings.LastIndex(share.Name, "/")+1:] - sharedMemo, err := ts.Service.GetMemoByShare(ctx, &apiv1.GetMemoByShareRequest{ - ShareId: shareToken, + sharedMemo, err := ts.Service.GetSharedMemo(ctx, &apiv1.GetSharedMemoRequest{ + ShareToken: shareToken, }) require.NoError(t, err) require.Len(t, sharedMemo.Reactions, 1) @@ -110,7 +110,7 @@ func TestGetMemoByShare_IncludesReactions(t *testing.T) { require.Equal(t, memo.Name, sharedMemo.Reactions[0].ContentId) } -func TestGetMemoByShare_SkipsReactionsWithMissingCreators(t *testing.T) { +func TestGetSharedMemo_SkipsReactionsWithMissingCreators(t *testing.T) { ctx := context.Background() ts := NewTestService(t) @@ -151,27 +151,27 @@ func TestGetMemoByShare_SkipsReactionsWithMissingCreators(t *testing.T) { require.NoError(t, err) shareToken := share.Name[strings.LastIndex(share.Name, "/")+1:] - sharedMemo, err := ts.Service.GetMemoByShare(ctx, &apiv1.GetMemoByShareRequest{ - ShareId: shareToken, + sharedMemo, err := ts.Service.GetSharedMemo(ctx, &apiv1.GetSharedMemoRequest{ + ShareToken: shareToken, }) require.NoError(t, err) require.Empty(t, sharedMemo.Reactions) } -func TestGetMemoByShare_ReturnsNotFoundForUnknownShare(t *testing.T) { +func TestGetSharedMemo_ReturnsNotFoundForUnknownShare(t *testing.T) { ctx := context.Background() ts := NewTestService(t) defer ts.Cleanup() - _, err := ts.Service.GetMemoByShare(ctx, &apiv1.GetMemoByShareRequest{ - ShareId: "missing-share-token", + _, err := ts.Service.GetSharedMemo(ctx, &apiv1.GetSharedMemoRequest{ + ShareToken: "missing-share-token", }) require.Error(t, err) require.Equal(t, codes.NotFound, status.Code(err)) } -func TestGetMemoByShare_ReturnsNotFoundForExpiredShare(t *testing.T) { +func TestGetSharedMemo_ReturnsNotFoundForExpiredShare(t *testing.T) { ctx := context.Background() ts := NewTestService(t) @@ -198,14 +198,14 @@ func TestGetMemoByShare_ReturnsNotFoundForExpiredShare(t *testing.T) { }) require.NoError(t, err) - _, err = ts.Service.GetMemoByShare(ctx, &apiv1.GetMemoByShareRequest{ - ShareId: expiredShare.UID, + _, err = ts.Service.GetSharedMemo(ctx, &apiv1.GetSharedMemoRequest{ + ShareToken: expiredShare.UID, }) require.Error(t, err) require.Equal(t, codes.NotFound, status.Code(err)) } -func TestGetMemoByShare_ReturnsNotFoundForArchivedMemo(t *testing.T) { +func TestGetSharedMemo_ReturnsNotFoundForArchivedMemo(t *testing.T) { ctx := context.Background() ts := NewTestService(t) @@ -242,8 +242,8 @@ func TestGetMemoByShare_ReturnsNotFoundForArchivedMemo(t *testing.T) { require.NoError(t, err) shareToken := share.Name[strings.LastIndex(share.Name, "/")+1:] - _, err = ts.Service.GetMemoByShare(ctx, &apiv1.GetMemoByShareRequest{ - ShareId: shareToken, + _, err = ts.Service.GetSharedMemo(ctx, &apiv1.GetSharedMemoRequest{ + ShareToken: shareToken, }) require.Error(t, err) require.Equal(t, codes.NotFound, status.Code(err)) diff --git a/web/src/hooks/useMemoShareQueries.ts b/web/src/hooks/useMemoShareQueries.ts index 24d4229b..9d7f9241 100644 --- a/web/src/hooks/useMemoShareQueries.ts +++ b/web/src/hooks/useMemoShareQueries.ts @@ -7,7 +7,7 @@ import type { MemoShare } from "@/types/proto/api/v1/memo_service_pb"; import { CreateMemoShareRequestSchema, DeleteMemoShareRequestSchema, - GetMemoByShareRequestSchema, + GetSharedMemoRequestSchema, ListMemoSharesRequestSchema, MemoShareSchema, } from "@/types/proto/api/v1/memo_service_pb"; @@ -16,7 +16,7 @@ import { export const memoShareKeys = { all: ["memo-shares"] as const, list: (memoName: string) => [...memoShareKeys.all, "list", memoName] as const, - byShare: (shareId: string) => [...memoShareKeys.all, "by-share", shareId] as const, + byShare: (shareToken: string) => [...memoShareKeys.all, "by-share", shareToken] as const, }; /** Lists all active share links for a memo (creator-only). */ @@ -63,14 +63,14 @@ export function useDeleteMemoShare() { } /** Resolves a share token to its memo. Used by the public SharedMemo page. */ -export function useSharedMemo(shareId: string, options?: { enabled?: boolean }) { +export function useSharedMemo(shareToken: string, options?: { enabled?: boolean }) { return useQuery({ - queryKey: memoShareKeys.byShare(shareId), + queryKey: memoShareKeys.byShare(shareToken), queryFn: async () => { - const memo = await memoServiceClient.getMemoByShare(create(GetMemoByShareRequestSchema, { shareId })); + const memo = await memoServiceClient.getSharedMemo(create(GetSharedMemoRequestSchema, { shareToken })); return memo; }, - enabled: options?.enabled ?? !!shareId, + enabled: options?.enabled ?? !!shareToken, retry: false, // Don't retry NOT_FOUND — the link is invalid or expired }); } diff --git a/web/src/types/proto/api/v1/memo_service_pb.ts b/web/src/types/proto/api/v1/memo_service_pb.ts index 560aa120..71c7aa15 100644 --- a/web/src/types/proto/api/v1/memo_service_pb.ts +++ b/web/src/types/proto/api/v1/memo_service_pb.ts @@ -20,7 +20,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file api/v1/memo_service.proto. */ export const file_api_v1_memo_service: GenFile = /*@__PURE__*/ - fileDesc("ChlhcGkvdjEvbWVtb19zZXJ2aWNlLnByb3RvEgxtZW1vcy5hcGkudjEipwIKCFJlYWN0aW9uEhQKBG5hbWUYASABKAlCBuBBA+BBCBIqCgdjcmVhdG9yGAIgASgJQhngQQP6QRMKEW1lbW9zLmFwaS52MS9Vc2VyEi0KCmNvbnRlbnRfaWQYAyABKAlCGeBBAvpBEwoRbWVtb3MuYXBpLnYxL01lbW8SGgoNcmVhY3Rpb25fdHlwZRgEIAEoCUID4EECEjQKC2NyZWF0ZV90aW1lGAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDOljqQVUKFW1lbW9zLmFwaS52MS9SZWFjdGlvbhIhbWVtb3Mve21lbW99L3JlYWN0aW9ucy97cmVhY3Rpb259GgRuYW1lKglyZWFjdGlvbnMyCHJlYWN0aW9uIuoGCgRNZW1vEhEKBG5hbWUYASABKAlCA+BBCBInCgVzdGF0ZRgCIAEoDjITLm1lbW9zLmFwaS52MS5TdGF0ZUID4EECEioKB2NyZWF0b3IYAyABKAlCGeBBA/pBEwoRbWVtb3MuYXBpLnYxL1VzZXISNAoLY3JlYXRlX3RpbWUYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQESNAoLdXBkYXRlX3RpbWUYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQESFAoHY29udGVudBgHIAEoCUID4EECEjEKCnZpc2liaWxpdHkYCSABKA4yGC5tZW1vcy5hcGkudjEuVmlzaWJpbGl0eUID4EECEhEKBHRhZ3MYCiADKAlCA+BBAxITCgZwaW5uZWQYCyABKAhCA+BBARIyCgthdHRhY2htZW50cxgMIAMoCzIYLm1lbW9zLmFwaS52MS5BdHRhY2htZW50QgPgQQESMgoJcmVsYXRpb25zGA0gAygLMhoubWVtb3MuYXBpLnYxLk1lbW9SZWxhdGlvbkID4EEBEi4KCXJlYWN0aW9ucxgOIAMoCzIWLm1lbW9zLmFwaS52MS5SZWFjdGlvbkID4EEDEjIKCHByb3BlcnR5GA8gASgLMhsubWVtb3MuYXBpLnYxLk1lbW8uUHJvcGVydHlCA+BBAxIuCgZwYXJlbnQYECABKAlCGeBBA/pBEwoRbWVtb3MuYXBpLnYxL01lbW9IAIgBARIUCgdzbmlwcGV0GBEgASgJQgPgQQMSMgoIbG9jYXRpb24YEiABKAsyFi5tZW1vcy5hcGkudjEuTG9jYXRpb25CA+BBAUgBiAEBGnIKCFByb3BlcnR5EhAKCGhhc19saW5rGAEgASgIEhUKDWhhc190YXNrX2xpc3QYAiABKAgSEAoIaGFzX2NvZGUYAyABKAgSHAoUaGFzX2luY29tcGxldGVfdGFza3MYBCABKAgSDQoFdGl0bGUYBSABKAk6N+pBNAoRbWVtb3MuYXBpLnYxL01lbW8SDG1lbW9zL3ttZW1vfRoEbmFtZSoFbWVtb3MyBG1lbW9CCQoHX3BhcmVudEILCglfbG9jYXRpb25KBAgGEAdSDGRpc3BsYXlfdGltZSJTCghMb2NhdGlvbhIYCgtwbGFjZWhvbGRlchgBIAEoCUID4EEBEhUKCGxhdGl0dWRlGAIgASgBQgPgQQESFgoJbG9uZ2l0dWRlGAMgASgBQgPgQQEiUAoRQ3JlYXRlTWVtb1JlcXVlc3QSJQoEbWVtbxgBIAEoCzISLm1lbW9zLmFwaS52MS5NZW1vQgPgQQISFAoHbWVtb19pZBgCIAEoCUID4EEBIrMBChBMaXN0TWVtb3NSZXF1ZXN0EhYKCXBhZ2Vfc2l6ZRgBIAEoBUID4EEBEhcKCnBhZ2VfdG9rZW4YAiABKAlCA+BBARInCgVzdGF0ZRgDIAEoDjITLm1lbW9zLmFwaS52MS5TdGF0ZUID4EEBEhUKCG9yZGVyX2J5GAQgASgJQgPgQQESEwoGZmlsdGVyGAUgASgJQgPgQQESGQoMc2hvd19kZWxldGVkGAYgASgIQgPgQQEiTwoRTGlzdE1lbW9zUmVzcG9uc2USIQoFbWVtb3MYASADKAsyEi5tZW1vcy5hcGkudjEuTWVtbxIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkiOQoOR2V0TWVtb1JlcXVlc3QSJwoEbmFtZRgBIAEoCUIZ4EEC+kETChFtZW1vcy5hcGkudjEvTWVtbyJwChFVcGRhdGVNZW1vUmVxdWVzdBIlCgRtZW1vGAEgASgLMhIubWVtb3MuYXBpLnYxLk1lbW9CA+BBAhI0Cgt1cGRhdGVfbWFzaxgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2tCA+BBAiJQChFEZWxldGVNZW1vUmVxdWVzdBInCgRuYW1lGAEgASgJQhngQQL6QRMKEW1lbW9zLmFwaS52MS9NZW1vEhIKBWZvcmNlGAIgASgIQgPgQQEieAoZU2V0TWVtb0F0dGFjaG1lbnRzUmVxdWVzdBInCgRuYW1lGAEgASgJQhngQQL6QRMKEW1lbW9zLmFwaS52MS9NZW1vEjIKC2F0dGFjaG1lbnRzGAIgAygLMhgubWVtb3MuYXBpLnYxLkF0dGFjaG1lbnRCA+BBAiJ2ChpMaXN0TWVtb0F0dGFjaG1lbnRzUmVxdWVzdBInCgRuYW1lGAEgASgJQhngQQL6QRMKEW1lbW9zLmFwaS52MS9NZW1vEhYKCXBhZ2Vfc2l6ZRgCIAEoBUID4EEBEhcKCnBhZ2VfdG9rZW4YAyABKAlCA+BBASJlChtMaXN0TWVtb0F0dGFjaG1lbnRzUmVzcG9uc2USLQoLYXR0YWNobWVudHMYASADKAsyGC5tZW1vcy5hcGkudjEuQXR0YWNobWVudBIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkiswIKDE1lbW9SZWxhdGlvbhIyCgRtZW1vGAEgASgLMh8ubWVtb3MuYXBpLnYxLk1lbW9SZWxhdGlvbi5NZW1vQgPgQQISOgoMcmVsYXRlZF9tZW1vGAIgASgLMh8ubWVtb3MuYXBpLnYxLk1lbW9SZWxhdGlvbi5NZW1vQgPgQQISMgoEdHlwZRgDIAEoDjIfLm1lbW9zLmFwaS52MS5NZW1vUmVsYXRpb24uVHlwZUID4EECGkUKBE1lbW8SJwoEbmFtZRgBIAEoCUIZ4EEC+kETChFtZW1vcy5hcGkudjEvTWVtbxIUCgdzbmlwcGV0GAIgASgJQgPgQQMiOAoEVHlwZRIUChBUWVBFX1VOU1BFQ0lGSUVEEAASDQoJUkVGRVJFTkNFEAESCwoHQ09NTUVOVBACInYKF1NldE1lbW9SZWxhdGlvbnNSZXF1ZXN0EicKBG5hbWUYASABKAlCGeBBAvpBEwoRbWVtb3MuYXBpLnYxL01lbW8SMgoJcmVsYXRpb25zGAIgAygLMhoubWVtb3MuYXBpLnYxLk1lbW9SZWxhdGlvbkID4EECInQKGExpc3RNZW1vUmVsYXRpb25zUmVxdWVzdBInCgRuYW1lGAEgASgJQhngQQL6QRMKEW1lbW9zLmFwaS52MS9NZW1vEhYKCXBhZ2Vfc2l6ZRgCIAEoBUID4EEBEhcKCnBhZ2VfdG9rZW4YAyABKAlCA+BBASJjChlMaXN0TWVtb1JlbGF0aW9uc1Jlc3BvbnNlEi0KCXJlbGF0aW9ucxgBIAMoCzIaLm1lbW9zLmFwaS52MS5NZW1vUmVsYXRpb24SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJIoYBChhDcmVhdGVNZW1vQ29tbWVudFJlcXVlc3QSJwoEbmFtZRgBIAEoCUIZ4EEC+kETChFtZW1vcy5hcGkudjEvTWVtbxIoCgdjb21tZW50GAIgASgLMhIubWVtb3MuYXBpLnYxLk1lbW9CA+BBAhIXCgpjb21tZW50X2lkGAMgASgJQgPgQQEiigEKF0xpc3RNZW1vQ29tbWVudHNSZXF1ZXN0EicKBG5hbWUYASABKAlCGeBBAvpBEwoRbWVtb3MuYXBpLnYxL01lbW8SFgoJcGFnZV9zaXplGAIgASgFQgPgQQESFwoKcGFnZV90b2tlbhgDIAEoCUID4EEBEhUKCG9yZGVyX2J5GAQgASgJQgPgQQEiVgoYTGlzdE1lbW9Db21tZW50c1Jlc3BvbnNlEiEKBW1lbW9zGAEgAygLMhIubWVtb3MuYXBpLnYxLk1lbW8SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJInQKGExpc3RNZW1vUmVhY3Rpb25zUmVxdWVzdBInCgRuYW1lGAEgASgJQhngQQL6QRMKEW1lbW9zLmFwaS52MS9NZW1vEhYKCXBhZ2Vfc2l6ZRgCIAEoBUID4EEBEhcKCnBhZ2VfdG9rZW4YAyABKAlCA+BBASJfChlMaXN0TWVtb1JlYWN0aW9uc1Jlc3BvbnNlEikKCXJlYWN0aW9ucxgBIAMoCzIWLm1lbW9zLmFwaS52MS5SZWFjdGlvbhIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkicwoZVXBzZXJ0TWVtb1JlYWN0aW9uUmVxdWVzdBInCgRuYW1lGAEgASgJQhngQQL6QRMKEW1lbW9zLmFwaS52MS9NZW1vEi0KCHJlYWN0aW9uGAIgASgLMhYubWVtb3MuYXBpLnYxLlJlYWN0aW9uQgPgQQIiSAoZRGVsZXRlTWVtb1JlYWN0aW9uUmVxdWVzdBIrCgRuYW1lGAEgASgJQh3gQQL6QRcKFW1lbW9zLmFwaS52MS9SZWFjdGlvbiLoAQoJTWVtb1NoYXJlEhEKBG5hbWUYASABKAlCA+BBCBI0CgtjcmVhdGVfdGltZRgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxI5CgtleHBpcmVfdGltZRgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAUgAiAEBOkfqQUQKFm1lbW9zLmFwaS52MS9NZW1vU2hhcmUSG21lbW9zL3ttZW1vfS9zaGFyZXMve3NoYXJlfSoGc2hhcmVzMgVzaGFyZUIOCgxfZXhwaXJlX3RpbWUidQoWQ3JlYXRlTWVtb1NoYXJlUmVxdWVzdBIpCgZwYXJlbnQYASABKAlCGeBBAvpBEwoRbWVtb3MuYXBpLnYxL01lbW8SMAoKbWVtb19zaGFyZRgCIAEoCzIXLm1lbW9zLmFwaS52MS5NZW1vU2hhcmVCA+BBAiJCChVMaXN0TWVtb1NoYXJlc1JlcXVlc3QSKQoGcGFyZW50GAEgASgJQhngQQL6QRMKEW1lbW9zLmFwaS52MS9NZW1vIkYKFkxpc3RNZW1vU2hhcmVzUmVzcG9uc2USLAoLbWVtb19zaGFyZXMYASADKAsyFy5tZW1vcy5hcGkudjEuTWVtb1NoYXJlIkYKFkRlbGV0ZU1lbW9TaGFyZVJlcXVlc3QSLAoEbmFtZRgBIAEoCUIe4EEC+kEYChZtZW1vcy5hcGkudjEvTWVtb1NoYXJlIi4KFUdldE1lbW9CeVNoYXJlUmVxdWVzdBIVCghzaGFyZV9pZBgBIAEoCUID4EECIioKFkdldExpbmtNZXRhZGF0YVJlcXVlc3QSEAoDdXJsGAEgASgJQgPgQQIiMAobQmF0Y2hHZXRMaW5rTWV0YWRhdGFSZXF1ZXN0EhEKBHVybHMYASADKAlCA+BBAiJRChxCYXRjaEdldExpbmtNZXRhZGF0YVJlc3BvbnNlEjEKDWxpbmtfbWV0YWRhdGEYASADKAsyGi5tZW1vcy5hcGkudjEuTGlua01ldGFkYXRhIk4KDExpbmtNZXRhZGF0YRILCgN1cmwYASABKAkSDQoFdGl0bGUYAiABKAkSEwoLZGVzY3JpcHRpb24YAyABKAkSDQoFaW1hZ2UYBCABKAkqUAoKVmlzaWJpbGl0eRIaChZWSVNJQklMSVRZX1VOU1BFQ0lGSUVEEAASCwoHUFJJVkFURRABEg0KCVBST1RFQ1RFRBACEgoKBlBVQkxJQxADMosVCgtNZW1vU2VydmljZRJlCgpDcmVhdGVNZW1vEh8ubWVtb3MuYXBpLnYxLkNyZWF0ZU1lbW9SZXF1ZXN0GhIubWVtb3MuYXBpLnYxLk1lbW8iItpBBG1lbW+C0+STAhU6BG1lbW8iDS9hcGkvdjEvbWVtb3MSZgoJTGlzdE1lbW9zEh4ubWVtb3MuYXBpLnYxLkxpc3RNZW1vc1JlcXVlc3QaHy5tZW1vcy5hcGkudjEuTGlzdE1lbW9zUmVzcG9uc2UiGNpBAILT5JMCDxINL2FwaS92MS9tZW1vcxJiCgdHZXRNZW1vEhwubWVtb3MuYXBpLnYxLkdldE1lbW9SZXF1ZXN0GhIubWVtb3MuYXBpLnYxLk1lbW8iJdpBBG5hbWWC0+STAhgSFi9hcGkvdjEve25hbWU9bWVtb3MvKn0SfwoKVXBkYXRlTWVtbxIfLm1lbW9zLmFwaS52MS5VcGRhdGVNZW1vUmVxdWVzdBoSLm1lbW9zLmFwaS52MS5NZW1vIjzaQRBtZW1vLHVwZGF0ZV9tYXNrgtPkkwIjOgRtZW1vMhsvYXBpL3YxL3ttZW1vLm5hbWU9bWVtb3MvKn0SbAoKRGVsZXRlTWVtbxIfLm1lbW9zLmFwaS52MS5EZWxldGVNZW1vUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSIl2kEEbmFtZYLT5JMCGCoWL2FwaS92MS97bmFtZT1tZW1vcy8qfRKLAQoSU2V0TWVtb0F0dGFjaG1lbnRzEicubWVtb3MuYXBpLnYxLlNldE1lbW9BdHRhY2htZW50c1JlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiNNpBBG5hbWWC0+STAic6ASoyIi9hcGkvdjEve25hbWU9bWVtb3MvKn0vYXR0YWNobWVudHMSnQEKE0xpc3RNZW1vQXR0YWNobWVudHMSKC5tZW1vcy5hcGkudjEuTGlzdE1lbW9BdHRhY2htZW50c1JlcXVlc3QaKS5tZW1vcy5hcGkudjEuTGlzdE1lbW9BdHRhY2htZW50c1Jlc3BvbnNlIjHaQQRuYW1lgtPkkwIkEiIvYXBpL3YxL3tuYW1lPW1lbW9zLyp9L2F0dGFjaG1lbnRzEoUBChBTZXRNZW1vUmVsYXRpb25zEiUubWVtb3MuYXBpLnYxLlNldE1lbW9SZWxhdGlvbnNSZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IjLaQQRuYW1lgtPkkwIlOgEqMiAvYXBpL3YxL3tuYW1lPW1lbW9zLyp9L3JlbGF0aW9ucxKVAQoRTGlzdE1lbW9SZWxhdGlvbnMSJi5tZW1vcy5hcGkudjEuTGlzdE1lbW9SZWxhdGlvbnNSZXF1ZXN0GicubWVtb3MuYXBpLnYxLkxpc3RNZW1vUmVsYXRpb25zUmVzcG9uc2UiL9pBBG5hbWWC0+STAiISIC9hcGkvdjEve25hbWU9bWVtb3MvKn0vcmVsYXRpb25zEpABChFDcmVhdGVNZW1vQ29tbWVudBImLm1lbW9zLmFwaS52MS5DcmVhdGVNZW1vQ29tbWVudFJlcXVlc3QaEi5tZW1vcy5hcGkudjEuTWVtbyI/2kEMbmFtZSxjb21tZW50gtPkkwIqOgdjb21tZW50Ih8vYXBpL3YxL3tuYW1lPW1lbW9zLyp9L2NvbW1lbnRzEpEBChBMaXN0TWVtb0NvbW1lbnRzEiUubWVtb3MuYXBpLnYxLkxpc3RNZW1vQ29tbWVudHNSZXF1ZXN0GiYubWVtb3MuYXBpLnYxLkxpc3RNZW1vQ29tbWVudHNSZXNwb25zZSIu2kEEbmFtZYLT5JMCIRIfL2FwaS92MS97bmFtZT1tZW1vcy8qfS9jb21tZW50cxKVAQoRTGlzdE1lbW9SZWFjdGlvbnMSJi5tZW1vcy5hcGkudjEuTGlzdE1lbW9SZWFjdGlvbnNSZXF1ZXN0GicubWVtb3MuYXBpLnYxLkxpc3RNZW1vUmVhY3Rpb25zUmVzcG9uc2UiL9pBBG5hbWWC0+STAiISIC9hcGkvdjEve25hbWU9bWVtb3MvKn0vcmVhY3Rpb25zEokBChJVcHNlcnRNZW1vUmVhY3Rpb24SJy5tZW1vcy5hcGkudjEuVXBzZXJ0TWVtb1JlYWN0aW9uUmVxdWVzdBoWLm1lbW9zLmFwaS52MS5SZWFjdGlvbiIy2kEEbmFtZYLT5JMCJToBKiIgL2FwaS92MS97bmFtZT1tZW1vcy8qfS9yZWFjdGlvbnMSiAEKEkRlbGV0ZU1lbW9SZWFjdGlvbhInLm1lbW9zLmFwaS52MS5EZWxldGVNZW1vUmVhY3Rpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IjHaQQRuYW1lgtPkkwIkKiIvYXBpL3YxL3tuYW1lPW1lbW9zLyovcmVhY3Rpb25zLyp9EpkBCg9DcmVhdGVNZW1vU2hhcmUSJC5tZW1vcy5hcGkudjEuQ3JlYXRlTWVtb1NoYXJlUmVxdWVzdBoXLm1lbW9zLmFwaS52MS5NZW1vU2hhcmUiR9pBEXBhcmVudCxtZW1vX3NoYXJlgtPkkwItOgptZW1vX3NoYXJlIh8vYXBpL3YxL3twYXJlbnQ9bWVtb3MvKn0vc2hhcmVzEo0BCg5MaXN0TWVtb1NoYXJlcxIjLm1lbW9zLmFwaS52MS5MaXN0TWVtb1NoYXJlc1JlcXVlc3QaJC5tZW1vcy5hcGkudjEuTGlzdE1lbW9TaGFyZXNSZXNwb25zZSIw2kEGcGFyZW50gtPkkwIhEh8vYXBpL3YxL3twYXJlbnQ9bWVtb3MvKn0vc2hhcmVzEn8KD0RlbGV0ZU1lbW9TaGFyZRIkLm1lbW9zLmFwaS52MS5EZWxldGVNZW1vU2hhcmVSZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5Ii7aQQRuYW1lgtPkkwIhKh8vYXBpL3YxL3tuYW1lPW1lbW9zLyovc2hhcmVzLyp9EmwKDkdldE1lbW9CeVNoYXJlEiMubWVtb3MuYXBpLnYxLkdldE1lbW9CeVNoYXJlUmVxdWVzdBoSLm1lbW9zLmFwaS52MS5NZW1vIiGC0+STAhsSGS9hcGkvdjEvc2hhcmVzL3tzaGFyZV9pZH0SeQoPR2V0TGlua01ldGFkYXRhEiQubWVtb3MuYXBpLnYxLkdldExpbmtNZXRhZGF0YVJlcXVlc3QaGi5tZW1vcy5hcGkudjEuTGlua01ldGFkYXRhIiSC0+STAh4SHC9hcGkvdjEvbWVtb3MvLS9saW5rTWV0YWRhdGESnwEKFEJhdGNoR2V0TGlua01ldGFkYXRhEikubWVtb3MuYXBpLnYxLkJhdGNoR2V0TGlua01ldGFkYXRhUmVxdWVzdBoqLm1lbW9zLmFwaS52MS5CYXRjaEdldExpbmtNZXRhZGF0YVJlc3BvbnNlIjCC0+STAio6ASoiJS9hcGkvdjEvbWVtb3MvLS9saW5rTWV0YWRhdGE6YmF0Y2hHZXRCqAEKEGNvbS5tZW1vcy5hcGkudjFCEE1lbW9TZXJ2aWNlUHJvdG9QAVowZ2l0aHViLmNvbS91c2VtZW1vcy9tZW1vcy9wcm90by9nZW4vYXBpL3YxO2FwaXYxogIDTUFYqgIMTWVtb3MuQXBpLlYxygIMTWVtb3NcQXBpXFYx4gIYTWVtb3NcQXBpXFYxXEdQQk1ldGFkYXRh6gIOTWVtb3M6OkFwaTo6VjFiBnByb3RvMw", [file_api_v1_attachment_service, file_api_v1_common, file_google_api_annotations, file_google_api_client, file_google_api_field_behavior, file_google_api_resource, file_google_protobuf_empty, file_google_protobuf_field_mask, file_google_protobuf_timestamp]); + fileDesc("ChlhcGkvdjEvbWVtb19zZXJ2aWNlLnByb3RvEgxtZW1vcy5hcGkudjEipwIKCFJlYWN0aW9uEhQKBG5hbWUYASABKAlCBuBBA+BBCBIqCgdjcmVhdG9yGAIgASgJQhngQQP6QRMKEW1lbW9zLmFwaS52MS9Vc2VyEi0KCmNvbnRlbnRfaWQYAyABKAlCGeBBAvpBEwoRbWVtb3MuYXBpLnYxL01lbW8SGgoNcmVhY3Rpb25fdHlwZRgEIAEoCUID4EECEjQKC2NyZWF0ZV90aW1lGAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDOljqQVUKFW1lbW9zLmFwaS52MS9SZWFjdGlvbhIhbWVtb3Mve21lbW99L3JlYWN0aW9ucy97cmVhY3Rpb259GgRuYW1lKglyZWFjdGlvbnMyCHJlYWN0aW9uIuoGCgRNZW1vEhEKBG5hbWUYASABKAlCA+BBCBInCgVzdGF0ZRgCIAEoDjITLm1lbW9zLmFwaS52MS5TdGF0ZUID4EECEioKB2NyZWF0b3IYAyABKAlCGeBBA/pBEwoRbWVtb3MuYXBpLnYxL1VzZXISNAoLY3JlYXRlX3RpbWUYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQESNAoLdXBkYXRlX3RpbWUYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQESFAoHY29udGVudBgHIAEoCUID4EECEjEKCnZpc2liaWxpdHkYCSABKA4yGC5tZW1vcy5hcGkudjEuVmlzaWJpbGl0eUID4EECEhEKBHRhZ3MYCiADKAlCA+BBAxITCgZwaW5uZWQYCyABKAhCA+BBARIyCgthdHRhY2htZW50cxgMIAMoCzIYLm1lbW9zLmFwaS52MS5BdHRhY2htZW50QgPgQQESMgoJcmVsYXRpb25zGA0gAygLMhoubWVtb3MuYXBpLnYxLk1lbW9SZWxhdGlvbkID4EEBEi4KCXJlYWN0aW9ucxgOIAMoCzIWLm1lbW9zLmFwaS52MS5SZWFjdGlvbkID4EEDEjIKCHByb3BlcnR5GA8gASgLMhsubWVtb3MuYXBpLnYxLk1lbW8uUHJvcGVydHlCA+BBAxIuCgZwYXJlbnQYECABKAlCGeBBA/pBEwoRbWVtb3MuYXBpLnYxL01lbW9IAIgBARIUCgdzbmlwcGV0GBEgASgJQgPgQQMSMgoIbG9jYXRpb24YEiABKAsyFi5tZW1vcy5hcGkudjEuTG9jYXRpb25CA+BBAUgBiAEBGnIKCFByb3BlcnR5EhAKCGhhc19saW5rGAEgASgIEhUKDWhhc190YXNrX2xpc3QYAiABKAgSEAoIaGFzX2NvZGUYAyABKAgSHAoUaGFzX2luY29tcGxldGVfdGFza3MYBCABKAgSDQoFdGl0bGUYBSABKAk6N+pBNAoRbWVtb3MuYXBpLnYxL01lbW8SDG1lbW9zL3ttZW1vfRoEbmFtZSoFbWVtb3MyBG1lbW9CCQoHX3BhcmVudEILCglfbG9jYXRpb25KBAgGEAdSDGRpc3BsYXlfdGltZSJTCghMb2NhdGlvbhIYCgtwbGFjZWhvbGRlchgBIAEoCUID4EEBEhUKCGxhdGl0dWRlGAIgASgBQgPgQQESFgoJbG9uZ2l0dWRlGAMgASgBQgPgQQEiUAoRQ3JlYXRlTWVtb1JlcXVlc3QSJQoEbWVtbxgBIAEoCzISLm1lbW9zLmFwaS52MS5NZW1vQgPgQQISFAoHbWVtb19pZBgCIAEoCUID4EEBIrMBChBMaXN0TWVtb3NSZXF1ZXN0EhYKCXBhZ2Vfc2l6ZRgBIAEoBUID4EEBEhcKCnBhZ2VfdG9rZW4YAiABKAlCA+BBARInCgVzdGF0ZRgDIAEoDjITLm1lbW9zLmFwaS52MS5TdGF0ZUID4EEBEhUKCG9yZGVyX2J5GAQgASgJQgPgQQESEwoGZmlsdGVyGAUgASgJQgPgQQESGQoMc2hvd19kZWxldGVkGAYgASgIQgPgQQEiTwoRTGlzdE1lbW9zUmVzcG9uc2USIQoFbWVtb3MYASADKAsyEi5tZW1vcy5hcGkudjEuTWVtbxIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkiOQoOR2V0TWVtb1JlcXVlc3QSJwoEbmFtZRgBIAEoCUIZ4EEC+kETChFtZW1vcy5hcGkudjEvTWVtbyJwChFVcGRhdGVNZW1vUmVxdWVzdBIlCgRtZW1vGAEgASgLMhIubWVtb3MuYXBpLnYxLk1lbW9CA+BBAhI0Cgt1cGRhdGVfbWFzaxgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2tCA+BBAiJQChFEZWxldGVNZW1vUmVxdWVzdBInCgRuYW1lGAEgASgJQhngQQL6QRMKEW1lbW9zLmFwaS52MS9NZW1vEhIKBWZvcmNlGAIgASgIQgPgQQEieAoZU2V0TWVtb0F0dGFjaG1lbnRzUmVxdWVzdBInCgRuYW1lGAEgASgJQhngQQL6QRMKEW1lbW9zLmFwaS52MS9NZW1vEjIKC2F0dGFjaG1lbnRzGAIgAygLMhgubWVtb3MuYXBpLnYxLkF0dGFjaG1lbnRCA+BBAiJ2ChpMaXN0TWVtb0F0dGFjaG1lbnRzUmVxdWVzdBInCgRuYW1lGAEgASgJQhngQQL6QRMKEW1lbW9zLmFwaS52MS9NZW1vEhYKCXBhZ2Vfc2l6ZRgCIAEoBUID4EEBEhcKCnBhZ2VfdG9rZW4YAyABKAlCA+BBASJlChtMaXN0TWVtb0F0dGFjaG1lbnRzUmVzcG9uc2USLQoLYXR0YWNobWVudHMYASADKAsyGC5tZW1vcy5hcGkudjEuQXR0YWNobWVudBIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkiswIKDE1lbW9SZWxhdGlvbhIyCgRtZW1vGAEgASgLMh8ubWVtb3MuYXBpLnYxLk1lbW9SZWxhdGlvbi5NZW1vQgPgQQISOgoMcmVsYXRlZF9tZW1vGAIgASgLMh8ubWVtb3MuYXBpLnYxLk1lbW9SZWxhdGlvbi5NZW1vQgPgQQISMgoEdHlwZRgDIAEoDjIfLm1lbW9zLmFwaS52MS5NZW1vUmVsYXRpb24uVHlwZUID4EECGkUKBE1lbW8SJwoEbmFtZRgBIAEoCUIZ4EEC+kETChFtZW1vcy5hcGkudjEvTWVtbxIUCgdzbmlwcGV0GAIgASgJQgPgQQMiOAoEVHlwZRIUChBUWVBFX1VOU1BFQ0lGSUVEEAASDQoJUkVGRVJFTkNFEAESCwoHQ09NTUVOVBACInYKF1NldE1lbW9SZWxhdGlvbnNSZXF1ZXN0EicKBG5hbWUYASABKAlCGeBBAvpBEwoRbWVtb3MuYXBpLnYxL01lbW8SMgoJcmVsYXRpb25zGAIgAygLMhoubWVtb3MuYXBpLnYxLk1lbW9SZWxhdGlvbkID4EECInQKGExpc3RNZW1vUmVsYXRpb25zUmVxdWVzdBInCgRuYW1lGAEgASgJQhngQQL6QRMKEW1lbW9zLmFwaS52MS9NZW1vEhYKCXBhZ2Vfc2l6ZRgCIAEoBUID4EEBEhcKCnBhZ2VfdG9rZW4YAyABKAlCA+BBASJjChlMaXN0TWVtb1JlbGF0aW9uc1Jlc3BvbnNlEi0KCXJlbGF0aW9ucxgBIAMoCzIaLm1lbW9zLmFwaS52MS5NZW1vUmVsYXRpb24SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJIoYBChhDcmVhdGVNZW1vQ29tbWVudFJlcXVlc3QSJwoEbmFtZRgBIAEoCUIZ4EEC+kETChFtZW1vcy5hcGkudjEvTWVtbxIoCgdjb21tZW50GAIgASgLMhIubWVtb3MuYXBpLnYxLk1lbW9CA+BBAhIXCgpjb21tZW50X2lkGAMgASgJQgPgQQEiigEKF0xpc3RNZW1vQ29tbWVudHNSZXF1ZXN0EicKBG5hbWUYASABKAlCGeBBAvpBEwoRbWVtb3MuYXBpLnYxL01lbW8SFgoJcGFnZV9zaXplGAIgASgFQgPgQQESFwoKcGFnZV90b2tlbhgDIAEoCUID4EEBEhUKCG9yZGVyX2J5GAQgASgJQgPgQQEiVgoYTGlzdE1lbW9Db21tZW50c1Jlc3BvbnNlEiEKBW1lbW9zGAEgAygLMhIubWVtb3MuYXBpLnYxLk1lbW8SFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJInQKGExpc3RNZW1vUmVhY3Rpb25zUmVxdWVzdBInCgRuYW1lGAEgASgJQhngQQL6QRMKEW1lbW9zLmFwaS52MS9NZW1vEhYKCXBhZ2Vfc2l6ZRgCIAEoBUID4EEBEhcKCnBhZ2VfdG9rZW4YAyABKAlCA+BBASJfChlMaXN0TWVtb1JlYWN0aW9uc1Jlc3BvbnNlEikKCXJlYWN0aW9ucxgBIAMoCzIWLm1lbW9zLmFwaS52MS5SZWFjdGlvbhIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkicwoZVXBzZXJ0TWVtb1JlYWN0aW9uUmVxdWVzdBInCgRuYW1lGAEgASgJQhngQQL6QRMKEW1lbW9zLmFwaS52MS9NZW1vEi0KCHJlYWN0aW9uGAIgASgLMhYubWVtb3MuYXBpLnYxLlJlYWN0aW9uQgPgQQIiSAoZRGVsZXRlTWVtb1JlYWN0aW9uUmVxdWVzdBIrCgRuYW1lGAEgASgJQh3gQQL6QRcKFW1lbW9zLmFwaS52MS9SZWFjdGlvbiLoAQoJTWVtb1NoYXJlEhEKBG5hbWUYASABKAlCA+BBCBI0CgtjcmVhdGVfdGltZRgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAxI5CgtleHBpcmVfdGltZRgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAUgAiAEBOkfqQUQKFm1lbW9zLmFwaS52MS9NZW1vU2hhcmUSG21lbW9zL3ttZW1vfS9zaGFyZXMve3NoYXJlfSoGc2hhcmVzMgVzaGFyZUIOCgxfZXhwaXJlX3RpbWUidQoWQ3JlYXRlTWVtb1NoYXJlUmVxdWVzdBIpCgZwYXJlbnQYASABKAlCGeBBAvpBEwoRbWVtb3MuYXBpLnYxL01lbW8SMAoKbWVtb19zaGFyZRgCIAEoCzIXLm1lbW9zLmFwaS52MS5NZW1vU2hhcmVCA+BBAiJCChVMaXN0TWVtb1NoYXJlc1JlcXVlc3QSKQoGcGFyZW50GAEgASgJQhngQQL6QRMKEW1lbW9zLmFwaS52MS9NZW1vIkYKFkxpc3RNZW1vU2hhcmVzUmVzcG9uc2USLAoLbWVtb19zaGFyZXMYASADKAsyFy5tZW1vcy5hcGkudjEuTWVtb1NoYXJlIkYKFkRlbGV0ZU1lbW9TaGFyZVJlcXVlc3QSLAoEbmFtZRgBIAEoCUIe4EEC+kEYChZtZW1vcy5hcGkudjEvTWVtb1NoYXJlIjAKFEdldFNoYXJlZE1lbW9SZXF1ZXN0EhgKC3NoYXJlX3Rva2VuGAEgASgJQgPgQQIiKgoWR2V0TGlua01ldGFkYXRhUmVxdWVzdBIQCgN1cmwYASABKAlCA+BBAiIwChtCYXRjaEdldExpbmtNZXRhZGF0YVJlcXVlc3QSEQoEdXJscxgBIAMoCUID4EECIlEKHEJhdGNoR2V0TGlua01ldGFkYXRhUmVzcG9uc2USMQoNbGlua19tZXRhZGF0YRgBIAMoCzIaLm1lbW9zLmFwaS52MS5MaW5rTWV0YWRhdGEiTgoMTGlua01ldGFkYXRhEgsKA3VybBgBIAEoCRINCgV0aXRsZRgCIAEoCRITCgtkZXNjcmlwdGlvbhgDIAEoCRINCgVpbWFnZRgEIAEoCSpQCgpWaXNpYmlsaXR5EhoKFlZJU0lCSUxJVFlfVU5TUEVDSUZJRUQQABILCgdQUklWQVRFEAESDQoJUFJPVEVDVEVEEAISCgoGUFVCTElDEAMykRUKC01lbW9TZXJ2aWNlEmUKCkNyZWF0ZU1lbW8SHy5tZW1vcy5hcGkudjEuQ3JlYXRlTWVtb1JlcXVlc3QaEi5tZW1vcy5hcGkudjEuTWVtbyIi2kEEbWVtb4LT5JMCFToEbWVtbyINL2FwaS92MS9tZW1vcxJmCglMaXN0TWVtb3MSHi5tZW1vcy5hcGkudjEuTGlzdE1lbW9zUmVxdWVzdBofLm1lbW9zLmFwaS52MS5MaXN0TWVtb3NSZXNwb25zZSIY2kEAgtPkkwIPEg0vYXBpL3YxL21lbW9zEmIKB0dldE1lbW8SHC5tZW1vcy5hcGkudjEuR2V0TWVtb1JlcXVlc3QaEi5tZW1vcy5hcGkudjEuTWVtbyIl2kEEbmFtZYLT5JMCGBIWL2FwaS92MS97bmFtZT1tZW1vcy8qfRJ/CgpVcGRhdGVNZW1vEh8ubWVtb3MuYXBpLnYxLlVwZGF0ZU1lbW9SZXF1ZXN0GhIubWVtb3MuYXBpLnYxLk1lbW8iPNpBEG1lbW8sdXBkYXRlX21hc2uC0+STAiM6BG1lbW8yGy9hcGkvdjEve21lbW8ubmFtZT1tZW1vcy8qfRJsCgpEZWxldGVNZW1vEh8ubWVtb3MuYXBpLnYxLkRlbGV0ZU1lbW9SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IiXaQQRuYW1lgtPkkwIYKhYvYXBpL3YxL3tuYW1lPW1lbW9zLyp9EosBChJTZXRNZW1vQXR0YWNobWVudHMSJy5tZW1vcy5hcGkudjEuU2V0TWVtb0F0dGFjaG1lbnRzUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSI02kEEbmFtZYLT5JMCJzoBKjIiL2FwaS92MS97bmFtZT1tZW1vcy8qfS9hdHRhY2htZW50cxKdAQoTTGlzdE1lbW9BdHRhY2htZW50cxIoLm1lbW9zLmFwaS52MS5MaXN0TWVtb0F0dGFjaG1lbnRzUmVxdWVzdBopLm1lbW9zLmFwaS52MS5MaXN0TWVtb0F0dGFjaG1lbnRzUmVzcG9uc2UiMdpBBG5hbWWC0+STAiQSIi9hcGkvdjEve25hbWU9bWVtb3MvKn0vYXR0YWNobWVudHMShQEKEFNldE1lbW9SZWxhdGlvbnMSJS5tZW1vcy5hcGkudjEuU2V0TWVtb1JlbGF0aW9uc1JlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiMtpBBG5hbWWC0+STAiU6ASoyIC9hcGkvdjEve25hbWU9bWVtb3MvKn0vcmVsYXRpb25zEpUBChFMaXN0TWVtb1JlbGF0aW9ucxImLm1lbW9zLmFwaS52MS5MaXN0TWVtb1JlbGF0aW9uc1JlcXVlc3QaJy5tZW1vcy5hcGkudjEuTGlzdE1lbW9SZWxhdGlvbnNSZXNwb25zZSIv2kEEbmFtZYLT5JMCIhIgL2FwaS92MS97bmFtZT1tZW1vcy8qfS9yZWxhdGlvbnMSkAEKEUNyZWF0ZU1lbW9Db21tZW50EiYubWVtb3MuYXBpLnYxLkNyZWF0ZU1lbW9Db21tZW50UmVxdWVzdBoSLm1lbW9zLmFwaS52MS5NZW1vIj/aQQxuYW1lLGNvbW1lbnSC0+STAio6B2NvbW1lbnQiHy9hcGkvdjEve25hbWU9bWVtb3MvKn0vY29tbWVudHMSkQEKEExpc3RNZW1vQ29tbWVudHMSJS5tZW1vcy5hcGkudjEuTGlzdE1lbW9Db21tZW50c1JlcXVlc3QaJi5tZW1vcy5hcGkudjEuTGlzdE1lbW9Db21tZW50c1Jlc3BvbnNlIi7aQQRuYW1lgtPkkwIhEh8vYXBpL3YxL3tuYW1lPW1lbW9zLyp9L2NvbW1lbnRzEpUBChFMaXN0TWVtb1JlYWN0aW9ucxImLm1lbW9zLmFwaS52MS5MaXN0TWVtb1JlYWN0aW9uc1JlcXVlc3QaJy5tZW1vcy5hcGkudjEuTGlzdE1lbW9SZWFjdGlvbnNSZXNwb25zZSIv2kEEbmFtZYLT5JMCIhIgL2FwaS92MS97bmFtZT1tZW1vcy8qfS9yZWFjdGlvbnMSiQEKElVwc2VydE1lbW9SZWFjdGlvbhInLm1lbW9zLmFwaS52MS5VcHNlcnRNZW1vUmVhY3Rpb25SZXF1ZXN0GhYubWVtb3MuYXBpLnYxLlJlYWN0aW9uIjLaQQRuYW1lgtPkkwIlOgEqIiAvYXBpL3YxL3tuYW1lPW1lbW9zLyp9L3JlYWN0aW9ucxKIAQoSRGVsZXRlTWVtb1JlYWN0aW9uEicubWVtb3MuYXBpLnYxLkRlbGV0ZU1lbW9SZWFjdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiMdpBBG5hbWWC0+STAiQqIi9hcGkvdjEve25hbWU9bWVtb3MvKi9yZWFjdGlvbnMvKn0SmQEKD0NyZWF0ZU1lbW9TaGFyZRIkLm1lbW9zLmFwaS52MS5DcmVhdGVNZW1vU2hhcmVSZXF1ZXN0GhcubWVtb3MuYXBpLnYxLk1lbW9TaGFyZSJH2kERcGFyZW50LG1lbW9fc2hhcmWC0+STAi06Cm1lbW9fc2hhcmUiHy9hcGkvdjEve3BhcmVudD1tZW1vcy8qfS9zaGFyZXMSjQEKDkxpc3RNZW1vU2hhcmVzEiMubWVtb3MuYXBpLnYxLkxpc3RNZW1vU2hhcmVzUmVxdWVzdBokLm1lbW9zLmFwaS52MS5MaXN0TWVtb1NoYXJlc1Jlc3BvbnNlIjDaQQZwYXJlbnSC0+STAiESHy9hcGkvdjEve3BhcmVudD1tZW1vcy8qfS9zaGFyZXMSfwoPRGVsZXRlTWVtb1NoYXJlEiQubWVtb3MuYXBpLnYxLkRlbGV0ZU1lbW9TaGFyZVJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiLtpBBG5hbWWC0+STAiEqHy9hcGkvdjEve25hbWU9bWVtb3MvKi9zaGFyZXMvKn0ScgoNR2V0U2hhcmVkTWVtbxIiLm1lbW9zLmFwaS52MS5HZXRTaGFyZWRNZW1vUmVxdWVzdBoSLm1lbW9zLmFwaS52MS5NZW1vIimC0+STAiMSIS9hcGkvdjEvc2hhcmVzL3tzaGFyZV90b2tlbn0vbWVtbxJ5Cg9HZXRMaW5rTWV0YWRhdGESJC5tZW1vcy5hcGkudjEuR2V0TGlua01ldGFkYXRhUmVxdWVzdBoaLm1lbW9zLmFwaS52MS5MaW5rTWV0YWRhdGEiJILT5JMCHhIcL2FwaS92MS9tZW1vcy8tL2xpbmtNZXRhZGF0YRKfAQoUQmF0Y2hHZXRMaW5rTWV0YWRhdGESKS5tZW1vcy5hcGkudjEuQmF0Y2hHZXRMaW5rTWV0YWRhdGFSZXF1ZXN0GioubWVtb3MuYXBpLnYxLkJhdGNoR2V0TGlua01ldGFkYXRhUmVzcG9uc2UiMILT5JMCKjoBKiIlL2FwaS92MS9tZW1vcy8tL2xpbmtNZXRhZGF0YTpiYXRjaEdldEKoAQoQY29tLm1lbW9zLmFwaS52MUIQTWVtb1NlcnZpY2VQcm90b1ABWjBnaXRodWIuY29tL3VzZW1lbW9zL21lbW9zL3Byb3RvL2dlbi9hcGkvdjE7YXBpdjGiAgNNQViqAgxNZW1vcy5BcGkuVjHKAgxNZW1vc1xBcGlcVjHiAhhNZW1vc1xBcGlcVjFcR1BCTWV0YWRhdGHqAg5NZW1vczo6QXBpOjpWMWIGcHJvdG8z", [file_api_v1_attachment_service, file_api_v1_common, file_google_api_annotations, file_google_api_client, file_google_api_field_behavior, file_google_api_resource, file_google_protobuf_empty, file_google_protobuf_field_mask, file_google_protobuf_timestamp]); /** * @generated from message memos.api.v1.Reaction @@ -1078,22 +1078,22 @@ export const DeleteMemoShareRequestSchema: GenMessage = messageDesc(file_api_v1_memo_service, 27); /** - * @generated from message memos.api.v1.GetMemoByShareRequest + * @generated from message memos.api.v1.GetSharedMemoRequest */ -export type GetMemoByShareRequest = Message<"memos.api.v1.GetMemoByShareRequest"> & { +export type GetSharedMemoRequest = Message<"memos.api.v1.GetSharedMemoRequest"> & { /** - * Required. The share token extracted from the share URL (/s/{share_id}). + * Required. The opaque bearer token extracted from the share URL. * - * @generated from field: string share_id = 1; + * @generated from field: string share_token = 1; */ - shareId: string; + shareToken: string; }; /** - * Describes the message memos.api.v1.GetMemoByShareRequest. - * Use `create(GetMemoByShareRequestSchema)` to create a new message. + * Describes the message memos.api.v1.GetSharedMemoRequest. + * Use `create(GetSharedMemoRequestSchema)` to create a new message. */ -export const GetMemoByShareRequestSchema: GenMessage = /*@__PURE__*/ +export const GetSharedMemoRequestSchema: GenMessage = /*@__PURE__*/ messageDesc(file_api_v1_memo_service, 28); /** @@ -1414,14 +1414,14 @@ export const MemoService: GenService<{ output: typeof EmptySchema; }, /** - * GetMemoByShare resolves a share token to its memo. No authentication required. + * GetSharedMemo resolves a share token to its memo. No authentication required. * Returns NOT_FOUND if the token is invalid or expired. * - * @generated from rpc memos.api.v1.MemoService.GetMemoByShare + * @generated from rpc memos.api.v1.MemoService.GetSharedMemo */ - getMemoByShare: { + getSharedMemo: { methodKind: "unary"; - input: typeof GetMemoByShareRequestSchema; + input: typeof GetSharedMemoRequestSchema; output: typeof MemoSchema; }, /**