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
d11e7a3a
Commit
d11e7a3a
authored
Oct 06, 2024
by
Steven
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
chore: remove duplicated requests
parent
c401a079
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
611 additions
and
1397 deletions
+611
-1397
memo_service.proto
proto/api/v1/memo_service.proto
+13
-45
memo_service.pb.go
proto/gen/api/v1/memo_service.pb.go
+497
-822
memo_service.pb.gw.go
proto/gen/api/v1/memo_service.pb.gw.go
+0
-224
memo_service_grpc.pb.go
proto/gen/api/v1/memo_service_grpc.pb.go
+0
-80
apidocs.swagger.yaml
proto/gen/apidocs.swagger.yaml
+24
-90
acl_config.go
server/router/api/v1/acl_config.go
+0
-1
memo_service.go
server/router/api/v1/memo_service.go
+45
-126
UserStatisticsView.tsx
web/src/components/UserStatisticsView.tsx
+13
-8
tag.ts
web/src/store/v1/tag.ts
+19
-1
No files found.
proto/api/v1/memo_service.proto
View file @
d11e7a3a
...
...
@@ -51,10 +51,6 @@ service MemoService {
option
(
google.api.http
)
=
{
delete
:
"/api/v1/{name=memos/*}"
};
option
(
google.api.method_signature
)
=
"name"
;
}
// ListMemoProperties lists memo properties.
rpc
ListMemoProperties
(
ListMemoPropertiesRequest
)
returns
(
ListMemoPropertiesResponse
)
{
option
(
google.api.http
)
=
{
get
:
"/api/v1/{name=memos/*}/properties"
};
}
// RebuildMemoProperty rebuilds a memo property.
rpc
RebuildMemoProperty
(
RebuildMemoPropertyRequest
)
returns
(
google.protobuf.Empty
)
{
option
(
google.api.http
)
=
{
...
...
@@ -62,10 +58,6 @@ service MemoService {
body
:
"*"
};
}
// ListMemoTags lists tags for a memo.
rpc
ListMemoTags
(
ListMemoTagsRequest
)
returns
(
ListMemoTagsResponse
)
{
option
(
google.api.http
)
=
{
get
:
"/api/v1/{parent=memos/*}/tags"
};
}
// RenameMemoTag renames a tag for a memo.
rpc
RenameMemoTag
(
RenameMemoTagRequest
)
returns
(
google.protobuf.Empty
)
{
option
(
google.api.http
)
=
{
...
...
@@ -219,6 +211,16 @@ message CreateMemoRequest {
optional
Location
location
=
5
;
}
enum
MemoView
{
MEMO_VIEW_UNSPECIFIED
=
0
;
// The full view of the memo. Includes all fields.
MEMO_VIEW_FULL
=
1
;
// The metadata only view of the memo. Excludes the content/snippet fields.
MEMO_VIEW_METADATA_ONLY
=
2
;
}
message
ListMemosRequest
{
// The maximum number of memos to return.
int32
page_size
=
1
;
...
...
@@ -230,6 +232,9 @@ message ListMemosRequest {
// Filter is used to filter memos returned in the list.
// Format: "creator == 'users/{uid}' && visibilities == ['PUBLIC', 'PROTECTED']"
string
filter
=
3
;
// The view of the memo.
MemoView
view
=
4
;
}
message
ListMemosResponse
{
...
...
@@ -263,49 +268,12 @@ message DeleteMemoRequest {
string
name
=
1
;
}
message
ListMemoPropertiesRequest
{
// The name of the memo.
// Format: memos/{id}. Use "memos/-" to list all properties.
string
name
=
1
;
}
message
ListMemoPropertiesResponse
{
repeated
MemoPropertyEntity
entities
=
1
;
}
message
MemoPropertyEntity
{
// The name of the memo property.
// Format: memos/{id}/properties/{property_id}
string
name
=
1
;
MemoProperty
property
=
2
[(
google.api.field_behavior
)
=
OUTPUT_ONLY
];
google.protobuf.Timestamp
display_time
=
3
[(
google.api.field_behavior
)
=
OUTPUT_ONLY
];
}
message
RebuildMemoPropertyRequest
{
// The name of the memo.
// Format: memos/{id}. Use "memos/-" to rebuild all memos.
string
name
=
1
;
}
message
ListMemoTagsRequest
{
// The parent, who owns the tags.
// Format: memos/{id}. Use "memos/-" to list all tags.
string
parent
=
1
;
// Filter is used to filter memos.
// Format: "creator == 'users/{uid}' && visibilities == ['PUBLIC', 'PROTECTED']"
string
filter
=
2
;
}
message
ListMemoTagsResponse
{
// tag_amounts is the amount of tags.
// key is the tag name. e.g. "tag1".
// value is the amount of the tag.
map
<
string
,
int32
>
tag_amounts
=
1
;
}
message
RenameMemoTagRequest
{
// The parent, who owns the tags.
// Format: memos/{id}. Use "memos/-" to rename all tags.
...
...
proto/gen/api/v1/memo_service.pb.go
View file @
d11e7a3a
This source diff could not be displayed because it is too large. You can
view the blob
instead.
proto/gen/api/v1/memo_service.pb.gw.go
View file @
d11e7a3a
...
...
@@ -349,58 +349,6 @@ func local_request_MemoService_DeleteMemo_0(ctx context.Context, marshaler runti
}
func
request_MemoService_ListMemoProperties_0
(
ctx
context
.
Context
,
marshaler
runtime
.
Marshaler
,
client
MemoServiceClient
,
req
*
http
.
Request
,
pathParams
map
[
string
]
string
)
(
proto
.
Message
,
runtime
.
ServerMetadata
,
error
)
{
var
protoReq
ListMemoPropertiesRequest
var
metadata
runtime
.
ServerMetadata
var
(
val
string
ok
bool
err
error
_
=
err
)
val
,
ok
=
pathParams
[
"name"
]
if
!
ok
{
return
nil
,
metadata
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"missing parameter %s"
,
"name"
)
}
protoReq
.
Name
,
err
=
runtime
.
String
(
val
)
if
err
!=
nil
{
return
nil
,
metadata
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"type mismatch, parameter: %s, error: %v"
,
"name"
,
err
)
}
msg
,
err
:=
client
.
ListMemoProperties
(
ctx
,
&
protoReq
,
grpc
.
Header
(
&
metadata
.
HeaderMD
),
grpc
.
Trailer
(
&
metadata
.
TrailerMD
))
return
msg
,
metadata
,
err
}
func
local_request_MemoService_ListMemoProperties_0
(
ctx
context
.
Context
,
marshaler
runtime
.
Marshaler
,
server
MemoServiceServer
,
req
*
http
.
Request
,
pathParams
map
[
string
]
string
)
(
proto
.
Message
,
runtime
.
ServerMetadata
,
error
)
{
var
protoReq
ListMemoPropertiesRequest
var
metadata
runtime
.
ServerMetadata
var
(
val
string
ok
bool
err
error
_
=
err
)
val
,
ok
=
pathParams
[
"name"
]
if
!
ok
{
return
nil
,
metadata
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"missing parameter %s"
,
"name"
)
}
protoReq
.
Name
,
err
=
runtime
.
String
(
val
)
if
err
!=
nil
{
return
nil
,
metadata
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"type mismatch, parameter: %s, error: %v"
,
"name"
,
err
)
}
msg
,
err
:=
server
.
ListMemoProperties
(
ctx
,
&
protoReq
)
return
msg
,
metadata
,
err
}
func
request_MemoService_RebuildMemoProperty_0
(
ctx
context
.
Context
,
marshaler
runtime
.
Marshaler
,
client
MemoServiceClient
,
req
*
http
.
Request
,
pathParams
map
[
string
]
string
)
(
proto
.
Message
,
runtime
.
ServerMetadata
,
error
)
{
var
protoReq
RebuildMemoPropertyRequest
var
metadata
runtime
.
ServerMetadata
...
...
@@ -461,76 +409,6 @@ func local_request_MemoService_RebuildMemoProperty_0(ctx context.Context, marsha
}
var
(
filter_MemoService_ListMemoTags_0
=
&
utilities
.
DoubleArray
{
Encoding
:
map
[
string
]
int
{
"parent"
:
0
},
Base
:
[]
int
{
1
,
1
,
0
},
Check
:
[]
int
{
0
,
1
,
2
}}
)
func
request_MemoService_ListMemoTags_0
(
ctx
context
.
Context
,
marshaler
runtime
.
Marshaler
,
client
MemoServiceClient
,
req
*
http
.
Request
,
pathParams
map
[
string
]
string
)
(
proto
.
Message
,
runtime
.
ServerMetadata
,
error
)
{
var
protoReq
ListMemoTagsRequest
var
metadata
runtime
.
ServerMetadata
var
(
val
string
ok
bool
err
error
_
=
err
)
val
,
ok
=
pathParams
[
"parent"
]
if
!
ok
{
return
nil
,
metadata
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"missing parameter %s"
,
"parent"
)
}
protoReq
.
Parent
,
err
=
runtime
.
String
(
val
)
if
err
!=
nil
{
return
nil
,
metadata
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"type mismatch, parameter: %s, error: %v"
,
"parent"
,
err
)
}
if
err
:=
req
.
ParseForm
();
err
!=
nil
{
return
nil
,
metadata
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"%v"
,
err
)
}
if
err
:=
runtime
.
PopulateQueryParameters
(
&
protoReq
,
req
.
Form
,
filter_MemoService_ListMemoTags_0
);
err
!=
nil
{
return
nil
,
metadata
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"%v"
,
err
)
}
msg
,
err
:=
client
.
ListMemoTags
(
ctx
,
&
protoReq
,
grpc
.
Header
(
&
metadata
.
HeaderMD
),
grpc
.
Trailer
(
&
metadata
.
TrailerMD
))
return
msg
,
metadata
,
err
}
func
local_request_MemoService_ListMemoTags_0
(
ctx
context
.
Context
,
marshaler
runtime
.
Marshaler
,
server
MemoServiceServer
,
req
*
http
.
Request
,
pathParams
map
[
string
]
string
)
(
proto
.
Message
,
runtime
.
ServerMetadata
,
error
)
{
var
protoReq
ListMemoTagsRequest
var
metadata
runtime
.
ServerMetadata
var
(
val
string
ok
bool
err
error
_
=
err
)
val
,
ok
=
pathParams
[
"parent"
]
if
!
ok
{
return
nil
,
metadata
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"missing parameter %s"
,
"parent"
)
}
protoReq
.
Parent
,
err
=
runtime
.
String
(
val
)
if
err
!=
nil
{
return
nil
,
metadata
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"type mismatch, parameter: %s, error: %v"
,
"parent"
,
err
)
}
if
err
:=
req
.
ParseForm
();
err
!=
nil
{
return
nil
,
metadata
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"%v"
,
err
)
}
if
err
:=
runtime
.
PopulateQueryParameters
(
&
protoReq
,
req
.
Form
,
filter_MemoService_ListMemoTags_0
);
err
!=
nil
{
return
nil
,
metadata
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"%v"
,
err
)
}
msg
,
err
:=
server
.
ListMemoTags
(
ctx
,
&
protoReq
)
return
msg
,
metadata
,
err
}
func
request_MemoService_RenameMemoTag_0
(
ctx
context
.
Context
,
marshaler
runtime
.
Marshaler
,
client
MemoServiceClient
,
req
*
http
.
Request
,
pathParams
map
[
string
]
string
)
(
proto
.
Message
,
runtime
.
ServerMetadata
,
error
)
{
var
protoReq
RenameMemoTagRequest
var
metadata
runtime
.
ServerMetadata
...
...
@@ -1338,31 +1216,6 @@ func RegisterMemoServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux
})
mux
.
Handle
(
"GET"
,
pattern_MemoService_ListMemoProperties_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
)
var
err
error
var
annotatedContext
context
.
Context
annotatedContext
,
err
=
runtime
.
AnnotateIncomingContext
(
ctx
,
mux
,
req
,
"/memos.api.v1.MemoService/ListMemoProperties"
,
runtime
.
WithHTTPPathPattern
(
"/api/v1/{name=memos/*}/properties"
))
if
err
!=
nil
{
runtime
.
HTTPError
(
ctx
,
mux
,
outboundMarshaler
,
w
,
req
,
err
)
return
}
resp
,
md
,
err
:=
local_request_MemoService_ListMemoProperties_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_ListMemoProperties_0
(
annotatedContext
,
mux
,
outboundMarshaler
,
w
,
req
,
resp
,
mux
.
GetForwardResponseOptions
()
...
)
})
mux
.
Handle
(
"POST"
,
pattern_MemoService_RebuildMemoProperty_0
,
func
(
w
http
.
ResponseWriter
,
req
*
http
.
Request
,
pathParams
map
[
string
]
string
)
{
ctx
,
cancel
:=
context
.
WithCancel
(
req
.
Context
())
defer
cancel
()
...
...
@@ -1388,31 +1241,6 @@ func RegisterMemoServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux
})
mux
.
Handle
(
"GET"
,
pattern_MemoService_ListMemoTags_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
)
var
err
error
var
annotatedContext
context
.
Context
annotatedContext
,
err
=
runtime
.
AnnotateIncomingContext
(
ctx
,
mux
,
req
,
"/memos.api.v1.MemoService/ListMemoTags"
,
runtime
.
WithHTTPPathPattern
(
"/api/v1/{parent=memos/*}/tags"
))
if
err
!=
nil
{
runtime
.
HTTPError
(
ctx
,
mux
,
outboundMarshaler
,
w
,
req
,
err
)
return
}
resp
,
md
,
err
:=
local_request_MemoService_ListMemoTags_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_ListMemoTags_0
(
annotatedContext
,
mux
,
outboundMarshaler
,
w
,
req
,
resp
,
mux
.
GetForwardResponseOptions
()
...
)
})
mux
.
Handle
(
"PATCH"
,
pattern_MemoService_RenameMemoTag_0
,
func
(
w
http
.
ResponseWriter
,
req
*
http
.
Request
,
pathParams
map
[
string
]
string
)
{
ctx
,
cancel
:=
context
.
WithCancel
(
req
.
Context
())
defer
cancel
()
...
...
@@ -1861,28 +1689,6 @@ func RegisterMemoServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux
})
mux
.
Handle
(
"GET"
,
pattern_MemoService_ListMemoProperties_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
)
var
err
error
var
annotatedContext
context
.
Context
annotatedContext
,
err
=
runtime
.
AnnotateContext
(
ctx
,
mux
,
req
,
"/memos.api.v1.MemoService/ListMemoProperties"
,
runtime
.
WithHTTPPathPattern
(
"/api/v1/{name=memos/*}/properties"
))
if
err
!=
nil
{
runtime
.
HTTPError
(
ctx
,
mux
,
outboundMarshaler
,
w
,
req
,
err
)
return
}
resp
,
md
,
err
:=
request_MemoService_ListMemoProperties_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_ListMemoProperties_0
(
annotatedContext
,
mux
,
outboundMarshaler
,
w
,
req
,
resp
,
mux
.
GetForwardResponseOptions
()
...
)
})
mux
.
Handle
(
"POST"
,
pattern_MemoService_RebuildMemoProperty_0
,
func
(
w
http
.
ResponseWriter
,
req
*
http
.
Request
,
pathParams
map
[
string
]
string
)
{
ctx
,
cancel
:=
context
.
WithCancel
(
req
.
Context
())
defer
cancel
()
...
...
@@ -1905,28 +1711,6 @@ func RegisterMemoServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux
})
mux
.
Handle
(
"GET"
,
pattern_MemoService_ListMemoTags_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
)
var
err
error
var
annotatedContext
context
.
Context
annotatedContext
,
err
=
runtime
.
AnnotateContext
(
ctx
,
mux
,
req
,
"/memos.api.v1.MemoService/ListMemoTags"
,
runtime
.
WithHTTPPathPattern
(
"/api/v1/{parent=memos/*}/tags"
))
if
err
!=
nil
{
runtime
.
HTTPError
(
ctx
,
mux
,
outboundMarshaler
,
w
,
req
,
err
)
return
}
resp
,
md
,
err
:=
request_MemoService_ListMemoTags_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_ListMemoTags_0
(
annotatedContext
,
mux
,
outboundMarshaler
,
w
,
req
,
resp
,
mux
.
GetForwardResponseOptions
()
...
)
})
mux
.
Handle
(
"PATCH"
,
pattern_MemoService_RenameMemoTag_0
,
func
(
w
http
.
ResponseWriter
,
req
*
http
.
Request
,
pathParams
map
[
string
]
string
)
{
ctx
,
cancel
:=
context
.
WithCancel
(
req
.
Context
())
defer
cancel
()
...
...
@@ -2185,12 +1969,8 @@ var (
pattern_MemoService_DeleteMemo_0
=
runtime
.
MustPattern
(
runtime
.
NewPattern
(
1
,
[]
int
{
2
,
0
,
2
,
1
,
2
,
2
,
1
,
0
,
4
,
2
,
5
,
3
},
[]
string
{
"api"
,
"v1"
,
"memos"
,
"name"
},
""
))
pattern_MemoService_ListMemoProperties_0
=
runtime
.
MustPattern
(
runtime
.
NewPattern
(
1
,
[]
int
{
2
,
0
,
2
,
1
,
2
,
2
,
1
,
0
,
4
,
2
,
5
,
3
,
2
,
4
},
[]
string
{
"api"
,
"v1"
,
"memos"
,
"name"
,
"properties"
},
""
))
pattern_MemoService_RebuildMemoProperty_0
=
runtime
.
MustPattern
(
runtime
.
NewPattern
(
1
,
[]
int
{
2
,
0
,
2
,
1
,
2
,
2
,
1
,
0
,
4
,
2
,
5
,
3
,
2
,
4
},
[]
string
{
"api"
,
"v1"
,
"memos"
,
"name"
,
"properties"
},
"rebuild"
))
pattern_MemoService_ListMemoTags_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"
,
"tags"
},
""
))
pattern_MemoService_RenameMemoTag_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"
,
"tags"
},
"rename"
))
pattern_MemoService_DeleteMemoTag_0
=
runtime
.
MustPattern
(
runtime
.
NewPattern
(
1
,
[]
int
{
2
,
0
,
2
,
1
,
2
,
2
,
1
,
0
,
4
,
2
,
5
,
3
,
2
,
4
,
1
,
0
,
4
,
1
,
5
,
5
},
[]
string
{
"api"
,
"v1"
,
"memos"
,
"parent"
,
"tags"
,
"tag"
},
""
))
...
...
@@ -2227,12 +2007,8 @@ var (
forward_MemoService_DeleteMemo_0
=
runtime
.
ForwardResponseMessage
forward_MemoService_ListMemoProperties_0
=
runtime
.
ForwardResponseMessage
forward_MemoService_RebuildMemoProperty_0
=
runtime
.
ForwardResponseMessage
forward_MemoService_ListMemoTags_0
=
runtime
.
ForwardResponseMessage
forward_MemoService_RenameMemoTag_0
=
runtime
.
ForwardResponseMessage
forward_MemoService_DeleteMemoTag_0
=
runtime
.
ForwardResponseMessage
...
...
proto/gen/api/v1/memo_service_grpc.pb.go
View file @
d11e7a3a
...
...
@@ -26,9 +26,7 @@ const (
MemoService_GetMemoByUid_FullMethodName
=
"/memos.api.v1.MemoService/GetMemoByUid"
MemoService_UpdateMemo_FullMethodName
=
"/memos.api.v1.MemoService/UpdateMemo"
MemoService_DeleteMemo_FullMethodName
=
"/memos.api.v1.MemoService/DeleteMemo"
MemoService_ListMemoProperties_FullMethodName
=
"/memos.api.v1.MemoService/ListMemoProperties"
MemoService_RebuildMemoProperty_FullMethodName
=
"/memos.api.v1.MemoService/RebuildMemoProperty"
MemoService_ListMemoTags_FullMethodName
=
"/memos.api.v1.MemoService/ListMemoTags"
MemoService_RenameMemoTag_FullMethodName
=
"/memos.api.v1.MemoService/RenameMemoTag"
MemoService_DeleteMemoTag_FullMethodName
=
"/memos.api.v1.MemoService/DeleteMemoTag"
MemoService_SetMemoResources_FullMethodName
=
"/memos.api.v1.MemoService/SetMemoResources"
...
...
@@ -58,12 +56,8 @@ type MemoServiceClient interface {
UpdateMemo
(
ctx
context
.
Context
,
in
*
UpdateMemoRequest
,
opts
...
grpc
.
CallOption
)
(
*
Memo
,
error
)
// DeleteMemo deletes a memo.
DeleteMemo
(
ctx
context
.
Context
,
in
*
DeleteMemoRequest
,
opts
...
grpc
.
CallOption
)
(
*
emptypb
.
Empty
,
error
)
// ListMemoProperties lists memo properties.
ListMemoProperties
(
ctx
context
.
Context
,
in
*
ListMemoPropertiesRequest
,
opts
...
grpc
.
CallOption
)
(
*
ListMemoPropertiesResponse
,
error
)
// RebuildMemoProperty rebuilds a memo property.
RebuildMemoProperty
(
ctx
context
.
Context
,
in
*
RebuildMemoPropertyRequest
,
opts
...
grpc
.
CallOption
)
(
*
emptypb
.
Empty
,
error
)
// ListMemoTags lists tags for a memo.
ListMemoTags
(
ctx
context
.
Context
,
in
*
ListMemoTagsRequest
,
opts
...
grpc
.
CallOption
)
(
*
ListMemoTagsResponse
,
error
)
// RenameMemoTag renames a tag for a memo.
RenameMemoTag
(
ctx
context
.
Context
,
in
*
RenameMemoTagRequest
,
opts
...
grpc
.
CallOption
)
(
*
emptypb
.
Empty
,
error
)
// DeleteMemoTag deletes a tag for a memo.
...
...
@@ -156,16 +150,6 @@ func (c *memoServiceClient) DeleteMemo(ctx context.Context, in *DeleteMemoReques
return
out
,
nil
}
func
(
c
*
memoServiceClient
)
ListMemoProperties
(
ctx
context
.
Context
,
in
*
ListMemoPropertiesRequest
,
opts
...
grpc
.
CallOption
)
(
*
ListMemoPropertiesResponse
,
error
)
{
cOpts
:=
append
([]
grpc
.
CallOption
{
grpc
.
StaticMethod
()},
opts
...
)
out
:=
new
(
ListMemoPropertiesResponse
)
err
:=
c
.
cc
.
Invoke
(
ctx
,
MemoService_ListMemoProperties_FullMethodName
,
in
,
out
,
cOpts
...
)
if
err
!=
nil
{
return
nil
,
err
}
return
out
,
nil
}
func
(
c
*
memoServiceClient
)
RebuildMemoProperty
(
ctx
context
.
Context
,
in
*
RebuildMemoPropertyRequest
,
opts
...
grpc
.
CallOption
)
(
*
emptypb
.
Empty
,
error
)
{
cOpts
:=
append
([]
grpc
.
CallOption
{
grpc
.
StaticMethod
()},
opts
...
)
out
:=
new
(
emptypb
.
Empty
)
...
...
@@ -176,16 +160,6 @@ func (c *memoServiceClient) RebuildMemoProperty(ctx context.Context, in *Rebuild
return
out
,
nil
}
func
(
c
*
memoServiceClient
)
ListMemoTags
(
ctx
context
.
Context
,
in
*
ListMemoTagsRequest
,
opts
...
grpc
.
CallOption
)
(
*
ListMemoTagsResponse
,
error
)
{
cOpts
:=
append
([]
grpc
.
CallOption
{
grpc
.
StaticMethod
()},
opts
...
)
out
:=
new
(
ListMemoTagsResponse
)
err
:=
c
.
cc
.
Invoke
(
ctx
,
MemoService_ListMemoTags_FullMethodName
,
in
,
out
,
cOpts
...
)
if
err
!=
nil
{
return
nil
,
err
}
return
out
,
nil
}
func
(
c
*
memoServiceClient
)
RenameMemoTag
(
ctx
context
.
Context
,
in
*
RenameMemoTagRequest
,
opts
...
grpc
.
CallOption
)
(
*
emptypb
.
Empty
,
error
)
{
cOpts
:=
append
([]
grpc
.
CallOption
{
grpc
.
StaticMethod
()},
opts
...
)
out
:=
new
(
emptypb
.
Empty
)
...
...
@@ -312,12 +286,8 @@ type MemoServiceServer interface {
UpdateMemo
(
context
.
Context
,
*
UpdateMemoRequest
)
(
*
Memo
,
error
)
// DeleteMemo deletes a memo.
DeleteMemo
(
context
.
Context
,
*
DeleteMemoRequest
)
(
*
emptypb
.
Empty
,
error
)
// ListMemoProperties lists memo properties.
ListMemoProperties
(
context
.
Context
,
*
ListMemoPropertiesRequest
)
(
*
ListMemoPropertiesResponse
,
error
)
// RebuildMemoProperty rebuilds a memo property.
RebuildMemoProperty
(
context
.
Context
,
*
RebuildMemoPropertyRequest
)
(
*
emptypb
.
Empty
,
error
)
// ListMemoTags lists tags for a memo.
ListMemoTags
(
context
.
Context
,
*
ListMemoTagsRequest
)
(
*
ListMemoTagsResponse
,
error
)
// RenameMemoTag renames a tag for a memo.
RenameMemoTag
(
context
.
Context
,
*
RenameMemoTagRequest
)
(
*
emptypb
.
Empty
,
error
)
// DeleteMemoTag deletes a tag for a memo.
...
...
@@ -368,15 +338,9 @@ func (UnimplementedMemoServiceServer) UpdateMemo(context.Context, *UpdateMemoReq
func
(
UnimplementedMemoServiceServer
)
DeleteMemo
(
context
.
Context
,
*
DeleteMemoRequest
)
(
*
emptypb
.
Empty
,
error
)
{
return
nil
,
status
.
Errorf
(
codes
.
Unimplemented
,
"method DeleteMemo not implemented"
)
}
func
(
UnimplementedMemoServiceServer
)
ListMemoProperties
(
context
.
Context
,
*
ListMemoPropertiesRequest
)
(
*
ListMemoPropertiesResponse
,
error
)
{
return
nil
,
status
.
Errorf
(
codes
.
Unimplemented
,
"method ListMemoProperties not implemented"
)
}
func
(
UnimplementedMemoServiceServer
)
RebuildMemoProperty
(
context
.
Context
,
*
RebuildMemoPropertyRequest
)
(
*
emptypb
.
Empty
,
error
)
{
return
nil
,
status
.
Errorf
(
codes
.
Unimplemented
,
"method RebuildMemoProperty not implemented"
)
}
func
(
UnimplementedMemoServiceServer
)
ListMemoTags
(
context
.
Context
,
*
ListMemoTagsRequest
)
(
*
ListMemoTagsResponse
,
error
)
{
return
nil
,
status
.
Errorf
(
codes
.
Unimplemented
,
"method ListMemoTags not implemented"
)
}
func
(
UnimplementedMemoServiceServer
)
RenameMemoTag
(
context
.
Context
,
*
RenameMemoTagRequest
)
(
*
emptypb
.
Empty
,
error
)
{
return
nil
,
status
.
Errorf
(
codes
.
Unimplemented
,
"method RenameMemoTag not implemented"
)
}
...
...
@@ -539,24 +503,6 @@ func _MemoService_DeleteMemo_Handler(srv interface{}, ctx context.Context, dec f
return
interceptor
(
ctx
,
in
,
info
,
handler
)
}
func
_MemoService_ListMemoProperties_Handler
(
srv
interface
{},
ctx
context
.
Context
,
dec
func
(
interface
{})
error
,
interceptor
grpc
.
UnaryServerInterceptor
)
(
interface
{},
error
)
{
in
:=
new
(
ListMemoPropertiesRequest
)
if
err
:=
dec
(
in
);
err
!=
nil
{
return
nil
,
err
}
if
interceptor
==
nil
{
return
srv
.
(
MemoServiceServer
)
.
ListMemoProperties
(
ctx
,
in
)
}
info
:=
&
grpc
.
UnaryServerInfo
{
Server
:
srv
,
FullMethod
:
MemoService_ListMemoProperties_FullMethodName
,
}
handler
:=
func
(
ctx
context
.
Context
,
req
interface
{})
(
interface
{},
error
)
{
return
srv
.
(
MemoServiceServer
)
.
ListMemoProperties
(
ctx
,
req
.
(
*
ListMemoPropertiesRequest
))
}
return
interceptor
(
ctx
,
in
,
info
,
handler
)
}
func
_MemoService_RebuildMemoProperty_Handler
(
srv
interface
{},
ctx
context
.
Context
,
dec
func
(
interface
{})
error
,
interceptor
grpc
.
UnaryServerInterceptor
)
(
interface
{},
error
)
{
in
:=
new
(
RebuildMemoPropertyRequest
)
if
err
:=
dec
(
in
);
err
!=
nil
{
...
...
@@ -575,24 +521,6 @@ func _MemoService_RebuildMemoProperty_Handler(srv interface{}, ctx context.Conte
return
interceptor
(
ctx
,
in
,
info
,
handler
)
}
func
_MemoService_ListMemoTags_Handler
(
srv
interface
{},
ctx
context
.
Context
,
dec
func
(
interface
{})
error
,
interceptor
grpc
.
UnaryServerInterceptor
)
(
interface
{},
error
)
{
in
:=
new
(
ListMemoTagsRequest
)
if
err
:=
dec
(
in
);
err
!=
nil
{
return
nil
,
err
}
if
interceptor
==
nil
{
return
srv
.
(
MemoServiceServer
)
.
ListMemoTags
(
ctx
,
in
)
}
info
:=
&
grpc
.
UnaryServerInfo
{
Server
:
srv
,
FullMethod
:
MemoService_ListMemoTags_FullMethodName
,
}
handler
:=
func
(
ctx
context
.
Context
,
req
interface
{})
(
interface
{},
error
)
{
return
srv
.
(
MemoServiceServer
)
.
ListMemoTags
(
ctx
,
req
.
(
*
ListMemoTagsRequest
))
}
return
interceptor
(
ctx
,
in
,
info
,
handler
)
}
func
_MemoService_RenameMemoTag_Handler
(
srv
interface
{},
ctx
context
.
Context
,
dec
func
(
interface
{})
error
,
interceptor
grpc
.
UnaryServerInterceptor
)
(
interface
{},
error
)
{
in
:=
new
(
RenameMemoTagRequest
)
if
err
:=
dec
(
in
);
err
!=
nil
{
...
...
@@ -822,18 +750,10 @@ var MemoService_ServiceDesc = grpc.ServiceDesc{
MethodName
:
"DeleteMemo"
,
Handler
:
_MemoService_DeleteMemo_Handler
,
},
{
MethodName
:
"ListMemoProperties"
,
Handler
:
_MemoService_ListMemoProperties_Handler
,
},
{
MethodName
:
"RebuildMemoProperty"
,
Handler
:
_MemoService_RebuildMemoProperty_Handler
,
},
{
MethodName
:
"ListMemoTags"
,
Handler
:
_MemoService_ListMemoTags_Handler
,
},
{
MethodName
:
"RenameMemoTag"
,
Handler
:
_MemoService_RenameMemoTag_Handler
,
...
...
proto/gen/apidocs.swagger.yaml
View file @
d11e7a3a
...
...
@@ -313,6 +313,20 @@ paths:
in: query
required: false
type: string
-
name
:
view
description
:
|-
The view of the memo.
- MEMO_VIEW_FULL: The full view of the memo. Includes all fields.
- MEMO_VIEW_METADATA_ONLY: The metadata only view of the memo. Excludes the content/snippet fields.
in: query
required: false
type: string
enum:
- MEMO_VIEW_UNSPECIFIED
- MEMO_VIEW_FULL
- MEMO_VIEW_METADATA_ONLY
default: MEMO_VIEW_UNSPECIFIED
tags
:
-
MemoService
post
:
...
...
@@ -1253,30 +1267,6 @@ paths:
$ref
:
'
#/definitions/v1CreateMemoRequest'
tags
:
-
MemoService
/api/v1/{name}/properties
:
get
:
summary
:
ListMemoProperties lists memo properties.
operationId
:
MemoService_ListMemoProperties
responses
:
"
200"
:
description
:
A successful response.
schema
:
$ref
:
'
#/definitions/v1ListMemoPropertiesResponse'
default
:
description
:
An unexpected error response.
schema
:
$ref
:
'
#/definitions/googlerpcStatus'
parameters
:
-
name
:
name
description
:
|-
The name of the memo.
Format: memos/{id}. Use "memos/-" to list all properties.
in: path
required: true
type: string
pattern: memos/[^/]+
tags
:
-
MemoService
/api/v1/{name}/properties:rebuild
:
post
:
summary
:
RebuildMemoProperty rebuilds a memo property.
...
...
@@ -1489,37 +1479,6 @@ paths:
pattern: users/[^/]+
tags
:
-
UserService
/api/v1/{parent}/tags
:
get
:
summary
:
ListMemoTags lists tags for a memo.
operationId
:
MemoService_ListMemoTags
responses
:
"
200"
:
description
:
A successful response.
schema
:
$ref
:
'
#/definitions/v1ListMemoTagsResponse'
default
:
description
:
An unexpected error response.
schema
:
$ref
:
'
#/definitions/googlerpcStatus'
parameters
:
-
name
:
parent
description
:
|-
The parent, who owns the tags.
Format: memos/{id}. Use "memos/-" to list all tags.
in: path
required: true
type: string
pattern: memos/[^/]+
-
name
:
filter
description
:
|-
Filter is used to filter memos.
Format: "creator == 'users/{uid}' && visibilities == ['PUBLIC', 'PROTECTED']"
in: query
required: false
type: string
tags
:
-
MemoService
/api/v1/{parent}/tags/{tag}
:
delete
:
summary
:
DeleteMemoTag deletes a tag for a memo.
...
...
@@ -2532,14 +2491,6 @@ definitions:
items
:
type
:
object
$ref
:
'
#/definitions/v1Memo'
v1ListMemoPropertiesResponse
:
type
:
object
properties
:
entities
:
type
:
array
items
:
type
:
object
$ref
:
'
#/definitions/v1MemoPropertyEntity'
v1ListMemoReactionsResponse
:
type
:
object
properties
:
...
...
@@ -2564,18 +2515,6 @@ definitions:
items
:
type
:
object
$ref
:
'
#/definitions/v1Resource'
v1ListMemoTagsResponse
:
type
:
object
properties
:
tagAmounts
:
type
:
object
additionalProperties
:
type
:
integer
format
:
int32
description
:
|-
tag_amounts is the amount of tags.
key is the tag name. e.g. "tag1".
value is the amount of the tag.
v1ListMemosResponse
:
type
:
object
properties
:
...
...
@@ -2734,21 +2673,6 @@ definitions:
type
:
boolean
hasIncompleteTasks
:
type
:
boolean
v1MemoPropertyEntity
:
type
:
object
properties
:
name
:
type
:
string
title
:
|-
The name of the memo property.
Format: memos/{id}/properties/{property_id}
property
:
$ref
:
'
#/definitions/v1MemoProperty'
readOnly
:
true
displayTime
:
type
:
string
format
:
date-time
readOnly
:
true
v1MemoRelation
:
type
:
object
properties
:
...
...
@@ -2771,6 +2695,16 @@ definitions:
-
REFERENCE
-
COMMENT
default
:
TYPE_UNSPECIFIED
v1MemoView
:
type
:
string
enum
:
-
MEMO_VIEW_UNSPECIFIED
-
MEMO_VIEW_FULL
-
MEMO_VIEW_METADATA_ONLY
default
:
MEMO_VIEW_UNSPECIFIED
description
:
|2-
- MEMO_VIEW_FULL: The full view of the memo. Includes all fields.
- MEMO_VIEW_METADATA_ONLY: The metadata only view of the memo. Excludes the content/snippet fields.
v1Node
:
type
:
object
properties
:
...
...
server/router/api/v1/acl_config.go
View file @
d11e7a3a
...
...
@@ -17,7 +17,6 @@ var authenticationAllowlistMethods = map[string]bool{
"/memos.api.v1.MemoService/GetMemo"
:
true
,
"/memos.api.v1.MemoService/GetMemoByUid"
:
true
,
"/memos.api.v1.MemoService/ListMemos"
:
true
,
"/memos.api.v1.MemoService/ListMemoTags"
:
true
,
"/memos.api.v1.MarkdownService/GetLinkMetadata"
:
true
,
"/memos.api.v1.ResourceService/GetResourceBinary"
:
true
,
"/memos.api.v1.ResourceService/GetResourceByUid"
:
true
,
...
...
server/router/api/v1/memo_service.go
View file @
d11e7a3a
...
...
@@ -93,7 +93,7 @@ func (s *APIV1Service) CreateMemo(ctx context.Context, request *v1pb.CreateMemoR
}
}
memoMessage
,
err
:=
s
.
convertMemoFromStore
(
ctx
,
memo
)
memoMessage
,
err
:=
s
.
convertMemoFromStore
(
ctx
,
memo
,
v1pb
.
MemoView_MEMO_VIEW_FULL
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"failed to convert memo"
)
}
...
...
@@ -131,6 +131,9 @@ func (s *APIV1Service) ListMemos(ctx context.Context, request *v1pb.ListMemosReq
limitPlusOne
:=
limit
+
1
memoFind
.
Limit
=
&
limitPlusOne
memoFind
.
Offset
=
&
offset
if
request
.
View
==
v1pb
.
MemoView_MEMO_VIEW_METADATA_ONLY
{
memoFind
.
ExcludeContent
=
true
}
memos
,
err
:=
s
.
Store
.
ListMemos
(
ctx
,
memoFind
)
if
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
Internal
,
"failed to list memos: %v"
,
err
)
...
...
@@ -146,7 +149,7 @@ func (s *APIV1Service) ListMemos(ctx context.Context, request *v1pb.ListMemosReq
}
}
for
_
,
memo
:=
range
memos
{
memoMessage
,
err
:=
s
.
convertMemoFromStore
(
ctx
,
memo
)
memoMessage
,
err
:=
s
.
convertMemoFromStore
(
ctx
,
memo
,
request
.
View
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"failed to convert memo"
)
}
...
...
@@ -187,7 +190,7 @@ func (s *APIV1Service) GetMemo(ctx context.Context, request *v1pb.GetMemoRequest
}
}
memoMessage
,
err
:=
s
.
convertMemoFromStore
(
ctx
,
memo
)
memoMessage
,
err
:=
s
.
convertMemoFromStore
(
ctx
,
memo
,
v1pb
.
MemoView_MEMO_VIEW_FULL
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"failed to convert memo"
)
}
...
...
@@ -218,7 +221,7 @@ func (s *APIV1Service) GetMemoByUid(ctx context.Context, request *v1pb.GetMemoBy
}
}
memoMessage
,
err
:=
s
.
convertMemoFromStore
(
ctx
,
memo
)
memoMessage
,
err
:=
s
.
convertMemoFromStore
(
ctx
,
memo
,
v1pb
.
MemoView_MEMO_VIEW_FULL
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"failed to convert memo"
)
}
...
...
@@ -347,7 +350,7 @@ func (s *APIV1Service) UpdateMemo(ctx context.Context, request *v1pb.UpdateMemoR
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"failed to get memo"
)
}
memoMessage
,
err
:=
s
.
convertMemoFromStore
(
ctx
,
memo
)
memoMessage
,
err
:=
s
.
convertMemoFromStore
(
ctx
,
memo
,
v1pb
.
MemoView_MEMO_VIEW_FULL
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"failed to convert memo"
)
}
...
...
@@ -383,7 +386,7 @@ func (s *APIV1Service) DeleteMemo(ctx context.Context, request *v1pb.DeleteMemoR
return
nil
,
status
.
Errorf
(
codes
.
PermissionDenied
,
"permission denied"
)
}
if
memoMessage
,
err
:=
s
.
convertMemoFromStore
(
ctx
,
memo
);
err
==
nil
{
if
memoMessage
,
err
:=
s
.
convertMemoFromStore
(
ctx
,
memo
,
v1pb
.
MemoView_MEMO_VIEW_METADATA_ONLY
);
err
==
nil
{
// Try to dispatch webhook when memo is deleted.
if
err
:=
s
.
DispatchMemoDeletedWebhook
(
ctx
,
memoMessage
);
err
!=
nil
{
slog
.
Warn
(
"Failed to dispatch memo deleted webhook"
,
slog
.
Any
(
"err"
,
err
))
...
...
@@ -518,7 +521,7 @@ func (s *APIV1Service) ListMemoComments(ctx context.Context, request *v1pb.ListM
return
nil
,
status
.
Errorf
(
codes
.
Internal
,
"failed to get memo"
)
}
if
memo
!=
nil
{
memoMessage
,
err
:=
s
.
convertMemoFromStore
(
ctx
,
memo
)
memoMessage
,
err
:=
s
.
convertMemoFromStore
(
ctx
,
memo
,
v1pb
.
MemoView_MEMO_VIEW_FULL
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"failed to convert memo"
)
}
...
...
@@ -532,58 +535,6 @@ func (s *APIV1Service) ListMemoComments(ctx context.Context, request *v1pb.ListM
return
response
,
nil
}
func
(
s
*
APIV1Service
)
ListMemoProperties
(
ctx
context
.
Context
,
request
*
v1pb
.
ListMemoPropertiesRequest
)
(
*
v1pb
.
ListMemoPropertiesResponse
,
error
)
{
user
,
err
:=
s
.
GetCurrentUser
(
ctx
)
if
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
Internal
,
"failed to get current user"
)
}
normalRowStatus
:=
store
.
Normal
memoFind
:=
&
store
.
FindMemo
{
CreatorID
:
&
user
.
ID
,
RowStatus
:
&
normalRowStatus
,
ExcludeComments
:
true
,
// Default exclude content for performance.
ExcludeContent
:
true
,
}
if
request
.
Name
!=
"memos/-"
{
memoID
,
err
:=
ExtractMemoIDFromName
(
request
.
Name
)
if
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"invalid memo name: %v"
,
err
)
}
memoFind
.
ID
=
&
memoID
}
memos
,
err
:=
s
.
Store
.
ListMemos
(
ctx
,
memoFind
)
if
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
Internal
,
"failed to list memos"
)
}
workspaceMemoRelatedSetting
,
err
:=
s
.
Store
.
GetWorkspaceMemoRelatedSetting
(
ctx
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"failed to get workspace memo related setting"
)
}
entities
:=
[]
*
v1pb
.
MemoPropertyEntity
{}
for
_
,
memo
:=
range
memos
{
displayTs
:=
memo
.
CreatedTs
if
workspaceMemoRelatedSetting
.
DisplayWithUpdateTime
{
displayTs
=
memo
.
UpdatedTs
}
entity
:=
&
v1pb
.
MemoPropertyEntity
{
Name
:
fmt
.
Sprintf
(
"%s%d"
,
MemoNamePrefix
,
memo
.
ID
),
DisplayTime
:
timestamppb
.
New
(
time
.
Unix
(
displayTs
,
0
)),
}
if
memo
.
Payload
.
Property
!=
nil
{
entity
.
Property
=
convertMemoPropertyFromStore
(
memo
.
Payload
.
Property
)
}
entities
=
append
(
entities
,
entity
)
}
return
&
v1pb
.
ListMemoPropertiesResponse
{
Entities
:
entities
,
},
nil
}
func
(
s
*
APIV1Service
)
RebuildMemoProperty
(
ctx
context
.
Context
,
request
*
v1pb
.
RebuildMemoPropertyRequest
)
(
*
emptypb
.
Empty
,
error
)
{
user
,
err
:=
s
.
GetCurrentUser
(
ctx
)
if
err
!=
nil
{
...
...
@@ -626,42 +577,6 @@ func (s *APIV1Service) RebuildMemoProperty(ctx context.Context, request *v1pb.Re
return
&
emptypb
.
Empty
{},
nil
}
func
(
s
*
APIV1Service
)
ListMemoTags
(
ctx
context
.
Context
,
request
*
v1pb
.
ListMemoTagsRequest
)
(
*
v1pb
.
ListMemoTagsResponse
,
error
)
{
normalRowStatus
:=
store
.
Normal
memoFind
:=
&
store
.
FindMemo
{
RowStatus
:
&
normalRowStatus
,
ExcludeComments
:
true
,
// Default exclude content for performance.
ExcludeContent
:
true
,
}
if
(
request
.
Parent
)
!=
"memos/-"
{
memoID
,
err
:=
ExtractMemoIDFromName
(
request
.
Parent
)
if
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"invalid memo name: %v"
,
err
)
}
memoFind
.
ID
=
&
memoID
}
if
err
:=
s
.
buildMemoFindWithFilter
(
ctx
,
memoFind
,
request
.
Filter
);
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"failed to build find memos with filter: %v"
,
err
)
}
memos
,
err
:=
s
.
Store
.
ListMemos
(
ctx
,
memoFind
)
if
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
Internal
,
"failed to list memos"
)
}
tagAmounts
:=
map
[
string
]
int32
{}
for
_
,
memo
:=
range
memos
{
if
memo
.
Payload
.
Property
!=
nil
{
for
_
,
tag
:=
range
memo
.
Payload
.
Property
.
Tags
{
tagAmounts
[
tag
]
++
}
}
}
return
&
v1pb
.
ListMemoTagsResponse
{
TagAmounts
:
tagAmounts
,
},
nil
}
func
(
s
*
APIV1Service
)
RenameMemoTag
(
ctx
context
.
Context
,
request
*
v1pb
.
RenameMemoTagRequest
)
(
*
emptypb
.
Empty
,
error
)
{
user
,
err
:=
s
.
GetCurrentUser
(
ctx
)
if
err
!=
nil
{
...
...
@@ -762,7 +677,7 @@ func (s *APIV1Service) DeleteMemoTag(ctx context.Context, request *v1pb.DeleteMe
return
&
emptypb
.
Empty
{},
nil
}
func
(
s
*
APIV1Service
)
convertMemoFromStore
(
ctx
context
.
Context
,
memo
*
store
.
Memo
)
(
*
v1pb
.
Memo
,
error
)
{
func
(
s
*
APIV1Service
)
convertMemoFromStore
(
ctx
context
.
Context
,
memo
*
store
.
Memo
,
view
v1pb
.
MemoView
)
(
*
v1pb
.
Memo
,
error
)
{
displayTs
:=
memo
.
CreatedTs
workspaceMemoRelatedSetting
,
err
:=
s
.
Store
.
GetWorkspaceMemoRelatedSetting
(
ctx
)
if
err
!=
nil
{
...
...
@@ -773,31 +688,6 @@ func (s *APIV1Service) convertMemoFromStore(ctx context.Context, memo *store.Mem
}
name
:=
fmt
.
Sprintf
(
"%s%d"
,
MemoNamePrefix
,
memo
.
ID
)
listMemoRelationsResponse
,
err
:=
s
.
ListMemoRelations
(
ctx
,
&
v1pb
.
ListMemoRelationsRequest
{
Name
:
name
})
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"failed to list memo relations"
)
}
listMemoResourcesResponse
,
err
:=
s
.
ListMemoResources
(
ctx
,
&
v1pb
.
ListMemoResourcesRequest
{
Name
:
name
})
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"failed to list memo resources"
)
}
listMemoReactionsResponse
,
err
:=
s
.
ListMemoReactions
(
ctx
,
&
v1pb
.
ListMemoReactionsRequest
{
Name
:
name
})
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"failed to list memo reactions"
)
}
nodes
,
err
:=
parser
.
Parse
(
tokenizer
.
Tokenize
(
memo
.
Content
))
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"failed to parse content"
)
}
snippet
,
err
:=
getMemoContentSnippet
(
memo
.
Content
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"failed to get memo content snippet"
)
}
memoMessage
:=
&
v1pb
.
Memo
{
Name
:
name
,
Uid
:
memo
.
UID
,
...
...
@@ -807,13 +697,8 @@ func (s *APIV1Service) convertMemoFromStore(ctx context.Context, memo *store.Mem
UpdateTime
:
timestamppb
.
New
(
time
.
Unix
(
memo
.
UpdatedTs
,
0
)),
DisplayTime
:
timestamppb
.
New
(
time
.
Unix
(
displayTs
,
0
)),
Content
:
memo
.
Content
,
Snippet
:
snippet
,
Nodes
:
convertFromASTNodes
(
nodes
),
Visibility
:
convertVisibilityFromStore
(
memo
.
Visibility
),
Pinned
:
memo
.
Pinned
,
Relations
:
listMemoRelationsResponse
.
Relations
,
Resources
:
listMemoResourcesResponse
.
Resources
,
Reactions
:
listMemoReactionsResponse
.
Reactions
,
}
if
memo
.
Payload
!=
nil
{
memoMessage
.
Property
=
convertMemoPropertyFromStore
(
memo
.
Payload
.
Property
)
...
...
@@ -823,6 +708,40 @@ func (s *APIV1Service) convertMemoFromStore(ctx context.Context, memo *store.Mem
parent
:=
fmt
.
Sprintf
(
"%s%d"
,
MemoNamePrefix
,
*
memo
.
ParentID
)
memoMessage
.
Parent
=
&
parent
}
// Fill content when view is MEMO_VIEW_FULL.
if
view
==
v1pb
.
MemoView_MEMO_VIEW_FULL
{
listMemoRelationsResponse
,
err
:=
s
.
ListMemoRelations
(
ctx
,
&
v1pb
.
ListMemoRelationsRequest
{
Name
:
name
})
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"failed to list memo relations"
)
}
memoMessage
.
Relations
=
listMemoRelationsResponse
.
Relations
listMemoResourcesResponse
,
err
:=
s
.
ListMemoResources
(
ctx
,
&
v1pb
.
ListMemoResourcesRequest
{
Name
:
name
})
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"failed to list memo resources"
)
}
memoMessage
.
Resources
=
listMemoResourcesResponse
.
Resources
listMemoReactionsResponse
,
err
:=
s
.
ListMemoReactions
(
ctx
,
&
v1pb
.
ListMemoReactionsRequest
{
Name
:
name
})
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"failed to list memo reactions"
)
}
memoMessage
.
Reactions
=
listMemoReactionsResponse
.
Reactions
nodes
,
err
:=
parser
.
Parse
(
tokenizer
.
Tokenize
(
memo
.
Content
))
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"failed to parse content"
)
}
memoMessage
.
Nodes
=
convertFromASTNodes
(
nodes
)
snippet
,
err
:=
getMemoContentSnippet
(
memo
.
Content
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"failed to get memo content snippet"
)
}
memoMessage
.
Snippet
=
snippet
}
return
memoMessage
,
nil
}
...
...
web/src/components/UserStatisticsView.tsx
View file @
d11e7a3a
...
...
@@ -20,10 +20,14 @@ import useAsyncEffect from "@/hooks/useAsyncEffect";
import
useCurrentUser
from
"@/hooks/useCurrentUser"
;
import
i18n
from
"@/i18n"
;
import
{
useMemoFilterStore
,
useMemoList
,
useMemoStore
}
from
"@/store/v1"
;
import
{
MemoView
}
from
"@/types/proto/api/v1/memo_service"
;
import
{
useTranslate
}
from
"@/utils/i18n"
;
import
ActivityCalendar
from
"./ActivityCalendar"
;
import
{
Popover
,
PopoverContent
,
PopoverTrigger
}
from
"./ui/Popover"
;
// Set the maximum number of memos to fetch.
const
DEFAULT_MEMO_PAGE_SIZE
=
1000000
;
interface
UserMemoStats
{
link
:
number
;
taskList
:
number
;
...
...
@@ -47,12 +51,13 @@ const UserStatisticsView = () => {
useAsyncEffect
(
async
()
=>
{
if
(
memoList
.
size
()
===
0
)
return
;
const
{
entities
}
=
await
memoServiceClient
.
listMemoProperties
({
name
:
`memos/-`
,
const
{
memos
}
=
await
memoServiceClient
.
listMemos
({
pageSize
:
DEFAULT_MEMO_PAGE_SIZE
,
view
:
MemoView
.
MEMO_VIEW_METADATA_ONLY
,
});
const
memoStats
:
UserMemoStats
=
{
link
:
0
,
taskList
:
0
,
code
:
0
,
incompleteTasks
:
0
};
entities
.
forEach
((
entity
)
=>
{
const
{
property
}
=
entity
;
memos
.
forEach
((
memo
)
=>
{
const
{
property
}
=
memo
;
if
(
property
?.
hasLink
)
{
memoStats
.
link
+=
1
;
}
...
...
@@ -67,11 +72,11 @@ const UserStatisticsView = () => {
}
});
setMemoStats
(
memoStats
);
setMemoAmount
(
entitie
s
.
length
);
setActivityStats
(
countBy
(
entities
.
map
((
entity
)
=>
dayjs
(
entity
.
displayTime
).
format
(
"YYYY-MM-DD"
))));
setMemoAmount
(
memo
s
.
length
);
setActivityStats
(
countBy
(
memos
.
map
((
memo
)
=>
dayjs
(
memo
.
displayTime
).
format
(
"YYYY-MM-DD"
))));
},
[
memoStore
.
stateId
]);
const
rebuildMemo
Tags
=
async
()
=>
{
const
rebuildMemo
Property
=
async
()
=>
{
await
memoServiceClient
.
rebuildMemoProperty
({
name
:
"memos/-"
,
});
...
...
@@ -112,7 +117,7 @@ const UserStatisticsView = () => {
<
MoreVerticalIcon
className=
"w-4 h-auto shrink-0 opacity-60"
/>
</
PopoverTrigger
>
<
PopoverContent
align=
"end"
alignOffset=
{
-
12
}
>
<
button
className=
"w-auto flex flex-row justify-between items-center gap-2 hover:opacity-80"
onClick=
{
rebuildMemo
Tags
}
>
<
button
className=
"w-auto flex flex-row justify-between items-center gap-2 hover:opacity-80"
onClick=
{
rebuildMemo
Property
}
>
<
RefreshCcwIcon
className=
"text-gray-400 w-4 h-auto cursor-pointer opacity-60"
/>
<
span
className=
"text-sm shrink-0 text-gray-500 dark:text-gray-400"
>
Rebuild properties
</
span
>
</
button
>
...
...
web/src/store/v1/tag.ts
View file @
d11e7a3a
...
...
@@ -3,8 +3,12 @@ import { create } from "zustand";
import
{
combine
}
from
"zustand/middleware"
;
import
{
memoServiceClient
}
from
"@/grpcweb"
;
import
{
Routes
}
from
"@/router"
;
import
{
MemoView
}
from
"@/types/proto/api/v1/memo_service"
;
import
{
User
}
from
"@/types/proto/api/v1/user_service"
;
// Set the maximum number of memos to fetch.
const
DEFAULT_MEMO_PAGE_SIZE
=
1000000
;
interface
State
{
tagAmounts
:
Record
<
string
,
number
>
;
}
...
...
@@ -37,7 +41,21 @@ export const useTagStore = create(
}
else
{
filters
.
push
(
`visibilities == ["PUBLIC"]`
);
}
const
{
tagAmounts
}
=
await
memoServiceClient
.
listMemoTags
({
parent
:
"memos/-"
,
filter
:
filters
.
join
(
" && "
)
});
const
{
memos
}
=
await
memoServiceClient
.
listMemos
({
pageSize
:
DEFAULT_MEMO_PAGE_SIZE
,
filter
:
filters
.
join
(
" && "
),
view
:
MemoView
.
MEMO_VIEW_METADATA_ONLY
,
});
const
tagAmounts
:
Record
<
string
,
number
>
=
{};
memos
.
forEach
((
memo
)
=>
{
memo
.
property
?.
tags
.
forEach
((
tag
)
=>
{
if
(
tagAmounts
[
tag
])
{
tagAmounts
[
tag
]
+=
1
;
}
else
{
tagAmounts
[
tag
]
=
1
;
}
});
});
set
({
tagAmounts
});
},
})),
...
...
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