Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
canifa_note
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Vũ Hoàng Anh
canifa_note
Commits
ed89cb83
Commit
ed89cb83
authored
Mar 19, 2024
by
Steven
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
chore: update memo relation definition
parent
722e3560
Changes
13
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
192 additions
and
180 deletions
+192
-180
memo_relation_service.proto
proto/api/v2/memo_relation_service.proto
+7
-2
README.md
proto/gen/api/v2/README.md
+2
-2
memo_relation_service.pb.go
proto/gen/api/v2/memo_relation_service.pb.go
+37
-33
apidocs.swagger.md
server/route/api/v2/apidocs.swagger.md
+106
-94
apidocs.swagger.yaml
server/route/api/v2/apidocs.swagger.yaml
+10
-6
memo_relation_service.go
server/route/api/v2/memo_relation_service.go
+10
-5
memo_service.go
server/route/api/v2/memo_service.go
+0
-11
AddMemoRelationButton.tsx
...ponents/MemoEditor/ActionButton/AddMemoRelationButton.tsx
+4
-4
RelationListView.tsx
web/src/components/MemoEditor/RelationListView.tsx
+3
-3
index.tsx
web/src/components/MemoEditor/index.tsx
+4
-1
MemoRelationListView.tsx
web/src/components/MemoRelationListView.tsx
+5
-11
MemoView.tsx
web/src/components/MemoView.tsx
+1
-1
MemoDetail.tsx
web/src/pages/MemoDetail.tsx
+3
-7
No files found.
proto/api/v2/memo_relation_service.proto
View file @
ed89cb83
...
@@ -5,8 +5,13 @@ package memos.api.v2;
...
@@ -5,8 +5,13 @@ package memos.api.v2;
option
go_package
=
"gen/api/v2"
;
option
go_package
=
"gen/api/v2"
;
message
MemoRelation
{
message
MemoRelation
{
int32
memo_id
=
1
;
// The name of memo.
int32
related_memo_id
=
2
;
// Format: "memos/{uid}"
string
memo
=
1
;
// The name of related memo.
// Format: "memos/{uid}"
string
related_memo
=
2
;
enum
Type
{
enum
Type
{
TYPE_UNSPECIFIED
=
0
;
TYPE_UNSPECIFIED
=
0
;
...
...
proto/gen/api/v2/README.md
View file @
ed89cb83
...
@@ -1226,8 +1226,8 @@ Used internally for obfuscating the page token.
...
@@ -1226,8 +1226,8 @@ Used internally for obfuscating the page token.
| Field | Type | Label | Description |
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| ----- | ---- | ----- | ----------- |
| memo
_id |
[
int32
](
#int32
)
| |
|
| memo
|
[
string
](
#string
)
| | The name of memo. Format:
"
memos/{uid}
"
|
| related_memo
_id |
[
int32
](
#int32
)
| |
|
| related_memo
|
[
string
](
#string
)
| | The name of related memo. Format:
"
memos/{uid}
"
|
| type |
[
MemoRelation.Type
](
#memos-api-v2-MemoRelation-Type
)
| | |
| type |
[
MemoRelation.Type
](
#memos-api-v2-MemoRelation-Type
)
| | |
...
...
proto/gen/api/v2/memo_relation_service.pb.go
View file @
ed89cb83
...
@@ -74,8 +74,12 @@ type MemoRelation struct {
...
@@ -74,8 +74,12 @@ type MemoRelation struct {
sizeCache
protoimpl
.
SizeCache
sizeCache
protoimpl
.
SizeCache
unknownFields
protoimpl
.
UnknownFields
unknownFields
protoimpl
.
UnknownFields
MemoId
int32
`protobuf:"varint,1,opt,name=memo_id,json=memoId,proto3" json:"memo_id,omitempty"`
// The name of memo.
RelatedMemoId
int32
`protobuf:"varint,2,opt,name=related_memo_id,json=relatedMemoId,proto3" json:"related_memo_id,omitempty"`
// Format: "memos/{uid}"
Memo
string
`protobuf:"bytes,1,opt,name=memo,proto3" json:"memo,omitempty"`
// The name of related memo.
// Format: "memos/{uid}"
RelatedMemo
string
`protobuf:"bytes,2,opt,name=related_memo,json=relatedMemo,proto3" json:"related_memo,omitempty"`
Type
MemoRelation_Type
`protobuf:"varint,3,opt,name=type,proto3,enum=memos.api.v2.MemoRelation_Type" json:"type,omitempty"`
Type
MemoRelation_Type
`protobuf:"varint,3,opt,name=type,proto3,enum=memos.api.v2.MemoRelation_Type" json:"type,omitempty"`
}
}
...
@@ -111,18 +115,18 @@ func (*MemoRelation) Descriptor() ([]byte, []int) {
...
@@ -111,18 +115,18 @@ func (*MemoRelation) Descriptor() ([]byte, []int) {
return
file_api_v2_memo_relation_service_proto_rawDescGZIP
(),
[]
int
{
0
}
return
file_api_v2_memo_relation_service_proto_rawDescGZIP
(),
[]
int
{
0
}
}
}
func
(
x
*
MemoRelation
)
GetMemo
Id
()
int32
{
func
(
x
*
MemoRelation
)
GetMemo
()
string
{
if
x
!=
nil
{
if
x
!=
nil
{
return
x
.
Memo
Id
return
x
.
Memo
}
}
return
0
return
""
}
}
func
(
x
*
MemoRelation
)
GetRelatedMemo
Id
()
int32
{
func
(
x
*
MemoRelation
)
GetRelatedMemo
()
string
{
if
x
!=
nil
{
if
x
!=
nil
{
return
x
.
RelatedMemo
Id
return
x
.
RelatedMemo
}
}
return
0
return
""
}
}
func
(
x
*
MemoRelation
)
GetType
()
MemoRelation_Type
{
func
(
x
*
MemoRelation
)
GetType
()
MemoRelation_Type
{
...
@@ -138,30 +142,30 @@ var file_api_v2_memo_relation_service_proto_rawDesc = []byte{
...
@@ -138,30 +142,30 @@ var file_api_v2_memo_relation_service_proto_rawDesc = []byte{
0x0a
,
0x22
,
0x61
,
0x70
,
0x69
,
0x2f
,
0x76
,
0x32
,
0x2f
,
0x6d
,
0x65
,
0x6d
,
0x6f
,
0x5f
,
0x72
,
0x65
,
0x0a
,
0x22
,
0x61
,
0x70
,
0x69
,
0x2f
,
0x76
,
0x32
,
0x2f
,
0x6d
,
0x65
,
0x6d
,
0x6f
,
0x5f
,
0x72
,
0x65
,
0x6c
,
0x61
,
0x74
,
0x69
,
0x6f
,
0x6e
,
0x5f
,
0x73
,
0x65
,
0x72
,
0x76
,
0x69
,
0x63
,
0x65
,
0x2e
,
0x70
,
0x6c
,
0x61
,
0x74
,
0x69
,
0x6f
,
0x6e
,
0x5f
,
0x73
,
0x65
,
0x72
,
0x76
,
0x69
,
0x63
,
0x65
,
0x2e
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x12
,
0x0c
,
0x6d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x2e
,
0x61
,
0x70
,
0x69
,
0x2e
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x12
,
0x0c
,
0x6d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x2e
,
0x61
,
0x70
,
0x69
,
0x2e
,
0x76
,
0x32
,
0x22
,
0xb
e
,
0x01
,
0x0a
,
0x0c
,
0x4d
,
0x65
,
0x6d
,
0x6f
,
0x52
,
0x65
,
0x6c
,
0x61
,
0x74
,
0x76
,
0x32
,
0x22
,
0xb
4
,
0x01
,
0x0a
,
0x0c
,
0x4d
,
0x65
,
0x6d
,
0x6f
,
0x52
,
0x65
,
0x6c
,
0x61
,
0x74
,
0x69
,
0x6f
,
0x6e
,
0x12
,
0x1
7
,
0x0a
,
0x07
,
0x6d
,
0x65
,
0x6d
,
0x6f
,
0x5f
,
0x69
,
0x64
,
0x18
,
0x01
,
0x69
,
0x6f
,
0x6e
,
0x12
,
0x1
2
,
0x0a
,
0x04
,
0x6d
,
0x65
,
0x6d
,
0x6f
,
0x18
,
0x01
,
0x20
,
0x01
,
0x28
,
0x
20
,
0x01
,
0x28
,
0x05
,
0x52
,
0x06
,
0x6d
,
0x65
,
0x6d
,
0x6f
,
0x49
,
0x64
,
0x12
,
0x26
,
0x0a
,
0x0f
,
0x
09
,
0x52
,
0x04
,
0x6d
,
0x65
,
0x6d
,
0x6f
,
0x12
,
0x21
,
0x0a
,
0x0c
,
0x72
,
0x65
,
0x6c
,
0x61
,
0x74
,
0x
72
,
0x65
,
0x6c
,
0x61
,
0x74
,
0x65
,
0x64
,
0x5f
,
0x6d
,
0x65
,
0x6d
,
0x6f
,
0x5f
,
0x69
,
0x64
,
0x18
,
0x
65
,
0x64
,
0x5f
,
0x6d
,
0x65
,
0x6d
,
0x6f
,
0x18
,
0x02
,
0x20
,
0x01
,
0x28
,
0x09
,
0x52
,
0x0b
,
0x72
,
0x
02
,
0x20
,
0x01
,
0x28
,
0x05
,
0x52
,
0x0d
,
0x72
,
0x65
,
0x6c
,
0x61
,
0x74
,
0x65
,
0x64
,
0x4d
,
0x65
,
0x
65
,
0x6c
,
0x61
,
0x74
,
0x65
,
0x64
,
0x4d
,
0x65
,
0x6d
,
0x6f
,
0x12
,
0x33
,
0x0a
,
0x04
,
0x74
,
0x79
,
0x
6d
,
0x6f
,
0x49
,
0x64
,
0x12
,
0x33
,
0x0a
,
0x04
,
0x74
,
0x79
,
0x70
,
0x65
,
0x18
,
0x03
,
0x20
,
0x01
,
0x
70
,
0x65
,
0x18
,
0x03
,
0x20
,
0x01
,
0x28
,
0x0e
,
0x32
,
0x1f
,
0x2e
,
0x6d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x2
8
,
0x0e
,
0x32
,
0x1f
,
0x2e
,
0x6d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x2e
,
0x61
,
0x70
,
0x69
,
0x2e
,
0x76
,
0x2
e
,
0x61
,
0x70
,
0x69
,
0x2e
,
0x76
,
0x32
,
0x2e
,
0x4d
,
0x65
,
0x6d
,
0x6f
,
0x52
,
0x65
,
0x6c
,
0x61
,
0x
32
,
0x2e
,
0x4d
,
0x65
,
0x6d
,
0x6f
,
0x52
,
0x65
,
0x6c
,
0x61
,
0x74
,
0x69
,
0x6f
,
0x6e
,
0x2e
,
0x54
,
0x
74
,
0x69
,
0x6f
,
0x6e
,
0x2e
,
0x54
,
0x79
,
0x70
,
0x65
,
0x52
,
0x04
,
0x74
,
0x79
,
0x70
,
0x65
,
0x22
,
0x
79
,
0x70
,
0x65
,
0x52
,
0x04
,
0x74
,
0x79
,
0x70
,
0x65
,
0x22
,
0x38
,
0x0a
,
0x04
,
0x54
,
0x79
,
0x70
,
0x
38
,
0x0a
,
0x04
,
0x54
,
0x79
,
0x70
,
0x65
,
0x12
,
0x14
,
0x0a
,
0x10
,
0x54
,
0x59
,
0x50
,
0x45
,
0x5f
,
0x
65
,
0x12
,
0x14
,
0x0a
,
0x10
,
0x54
,
0x59
,
0x50
,
0x45
,
0x5f
,
0x55
,
0x4e
,
0x53
,
0x50
,
0x45
,
0x43
,
0x
55
,
0x4e
,
0x53
,
0x50
,
0x45
,
0x43
,
0x49
,
0x46
,
0x49
,
0x45
,
0x44
,
0x10
,
0x00
,
0x12
,
0x0d
,
0x0a
,
0x
49
,
0x46
,
0x49
,
0x45
,
0x44
,
0x10
,
0x00
,
0x12
,
0x0d
,
0x0a
,
0x09
,
0x52
,
0x45
,
0x46
,
0x45
,
0x52
,
0x
09
,
0x52
,
0x45
,
0x46
,
0x45
,
0x52
,
0x45
,
0x4e
,
0x43
,
0x45
,
0x10
,
0x01
,
0x12
,
0x0b
,
0x0a
,
0x07
,
0x4
5
,
0x4e
,
0x43
,
0x45
,
0x10
,
0x01
,
0x12
,
0x0b
,
0x0a
,
0x07
,
0x43
,
0x4f
,
0x4d
,
0x4d
,
0x45
,
0x4e
,
0x4
3
,
0x4f
,
0x4d
,
0x4d
,
0x45
,
0x4e
,
0x54
,
0x10
,
0x02
,
0x42
,
0xb0
,
0x01
,
0x0a
,
0x10
,
0x63
,
0x6f
,
0x
54
,
0x10
,
0x02
,
0x42
,
0xb0
,
0x01
,
0x0a
,
0x10
,
0x63
,
0x6f
,
0x6d
,
0x2e
,
0x6d
,
0x65
,
0x6d
,
0x6f
,
0x
6d
,
0x2e
,
0x6d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x2e
,
0x61
,
0x70
,
0x69
,
0x2e
,
0x76
,
0x32
,
0x42
,
0x18
,
0x
73
,
0x2e
,
0x61
,
0x70
,
0x69
,
0x2e
,
0x76
,
0x32
,
0x42
,
0x18
,
0x4d
,
0x65
,
0x6d
,
0x6f
,
0x52
,
0x65
,
0x
4d
,
0x65
,
0x6d
,
0x6f
,
0x52
,
0x65
,
0x6c
,
0x61
,
0x74
,
0x69
,
0x6f
,
0x6e
,
0x53
,
0x65
,
0x72
,
0x76
,
0x6
c
,
0x61
,
0x74
,
0x69
,
0x6f
,
0x6e
,
0x53
,
0x65
,
0x72
,
0x76
,
0x69
,
0x63
,
0x65
,
0x50
,
0x72
,
0x6f
,
0x6
9
,
0x63
,
0x65
,
0x50
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x50
,
0x01
,
0x5a
,
0x30
,
0x67
,
0x69
,
0x74
,
0x68
,
0x7
4
,
0x6f
,
0x50
,
0x01
,
0x5a
,
0x30
,
0x67
,
0x69
,
0x74
,
0x68
,
0x75
,
0x62
,
0x2e
,
0x63
,
0x6f
,
0x6d
,
0x7
5
,
0x62
,
0x2e
,
0x63
,
0x6f
,
0x6d
,
0x2f
,
0x75
,
0x73
,
0x65
,
0x6d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x2f
,
0x
2f
,
0x75
,
0x73
,
0x65
,
0x6d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x2f
,
0x6d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x2f
,
0x
6d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x2f
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x2f
,
0x67
,
0x65
,
0x6e
,
0x2f
,
0x
70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x2f
,
0x67
,
0x65
,
0x6e
,
0x2f
,
0x61
,
0x70
,
0x69
,
0x2f
,
0x76
,
0x32
,
0x
61
,
0x70
,
0x69
,
0x2f
,
0x76
,
0x32
,
0x3b
,
0x61
,
0x70
,
0x69
,
0x76
,
0x32
,
0xa2
,
0x02
,
0x03
,
0x4d
,
0x
3b
,
0x61
,
0x70
,
0x69
,
0x76
,
0x32
,
0xa2
,
0x02
,
0x03
,
0x4d
,
0x41
,
0x58
,
0xaa
,
0x02
,
0x0c
,
0x4d
,
0x
41
,
0x58
,
0xaa
,
0x02
,
0x0c
,
0x4d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x2e
,
0x41
,
0x70
,
0x69
,
0x2e
,
0x56
,
0x
65
,
0x6d
,
0x6f
,
0x73
,
0x2e
,
0x41
,
0x70
,
0x69
,
0x2e
,
0x56
,
0x32
,
0xca
,
0x02
,
0x0c
,
0x4d
,
0x65
,
0x
32
,
0xca
,
0x02
,
0x0c
,
0x4d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x5c
,
0x41
,
0x70
,
0x69
,
0x5c
,
0x56
,
0x32
,
0x
6d
,
0x6f
,
0x73
,
0x5c
,
0x41
,
0x70
,
0x69
,
0x5c
,
0x56
,
0x32
,
0xe2
,
0x02
,
0x18
,
0x4d
,
0x65
,
0x6d
,
0x
e2
,
0x02
,
0x18
,
0x4d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x5c
,
0x41
,
0x70
,
0x69
,
0x5c
,
0x56
,
0x32
,
0x5c
,
0x
6f
,
0x73
,
0x5c
,
0x41
,
0x70
,
0x69
,
0x5c
,
0x56
,
0x32
,
0x5c
,
0x47
,
0x50
,
0x42
,
0x4d
,
0x65
,
0x74
,
0x
47
,
0x50
,
0x42
,
0x4d
,
0x65
,
0x74
,
0x61
,
0x64
,
0x61
,
0x74
,
0x61
,
0xea
,
0x02
,
0x0e
,
0x4d
,
0x65
,
0x6
1
,
0x64
,
0x61
,
0x74
,
0x61
,
0xea
,
0x02
,
0x0e
,
0x4d
,
0x65
,
0x6d
,
0x6f
,
0x73
,
0x3a
,
0x3a
,
0x41
,
0x6
d
,
0x6f
,
0x73
,
0x3a
,
0x3a
,
0x41
,
0x70
,
0x69
,
0x3a
,
0x3a
,
0x56
,
0x32
,
0x62
,
0x06
,
0x70
,
0x72
,
0x
70
,
0x69
,
0x3a
,
0x3a
,
0x56
,
0x32
,
0x62
,
0x06
,
0x70
,
0x72
,
0x
6f
,
0x74
,
0x6f
,
0x33
,
0x6f
,
0x74
,
0x6f
,
0x33
,
}
}
var
(
var
(
...
...
server/route/api/v2/apidocs.swagger.md
View file @
ed89cb83
This diff is collapsed.
Click to expand it.
server/route/api/v2/apidocs.swagger.yaml
View file @
ed89cb83
...
@@ -2130,12 +2130,16 @@ definitions:
...
@@ -2130,12 +2130,16 @@ definitions:
v2MemoRelation
:
v2MemoRelation
:
type
:
object
type
:
object
properties
:
properties
:
memoId
:
memo
:
type
:
integer
type
:
string
format
:
int32
title
:
|-
relatedMemoId
:
The name of memo.
type
:
integer
Format: "memos/{uid}"
format
:
int32
relatedMemo
:
type
:
string
title
:
|-
The name of related memo.
Format: "memos/{uid}"
type
:
type
:
$ref
:
'
#/definitions/v2MemoRelationType'
$ref
:
'
#/definitions/v2MemoRelationType'
v2MemoRelationType
:
v2MemoRelationType
:
...
...
server/route/api/v2/memo_relation_service.go
View file @
ed89cb83
...
@@ -2,6 +2,7 @@ package v2
...
@@ -2,6 +2,7 @@ package v2
import
(
import
(
"context"
"context"
"fmt"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"google.golang.org/grpc/status"
...
@@ -26,7 +27,7 @@ func (s *APIV2Service) SetMemoRelations(ctx context.Context, request *apiv2pb.Se
...
@@ -26,7 +27,7 @@ func (s *APIV2Service) SetMemoRelations(ctx context.Context, request *apiv2pb.Se
for
_
,
relation
:=
range
request
.
Relations
{
for
_
,
relation
:=
range
request
.
Relations
{
// Ignore reflexive relations.
// Ignore reflexive relations.
if
id
==
relation
.
RelatedMemoId
{
if
request
.
Name
==
relation
.
RelatedMemo
{
continue
continue
}
}
// Ignore comment relations as there's no need to update a comment's relation.
// Ignore comment relations as there's no need to update a comment's relation.
...
@@ -34,9 +35,13 @@ func (s *APIV2Service) SetMemoRelations(ctx context.Context, request *apiv2pb.Se
...
@@ -34,9 +35,13 @@ func (s *APIV2Service) SetMemoRelations(ctx context.Context, request *apiv2pb.Se
if
relation
.
Type
==
apiv2pb
.
MemoRelation_COMMENT
{
if
relation
.
Type
==
apiv2pb
.
MemoRelation_COMMENT
{
continue
continue
}
}
relatedMemoID
,
err
:=
ExtractMemoIDFromName
(
relation
.
RelatedMemo
)
if
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"invalid related memo name: %v"
,
err
)
}
if
_
,
err
:=
s
.
Store
.
UpsertMemoRelation
(
ctx
,
&
store
.
MemoRelation
{
if
_
,
err
:=
s
.
Store
.
UpsertMemoRelation
(
ctx
,
&
store
.
MemoRelation
{
MemoID
:
id
,
MemoID
:
id
,
RelatedMemoID
:
relat
ion
.
RelatedMemoId
,
RelatedMemoID
:
relat
edMemoID
,
Type
:
convertMemoRelationTypeToStore
(
relation
.
Type
),
Type
:
convertMemoRelationTypeToStore
(
relation
.
Type
),
});
err
!=
nil
{
});
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
Internal
,
"failed to upsert memo relation"
)
return
nil
,
status
.
Errorf
(
codes
.
Internal
,
"failed to upsert memo relation"
)
...
@@ -79,8 +84,8 @@ func (s *APIV2Service) ListMemoRelations(ctx context.Context, request *apiv2pb.L
...
@@ -79,8 +84,8 @@ func (s *APIV2Service) ListMemoRelations(ctx context.Context, request *apiv2pb.L
func
convertMemoRelationFromStore
(
memoRelation
*
store
.
MemoRelation
)
*
apiv2pb
.
MemoRelation
{
func
convertMemoRelationFromStore
(
memoRelation
*
store
.
MemoRelation
)
*
apiv2pb
.
MemoRelation
{
return
&
apiv2pb
.
MemoRelation
{
return
&
apiv2pb
.
MemoRelation
{
Memo
Id
:
memoRelation
.
MemoID
,
Memo
:
fmt
.
Sprintf
(
"%s%d"
,
MemoNamePrefix
,
memoRelation
.
MemoID
)
,
RelatedMemo
Id
:
memoRelation
.
RelatedMemoID
,
RelatedMemo
:
fmt
.
Sprintf
(
"%s%d"
,
MemoNamePrefix
,
memoRelation
.
RelatedMemoID
)
,
Type
:
convertMemoRelationTypeFromStore
(
memoRelation
.
Type
),
Type
:
convertMemoRelationTypeFromStore
(
memoRelation
.
Type
),
}
}
}
}
...
...
server/route/api/v2/memo_service.go
View file @
ed89cb83
...
@@ -883,17 +883,6 @@ func convertMemoToWebhookPayload(memo *apiv2pb.Memo) (*webhook.WebhookPayload, e
...
@@ -883,17 +883,6 @@ func convertMemoToWebhookPayload(memo *apiv2pb.Memo) (*webhook.WebhookPayload, e
}
}
return
resources
return
resources
}(),
}(),
RelationList
:
func
()
[]
*
webhook
.
MemoRelation
{
relations
:=
[]
*
webhook
.
MemoRelation
{}
for
_
,
relation
:=
range
memo
.
Relations
{
relations
=
append
(
relations
,
&
webhook
.
MemoRelation
{
MemoID
:
relation
.
MemoId
,
RelatedMemoID
:
relation
.
RelatedMemoId
,
Type
:
relation
.
Type
.
String
(),
})
}
return
relations
}(),
},
},
},
nil
},
nil
}
}
web/src/components/MemoEditor/ActionButton/AddMemoRelationButton.tsx
View file @
ed89cb83
...
@@ -5,7 +5,7 @@ import toast from "react-hot-toast";
...
@@ -5,7 +5,7 @@ import toast from "react-hot-toast";
import
showCreateMemoRelationDialog
from
"@/components/CreateMemoRelationDialog"
;
import
showCreateMemoRelationDialog
from
"@/components/CreateMemoRelationDialog"
;
import
Icon
from
"@/components/Icon"
;
import
Icon
from
"@/components/Icon"
;
import
{
UNKNOWN_ID
}
from
"@/helpers/consts"
;
import
{
UNKNOWN_ID
}
from
"@/helpers/consts"
;
import
{
extractMemoIdFromName
}
from
"@/store/v1"
;
import
{
MemoNamePrefix
}
from
"@/store/v1"
;
import
{
MemoRelation_Type
}
from
"@/types/proto/api/v2/memo_relation_service"
;
import
{
MemoRelation_Type
}
from
"@/types/proto/api/v2/memo_relation_service"
;
import
{
EditorRefActions
}
from
"../Editor"
;
import
{
EditorRefActions
}
from
"../Editor"
;
import
{
MemoEditorContext
}
from
"../types"
;
import
{
MemoEditorContext
}
from
"../types"
;
...
@@ -47,12 +47,12 @@ const AddMemoRelationButton = (props: Props) => {
...
@@ -47,12 +47,12 @@ const AddMemoRelationButton = (props: Props) => {
uniqBy
(
uniqBy
(
[
[
...
memos
.
map
((
memo
)
=>
({
...
memos
.
map
((
memo
)
=>
({
memo
Id
:
context
.
memoId
||
UNKNOWN_ID
,
memo
:
`
${
MemoNamePrefix
}${
context
.
memoId
||
UNKNOWN_ID
}
`
,
relatedMemo
Id
:
extractMemoIdFromName
(
memo
.
name
)
,
relatedMemo
:
memo
.
name
,
type
:
MemoRelation_Type
.
REFERENCE
,
type
:
MemoRelation_Type
.
REFERENCE
,
})),
})),
...
context
.
relationList
,
...
context
.
relationList
,
].
filter
((
relation
)
=>
relation
.
relatedMemo
Id
!==
(
context
.
memoId
||
UNKNOWN_ID
)
),
].
filter
((
relation
)
=>
relation
.
relatedMemo
!==
`
${
MemoNamePrefix
}${
context
.
memoId
||
UNKNOWN_ID
}
`
),
"relatedMemoId"
,
"relatedMemoId"
,
),
),
);
);
...
...
web/src/components/MemoEditor/RelationListView.tsx
View file @
ed89cb83
import
{
useEffect
,
useState
}
from
"react"
;
import
{
useEffect
,
useState
}
from
"react"
;
import
{
MemoNamePrefix
,
extractMemoIdFromName
,
useMemoStore
}
from
"@/store/v1"
;
import
{
useMemoStore
}
from
"@/store/v1"
;
import
{
MemoRelation
,
MemoRelation_Type
}
from
"@/types/proto/api/v2/memo_relation_service"
;
import
{
MemoRelation
,
MemoRelation_Type
}
from
"@/types/proto/api/v2/memo_relation_service"
;
import
{
Memo
}
from
"@/types/proto/api/v2/memo_service"
;
import
{
Memo
}
from
"@/types/proto/api/v2/memo_service"
;
import
Icon
from
"../Icon"
;
import
Icon
from
"../Icon"
;
...
@@ -19,7 +19,7 @@ const RelationListView = (props: Props) => {
...
@@ -19,7 +19,7 @@ const RelationListView = (props: Props) => {
const
requests
=
relationList
const
requests
=
relationList
.
filter
((
relation
)
=>
relation
.
type
===
MemoRelation_Type
.
REFERENCE
)
.
filter
((
relation
)
=>
relation
.
type
===
MemoRelation_Type
.
REFERENCE
)
.
map
(
async
(
relation
)
=>
{
.
map
(
async
(
relation
)
=>
{
return
await
memoStore
.
getOrFetchMemoByName
(
`
${
MemoNamePrefix
}${
relation
.
relatedMemoId
}
`
,
{
skipStore
:
true
});
return
await
memoStore
.
getOrFetchMemoByName
(
relation
.
relatedMemo
,
{
skipStore
:
true
});
});
});
const
list
=
await
Promise
.
all
(
requests
);
const
list
=
await
Promise
.
all
(
requests
);
setReferencingMemoList
(
list
);
setReferencingMemoList
(
list
);
...
@@ -27,7 +27,7 @@ const RelationListView = (props: Props) => {
...
@@ -27,7 +27,7 @@ const RelationListView = (props: Props) => {
},
[
relationList
]);
},
[
relationList
]);
const
handleDeleteRelation
=
async
(
memo
:
Memo
)
=>
{
const
handleDeleteRelation
=
async
(
memo
:
Memo
)
=>
{
setRelationList
(
relationList
.
filter
((
relation
)
=>
relation
.
relatedMemo
Id
!==
extractMemoIdFromName
(
memo
.
name
)
));
setRelationList
(
relationList
.
filter
((
relation
)
=>
relation
.
relatedMemo
!==
memo
.
name
));
};
};
return
(
return
(
...
...
web/src/components/MemoEditor/index.tsx
View file @
ed89cb83
...
@@ -75,7 +75,10 @@ const MemoEditor = (props: Props) => {
...
@@ -75,7 +75,10 @@ const MemoEditor = (props: Props) => {
const
[
contentCache
,
setContentCache
]
=
useLocalStorage
<
string
>
(
contentCacheKey
,
""
);
const
[
contentCache
,
setContentCache
]
=
useLocalStorage
<
string
>
(
contentCacheKey
,
""
);
const
referenceRelations
=
memoId
const
referenceRelations
=
memoId
?
state
.
relationList
.
filter
(
?
state
.
relationList
.
filter
(
(
relation
)
=>
relation
.
memoId
===
memoId
&&
relation
.
relatedMemoId
!==
memoId
&&
relation
.
type
===
MemoRelation_Type
.
REFERENCE
,
(
relation
)
=>
extractMemoIdFromName
(
relation
.
memo
)
===
memoId
&&
extractMemoIdFromName
(
relation
.
relatedMemo
)
!==
memoId
&&
relation
.
type
===
MemoRelation_Type
.
REFERENCE
,
)
)
:
state
.
relationList
.
filter
((
relation
)
=>
relation
.
type
===
MemoRelation_Type
.
REFERENCE
);
:
state
.
relationList
.
filter
((
relation
)
=>
relation
.
type
===
MemoRelation_Type
.
REFERENCE
);
...
...
web/src/components/MemoRelationListView.tsx
View file @
ed89cb83
import
{
Tooltip
}
from
"@mui/joy"
;
import
{
Tooltip
}
from
"@mui/joy"
;
import
{
memo
,
useEffect
,
useState
}
from
"react"
;
import
{
memo
,
useEffect
,
useState
}
from
"react"
;
import
{
Link
}
from
"react-router-dom"
;
import
{
Link
}
from
"react-router-dom"
;
import
{
MemoNamePrefix
,
extractMemoIdFromName
,
useMemoStore
}
from
"@/store/v1"
;
import
{
useMemoStore
}
from
"@/store/v1"
;
import
{
MemoRelation
}
from
"@/types/proto/api/v2/memo_relation_service"
;
import
{
MemoRelation
}
from
"@/types/proto/api/v2/memo_relation_service"
;
import
{
Memo
}
from
"@/types/proto/api/v2/memo_service"
;
import
{
Memo
}
from
"@/types/proto/api/v2/memo_service"
;
import
Icon
from
"./Icon"
;
import
Icon
from
"./Icon"
;
...
@@ -21,20 +21,14 @@ const MemoRelationListView = (props: Props) => {
...
@@ -21,20 +21,14 @@ const MemoRelationListView = (props: Props) => {
(
async
()
=>
{
(
async
()
=>
{
const
referencingMemoList
=
await
Promise
.
all
(
const
referencingMemoList
=
await
Promise
.
all
(
relationList
relationList
.
filter
(
.
filter
((
relation
)
=>
relation
.
memo
===
memo
.
name
&&
relation
.
relatedMemo
!==
memo
.
name
)
(
relation
)
=>
.
map
((
relation
)
=>
memoStore
.
getOrFetchMemoByName
(
relation
.
relatedMemo
,
{
skipStore
:
true
})),
relation
.
memoId
===
extractMemoIdFromName
(
memo
.
name
)
&&
relation
.
relatedMemoId
!==
extractMemoIdFromName
(
memo
.
name
),
)
.
map
((
relation
)
=>
memoStore
.
getOrFetchMemoByName
(
`
${
MemoNamePrefix
}${
relation
.
relatedMemoId
}
`
,
{
skipStore
:
true
})),
);
);
setReferencingMemoList
(
referencingMemoList
);
setReferencingMemoList
(
referencingMemoList
);
const
referencedMemoList
=
await
Promise
.
all
(
const
referencedMemoList
=
await
Promise
.
all
(
relationList
relationList
.
filter
(
.
filter
((
relation
)
=>
relation
.
memo
!==
memo
.
name
&&
relation
.
relatedMemo
===
memo
.
name
)
(
relation
)
=>
.
map
((
relation
)
=>
memoStore
.
getOrFetchMemoByName
(
relation
.
memo
,
{
skipStore
:
true
})),
relation
.
memoId
!==
extractMemoIdFromName
(
memo
.
name
)
&&
relation
.
relatedMemoId
===
extractMemoIdFromName
(
memo
.
name
),
)
.
map
((
relation
)
=>
memoStore
.
getOrFetchMemoByName
(
`
${
MemoNamePrefix
}${
relation
.
memoId
}
`
,
{
skipStore
:
true
})),
);
);
setReferencedMemoList
(
referencedMemoList
);
setReferencedMemoList
(
referencedMemoList
);
})();
})();
...
...
web/src/components/MemoView.tsx
View file @
ed89cb83
...
@@ -41,7 +41,7 @@ const MemoView: React.FC<Props> = (props: Props) => {
...
@@ -41,7 +41,7 @@ const MemoView: React.FC<Props> = (props: Props) => {
const
memoContainerRef
=
useRef
<
HTMLDivElement
>
(
null
);
const
memoContainerRef
=
useRef
<
HTMLDivElement
>
(
null
);
const
referencedMemos
=
memo
.
relations
.
filter
((
relation
)
=>
relation
.
type
===
MemoRelation_Type
.
REFERENCE
);
const
referencedMemos
=
memo
.
relations
.
filter
((
relation
)
=>
relation
.
type
===
MemoRelation_Type
.
REFERENCE
);
const
commentAmount
=
memo
.
relations
.
filter
(
const
commentAmount
=
memo
.
relations
.
filter
(
(
relation
)
=>
relation
.
type
===
MemoRelation_Type
.
COMMENT
&&
relation
.
relatedMemo
Id
===
extractMemoIdFromName
(
memo
.
name
)
,
(
relation
)
=>
relation
.
type
===
MemoRelation_Type
.
COMMENT
&&
relation
.
relatedMemo
===
memo
.
name
,
).
length
;
).
length
;
const
readonly
=
memo
.
creator
!==
user
?.
name
;
const
readonly
=
memo
.
creator
!==
user
?.
name
;
const
isInMemoDetailPage
=
location
.
pathname
.
startsWith
(
`/m/
${
memo
.
name
}
`
);
const
isInMemoDetailPage
=
location
.
pathname
.
startsWith
(
`/m/
${
memo
.
name
}
`
);
...
...
web/src/pages/MemoDetail.tsx
View file @
ed89cb83
...
@@ -23,12 +23,8 @@ const MemoDetail = () => {
...
@@ -23,12 +23,8 @@ const MemoDetail = () => {
const
memo
=
memoStore
.
getMemoByResourceId
(
resourceId
||
""
);
const
memo
=
memoStore
.
getMemoByResourceId
(
resourceId
||
""
);
const
[
parentMemo
,
setParentMemo
]
=
useState
<
Memo
|
undefined
>
(
undefined
);
const
[
parentMemo
,
setParentMemo
]
=
useState
<
Memo
|
undefined
>
(
undefined
);
const
commentRelations
=
const
commentRelations
=
memo
?.
relations
.
filter
(
memo
?.
relations
.
filter
((
relation
)
=>
relation
.
relatedMemo
===
memo
.
name
&&
relation
.
type
===
MemoRelation_Type
.
COMMENT
)
||
[];
(
relation
)
=>
relation
.
relatedMemoId
===
extractMemoIdFromName
(
memo
.
name
)
&&
relation
.
type
===
MemoRelation_Type
.
COMMENT
,
const
comments
=
commentRelations
.
map
((
relation
)
=>
memoStore
.
getMemoByName
(
relation
.
memo
)).
filter
((
memo
)
=>
memo
)
as
any
as
Memo
[];
)
||
[];
const
comments
=
commentRelations
.
map
((
relation
)
=>
memoStore
.
getMemoByName
(
`
${
MemoNamePrefix
}${
relation
.
memoId
}
`
))
.
filter
((
memo
)
=>
memo
)
as
any
as
Memo
[];
// Prepare memo.
// Prepare memo.
useEffect
(()
=>
{
useEffect
(()
=>
{
...
@@ -56,7 +52,7 @@ const MemoDetail = () => {
...
@@ -56,7 +52,7 @@ const MemoDetail = () => {
}
else
{
}
else
{
setParentMemo
(
undefined
);
setParentMemo
(
undefined
);
}
}
await
Promise
.
all
(
commentRelations
.
map
((
relation
)
=>
memoStore
.
getOrFetchMemoByName
(
`
${
MemoNamePrefix
}${
relation
.
memoId
}
`
)));
await
Promise
.
all
(
commentRelations
.
map
((
relation
)
=>
memoStore
.
getOrFetchMemoByName
(
relation
.
memo
)));
})();
})();
},
[
memo
]);
},
[
memo
]);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment