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
7c5261b5
Commit
7c5261b5
authored
Mar 20, 2024
by
Steven
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
chore: tweak resource definition
parent
7cc8b951
Changes
23
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
708 additions
and
611 deletions
+708
-611
webhook.go
plugin/webhook/webhook.go
+2
-1
memo_service.proto
proto/api/v2/memo_service.proto
+1
-1
resource_service.proto
proto/api/v2/resource_service.proto
+25
-21
README.md
proto/gen/api/v2/README.md
+36
-36
memo_service_grpc.pb.go
proto/gen/api/v2/memo_service_grpc.pb.go
+2
-2
resource_service.pb.go
proto/gen/api/v2/resource_service.pb.go
+204
-202
resource_service.pb.gw.go
proto/gen/api/v2/resource_service.pb.gw.go
+67
-83
resource_service_grpc.pb.go
proto/gen/api/v2/resource_service_grpc.pb.go
+37
-37
apidocs.swagger.md
server/route/api/v2/apidocs.swagger.md
+69
-31
apidocs.swagger.yaml
server/route/api/v2/apidocs.swagger.yaml
+122
-114
memo_resource_service.go
server/route/api/v2/memo_resource_service.go
+10
-6
memo_service.go
server/route/api/v2/memo_service.go
+1
-1
resource_name.go
server/route/api/v2/resource_name.go
+14
-0
resource_service.go
server/route/api/v2/resource_service.go
+93
-17
EmbeddedResource.tsx
...mponents/MemoContent/EmbeddedContent/EmbeddedResource.tsx
+1
-1
ResourceListView.tsx
web/src/components/MemoEditor/ResourceListView.tsx
+4
-4
index.tsx
web/src/components/MemoEditor/index.tsx
+1
-1
MemoResourceListView.tsx
web/src/components/MemoResourceListView.tsx
+2
-2
Resources.tsx
web/src/pages/Resources.tsx
+3
-3
resource.ts
web/src/store/reducer/resource.ts
+2
-2
resource.ts
web/src/store/v1/resource.ts
+11
-43
resource.d.ts
web/src/types/modules/resource.d.ts
+0
-2
resource.ts
web/src/utils/resource.ts
+1
-1
No files found.
plugin/webhook/webhook.go
View file @
7c5261b5
...
...
@@ -30,7 +30,8 @@ type Memo struct {
}
type
Resource
struct
{
ID
int32
`json:"id"`
ID
int32
`json:"id"`
UID
string
`json:"uid"`
// Standard fields
CreatorID
int32
`json:"creatorId"`
...
...
proto/api/v2/memo_service.proto
View file @
7c5261b5
...
...
@@ -26,7 +26,7 @@ service MemoService {
rpc
ListMemos
(
ListMemosRequest
)
returns
(
ListMemosResponse
)
{
option
(
google.api.http
)
=
{
get
:
"/api/v2/memos"
};
}
// SearchMemos
Request
searches memos.
// SearchMemos searches memos.
rpc
SearchMemos
(
SearchMemosRequest
)
returns
(
SearchMemosResponse
)
{
option
(
google.api.http
)
=
{
get
:
"/api/v2/memos:search"
};
}
...
...
proto/api/v2/resource_service.proto
View file @
7c5261b5
...
...
@@ -18,37 +18,38 @@ service ResourceService {
rpc
ListResources
(
ListResourcesRequest
)
returns
(
ListResourcesResponse
)
{
option
(
google.api.http
)
=
{
get
:
"/api/v2/resources"
};
}
// GetResource returns a resource by id.
rpc
GetResource
(
GetResourceRequest
)
returns
(
GetResourceResponse
)
{
option
(
google.api.http
)
=
{
get
:
"/api/v2/resources/{id}"
};
option
(
google.api.method_signature
)
=
"id"
;
// SearchResources searches memos.
rpc
SearchResources
(
SearchResourcesRequest
)
returns
(
SearchResourcesResponse
)
{
option
(
google.api.http
)
=
{
get
:
"/api/v2/resources:search"
};
}
// GetResource
ByName
returns a resource by name.
rpc
GetResource
ByName
(
GetResourceByNameRequest
)
returns
(
GetResourceByNam
eResponse
)
{
option
(
google.api.http
)
=
{
get
:
"/api/v2/
resources/name/{name
}"
};
// GetResource returns a resource by name.
rpc
GetResource
(
GetResourceRequest
)
returns
(
GetResourc
eResponse
)
{
option
(
google.api.http
)
=
{
get
:
"/api/v2/
{name=resources/*
}"
};
option
(
google.api.method_signature
)
=
"name"
;
}
// UpdateResource updates a resource.
rpc
UpdateResource
(
UpdateResourceRequest
)
returns
(
UpdateResourceResponse
)
{
option
(
google.api.http
)
=
{
patch
:
"/api/v2/
resources/{resource.id
}"
,
patch
:
"/api/v2/
{resource.name=resources/*
}"
,
body
:
"resource"
};
option
(
google.api.method_signature
)
=
"resource,update_mask"
;
}
// DeleteResource deletes a resource by
id
.
// DeleteResource deletes a resource by
name
.
rpc
DeleteResource
(
DeleteResourceRequest
)
returns
(
DeleteResourceResponse
)
{
option
(
google.api.http
)
=
{
delete
:
"/api/v2/
resources/{id
}"
};
option
(
google.api.method_signature
)
=
"
id
"
;
option
(
google.api.http
)
=
{
delete
:
"/api/v2/
{name=resources/*
}"
};
option
(
google.api.method_signature
)
=
"
name
"
;
}
}
message
Resource
{
// The name of the resource.
// Format: resources/{id}
// id is the system generated unique identifier.
int32
id
=
1
;
string
name
=
1
;
//
name is the user provided nam
e.
string
name
=
2
;
//
The user defined id of the resourc
e.
string
uid
=
2
;
google.protobuf.Timestamp
create_time
=
3
;
...
...
@@ -65,8 +66,11 @@ message Resource {
message
CreateResourceRequest
{
string
filename
=
1
;
string
external_link
=
2
;
string
type
=
3
;
optional
int32
memo_id
=
4
;
}
...
...
@@ -80,19 +84,19 @@ message ListResourcesResponse {
repeated
Resource
resources
=
1
;
}
message
GetResource
Request
{
int32
id
=
1
;
message
SearchResources
Request
{
string
filter
=
1
;
}
message
GetResource
Response
{
Resource
resource
=
1
;
message
SearchResources
Response
{
repeated
Resource
resources
=
1
;
}
message
GetResource
ByName
Request
{
message
GetResourceRequest
{
string
name
=
1
;
}
message
GetResource
ByName
Response
{
message
GetResourceResponse
{
Resource
resource
=
1
;
}
...
...
@@ -107,7 +111,7 @@ message UpdateResourceResponse {
}
message
DeleteResourceRequest
{
int32
id
=
1
;
string
name
=
1
;
}
message
DeleteResourceResponse
{}
proto/gen/api/v2/README.md
View file @
7c5261b5
...
...
@@ -99,13 +99,13 @@
-
[
CreateResourceResponse
](
#memos-api-v2-CreateResourceResponse
)
-
[
DeleteResourceRequest
](
#memos-api-v2-DeleteResourceRequest
)
-
[
DeleteResourceResponse
](
#memos-api-v2-DeleteResourceResponse
)
-
[
GetResourceByNameRequest
](
#memos-api-v2-GetResourceByNameRequest
)
-
[
GetResourceByNameResponse
](
#memos-api-v2-GetResourceByNameResponse
)
-
[
GetResourceRequest
](
#memos-api-v2-GetResourceRequest
)
-
[
GetResourceResponse
](
#memos-api-v2-GetResourceResponse
)
-
[
ListResourcesRequest
](
#memos-api-v2-ListResourcesRequest
)
-
[
ListResourcesResponse
](
#memos-api-v2-ListResourcesResponse
)
-
[
Resource
](
#memos-api-v2-Resource
)
-
[
SearchResourcesRequest
](
#memos-api-v2-SearchResourcesRequest
)
-
[
SearchResourcesResponse
](
#memos-api-v2-SearchResourcesResponse
)
-
[
UpdateResourceRequest
](
#memos-api-v2-UpdateResourceRequest
)
-
[
UpdateResourceResponse
](
#memos-api-v2-UpdateResourceResponse
)
...
...
@@ -1362,7 +1362,7 @@ Used internally for obfuscating the page token.
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
|
id |
[
int32
](
#int32
)
| | |
|
name |
[
string
](
#string
)
| | |
...
...
@@ -1379,9 +1379,9 @@ Used internally for obfuscating the page token.
<a
name=
"memos-api-v2-GetResource
ByName
Request"
></a>
<a
name=
"memos-api-v2-GetResourceRequest"
></a>
### GetResource
ByName
Request
### GetResourceRequest
...
...
@@ -1394,9 +1394,9 @@ Used internally for obfuscating the page token.
<a
name=
"memos-api-v2-GetResource
ByName
Response"
></a>
<a
name=
"memos-api-v2-GetResourceResponse"
></a>
### GetResource
ByName
Response
### GetResourceResponse
...
...
@@ -1409,77 +1409,77 @@ Used internally for obfuscating the page token.
<a
name=
"memos-api-v2-GetResourceRequest"
></a>
### GetResourceRequest
<a
name=
"memos-api-v2-ListResourcesRequest"
></a>
### ListResourcesRequest
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| id |
[
int32
](
#int32
)
| | |
<a
name=
"memos-api-v2-
GetResource
Response"
></a>
<a
name=
"memos-api-v2-
ListResources
Response"
></a>
###
GetResource
Response
###
ListResources
Response
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| resource
|
[
Resource
](
#memos-api-v2-Resource
)
|
| |
| resource
s |
[
Resource
](
#memos-api-v2-Resource
)
| repeated
| |
<a
name=
"memos-api-v2-ListResourcesRequest"
></a>
<a
name=
"memos-api-v2-Resource"
></a>
### Resource
### ListResourcesRequest
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| name |
[
string
](
#string
)
| | The name of the resource. Format: resources/{id} id is the system generated unique identifier. |
| uid |
[
string
](
#string
)
| | The user defined id of the resource. |
| create_time |
[
google.protobuf.Timestamp
](
#google-protobuf-Timestamp
)
| | |
| filename |
[
string
](
#string
)
| | |
| external_link |
[
string
](
#string
)
| | |
| type |
[
string
](
#string
)
| | |
| size |
[
int64
](
#int64
)
| | |
| memo_id |
[
int32
](
#int32
)
| optional | |
<a
name=
"memos-api-v2-ListResourcesResponse"
></a>
### ListResourcesResponse
<a
name=
"memos-api-v2-SearchResourcesRequest"
></a>
### SearchResourcesRequest
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
|
resources |
[
Resource
](
#memos-api-v2-Resource
)
| repeated
| |
|
filter |
[
string
](
#string
)
|
| |
<a
name=
"memos-api-v2-
Resourc
e"
></a>
<a
name=
"memos-api-v2-
SearchResourcesRespons
e"
></a>
###
Resourc
e
###
SearchResourcesRespons
e
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| id |
[
int32
](
#int32
)
| | id is the system generated unique identifier. |
| name |
[
string
](
#string
)
| | name is the user provided name. |
| create_time |
[
google.protobuf.Timestamp
](
#google-protobuf-Timestamp
)
| | |
| filename |
[
string
](
#string
)
| | |
| external_link |
[
string
](
#string
)
| | |
| type |
[
string
](
#string
)
| | |
| size |
[
int64
](
#int64
)
| | |
| memo_id |
[
int32
](
#int32
)
| optional | |
| resources |
[
Resource
](
#memos-api-v2-Resource
)
| repeated | |
...
...
@@ -1532,10 +1532,10 @@ Used internally for obfuscating the page token.
| ----------- | ------------ | ------------- | ------------|
| CreateResource |
[
CreateResourceRequest
](
#memos-api-v2-CreateResourceRequest
)
|
[
CreateResourceResponse
](
#memos-api-v2-CreateResourceResponse
)
| CreateResource creates a new resource. |
| ListResources |
[
ListResourcesRequest
](
#memos-api-v2-ListResourcesRequest
)
|
[
ListResourcesResponse
](
#memos-api-v2-ListResourcesResponse
)
| ListResources lists all resources. |
|
GetResource |
[
GetResourceRequest
](
#memos-api-v2-GetResourceRequest
)
|
[
GetResourceResponse
](
#memos-api-v2-GetResourceResponse
)
| GetResource returns a resource by id
. |
| GetResource
ByName |
[
GetResourceByNameRequest
](
#memos-api-v2-GetResourceByNameRequest
)
|
[
GetResourceByNameResponse
](
#memos-api-v2-GetResourceByNameResponse
)
| GetResourceByNam
e returns a resource by name. |
|
SearchResources |
[
SearchResourcesRequest
](
#memos-api-v2-SearchResourcesRequest
)
|
[
SearchResourcesResponse
](
#memos-api-v2-SearchResourcesResponse
)
| SearchResources searches memos
. |
| GetResource
|
[
GetResourceRequest
](
#memos-api-v2-GetResourceRequest
)
|
[
GetResourceResponse
](
#memos-api-v2-GetResourceResponse
)
| GetResourc
e returns a resource by name. |
| UpdateResource |
[
UpdateResourceRequest
](
#memos-api-v2-UpdateResourceRequest
)
|
[
UpdateResourceResponse
](
#memos-api-v2-UpdateResourceResponse
)
| UpdateResource updates a resource. |
| DeleteResource |
[
DeleteResourceRequest
](
#memos-api-v2-DeleteResourceRequest
)
|
[
DeleteResourceResponse
](
#memos-api-v2-DeleteResourceResponse
)
| DeleteResource deletes a resource by
id
. |
| DeleteResource |
[
DeleteResourceRequest
](
#memos-api-v2-DeleteResourceRequest
)
|
[
DeleteResourceResponse
](
#memos-api-v2-DeleteResourceResponse
)
| DeleteResource deletes a resource by
name
. |
...
...
@@ -2123,7 +2123,7 @@ Used internally for obfuscating the page token.
| ----------- | ------------ | ------------- | ------------|
| CreateMemo |
[
CreateMemoRequest
](
#memos-api-v2-CreateMemoRequest
)
|
[
CreateMemoResponse
](
#memos-api-v2-CreateMemoResponse
)
| CreateMemo creates a memo. |
| ListMemos |
[
ListMemosRequest
](
#memos-api-v2-ListMemosRequest
)
|
[
ListMemosResponse
](
#memos-api-v2-ListMemosResponse
)
| ListMemos lists memos with pagination and filter. |
| SearchMemos |
[
SearchMemosRequest
](
#memos-api-v2-SearchMemosRequest
)
|
[
SearchMemosResponse
](
#memos-api-v2-SearchMemosResponse
)
| SearchMemos
Request
searches memos. |
| SearchMemos |
[
SearchMemosRequest
](
#memos-api-v2-SearchMemosRequest
)
|
[
SearchMemosResponse
](
#memos-api-v2-SearchMemosResponse
)
| SearchMemos searches memos. |
| GetMemo |
[
GetMemoRequest
](
#memos-api-v2-GetMemoRequest
)
|
[
GetMemoResponse
](
#memos-api-v2-GetMemoResponse
)
| GetMemo gets a memo. |
| UpdateMemo |
[
UpdateMemoRequest
](
#memos-api-v2-UpdateMemoRequest
)
|
[
UpdateMemoResponse
](
#memos-api-v2-UpdateMemoResponse
)
| UpdateMemo updates a memo. |
| DeleteMemo |
[
DeleteMemoRequest
](
#memos-api-v2-DeleteMemoRequest
)
|
[
DeleteMemoResponse
](
#memos-api-v2-DeleteMemoResponse
)
| DeleteMemo deletes a memo. |
...
...
proto/gen/api/v2/memo_service_grpc.pb.go
View file @
7c5261b5
...
...
@@ -46,7 +46,7 @@ type MemoServiceClient interface {
CreateMemo
(
ctx
context
.
Context
,
in
*
CreateMemoRequest
,
opts
...
grpc
.
CallOption
)
(
*
CreateMemoResponse
,
error
)
// ListMemos lists memos with pagination and filter.
ListMemos
(
ctx
context
.
Context
,
in
*
ListMemosRequest
,
opts
...
grpc
.
CallOption
)
(
*
ListMemosResponse
,
error
)
// SearchMemos
Request
searches memos.
// SearchMemos searches memos.
SearchMemos
(
ctx
context
.
Context
,
in
*
SearchMemosRequest
,
opts
...
grpc
.
CallOption
)
(
*
SearchMemosResponse
,
error
)
// GetMemo gets a memo.
GetMemo
(
ctx
context
.
Context
,
in
*
GetMemoRequest
,
opts
...
grpc
.
CallOption
)
(
*
GetMemoResponse
,
error
)
...
...
@@ -247,7 +247,7 @@ type MemoServiceServer interface {
CreateMemo
(
context
.
Context
,
*
CreateMemoRequest
)
(
*
CreateMemoResponse
,
error
)
// ListMemos lists memos with pagination and filter.
ListMemos
(
context
.
Context
,
*
ListMemosRequest
)
(
*
ListMemosResponse
,
error
)
// SearchMemos
Request
searches memos.
// SearchMemos searches memos.
SearchMemos
(
context
.
Context
,
*
SearchMemosRequest
)
(
*
SearchMemosResponse
,
error
)
// GetMemo gets a memo.
GetMemo
(
context
.
Context
,
*
GetMemoRequest
)
(
*
GetMemoResponse
,
error
)
...
...
proto/gen/api/v2/resource_service.pb.go
View file @
7c5261b5
This diff is collapsed.
Click to expand it.
proto/gen/api/v2/resource_service.pb.gw.go
View file @
7c5261b5
This diff is collapsed.
Click to expand it.
proto/gen/api/v2/resource_service_grpc.pb.go
View file @
7c5261b5
...
...
@@ -19,12 +19,12 @@ import (
const
_
=
grpc
.
SupportPackageIsVersion7
const
(
ResourceService_CreateResource_FullMethodName
=
"/memos.api.v2.ResourceService/CreateResource"
ResourceService_ListResources_FullMethodName
=
"/memos.api.v2.ResourceService/ListResources"
ResourceService_
GetResource_FullMethodName
=
"/memos.api.v2.ResourceService/GetResource
"
ResourceService_GetResource
ByName_FullMethodName
=
"/memos.api.v2.ResourceService/GetResourceByNam
e"
ResourceService_UpdateResource_FullMethodName
=
"/memos.api.v2.ResourceService/UpdateResource"
ResourceService_DeleteResource_FullMethodName
=
"/memos.api.v2.ResourceService/DeleteResource"
ResourceService_CreateResource_FullMethodName
=
"/memos.api.v2.ResourceService/CreateResource"
ResourceService_ListResources_FullMethodName
=
"/memos.api.v2.ResourceService/ListResources"
ResourceService_
SearchResources_FullMethodName
=
"/memos.api.v2.ResourceService/SearchResources
"
ResourceService_GetResource
_FullMethodName
=
"/memos.api.v2.ResourceService/GetResourc
e"
ResourceService_UpdateResource_FullMethodName
=
"/memos.api.v2.ResourceService/UpdateResource"
ResourceService_DeleteResource_FullMethodName
=
"/memos.api.v2.ResourceService/DeleteResource"
)
// ResourceServiceClient is the client API for ResourceService service.
...
...
@@ -35,13 +35,13 @@ type ResourceServiceClient interface {
CreateResource
(
ctx
context
.
Context
,
in
*
CreateResourceRequest
,
opts
...
grpc
.
CallOption
)
(
*
CreateResourceResponse
,
error
)
// ListResources lists all resources.
ListResources
(
ctx
context
.
Context
,
in
*
ListResourcesRequest
,
opts
...
grpc
.
CallOption
)
(
*
ListResourcesResponse
,
error
)
// GetResource returns a resource by id.
// SearchResources searches memos.
SearchResources
(
ctx
context
.
Context
,
in
*
SearchResourcesRequest
,
opts
...
grpc
.
CallOption
)
(
*
SearchResourcesResponse
,
error
)
// GetResource returns a resource by name.
GetResource
(
ctx
context
.
Context
,
in
*
GetResourceRequest
,
opts
...
grpc
.
CallOption
)
(
*
GetResourceResponse
,
error
)
// GetResourceByName returns a resource by name.
GetResourceByName
(
ctx
context
.
Context
,
in
*
GetResourceByNameRequest
,
opts
...
grpc
.
CallOption
)
(
*
GetResourceByNameResponse
,
error
)
// UpdateResource updates a resource.
UpdateResource
(
ctx
context
.
Context
,
in
*
UpdateResourceRequest
,
opts
...
grpc
.
CallOption
)
(
*
UpdateResourceResponse
,
error
)
// DeleteResource deletes a resource by
id
.
// DeleteResource deletes a resource by
name
.
DeleteResource
(
ctx
context
.
Context
,
in
*
DeleteResourceRequest
,
opts
...
grpc
.
CallOption
)
(
*
DeleteResourceResponse
,
error
)
}
...
...
@@ -71,18 +71,18 @@ func (c *resourceServiceClient) ListResources(ctx context.Context, in *ListResou
return
out
,
nil
}
func
(
c
*
resourceServiceClient
)
GetResource
(
ctx
context
.
Context
,
in
*
GetResourceRequest
,
opts
...
grpc
.
CallOption
)
(
*
GetResource
Response
,
error
)
{
out
:=
new
(
GetResource
Response
)
err
:=
c
.
cc
.
Invoke
(
ctx
,
ResourceService_
GetResource
_FullMethodName
,
in
,
out
,
opts
...
)
func
(
c
*
resourceServiceClient
)
SearchResources
(
ctx
context
.
Context
,
in
*
SearchResourcesRequest
,
opts
...
grpc
.
CallOption
)
(
*
SearchResources
Response
,
error
)
{
out
:=
new
(
SearchResources
Response
)
err
:=
c
.
cc
.
Invoke
(
ctx
,
ResourceService_
SearchResources
_FullMethodName
,
in
,
out
,
opts
...
)
if
err
!=
nil
{
return
nil
,
err
}
return
out
,
nil
}
func
(
c
*
resourceServiceClient
)
GetResource
ByName
(
ctx
context
.
Context
,
in
*
GetResourceByNameRequest
,
opts
...
grpc
.
CallOption
)
(
*
GetResourceByNam
eResponse
,
error
)
{
out
:=
new
(
GetResource
ByName
Response
)
err
:=
c
.
cc
.
Invoke
(
ctx
,
ResourceService_GetResource
ByName
_FullMethodName
,
in
,
out
,
opts
...
)
func
(
c
*
resourceServiceClient
)
GetResource
(
ctx
context
.
Context
,
in
*
GetResourceRequest
,
opts
...
grpc
.
CallOption
)
(
*
GetResourc
eResponse
,
error
)
{
out
:=
new
(
GetResourceResponse
)
err
:=
c
.
cc
.
Invoke
(
ctx
,
ResourceService_GetResource_FullMethodName
,
in
,
out
,
opts
...
)
if
err
!=
nil
{
return
nil
,
err
}
...
...
@@ -115,13 +115,13 @@ type ResourceServiceServer interface {
CreateResource
(
context
.
Context
,
*
CreateResourceRequest
)
(
*
CreateResourceResponse
,
error
)
// ListResources lists all resources.
ListResources
(
context
.
Context
,
*
ListResourcesRequest
)
(
*
ListResourcesResponse
,
error
)
// GetResource returns a resource by id.
// SearchResources searches memos.
SearchResources
(
context
.
Context
,
*
SearchResourcesRequest
)
(
*
SearchResourcesResponse
,
error
)
// GetResource returns a resource by name.
GetResource
(
context
.
Context
,
*
GetResourceRequest
)
(
*
GetResourceResponse
,
error
)
// GetResourceByName returns a resource by name.
GetResourceByName
(
context
.
Context
,
*
GetResourceByNameRequest
)
(
*
GetResourceByNameResponse
,
error
)
// UpdateResource updates a resource.
UpdateResource
(
context
.
Context
,
*
UpdateResourceRequest
)
(
*
UpdateResourceResponse
,
error
)
// DeleteResource deletes a resource by
id
.
// DeleteResource deletes a resource by
name
.
DeleteResource
(
context
.
Context
,
*
DeleteResourceRequest
)
(
*
DeleteResourceResponse
,
error
)
mustEmbedUnimplementedResourceServiceServer
()
}
...
...
@@ -136,12 +136,12 @@ func (UnimplementedResourceServiceServer) CreateResource(context.Context, *Creat
func
(
UnimplementedResourceServiceServer
)
ListResources
(
context
.
Context
,
*
ListResourcesRequest
)
(
*
ListResourcesResponse
,
error
)
{
return
nil
,
status
.
Errorf
(
codes
.
Unimplemented
,
"method ListResources not implemented"
)
}
func
(
UnimplementedResourceServiceServer
)
SearchResources
(
context
.
Context
,
*
SearchResourcesRequest
)
(
*
SearchResourcesResponse
,
error
)
{
return
nil
,
status
.
Errorf
(
codes
.
Unimplemented
,
"method SearchResources not implemented"
)
}
func
(
UnimplementedResourceServiceServer
)
GetResource
(
context
.
Context
,
*
GetResourceRequest
)
(
*
GetResourceResponse
,
error
)
{
return
nil
,
status
.
Errorf
(
codes
.
Unimplemented
,
"method GetResource not implemented"
)
}
func
(
UnimplementedResourceServiceServer
)
GetResourceByName
(
context
.
Context
,
*
GetResourceByNameRequest
)
(
*
GetResourceByNameResponse
,
error
)
{
return
nil
,
status
.
Errorf
(
codes
.
Unimplemented
,
"method GetResourceByName not implemented"
)
}
func
(
UnimplementedResourceServiceServer
)
UpdateResource
(
context
.
Context
,
*
UpdateResourceRequest
)
(
*
UpdateResourceResponse
,
error
)
{
return
nil
,
status
.
Errorf
(
codes
.
Unimplemented
,
"method UpdateResource not implemented"
)
}
...
...
@@ -197,38 +197,38 @@ func _ResourceService_ListResources_Handler(srv interface{}, ctx context.Context
return
interceptor
(
ctx
,
in
,
info
,
handler
)
}
func
_ResourceService_
GetResource
_Handler
(
srv
interface
{},
ctx
context
.
Context
,
dec
func
(
interface
{})
error
,
interceptor
grpc
.
UnaryServerInterceptor
)
(
interface
{},
error
)
{
in
:=
new
(
GetResource
Request
)
func
_ResourceService_
SearchResources
_Handler
(
srv
interface
{},
ctx
context
.
Context
,
dec
func
(
interface
{})
error
,
interceptor
grpc
.
UnaryServerInterceptor
)
(
interface
{},
error
)
{
in
:=
new
(
SearchResources
Request
)
if
err
:=
dec
(
in
);
err
!=
nil
{
return
nil
,
err
}
if
interceptor
==
nil
{
return
srv
.
(
ResourceServiceServer
)
.
GetResource
(
ctx
,
in
)
return
srv
.
(
ResourceServiceServer
)
.
SearchResources
(
ctx
,
in
)
}
info
:=
&
grpc
.
UnaryServerInfo
{
Server
:
srv
,
FullMethod
:
ResourceService_
GetResource
_FullMethodName
,
FullMethod
:
ResourceService_
SearchResources
_FullMethodName
,
}
handler
:=
func
(
ctx
context
.
Context
,
req
interface
{})
(
interface
{},
error
)
{
return
srv
.
(
ResourceServiceServer
)
.
GetResource
(
ctx
,
req
.
(
*
GetResource
Request
))
return
srv
.
(
ResourceServiceServer
)
.
SearchResources
(
ctx
,
req
.
(
*
SearchResources
Request
))
}
return
interceptor
(
ctx
,
in
,
info
,
handler
)
}
func
_ResourceService_GetResource
ByName
_Handler
(
srv
interface
{},
ctx
context
.
Context
,
dec
func
(
interface
{})
error
,
interceptor
grpc
.
UnaryServerInterceptor
)
(
interface
{},
error
)
{
in
:=
new
(
GetResource
ByName
Request
)
func
_ResourceService_GetResource_Handler
(
srv
interface
{},
ctx
context
.
Context
,
dec
func
(
interface
{})
error
,
interceptor
grpc
.
UnaryServerInterceptor
)
(
interface
{},
error
)
{
in
:=
new
(
GetResourceRequest
)
if
err
:=
dec
(
in
);
err
!=
nil
{
return
nil
,
err
}
if
interceptor
==
nil
{
return
srv
.
(
ResourceServiceServer
)
.
GetResource
ByName
(
ctx
,
in
)
return
srv
.
(
ResourceServiceServer
)
.
GetResource
(
ctx
,
in
)
}
info
:=
&
grpc
.
UnaryServerInfo
{
Server
:
srv
,
FullMethod
:
ResourceService_GetResource
ByName
_FullMethodName
,
FullMethod
:
ResourceService_GetResource_FullMethodName
,
}
handler
:=
func
(
ctx
context
.
Context
,
req
interface
{})
(
interface
{},
error
)
{
return
srv
.
(
ResourceServiceServer
)
.
GetResource
ByName
(
ctx
,
req
.
(
*
GetResourceByNam
eRequest
))
return
srv
.
(
ResourceServiceServer
)
.
GetResource
(
ctx
,
req
.
(
*
GetResourc
eRequest
))
}
return
interceptor
(
ctx
,
in
,
info
,
handler
)
}
...
...
@@ -285,12 +285,12 @@ var ResourceService_ServiceDesc = grpc.ServiceDesc{
Handler
:
_ResourceService_ListResources_Handler
,
},
{
MethodName
:
"
GetResource
"
,
Handler
:
_ResourceService_
GetResource
_Handler
,
MethodName
:
"
SearchResources
"
,
Handler
:
_ResourceService_
SearchResources
_Handler
,
},
{
MethodName
:
"GetResource
ByName
"
,
Handler
:
_ResourceService_GetResource
ByName
_Handler
,
MethodName
:
"GetResource"
,
Handler
:
_ResourceService_GetResource_Handler
,
},
{
MethodName
:
"UpdateResource"
,
...
...
server/route/api/v2/apidocs.swagger.md
View file @
7c5261b5
...
...
@@ -146,19 +146,19 @@ UpdateInbox updates an inbox.
#### GET
##### Summary
Get
Memo gets a memo
.
Get
Resource returns a resource by name
.
##### Parameters
| Name | Located in | Description | Required | Schema |
| ---- | ---------- | ----------- | -------- | ------ |
| name_1 | path |
The name of the memo. Format: memos/{id}
| Yes | string |
| name_1 | path | | Yes | string |
##### Responses
| Code | Description | Schema |
| ---- | ----------- | ------ |
| 200 | A successful response. |
[
v2Get
MemoResponse
](
#v2getmemo
response
)
|
| 200 | A successful response. |
[
v2Get
ResourceResponse
](
#v2getresource
response
)
|
| default | An unexpected error response. |
[
googlerpcStatus
](
#googlerpcstatus
)
|
#### DELETE
...
...
@@ -288,7 +288,7 @@ ExportMemos exports memos.
#### GET
##### Summary
SearchMemos
Request
searches memos.
SearchMemos searches memos.
##### Parameters
...
...
@@ -324,7 +324,7 @@ UpdateMemo updates a memo.
| 200 | A successful response. |
[
v2UpdateMemoResponse
](
#v2updatememoresponse
)
|
| default | An unexpected error response. |
[
googlerpcStatus
](
#googlerpcstatus
)
|
### /api/v2/{name_
1
}
### /api/v2/{name_
2
}
#### GET
##### Summary
...
...
@@ -335,7 +335,7 @@ GetMemo gets a memo.
| Name | Located in | Description | Required | Schema |
| ---- | ---------- | ----------- | -------- | ------ |
| name_
1
| path | The name of the memo. Format: memos/{id} | Yes | string |
| name_
2
| path | The name of the memo. Format: memos/{id} | Yes | string |
##### Responses
...
...
@@ -347,22 +347,22 @@ GetMemo gets a memo.
#### DELETE
##### Summary
Delete
Inbox deletes an inbox
.
Delete
Resource deletes a resource by name
.
##### Parameters
| Name | Located in | Description | Required | Schema |
| ---- | ---------- | ----------- | -------- | ------ |
| name_
1 | path | The name of the inbox to delete. Format: inboxes/{uid}
| Yes | string |
| name_
2 | path |
| Yes | string |
##### Responses
| Code | Description | Schema |
| ---- | ----------- | ------ |
| 200 | A successful response. |
[
v2Delete
InboxResponse
](
#v2deleteinbox
response
)
|
| 200 | A successful response. |
[
v2Delete
ResourceResponse
](
#v2deleteresource
response
)
|
| default | An unexpected error response. |
[
googlerpcStatus
](
#googlerpcstatus
)
|
### /api/v2/{name_
2
}
### /api/v2/{name_
3
}
#### DELETE
##### Summary
...
...
@@ -373,7 +373,7 @@ DeleteMemo deletes a memo.
| Name | Located in | Description | Required | Schema |
| ---- | ---------- | ----------- | -------- | ------ |
| name_
2
| path | The name of the memo. Format: memos/{id} | Yes | string |
| name_
3
| path | The name of the memo. Format: memos/{id} | Yes | string |
##### Responses
...
...
@@ -601,38 +601,38 @@ CreateResource creates a new resource.
| 200 | A successful response. |
[
v2CreateResourceResponse
](
#v2createresourceresponse
)
|
| default | An unexpected error response. |
[
googlerpcStatus
](
#googlerpcstatus
)
|
### /api/v2/resources
/name/{name}
### /api/v2/resources
:search
#### GET
##### Summary
GetResourceByName returns a resource by name
.
SearchResources searches memos
.
##### Parameters
| Name | Located in | Description | Required | Schema |
| ---- | ---------- | ----------- | -------- | ------ |
|
name | path | | Yes
| string |
|
filter | query | | No
| string |
##### Responses
| Code | Description | Schema |
| ---- | ----------- | ------ |
| 200 | A successful response. |
[
v2
GetResourceByNameResponse
](
#v2getresourcebyname
response
)
|
| 200 | A successful response. |
[
v2
SearchResourcesResponse
](
#v2searchresources
response
)
|
| default | An unexpected error response. |
[
googlerpcStatus
](
#googlerpcstatus
)
|
### /api/v2/
resources/{id
}
### /api/v2/
{name_1
}
#### GET
##### Summary
GetResource returns a resource by
id
.
GetResource returns a resource by
name
.
##### Parameters
| Name | Located in | Description | Required | Schema |
| ---- | ---------- | ----------- | -------- | ------ |
|
id | path | | Yes | integer
|
|
name_1 | path | | Yes | string
|
##### Responses
...
...
@@ -644,13 +644,51 @@ GetResource returns a resource by id.
#### DELETE
##### Summary
Delete
Resource deletes a resource by id
.
Delete
Inbox deletes an inbox
.
##### Parameters
| Name | Located in | Description | Required | Schema |
| ---- | ---------- | ----------- | -------- | ------ |
| id | path | | Yes | integer |
| name_1 | path | The name of the inbox to delete. Format: inboxes/{uid} | Yes | string |
##### Responses
| Code | Description | Schema |
| ---- | ----------- | ------ |
| 200 | A successful response. |
[
v2DeleteInboxResponse
](
#v2deleteinboxresponse
)
|
| default | An unexpected error response. |
[
googlerpcStatus
](
#googlerpcstatus
)
|
### /api/v2/{name_2}
#### GET
##### Summary
GetMemo gets a memo.
##### Parameters
| Name | Located in | Description | Required | Schema |
| ---- | ---------- | ----------- | -------- | ------ |
| name_2 | path | The name of the memo. Format: memos/{id} | Yes | string |
##### Responses
| Code | Description | Schema |
| ---- | ----------- | ------ |
| 200 | A successful response. |
[
v2GetMemoResponse
](
#v2getmemoresponse
)
|
| default | An unexpected error response. |
[
googlerpcStatus
](
#googlerpcstatus
)
|
#### DELETE
##### Summary
DeleteResource deletes a resource by name.
##### Parameters
| Name | Located in | Description | Required | Schema |
| ---- | ---------- | ----------- | -------- | ------ |
| name_2 | path | | Yes | string |
##### Responses
...
...
@@ -659,7 +697,7 @@ DeleteResource deletes a resource by id.
| 200 | A successful response. |
[
v2DeleteResourceResponse
](
#v2deleteresourceresponse
)
|
| default | An unexpected error response. |
[
googlerpcStatus
](
#googlerpcstatus
)
|
### /api/v2/
resources/{resource.id
}
### /api/v2/
{resource.name
}
#### PATCH
##### Summary
...
...
@@ -670,8 +708,8 @@ UpdateResource updates a resource.
| Name | Located in | Description | Required | Schema |
| ---- | ---------- | ----------- | -------- | ------ |
| resource.
id | path | id is the system generated unique identifier. | Yes | integer
|
| resource | body | | Yes | {
**"
name
"**
: string,
**"createTime"**
: dateTime,
**"filename"**
: string,
**"externalLink"**
: string,
**"type"**
: string,
**"size"**
: string (int64),
**"memoId"**
: integer } |
| resource.
name | path | The name of the resource. Format: resources/{id} id is the system generated unique identifier. | Yes | string
|
| resource | body | | Yes | {
**"
uid
"**
: string,
**"createTime"**
: dateTime,
**"filename"**
: string,
**"externalLink"**
: string,
**"type"**
: string,
**"size"**
: string (int64),
**"memoId"**
: integer } |
##### Responses
...
...
@@ -1463,12 +1501,6 @@ GetActivity returns the activity with the given id.
| ---- | ---- | ----------- | -------- |
| memo |
[
v2Memo
](
#v2memo
)
| | No |
#### v2GetResourceByNameResponse
| Name | Type | Description | Required |
| ---- | ---- | ----------- | -------- |
| resource |
[
v2Resource
](
#v2resource
)
| | No |
#### v2GetResourceResponse
| Name | Type | Description | Required |
...
...
@@ -1659,8 +1691,8 @@ GetActivity returns the activity with the given id.
| Name | Type | Description | Required |
| ---- | ---- | ----------- | -------- |
|
id | integer |
id is the system generated unique identifier. | No |
|
name | string | name is the user provided nam
e. | No |
|
name | string | The name of the resource. Format: resources/{id}
id is the system generated unique identifier. | No |
|
uid | string | The user defined id of the resourc
e. | No |
| createTime | dateTime | | No |
| filename | string | | No |
| externalLink | string | | No |
...
...
@@ -1674,6 +1706,12 @@ GetActivity returns the activity with the given id.
| ---- | ---- | ----------- | -------- |
| memos |
[
[v2Memo
](
#v2memo
)
] | | No |
#### v2SearchResourcesResponse
| Name | Type | Description | Required |
| ---- | ---- | ----------- | -------- |
| resources |
[
[v2Resource
](
#v2resource
)
] | | No |
#### v2SearchUsersResponse
| Name | Type | Description | Required |
...
...
server/route/api/v2/apidocs.swagger.yaml
View file @
7c5261b5
...
...
@@ -285,7 +285,7 @@ paths:
-
MemoService
/api/v2/memos:search
:
get
:
summary
:
SearchMemos
Request
searches memos.
summary
:
SearchMemos searches memos.
operationId
:
MemoService_SearchMemos
responses
:
"
200"
:
...
...
@@ -353,113 +353,26 @@ paths:
format
:
int32
tags
:
-
ResourceService
/api/v2/resources
/name/{name}
:
/api/v2/resources
:search
:
get
:
summary
:
GetResourceByName returns a resource by name
.
operationId
:
ResourceService_
GetResourceByName
summary
:
SearchResources searches memos
.
operationId
:
ResourceService_
SearchResources
responses
:
"
200"
:
description
:
A successful response.
schema
:
$ref
:
'
#/definitions/v2
GetResourceByName
Response'
$ref
:
'
#/definitions/v2
SearchResources
Response'
default
:
description
:
An unexpected error response.
schema
:
$ref
:
'
#/definitions/googlerpcStatus'
parameters
:
-
name
:
name
in
:
path
required
:
tru
e
-
name
:
filter
in
:
query
required
:
fals
e
type
:
string
tags
:
-
ResourceService
/api/v2/resources/{id}
:
get
:
summary
:
GetResource returns a resource by id.
operationId
:
ResourceService_GetResource
responses
:
"
200"
:
description
:
A successful response.
schema
:
$ref
:
'
#/definitions/v2GetResourceResponse'
default
:
description
:
An unexpected error response.
schema
:
$ref
:
'
#/definitions/googlerpcStatus'
parameters
:
-
name
:
id
in
:
path
required
:
true
type
:
integer
format
:
int32
tags
:
-
ResourceService
delete
:
summary
:
DeleteResource deletes a resource by id.
operationId
:
ResourceService_DeleteResource
responses
:
"
200"
:
description
:
A successful response.
schema
:
$ref
:
'
#/definitions/v2DeleteResourceResponse'
default
:
description
:
An unexpected error response.
schema
:
$ref
:
'
#/definitions/googlerpcStatus'
parameters
:
-
name
:
id
in
:
path
required
:
true
type
:
integer
format
:
int32
tags
:
-
ResourceService
/api/v2/resources/{resource.id}
:
patch
:
summary
:
UpdateResource updates a resource.
operationId
:
ResourceService_UpdateResource
responses
:
"
200"
:
description
:
A successful response.
schema
:
$ref
:
'
#/definitions/v2UpdateResourceResponse'
default
:
description
:
An unexpected error response.
schema
:
$ref
:
'
#/definitions/googlerpcStatus'
parameters
:
-
name
:
resource.id
description
:
id is the system generated unique identifier.
in
:
path
required
:
true
type
:
integer
format
:
int32
-
name
:
resource
in
:
body
required
:
true
schema
:
type
:
object
properties
:
name
:
type
:
string
description
:
name is the user provided name.
createTime
:
type
:
string
format
:
date-time
filename
:
type
:
string
externalLink
:
type
:
string
type
:
type
:
string
size
:
type
:
string
format
:
int64
memoId
:
type
:
integer
format
:
int32
tags
:
-
ResourceService
/api/v2/tags
:
get
:
summary
:
ListTags lists tags.
...
...
@@ -978,28 +891,25 @@ paths:
-
MemoService
/api/v2/{name_1}
:
get
:
summary
:
Get
Memo gets a memo
.
operationId
:
MemoService_GetMemo
summary
:
Get
Resource returns a resource by name
.
operationId
:
ResourceService_GetResource
responses
:
"
200"
:
description
:
A successful response.
schema
:
$ref
:
'
#/definitions/v2Get
Memo
Response'
$ref
:
'
#/definitions/v2Get
Resource
Response'
default
:
description
:
An unexpected error response.
schema
:
$ref
:
'
#/definitions/googlerpcStatus'
parameters
:
-
name
:
name_1
description
:
|-
The name of the memo.
Format: memos/{id}
in
:
path
required
:
true
type
:
string
pattern:
memo
s/[^/]+
pattern
:
resource
s/[^/]+
tags
:
-
Memo
Service
-
Resource
Service
delete
:
summary
:
DeleteInbox deletes an inbox.
operationId
:
InboxService_DeleteInbox
...
...
@@ -1024,6 +934,50 @@ paths:
tags
:
-
InboxService
/api/v2/{name_2}
:
get
:
summary
:
GetMemo gets a memo.
operationId
:
MemoService_GetMemo
responses
:
"
200"
:
description
:
A successful response.
schema
:
$ref
:
'
#/definitions/v2GetMemoResponse'
default
:
description
:
An unexpected error response.
schema
:
$ref
:
'
#/definitions/googlerpcStatus'
parameters
:
-
name
:
name_2
description
:
|-
The name of the memo.
Format: memos/{id}
in: path
required: true
type: string
pattern: memos/[^/]+
tags
:
-
MemoService
delete
:
summary
:
DeleteResource deletes a resource by name.
operationId
:
ResourceService_DeleteResource
responses
:
"
200"
:
description
:
A successful response.
schema
:
$ref
:
'
#/definitions/v2DeleteResourceResponse'
default
:
description
:
An unexpected error response.
schema
:
$ref
:
'
#/definitions/googlerpcStatus'
parameters
:
-
name
:
name_2
in
:
path
required
:
true
type
:
string
pattern
:
resources/[^/]+
tags
:
-
ResourceService
/api/v2/{name_3}
:
delete
:
summary
:
DeleteMemo deletes a memo.
operationId
:
MemoService_DeleteMemo
...
...
@@ -1037,7 +991,7 @@ paths:
schema
:
$ref
:
'
#/definitions/googlerpcStatus'
parameters
:
-
name
:
name_
2
-
name
:
name_
3
description
:
|-
The name of the memo.
Format: memos/{id}
...
...
@@ -1475,6 +1429,55 @@ paths:
pattern: users/[^/]+
tags
:
-
UserService
/api/v2/{resource.name}
:
patch
:
summary
:
UpdateResource updates a resource.
operationId
:
ResourceService_UpdateResource
responses
:
"
200"
:
description
:
A successful response.
schema
:
$ref
:
'
#/definitions/v2UpdateResourceResponse'
default
:
description
:
An unexpected error response.
schema
:
$ref
:
'
#/definitions/googlerpcStatus'
parameters
:
-
name
:
resource.name
description
:
|-
The name of the resource.
Format: resources/{id}
id is the system generated unique identifier.
in: path
required: true
type: string
pattern: resources/[^/]+
-
name
:
resource
in
:
body
required
:
true
schema
:
type
:
object
properties
:
uid
:
type
:
string
description
:
The user defined id of the resource.
createTime
:
type
:
string
format
:
date-time
filename
:
type
:
string
externalLink
:
type
:
string
type
:
type
:
string
size
:
type
:
string
format
:
int64
memoId
:
type
:
integer
format
:
int32
tags
:
-
ResourceService
/api/v2/{setting.name}
:
patch
:
summary
:
UpdateUserSetting updates the setting of a user.
...
...
@@ -1882,11 +1885,6 @@ definitions:
properties
:
memo
:
$ref
:
'
#/definitions/v2Memo'
v2GetResourceByNameResponse
:
type
:
object
properties
:
resource
:
$ref
:
'
#/definitions/v2Resource'
v2GetResourceResponse
:
type
:
object
properties
:
...
...
@@ -2161,13 +2159,15 @@ definitions:
v2Resource
:
type
:
object
properties
:
id
:
type
:
integer
format
:
int32
description
:
id is the system generated unique identifier.
name
:
type
:
string
description
:
name is the user provided name.
description
:
|-
The name of the resource.
Format: resources/{id}
id is the system generated unique identifier.
uid
:
type
:
string
description
:
The user defined id of the resource.
createTime
:
type
:
string
format
:
date-time
...
...
@@ -2191,6 +2191,14 @@ definitions:
items
:
type
:
object
$ref
:
'
#/definitions/v2Memo'
v2SearchResourcesResponse
:
type
:
object
properties
:
resources
:
type
:
array
items
:
type
:
object
$ref
:
'
#/definitions/v2Resource'
v2SearchUsersResponse
:
type
:
object
properties
:
...
...
server/route/api/v2/memo_resource_service.go
View file @
7c5261b5
...
...
@@ -13,12 +13,12 @@ import (
)
func
(
s
*
APIV2Service
)
SetMemoResources
(
ctx
context
.
Context
,
request
*
apiv2pb
.
SetMemoResourcesRequest
)
(
*
apiv2pb
.
SetMemoResourcesResponse
,
error
)
{
id
,
err
:=
ExtractMemoIDFromName
(
request
.
Name
)
memoID
,
err
:=
ExtractMemoIDFromName
(
request
.
Name
)
if
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"invalid memo name: %v"
,
err
)
}
resources
,
err
:=
s
.
Store
.
ListResources
(
ctx
,
&
store
.
FindResource
{
MemoID
:
&
id
,
MemoID
:
&
memoID
,
})
if
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
Internal
,
"failed to list resources"
)
...
...
@@ -28,7 +28,7 @@ func (s *APIV2Service) SetMemoResources(ctx context.Context, request *apiv2pb.Se
for
_
,
resource
:=
range
resources
{
found
:=
false
for
_
,
requestResource
:=
range
request
.
Resources
{
if
resource
.
ID
==
int32
(
requestResource
.
Id
)
{
if
resource
.
UID
==
requestResource
.
Uid
{
found
=
true
break
}
...
...
@@ -36,7 +36,7 @@ func (s *APIV2Service) SetMemoResources(ctx context.Context, request *apiv2pb.Se
if
!
found
{
if
err
=
s
.
Store
.
DeleteResource
(
ctx
,
&
store
.
DeleteResource
{
ID
:
int32
(
resource
.
ID
),
MemoID
:
&
id
,
MemoID
:
&
memoID
,
});
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
Internal
,
"failed to delete resource"
)
}
...
...
@@ -46,10 +46,14 @@ func (s *APIV2Service) SetMemoResources(ctx context.Context, request *apiv2pb.Se
slices
.
Reverse
(
request
.
Resources
)
// Update resources' memo_id in the request.
for
index
,
resource
:=
range
request
.
Resources
{
id
,
err
:=
ExtractMemoIDFromName
(
resource
.
Name
)
if
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"invalid resource name: %v"
,
err
)
}
updatedTs
:=
time
.
Now
()
.
Unix
()
+
int64
(
index
)
if
_
,
err
:=
s
.
Store
.
UpdateResource
(
ctx
,
&
store
.
UpdateResource
{
ID
:
resource
.
I
d
,
MemoID
:
&
id
,
ID
:
i
d
,
MemoID
:
&
memoID
,
UpdatedTs
:
&
updatedTs
,
});
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
Internal
,
"failed to update resource: %v"
,
err
)
...
...
server/route/api/v2/memo_service.go
View file @
7c5261b5
...
...
@@ -874,7 +874,7 @@ func convertMemoToWebhookPayload(memo *apiv2pb.Memo) (*webhook.WebhookPayload, e
resources
:=
[]
*
webhook
.
Resource
{}
for
_
,
resource
:=
range
memo
.
Resources
{
resources
=
append
(
resources
,
&
webhook
.
Resource
{
ID
:
resource
.
I
d
,
UID
:
resource
.
Ui
d
,
Filename
:
resource
.
Filename
,
ExternalLink
:
resource
.
ExternalLink
,
Type
:
resource
.
Type
,
...
...
server/route/api/v2/resource_name.go
View file @
7c5261b5
...
...
@@ -13,6 +13,7 @@ const (
WorkspaceSettingNamePrefix
=
"settings/"
UserNamePrefix
=
"users/"
MemoNamePrefix
=
"memos/"
ResourceNamePrefix
=
"resources/"
InboxNamePrefix
=
"inboxes/"
)
...
...
@@ -70,6 +71,19 @@ func ExtractMemoIDFromName(name string) (int32, error) {
return
id
,
nil
}
// ExtractResourceIDFromName returns the resource ID from a resource name.
func
ExtractResourceIDFromName
(
name
string
)
(
int32
,
error
)
{
tokens
,
err
:=
GetNameParentTokens
(
name
,
ResourceNamePrefix
)
if
err
!=
nil
{
return
0
,
err
}
id
,
err
:=
util
.
ConvertStringToInt32
(
tokens
[
0
])
if
err
!=
nil
{
return
0
,
errors
.
Errorf
(
"invalid resource ID %q"
,
tokens
[
0
])
}
return
id
,
nil
}
// ExtractInboxIDFromName returns the inbox ID from a resource name.
func
ExtractInboxIDFromName
(
name
string
)
(
int32
,
error
)
{
tokens
,
err
:=
GetNameParentTokens
(
name
,
InboxNamePrefix
)
...
...
server/route/api/v2/resource_service.go
View file @
7c5261b5
...
...
@@ -2,10 +2,14 @@ package v2
import
(
"context"
"fmt"
"net/url"
"time"
"github.com/google/cel-go/cel"
"github.com/lithammer/shortuuid/v4"
"github.com/pkg/errors"
expr
"google.golang.org/genproto/googleapis/api/expr/v1alpha1"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"google.golang.org/protobuf/types/known/timestamppb"
...
...
@@ -69,25 +73,42 @@ func (s *APIV2Service) ListResources(ctx context.Context, _ *apiv2pb.ListResourc
return
response
,
nil
}
func
(
s
*
APIV2Service
)
GetResource
(
ctx
context
.
Context
,
request
*
apiv2pb
.
GetResourceRequest
)
(
*
apiv2pb
.
GetResourceResponse
,
error
)
{
resource
,
err
:=
s
.
Store
.
GetResource
(
ctx
,
&
store
.
FindResource
{
ID
:
&
request
.
Id
,
})
func
(
s
*
APIV2Service
)
SearchResources
(
ctx
context
.
Context
,
request
*
apiv2pb
.
SearchResourcesRequest
)
(
*
apiv2pb
.
SearchResourcesResponse
,
error
)
{
if
request
.
Filter
==
""
{
return
nil
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"filter is empty"
)
}
filter
,
err
:=
parseSearchResourcesFilter
(
request
.
Filter
)
if
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
In
ternal
,
"failed to get resource
: %v"
,
err
)
return
nil
,
status
.
Errorf
(
codes
.
In
validArgument
,
"failed to parse filter
: %v"
,
err
)
}
if
resource
==
nil
{
return
nil
,
status
.
Errorf
(
codes
.
NotFound
,
"resource not found"
)
resourceFind
:=
&
store
.
FindResource
{}
if
filter
.
UID
!=
nil
{
resourceFind
.
UID
=
filter
.
UID
}
user
,
err
:=
getCurrentUser
(
ctx
,
s
.
Store
)
if
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
Internal
,
"failed to get current user: %v"
,
err
)
}
resourceFind
.
CreatorID
=
&
user
.
ID
resources
,
err
:=
s
.
Store
.
ListResources
(
ctx
,
resourceFind
)
if
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
Internal
,
"failed to search resources: %v"
,
err
)
}
return
&
apiv2pb
.
GetResourceResponse
{
Resource
:
s
.
convertResourceFromStore
(
ctx
,
resource
),
},
nil
response
:=
&
apiv2pb
.
SearchResourcesResponse
{}
for
_
,
resource
:=
range
resources
{
response
.
Resources
=
append
(
response
.
Resources
,
s
.
convertResourceFromStore
(
ctx
,
resource
))
}
return
response
,
nil
}
func
(
s
*
APIV2Service
)
GetResourceByName
(
ctx
context
.
Context
,
request
*
apiv2pb
.
GetResourceByNameRequest
)
(
*
apiv2pb
.
GetResourceByNameResponse
,
error
)
{
func
(
s
*
APIV2Service
)
GetResource
(
ctx
context
.
Context
,
request
*
apiv2pb
.
GetResourceRequest
)
(
*
apiv2pb
.
GetResourceResponse
,
error
)
{
id
,
err
:=
ExtractResourceIDFromName
(
request
.
Name
)
if
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"invalid resource name: %v"
,
err
)
}
resource
,
err
:=
s
.
Store
.
GetResource
(
ctx
,
&
store
.
FindResource
{
UID
:
&
request
.
Name
,
ID
:
&
id
,
})
if
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
Internal
,
"failed to get resource: %v"
,
err
)
...
...
@@ -96,19 +117,23 @@ func (s *APIV2Service) GetResourceByName(ctx context.Context, request *apiv2pb.G
return
nil
,
status
.
Errorf
(
codes
.
NotFound
,
"resource not found"
)
}
return
&
apiv2pb
.
GetResource
ByName
Response
{
return
&
apiv2pb
.
GetResourceResponse
{
Resource
:
s
.
convertResourceFromStore
(
ctx
,
resource
),
},
nil
}
func
(
s
*
APIV2Service
)
UpdateResource
(
ctx
context
.
Context
,
request
*
apiv2pb
.
UpdateResourceRequest
)
(
*
apiv2pb
.
UpdateResourceResponse
,
error
)
{
id
,
err
:=
ExtractResourceIDFromName
(
request
.
Resource
.
Name
)
if
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"invalid resource name: %v"
,
err
)
}
if
request
.
UpdateMask
==
nil
||
len
(
request
.
UpdateMask
.
Paths
)
==
0
{
return
nil
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"update mask is required"
)
}
currentTs
:=
time
.
Now
()
.
Unix
()
update
:=
&
store
.
UpdateResource
{
ID
:
request
.
Resource
.
I
d
,
ID
:
i
d
,
UpdatedTs
:
&
currentTs
,
}
for
_
,
field
:=
range
request
.
UpdateMask
.
Paths
{
...
...
@@ -129,12 +154,16 @@ func (s *APIV2Service) UpdateResource(ctx context.Context, request *apiv2pb.Upda
}
func
(
s
*
APIV2Service
)
DeleteResource
(
ctx
context
.
Context
,
request
*
apiv2pb
.
DeleteResourceRequest
)
(
*
apiv2pb
.
DeleteResourceResponse
,
error
)
{
id
,
err
:=
ExtractResourceIDFromName
(
request
.
Name
)
if
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"invalid resource name: %v"
,
err
)
}
user
,
err
:=
getCurrentUser
(
ctx
,
s
.
Store
)
if
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
Internal
,
"failed to get current user: %v"
,
err
)
}
resource
,
err
:=
s
.
Store
.
GetResource
(
ctx
,
&
store
.
FindResource
{
ID
:
&
request
.
I
d
,
ID
:
&
i
d
,
CreatorID
:
&
user
.
ID
,
})
if
err
!=
nil
{
...
...
@@ -164,8 +193,8 @@ func (s *APIV2Service) convertResourceFromStore(ctx context.Context, resource *s
}
return
&
apiv2pb
.
Resource
{
Id
:
resource
.
ID
,
Name
:
resource
.
UID
,
Name
:
fmt
.
Sprintf
(
"%s%d"
,
ResourceNamePrefix
,
resource
.
ID
)
,
Uid
:
resource
.
UID
,
CreateTime
:
timestamppb
.
New
(
time
.
Unix
(
resource
.
CreatedTs
,
0
)),
Filename
:
resource
.
Filename
,
ExternalLink
:
resource
.
ExternalLink
,
...
...
@@ -174,3 +203,50 @@ func (s *APIV2Service) convertResourceFromStore(ctx context.Context, resource *s
MemoId
:
memoID
,
}
}
// SearchResourcesFilterCELAttributes are the CEL attributes for SearchResourcesFilter.
var
SearchResourcesFilterCELAttributes
=
[]
cel
.
EnvOption
{
cel
.
Variable
(
"uid"
,
cel
.
StringType
),
}
type
SearchResourcesFilter
struct
{
UID
*
string
}
func
parseSearchResourcesFilter
(
expression
string
)
(
*
SearchResourcesFilter
,
error
)
{
e
,
err
:=
cel
.
NewEnv
(
SearchResourcesFilterCELAttributes
...
)
if
err
!=
nil
{
return
nil
,
err
}
ast
,
issues
:=
e
.
Compile
(
expression
)
if
issues
!=
nil
{
return
nil
,
errors
.
Errorf
(
"found issue %v"
,
issues
)
}
filter
:=
&
SearchResourcesFilter
{}
expr
,
err
:=
cel
.
AstToParsedExpr
(
ast
)
if
err
!=
nil
{
return
nil
,
err
}
callExpr
:=
expr
.
GetExpr
()
.
GetCallExpr
()
findSearchResourcesField
(
callExpr
,
filter
)
return
filter
,
nil
}
func
findSearchResourcesField
(
callExpr
*
expr
.
Expr_Call
,
filter
*
SearchResourcesFilter
)
{
if
len
(
callExpr
.
Args
)
==
2
{
idExpr
:=
callExpr
.
Args
[
0
]
.
GetIdentExpr
()
if
idExpr
!=
nil
{
if
idExpr
.
Name
==
"uid"
{
uid
:=
callExpr
.
Args
[
1
]
.
GetConstExpr
()
.
GetStringValue
()
filter
.
UID
=
&
uid
}
return
}
}
for
_
,
arg
:=
range
callExpr
.
Args
{
callExpr
:=
arg
.
GetCallExpr
()
if
callExpr
!=
nil
{
findSearchResourcesField
(
callExpr
,
filter
)
}
}
}
web/src/components/MemoContent/EmbeddedContent/EmbeddedResource.tsx
View file @
7c5261b5
...
...
@@ -42,7 +42,7 @@ const EmbeddedResource = ({ resourceId, params: paramsStr }: Props) => {
const
params
=
new
URLSearchParams
(
paramsStr
);
useEffect
(()
=>
{
resourceStore
.
getOrFetchResourceByName
(
resourceId
).
finally
(()
=>
loadingState
.
setFinish
());
resourceStore
.
searchResources
(
`uid ==
${
resourceId
}
`
).
finally
(()
=>
loadingState
.
setFinish
());
},
[
resourceId
]);
if
(
loadingState
.
isLoading
)
{
...
...
web/src/components/MemoEditor/ResourceListView.tsx
View file @
7c5261b5
...
...
@@ -10,8 +10,8 @@ interface Props {
const
ResourceListView
=
(
props
:
Props
)
=>
{
const
{
resourceList
,
setResourceList
}
=
props
;
const
handleDeleteResource
=
async
(
resourceId
:
ResourceId
)
=>
{
setResourceList
(
resourceList
.
filter
((
resource
)
=>
resource
.
id
!==
resourceId
));
const
handleDeleteResource
=
async
(
name
:
string
)
=>
{
setResourceList
(
resourceList
.
filter
((
resource
)
=>
resource
.
name
!==
name
));
};
return
(
...
...
@@ -21,14 +21,14 @@ const ResourceListView = (props: Props) => {
{
resourceList
.
map
((
resource
)
=>
{
return
(
<
div
key=
{
resource
.
id
}
key=
{
resource
.
name
}
className=
"max-w-full flex flex-row justify-start items-center flex-nowrap gap-x-1 bg-zinc-100 dark:bg-zinc-900 px-2 py-1 rounded text-gray-500 dark:text-gray-400"
>
<
ResourceIcon
resource=
{
resource
}
className=
"!w-4 !h-4 !opacity-100"
/>
<
span
className=
"text-sm max-w-[8rem] truncate"
>
{
resource
.
filename
}
</
span
>
<
Icon
.
X
className=
"w-4 h-auto cursor-pointer opacity-60 hover:opacity-100"
onClick=
{
()
=>
handleDeleteResource
(
resource
.
id
)
}
onClick=
{
()
=>
handleDeleteResource
(
resource
.
name
)
}
/>
</
div
>
);
...
...
web/src/components/MemoEditor/index.tsx
View file @
7c5261b5
...
...
@@ -229,7 +229,7 @@ const MemoEditor = (props: Props) => {
if
(
memoId
)
{
await
resourceStore
.
updateResource
({
resource
:
Resource
.
fromPartial
({
id
:
resource
.
id
,
name
:
resource
.
name
,
memoId
,
}),
updateMask
:
[
"memo_id"
],
...
...
web/src/components/MemoResourceListView.tsx
View file @
7c5261b5
...
...
@@ -70,7 +70,7 @@ const MemoResourceListView = ({ resources = [] }: { resources: Resource[] }) =>
const
cards
=
resources
.
map
((
resource
)
=>
(
<
SquareDiv
key=
{
resource
.
id
}
key=
{
resource
.
name
}
className=
"flex justify-center items-center border dark:border-zinc-900 rounded overflow-hidden hide-scrollbar hover:shadow-md"
>
<
MediaCard
resource=
{
resource
}
thumbnail
/>
...
...
@@ -90,7 +90,7 @@ const MemoResourceListView = ({ resources = [] }: { resources: Resource[] }) =>
return
(
<
div
className=
"w-full flex flex-row justify-start flex-wrap gap-2"
>
{
otherResources
.
map
((
resource
)
=>
(
<
MemoResource
key=
{
resource
.
id
}
resource=
{
resource
}
/>
<
MemoResource
key=
{
resource
.
name
}
resource=
{
resource
}
/>
))
}
</
div
>
);
...
...
web/src/pages/Resources.tsx
View file @
7c5261b5
...
...
@@ -70,7 +70,7 @@ const Resources = () => {
dialogName
:
"delete-unused-resources-dialog"
,
onConfirm
:
async
()
=>
{
for
(
const
resource
of
unusedResources
)
{
await
resourceServiceClient
.
deleteResource
({
id
:
resource
.
id
});
await
resourceServiceClient
.
deleteResource
({
name
:
resource
.
name
});
}
setResources
(
resources
.
filter
((
resource
)
=>
resource
.
memoId
));
},
...
...
@@ -123,7 +123,7 @@ const Resources = () => {
{
resources
.
map
((
resource
)
=>
{
const
relatedMemo
=
resource
.
memoId
?
memoStore
.
getMemoByName
(
`${MemoNamePrefix}${resource.memoId}`
)
:
null
;
return
(
<
div
key=
{
resource
.
id
}
className=
"w-24 sm:w-32 h-auto flex flex-col justify-start items-start"
>
<
div
key=
{
resource
.
name
}
className=
"w-24 sm:w-32 h-auto flex flex-col justify-start items-start"
>
<
div
className=
"w-24 h-24 flex justify-center items-center sm:w-32 sm:h-32 border dark:border-zinc-900 overflow-clip rounded-xl cursor-pointer hover:shadow hover:opacity-80"
>
<
ResourceIcon
resource=
{
resource
}
strokeWidth=
{
0.5
}
/>
</
div
>
...
...
@@ -163,7 +163,7 @@ const Resources = () => {
</
div
>
{
unusedResources
.
map
((
resource
)
=>
{
return
(
<
div
key=
{
resource
.
id
}
className=
"w-24 sm:w-32 h-auto flex flex-col justify-start items-start"
>
<
div
key=
{
resource
.
name
}
className=
"w-24 sm:w-32 h-auto flex flex-col justify-start items-start"
>
<
div
className=
"w-24 h-24 flex justify-center items-center sm:w-32 sm:h-32 border dark:border-zinc-900 overflow-clip rounded-xl cursor-pointer hover:shadow hover:opacity-80"
>
<
ResourceIcon
resource=
{
resource
}
strokeWidth=
{
0.5
}
/>
</
div
>
...
...
web/src/store/reducer/resource.ts
View file @
7c5261b5
...
...
@@ -21,14 +21,14 @@ const resourceSlice = createSlice({
upsertResources
:
(
state
,
action
:
PayloadAction
<
Resource
[]
>
)
=>
{
return
{
...
state
,
resources
:
uniqBy
([...
action
.
payload
,
...
state
.
resources
],
"
id
"
),
resources
:
uniqBy
([...
action
.
payload
,
...
state
.
resources
],
"
name
"
),
};
},
patchResource
:
(
state
,
action
:
PayloadAction
<
Partial
<
Resource
>>
)
=>
{
return
{
...
state
,
resources
:
state
.
resources
.
map
((
resource
)
=>
{
if
(
resource
.
id
===
action
.
payload
.
id
)
{
if
(
resource
.
name
===
action
.
payload
.
name
)
{
return
{
...
resource
,
...
action
.
payload
,
...
...
web/src/store/v1/resource.ts
View file @
7c5261b5
...
...
@@ -4,62 +4,30 @@ import { resourceServiceClient } from "@/grpcweb";
import
{
Resource
}
from
"@/types/proto/api/v2/resource_service"
;
interface
State
{
resourceMapBy
Id
:
Record
<
number
,
Resource
>
;
resourceMapBy
Name
:
Record
<
string
,
Resource
>
;
}
const
getDefaultState
=
():
State
=>
({
resourceMapBy
Id
:
{},
resourceMapBy
Name
:
{},
});
export
const
useResourceStore
=
create
(
combine
(
getDefaultState
(),
(
set
,
get
)
=>
({
setState
:
(
state
:
State
)
=>
set
(
state
),
getState
:
()
=>
get
(),
getOrFetchResourceById
:
async
(
id
:
number
,
options
?:
{
skipCache
?:
boolean
;
skipStore
?:
boolean
})
=>
{
const
resourceMap
=
get
().
resourceMapById
;
const
resource
=
resourceMap
[
id
];
if
(
resource
&&
!
options
?.
skipCache
)
{
return
resource
;
}
const
res
=
await
resourceServiceClient
.
getResource
({
id
,
});
if
(
!
res
.
resource
)
{
throw
new
Error
(
"Resource not found"
);
}
if
(
!
options
?.
skipStore
)
{
resourceMap
[
id
]
=
res
.
resource
;
set
({
resourceMapById
:
resourceMap
});
}
return
res
.
resource
;
},
getResourceById
:
(
id
:
number
)
=>
{
return
get
().
resourceMapById
[
id
];
},
getOrFetchResourceByName
:
async
(
name
:
string
,
options
?:
{
skipCache
?:
boolean
;
skipStore
?:
boolean
})
=>
{
const
resourceMap
=
get
().
resourceMapById
;
const
cachedResource
=
Object
.
values
(
resourceMap
).
find
((
r
)
=>
r
.
name
===
name
);
if
(
cachedResource
&&
!
options
?.
skipCache
)
{
return
cachedResource
;
}
const
{
resource
}
=
await
resourceServiceClient
.
getResourceByName
({
name
,
searchResources
:
async
(
filter
:
string
)
=>
{
const
{
resources
}
=
await
resourceServiceClient
.
searchResources
({
filter
,
});
if
(
!
resource
)
{
throw
new
Error
(
"Resource not found"
);
}
if
(
!
options
?.
skipStore
)
{
resourceMap
[
resource
.
id
]
=
resource
;
set
({
resourceMapById
:
resourceMap
});
const
resourceMap
=
get
().
resourceMapByName
;
for
(
const
resource
of
resources
)
{
resourceMap
[
resource
.
name
]
=
resource
;
}
return
resource
;
set
({
resourceMapByName
:
resourceMap
});
return
resources
;
},
getResourceByName
:
(
name
:
string
)
=>
{
const
resourceMap
=
get
().
resourceMapBy
Id
;
const
resourceMap
=
get
().
resourceMapBy
Name
;
return
Object
.
values
(
resourceMap
).
find
((
r
)
=>
r
.
name
===
name
);
},
})),
...
...
web/src/types/modules/resource.d.ts
View file @
7c5261b5
type
ResourceId
=
number
;
interface
ResourceCreate
{
filename
:
string
;
externalLink
:
string
;
...
...
web/src/utils/resource.ts
View file @
7c5261b5
...
...
@@ -5,7 +5,7 @@ export const getResourceUrl = (resource: Resource) => {
return
resource
.
externalLink
;
}
return
`
${
import
.
meta
.
env
.
VITE_API_BASE_URL
||
window
.
location
.
origin
}
/o/r/
${
resource
.
name
}
`
;
return
`
${
import
.
meta
.
env
.
VITE_API_BASE_URL
||
window
.
location
.
origin
}
/o/r/
${
resource
.
uid
}
`
;
};
export
const
getResourceType
=
(
resource
:
Resource
)
=>
{
...
...
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