Commit 922de077 authored by Steven's avatar Steven

feat: impl memo comment api

parent 7549c807
...@@ -26,6 +26,31 @@ func NewMemoService(store *store.Store) *MemoService { ...@@ -26,6 +26,31 @@ func NewMemoService(store *store.Store) *MemoService {
} }
} }
func (s *MemoService) CreateMemo(ctx context.Context, request *apiv2pb.CreateMemoRequest) (*apiv2pb.CreateMemoResponse, error) {
user, err := getCurrentUser(ctx, s.Store)
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to get user")
}
if user == nil {
return nil, status.Errorf(codes.PermissionDenied, "permission denied")
}
create := &store.Memo{
CreatorID: user.ID,
Content: request.Content,
Visibility: store.Visibility(request.Visibility),
}
memo, err := s.Store.CreateMemo(ctx, create)
if err != nil {
return nil, err
}
response := &apiv2pb.CreateMemoResponse{
Memo: convertMemoFromStore(memo),
}
return response, nil
}
func (s *MemoService) ListMemos(ctx context.Context, request *apiv2pb.ListMemosRequest) (*apiv2pb.ListMemosResponse, error) { func (s *MemoService) ListMemos(ctx context.Context, request *apiv2pb.ListMemosRequest) (*apiv2pb.ListMemosResponse, error) {
memoFind := &store.FindMemo{} memoFind := &store.FindMemo{}
if request.Filter != "" { if request.Filter != "" {
...@@ -99,6 +124,59 @@ func (s *MemoService) GetMemo(ctx context.Context, request *apiv2pb.GetMemoReque ...@@ -99,6 +124,59 @@ func (s *MemoService) GetMemo(ctx context.Context, request *apiv2pb.GetMemoReque
return response, nil return response, nil
} }
func (s *MemoService) CreateMemoComment(ctx context.Context, request *apiv2pb.CreateMemoCommentRequest) (*apiv2pb.CreateMemoCommentResponse, error) {
// Create the comment memo first.
createMemoResponse, err := s.CreateMemo(ctx, request.Create)
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to create memo")
}
// Build the relation between the comment memo and the original memo.
memo := createMemoResponse.Memo
_, err = s.Store.UpsertMemoRelation(ctx, &store.MemoRelation{
MemoID: memo.Id,
RelatedMemoID: request.Id,
Type: store.MemoRelationComment,
})
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to create memo relation")
}
response := &apiv2pb.CreateMemoCommentResponse{
Memo: memo,
}
return response, nil
}
func (s *MemoService) ListMemoComments(ctx context.Context, request *apiv2pb.ListMemoCommentsRequest) (*apiv2pb.ListMemoCommentsResponse, error) {
memoRelationComment := store.MemoRelationComment
memoRelations, err := s.Store.ListMemoRelations(ctx, &store.FindMemoRelation{
RelatedMemoID: &request.Id,
Type: &memoRelationComment,
})
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to list memo relations")
}
var memos []*apiv2pb.Memo
for _, memoRelation := range memoRelations {
memo, err := s.Store.GetMemo(ctx, &store.FindMemo{
ID: &memoRelation.MemoID,
})
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to get memo")
}
if memo != nil {
memos = append(memos, convertMemoFromStore(memo))
}
}
response := &apiv2pb.ListMemoCommentsResponse{
Memos: memos,
}
return response, nil
}
// ListMemosFilterCELAttributes are the CEL attributes for ListMemosFilter. // ListMemosFilterCELAttributes are the CEL attributes for ListMemosFilter.
var ListMemosFilterCELAttributes = []cel.EnvOption{ var ListMemosFilterCELAttributes = []cel.EnvOption{
cel.Variable("visibility", cel.StringType), cel.Variable("visibility", cel.StringType),
......
...@@ -9,6 +9,10 @@ import "google/api/client.proto"; ...@@ -9,6 +9,10 @@ import "google/api/client.proto";
option go_package = "gen/api/v2"; option go_package = "gen/api/v2";
service MemoService { service MemoService {
rpc CreateMemo(CreateMemoRequest) returns (CreateMemoResponse) {
option (google.api.http) = {post: "/api/v2/memos"};
}
rpc ListMemos(ListMemosRequest) returns (ListMemosResponse) { rpc ListMemos(ListMemosRequest) returns (ListMemosResponse) {
option (google.api.http) = {get: "/api/v2/memos"}; option (google.api.http) = {get: "/api/v2/memos"};
} }
...@@ -17,6 +21,26 @@ service MemoService { ...@@ -17,6 +21,26 @@ service MemoService {
option (google.api.http) = {get: "/api/v2/memos/{id}"}; option (google.api.http) = {get: "/api/v2/memos/{id}"};
option (google.api.method_signature) = "id"; option (google.api.method_signature) = "id";
} }
rpc CreateMemoComment(CreateMemoCommentRequest) returns (CreateMemoCommentResponse) {
option (google.api.http) = {post: "/api/v2/memos/{id}/comments"};
option (google.api.method_signature) = "id";
}
rpc ListMemoComments(ListMemoCommentsRequest) returns (ListMemoCommentsResponse) {
option (google.api.http) = {get: "/api/v2/memos/{id}/comments"};
option (google.api.method_signature) = "id";
}
}
enum Visibility {
VISIBILITY_UNSPECIFIED = 0;
PRIVATE = 1;
PROTECTED = 2;
PUBLIC = 3;
} }
message Memo { message Memo {
...@@ -37,6 +61,16 @@ message Memo { ...@@ -37,6 +61,16 @@ message Memo {
bool pinned = 8; bool pinned = 8;
} }
message CreateMemoRequest {
string content = 1;
Visibility visibility = 2;
}
message CreateMemoResponse {
Memo memo = 1;
}
message ListMemosRequest { message ListMemosRequest {
int32 page = 1; int32 page = 1;
...@@ -58,12 +92,21 @@ message GetMemoResponse { ...@@ -58,12 +92,21 @@ message GetMemoResponse {
Memo memo = 1; Memo memo = 1;
} }
enum Visibility { message CreateMemoCommentRequest {
VISIBILITY_UNSPECIFIED = 0; // id is the memo id to create comment for.
int32 id = 1;
PRIVATE = 1; CreateMemoRequest create = 2;
}
PROTECTED = 2; message CreateMemoCommentResponse {
Memo memo = 1;
}
PUBLIC = 3; message ListMemoCommentsRequest {
int32 id = 1;
}
message ListMemoCommentsResponse {
repeated Memo memos = 1;
} }
...@@ -7,8 +7,14 @@ ...@@ -7,8 +7,14 @@
- [RowStatus](#memos-api-v2-RowStatus) - [RowStatus](#memos-api-v2-RowStatus)
- [api/v2/memo_service.proto](#api_v2_memo_service-proto) - [api/v2/memo_service.proto](#api_v2_memo_service-proto)
- [CreateMemoCommentRequest](#memos-api-v2-CreateMemoCommentRequest)
- [CreateMemoCommentResponse](#memos-api-v2-CreateMemoCommentResponse)
- [CreateMemoRequest](#memos-api-v2-CreateMemoRequest)
- [CreateMemoResponse](#memos-api-v2-CreateMemoResponse)
- [GetMemoRequest](#memos-api-v2-GetMemoRequest) - [GetMemoRequest](#memos-api-v2-GetMemoRequest)
- [GetMemoResponse](#memos-api-v2-GetMemoResponse) - [GetMemoResponse](#memos-api-v2-GetMemoResponse)
- [ListMemoCommentsRequest](#memos-api-v2-ListMemoCommentsRequest)
- [ListMemoCommentsResponse](#memos-api-v2-ListMemoCommentsResponse)
- [ListMemosRequest](#memos-api-v2-ListMemosRequest) - [ListMemosRequest](#memos-api-v2-ListMemosRequest)
- [ListMemosResponse](#memos-api-v2-ListMemosResponse) - [ListMemosResponse](#memos-api-v2-ListMemosResponse)
- [Memo](#memos-api-v2-Memo) - [Memo](#memos-api-v2-Memo)
...@@ -100,6 +106,68 @@ ...@@ -100,6 +106,68 @@
<a name="memos-api-v2-CreateMemoCommentRequest"></a>
### CreateMemoCommentRequest
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| id | [int32](#int32) | | id is the memo id to create comment for. |
| create | [CreateMemoRequest](#memos-api-v2-CreateMemoRequest) | | |
<a name="memos-api-v2-CreateMemoCommentResponse"></a>
### CreateMemoCommentResponse
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| memo | [Memo](#memos-api-v2-Memo) | | |
<a name="memos-api-v2-CreateMemoRequest"></a>
### CreateMemoRequest
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| content | [string](#string) | | |
| visibility | [Visibility](#memos-api-v2-Visibility) | | |
<a name="memos-api-v2-CreateMemoResponse"></a>
### CreateMemoResponse
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| memo | [Memo](#memos-api-v2-Memo) | | |
<a name="memos-api-v2-GetMemoRequest"></a> <a name="memos-api-v2-GetMemoRequest"></a>
### GetMemoRequest ### GetMemoRequest
...@@ -130,6 +198,36 @@ ...@@ -130,6 +198,36 @@
<a name="memos-api-v2-ListMemoCommentsRequest"></a>
### ListMemoCommentsRequest
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| id | [int32](#int32) | | |
<a name="memos-api-v2-ListMemoCommentsResponse"></a>
### ListMemoCommentsResponse
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| memos | [Memo](#memos-api-v2-Memo) | repeated | |
<a name="memos-api-v2-ListMemosRequest"></a> <a name="memos-api-v2-ListMemosRequest"></a>
### ListMemosRequest ### ListMemosRequest
...@@ -211,8 +309,11 @@ ...@@ -211,8 +309,11 @@
| Method Name | Request Type | Response Type | Description | | Method Name | Request Type | Response Type | Description |
| ----------- | ------------ | ------------- | ------------| | ----------- | ------------ | ------------- | ------------|
| CreateMemo | [CreateMemoRequest](#memos-api-v2-CreateMemoRequest) | [CreateMemoResponse](#memos-api-v2-CreateMemoResponse) | |
| ListMemos | [ListMemosRequest](#memos-api-v2-ListMemosRequest) | [ListMemosResponse](#memos-api-v2-ListMemosResponse) | | | ListMemos | [ListMemosRequest](#memos-api-v2-ListMemosRequest) | [ListMemosResponse](#memos-api-v2-ListMemosResponse) | |
| GetMemo | [GetMemoRequest](#memos-api-v2-GetMemoRequest) | [GetMemoResponse](#memos-api-v2-GetMemoResponse) | | | GetMemo | [GetMemoRequest](#memos-api-v2-GetMemoRequest) | [GetMemoResponse](#memos-api-v2-GetMemoResponse) | |
| CreateMemoComment | [CreateMemoCommentRequest](#memos-api-v2-CreateMemoCommentRequest) | [CreateMemoCommentResponse](#memos-api-v2-CreateMemoCommentResponse) | |
| ListMemoComments | [ListMemoCommentsRequest](#memos-api-v2-ListMemoCommentsRequest) | [ListMemoCommentsResponse](#memos-api-v2-ListMemoCommentsResponse) | |
......
This diff is collapsed.
This diff is collapsed.
...@@ -19,16 +19,22 @@ import ( ...@@ -19,16 +19,22 @@ import (
const _ = grpc.SupportPackageIsVersion7 const _ = grpc.SupportPackageIsVersion7
const ( const (
MemoService_CreateMemo_FullMethodName = "/memos.api.v2.MemoService/CreateMemo"
MemoService_ListMemos_FullMethodName = "/memos.api.v2.MemoService/ListMemos" MemoService_ListMemos_FullMethodName = "/memos.api.v2.MemoService/ListMemos"
MemoService_GetMemo_FullMethodName = "/memos.api.v2.MemoService/GetMemo" MemoService_GetMemo_FullMethodName = "/memos.api.v2.MemoService/GetMemo"
MemoService_CreateMemoComment_FullMethodName = "/memos.api.v2.MemoService/CreateMemoComment"
MemoService_ListMemoComments_FullMethodName = "/memos.api.v2.MemoService/ListMemoComments"
) )
// MemoServiceClient is the client API for MemoService service. // MemoServiceClient is the client API for MemoService service.
// //
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
type MemoServiceClient interface { type MemoServiceClient interface {
CreateMemo(ctx context.Context, in *CreateMemoRequest, opts ...grpc.CallOption) (*CreateMemoResponse, error)
ListMemos(ctx context.Context, in *ListMemosRequest, opts ...grpc.CallOption) (*ListMemosResponse, error) ListMemos(ctx context.Context, in *ListMemosRequest, opts ...grpc.CallOption) (*ListMemosResponse, error)
GetMemo(ctx context.Context, in *GetMemoRequest, opts ...grpc.CallOption) (*GetMemoResponse, error) GetMemo(ctx context.Context, in *GetMemoRequest, opts ...grpc.CallOption) (*GetMemoResponse, error)
CreateMemoComment(ctx context.Context, in *CreateMemoCommentRequest, opts ...grpc.CallOption) (*CreateMemoCommentResponse, error)
ListMemoComments(ctx context.Context, in *ListMemoCommentsRequest, opts ...grpc.CallOption) (*ListMemoCommentsResponse, error)
} }
type memoServiceClient struct { type memoServiceClient struct {
...@@ -39,6 +45,15 @@ func NewMemoServiceClient(cc grpc.ClientConnInterface) MemoServiceClient { ...@@ -39,6 +45,15 @@ func NewMemoServiceClient(cc grpc.ClientConnInterface) MemoServiceClient {
return &memoServiceClient{cc} return &memoServiceClient{cc}
} }
func (c *memoServiceClient) CreateMemo(ctx context.Context, in *CreateMemoRequest, opts ...grpc.CallOption) (*CreateMemoResponse, error) {
out := new(CreateMemoResponse)
err := c.cc.Invoke(ctx, MemoService_CreateMemo_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *memoServiceClient) ListMemos(ctx context.Context, in *ListMemosRequest, opts ...grpc.CallOption) (*ListMemosResponse, error) { func (c *memoServiceClient) ListMemos(ctx context.Context, in *ListMemosRequest, opts ...grpc.CallOption) (*ListMemosResponse, error) {
out := new(ListMemosResponse) out := new(ListMemosResponse)
err := c.cc.Invoke(ctx, MemoService_ListMemos_FullMethodName, in, out, opts...) err := c.cc.Invoke(ctx, MemoService_ListMemos_FullMethodName, in, out, opts...)
...@@ -57,12 +72,33 @@ func (c *memoServiceClient) GetMemo(ctx context.Context, in *GetMemoRequest, opt ...@@ -57,12 +72,33 @@ func (c *memoServiceClient) GetMemo(ctx context.Context, in *GetMemoRequest, opt
return out, nil return out, nil
} }
func (c *memoServiceClient) CreateMemoComment(ctx context.Context, in *CreateMemoCommentRequest, opts ...grpc.CallOption) (*CreateMemoCommentResponse, error) {
out := new(CreateMemoCommentResponse)
err := c.cc.Invoke(ctx, MemoService_CreateMemoComment_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *memoServiceClient) ListMemoComments(ctx context.Context, in *ListMemoCommentsRequest, opts ...grpc.CallOption) (*ListMemoCommentsResponse, error) {
out := new(ListMemoCommentsResponse)
err := c.cc.Invoke(ctx, MemoService_ListMemoComments_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// MemoServiceServer is the server API for MemoService service. // MemoServiceServer is the server API for MemoService service.
// All implementations must embed UnimplementedMemoServiceServer // All implementations must embed UnimplementedMemoServiceServer
// for forward compatibility // for forward compatibility
type MemoServiceServer interface { type MemoServiceServer interface {
CreateMemo(context.Context, *CreateMemoRequest) (*CreateMemoResponse, error)
ListMemos(context.Context, *ListMemosRequest) (*ListMemosResponse, error) ListMemos(context.Context, *ListMemosRequest) (*ListMemosResponse, error)
GetMemo(context.Context, *GetMemoRequest) (*GetMemoResponse, error) GetMemo(context.Context, *GetMemoRequest) (*GetMemoResponse, error)
CreateMemoComment(context.Context, *CreateMemoCommentRequest) (*CreateMemoCommentResponse, error)
ListMemoComments(context.Context, *ListMemoCommentsRequest) (*ListMemoCommentsResponse, error)
mustEmbedUnimplementedMemoServiceServer() mustEmbedUnimplementedMemoServiceServer()
} }
...@@ -70,12 +106,21 @@ type MemoServiceServer interface { ...@@ -70,12 +106,21 @@ type MemoServiceServer interface {
type UnimplementedMemoServiceServer struct { type UnimplementedMemoServiceServer struct {
} }
func (UnimplementedMemoServiceServer) CreateMemo(context.Context, *CreateMemoRequest) (*CreateMemoResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method CreateMemo not implemented")
}
func (UnimplementedMemoServiceServer) ListMemos(context.Context, *ListMemosRequest) (*ListMemosResponse, error) { func (UnimplementedMemoServiceServer) ListMemos(context.Context, *ListMemosRequest) (*ListMemosResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method ListMemos not implemented") return nil, status.Errorf(codes.Unimplemented, "method ListMemos not implemented")
} }
func (UnimplementedMemoServiceServer) GetMemo(context.Context, *GetMemoRequest) (*GetMemoResponse, error) { func (UnimplementedMemoServiceServer) GetMemo(context.Context, *GetMemoRequest) (*GetMemoResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetMemo not implemented") return nil, status.Errorf(codes.Unimplemented, "method GetMemo not implemented")
} }
func (UnimplementedMemoServiceServer) CreateMemoComment(context.Context, *CreateMemoCommentRequest) (*CreateMemoCommentResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method CreateMemoComment not implemented")
}
func (UnimplementedMemoServiceServer) ListMemoComments(context.Context, *ListMemoCommentsRequest) (*ListMemoCommentsResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method ListMemoComments not implemented")
}
func (UnimplementedMemoServiceServer) mustEmbedUnimplementedMemoServiceServer() {} func (UnimplementedMemoServiceServer) mustEmbedUnimplementedMemoServiceServer() {}
// UnsafeMemoServiceServer may be embedded to opt out of forward compatibility for this service. // UnsafeMemoServiceServer may be embedded to opt out of forward compatibility for this service.
...@@ -89,6 +134,24 @@ func RegisterMemoServiceServer(s grpc.ServiceRegistrar, srv MemoServiceServer) { ...@@ -89,6 +134,24 @@ func RegisterMemoServiceServer(s grpc.ServiceRegistrar, srv MemoServiceServer) {
s.RegisterService(&MemoService_ServiceDesc, srv) s.RegisterService(&MemoService_ServiceDesc, srv)
} }
func _MemoService_CreateMemo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(CreateMemoRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(MemoServiceServer).CreateMemo(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: MemoService_CreateMemo_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(MemoServiceServer).CreateMemo(ctx, req.(*CreateMemoRequest))
}
return interceptor(ctx, in, info, handler)
}
func _MemoService_ListMemos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { func _MemoService_ListMemos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ListMemosRequest) in := new(ListMemosRequest)
if err := dec(in); err != nil { if err := dec(in); err != nil {
...@@ -125,6 +188,42 @@ func _MemoService_GetMemo_Handler(srv interface{}, ctx context.Context, dec func ...@@ -125,6 +188,42 @@ func _MemoService_GetMemo_Handler(srv interface{}, ctx context.Context, dec func
return interceptor(ctx, in, info, handler) return interceptor(ctx, in, info, handler)
} }
func _MemoService_CreateMemoComment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(CreateMemoCommentRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(MemoServiceServer).CreateMemoComment(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: MemoService_CreateMemoComment_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(MemoServiceServer).CreateMemoComment(ctx, req.(*CreateMemoCommentRequest))
}
return interceptor(ctx, in, info, handler)
}
func _MemoService_ListMemoComments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ListMemoCommentsRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(MemoServiceServer).ListMemoComments(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: MemoService_ListMemoComments_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(MemoServiceServer).ListMemoComments(ctx, req.(*ListMemoCommentsRequest))
}
return interceptor(ctx, in, info, handler)
}
// MemoService_ServiceDesc is the grpc.ServiceDesc for MemoService service. // MemoService_ServiceDesc is the grpc.ServiceDesc for MemoService service.
// It's only intended for direct use with grpc.RegisterService, // It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy) // and not to be introspected or modified (even as a copy)
...@@ -132,6 +231,10 @@ var MemoService_ServiceDesc = grpc.ServiceDesc{ ...@@ -132,6 +231,10 @@ var MemoService_ServiceDesc = grpc.ServiceDesc{
ServiceName: "memos.api.v2.MemoService", ServiceName: "memos.api.v2.MemoService",
HandlerType: (*MemoServiceServer)(nil), HandlerType: (*MemoServiceServer)(nil),
Methods: []grpc.MethodDesc{ Methods: []grpc.MethodDesc{
{
MethodName: "CreateMemo",
Handler: _MemoService_CreateMemo_Handler,
},
{ {
MethodName: "ListMemos", MethodName: "ListMemos",
Handler: _MemoService_ListMemos_Handler, Handler: _MemoService_ListMemos_Handler,
...@@ -140,6 +243,14 @@ var MemoService_ServiceDesc = grpc.ServiceDesc{ ...@@ -140,6 +243,14 @@ var MemoService_ServiceDesc = grpc.ServiceDesc{
MethodName: "GetMemo", MethodName: "GetMemo",
Handler: _MemoService_GetMemo_Handler, Handler: _MemoService_GetMemo_Handler,
}, },
{
MethodName: "CreateMemoComment",
Handler: _MemoService_CreateMemoComment_Handler,
},
{
MethodName: "ListMemoComments",
Handler: _MemoService_ListMemoComments_Handler,
},
}, },
Streams: []grpc.StreamDesc{}, Streams: []grpc.StreamDesc{},
Metadata: "api/v2/memo_service.proto", Metadata: "api/v2/memo_service.proto",
......
...@@ -7,8 +7,10 @@ import ( ...@@ -7,8 +7,10 @@ import (
type MemoRelationType string type MemoRelationType string
const ( const (
// MemoRelationReference is the type for a reference memo relation.
MemoRelationReference MemoRelationType = "REFERENCE" MemoRelationReference MemoRelationType = "REFERENCE"
MemoRelationAdditional MemoRelationType = "ADDITIONAL" // MemoRelationComment is the type for a comment memo relation.
MemoRelationComment MemoRelationType = "COMMENT"
) )
type MemoRelation struct { type MemoRelation struct {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment