Commit 7c5261b5 authored by Steven's avatar Steven

chore: tweak resource definition

parent 7cc8b951
...@@ -30,7 +30,8 @@ type Memo struct { ...@@ -30,7 +30,8 @@ type Memo struct {
} }
type Resource struct { type Resource struct {
ID int32 `json:"id"` ID int32 `json:"id"`
UID string `json:"uid"`
// Standard fields // Standard fields
CreatorID int32 `json:"creatorId"` CreatorID int32 `json:"creatorId"`
......
...@@ -26,7 +26,7 @@ service MemoService { ...@@ -26,7 +26,7 @@ service MemoService {
rpc ListMemos(ListMemosRequest) returns (ListMemosResponse) { rpc ListMemos(ListMemosRequest) returns (ListMemosResponse) {
option (google.api.http) = {get: "/api/v2/memos"}; option (google.api.http) = {get: "/api/v2/memos"};
} }
// SearchMemosRequest searches memos. // SearchMemos searches memos.
rpc SearchMemos(SearchMemosRequest) returns (SearchMemosResponse) { rpc SearchMemos(SearchMemosRequest) returns (SearchMemosResponse) {
option (google.api.http) = {get: "/api/v2/memos:search"}; option (google.api.http) = {get: "/api/v2/memos:search"};
} }
......
...@@ -18,37 +18,38 @@ service ResourceService { ...@@ -18,37 +18,38 @@ service ResourceService {
rpc ListResources(ListResourcesRequest) returns (ListResourcesResponse) { rpc ListResources(ListResourcesRequest) returns (ListResourcesResponse) {
option (google.api.http) = {get: "/api/v2/resources"}; option (google.api.http) = {get: "/api/v2/resources"};
} }
// GetResource returns a resource by id. // SearchResources searches memos.
rpc GetResource(GetResourceRequest) returns (GetResourceResponse) { rpc SearchResources(SearchResourcesRequest) returns (SearchResourcesResponse) {
option (google.api.http) = {get: "/api/v2/resources/{id}"}; option (google.api.http) = {get: "/api/v2/resources:search"};
option (google.api.method_signature) = "id";
} }
// GetResourceByName returns a resource by name. // GetResource returns a resource by name.
rpc GetResourceByName(GetResourceByNameRequest) returns (GetResourceByNameResponse) { rpc GetResource(GetResourceRequest) returns (GetResourceResponse) {
option (google.api.http) = {get: "/api/v2/resources/name/{name}"}; option (google.api.http) = {get: "/api/v2/{name=resources/*}"};
option (google.api.method_signature) = "name"; option (google.api.method_signature) = "name";
} }
// UpdateResource updates a resource. // UpdateResource updates a resource.
rpc UpdateResource(UpdateResourceRequest) returns (UpdateResourceResponse) { rpc UpdateResource(UpdateResourceRequest) returns (UpdateResourceResponse) {
option (google.api.http) = { option (google.api.http) = {
patch: "/api/v2/resources/{resource.id}", patch: "/api/v2/{resource.name=resources/*}",
body: "resource" body: "resource"
}; };
option (google.api.method_signature) = "resource,update_mask"; 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) { rpc DeleteResource(DeleteResourceRequest) returns (DeleteResourceResponse) {
option (google.api.http) = {delete: "/api/v2/resources/{id}"}; option (google.api.http) = {delete: "/api/v2/{name=resources/*}"};
option (google.api.method_signature) = "id"; option (google.api.method_signature) = "name";
} }
} }
message Resource { message Resource {
// The name of the resource.
// Format: resources/{id}
// id is the system generated unique identifier. // id is the system generated unique identifier.
int32 id = 1; string name = 1;
// name is the user provided name. // The user defined id of the resource.
string name = 2; string uid = 2;
google.protobuf.Timestamp create_time = 3; google.protobuf.Timestamp create_time = 3;
...@@ -65,8 +66,11 @@ message Resource { ...@@ -65,8 +66,11 @@ message Resource {
message CreateResourceRequest { message CreateResourceRequest {
string filename = 1; string filename = 1;
string external_link = 2; string external_link = 2;
string type = 3; string type = 3;
optional int32 memo_id = 4; optional int32 memo_id = 4;
} }
...@@ -80,19 +84,19 @@ message ListResourcesResponse { ...@@ -80,19 +84,19 @@ message ListResourcesResponse {
repeated Resource resources = 1; repeated Resource resources = 1;
} }
message GetResourceRequest { message SearchResourcesRequest {
int32 id = 1; string filter = 1;
} }
message GetResourceResponse { message SearchResourcesResponse {
Resource resource = 1; repeated Resource resources = 1;
} }
message GetResourceByNameRequest { message GetResourceRequest {
string name = 1; string name = 1;
} }
message GetResourceByNameResponse { message GetResourceResponse {
Resource resource = 1; Resource resource = 1;
} }
...@@ -107,7 +111,7 @@ message UpdateResourceResponse { ...@@ -107,7 +111,7 @@ message UpdateResourceResponse {
} }
message DeleteResourceRequest { message DeleteResourceRequest {
int32 id = 1; string name = 1;
} }
message DeleteResourceResponse {} message DeleteResourceResponse {}
...@@ -99,13 +99,13 @@ ...@@ -99,13 +99,13 @@
- [CreateResourceResponse](#memos-api-v2-CreateResourceResponse) - [CreateResourceResponse](#memos-api-v2-CreateResourceResponse)
- [DeleteResourceRequest](#memos-api-v2-DeleteResourceRequest) - [DeleteResourceRequest](#memos-api-v2-DeleteResourceRequest)
- [DeleteResourceResponse](#memos-api-v2-DeleteResourceResponse) - [DeleteResourceResponse](#memos-api-v2-DeleteResourceResponse)
- [GetResourceByNameRequest](#memos-api-v2-GetResourceByNameRequest)
- [GetResourceByNameResponse](#memos-api-v2-GetResourceByNameResponse)
- [GetResourceRequest](#memos-api-v2-GetResourceRequest) - [GetResourceRequest](#memos-api-v2-GetResourceRequest)
- [GetResourceResponse](#memos-api-v2-GetResourceResponse) - [GetResourceResponse](#memos-api-v2-GetResourceResponse)
- [ListResourcesRequest](#memos-api-v2-ListResourcesRequest) - [ListResourcesRequest](#memos-api-v2-ListResourcesRequest)
- [ListResourcesResponse](#memos-api-v2-ListResourcesResponse) - [ListResourcesResponse](#memos-api-v2-ListResourcesResponse)
- [Resource](#memos-api-v2-Resource) - [Resource](#memos-api-v2-Resource)
- [SearchResourcesRequest](#memos-api-v2-SearchResourcesRequest)
- [SearchResourcesResponse](#memos-api-v2-SearchResourcesResponse)
- [UpdateResourceRequest](#memos-api-v2-UpdateResourceRequest) - [UpdateResourceRequest](#memos-api-v2-UpdateResourceRequest)
- [UpdateResourceResponse](#memos-api-v2-UpdateResourceResponse) - [UpdateResourceResponse](#memos-api-v2-UpdateResourceResponse)
...@@ -1362,7 +1362,7 @@ Used internally for obfuscating the page token. ...@@ -1362,7 +1362,7 @@ Used internally for obfuscating the page token.
| Field | Type | Label | Description | | Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- | | ----- | ---- | ----- | ----------- |
| id | [int32](#int32) | | | | name | [string](#string) | | |
...@@ -1379,9 +1379,9 @@ Used internally for obfuscating the page token. ...@@ -1379,9 +1379,9 @@ Used internally for obfuscating the page token.
<a name="memos-api-v2-GetResourceByNameRequest"></a> <a name="memos-api-v2-GetResourceRequest"></a>
### GetResourceByNameRequest ### GetResourceRequest
...@@ -1394,9 +1394,9 @@ Used internally for obfuscating the page token. ...@@ -1394,9 +1394,9 @@ Used internally for obfuscating the page token.
<a name="memos-api-v2-GetResourceByNameResponse"></a> <a name="memos-api-v2-GetResourceResponse"></a>
### GetResourceByNameResponse ### GetResourceResponse
...@@ -1409,77 +1409,77 @@ Used internally for obfuscating the page token. ...@@ -1409,77 +1409,77 @@ Used internally for obfuscating the page token.
<a name="memos-api-v2-GetResourceRequest"></a> <a name="memos-api-v2-ListResourcesRequest"></a>
### GetResourceRequest
### ListResourcesRequest
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| id | [int32](#int32) | | |
<a name="memos-api-v2-GetResourceResponse"></a> <a name="memos-api-v2-ListResourcesResponse"></a>
### GetResourceResponse ### ListResourcesResponse
| Field | Type | Label | Description | | Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- | | ----- | ---- | ----- | ----------- |
| resource | [Resource](#memos-api-v2-Resource) | | | | resources | [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 | | Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- | | ----- | ---- | ----- | ----------- |
| resources | [Resource](#memos-api-v2-Resource) | repeated | | | filter | [string](#string) | | |
<a name="memos-api-v2-Resource"></a> <a name="memos-api-v2-SearchResourcesResponse"></a>
### Resource ### SearchResourcesResponse
| Field | Type | Label | Description | | Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- | | ----- | ---- | ----- | ----------- |
| id | [int32](#int32) | | id is the system generated unique identifier. | | resources | [Resource](#memos-api-v2-Resource) | repeated | |
| 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 | |
...@@ -1532,10 +1532,10 @@ Used internally for obfuscating the page token. ...@@ -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. | | 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. | | 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. | | SearchResources | [SearchResourcesRequest](#memos-api-v2-SearchResourcesRequest) | [SearchResourcesResponse](#memos-api-v2-SearchResourcesResponse) | SearchResources searches memos. |
| GetResourceByName | [GetResourceByNameRequest](#memos-api-v2-GetResourceByNameRequest) | [GetResourceByNameResponse](#memos-api-v2-GetResourceByNameResponse) | GetResourceByName returns a resource by name. | | GetResource | [GetResourceRequest](#memos-api-v2-GetResourceRequest) | [GetResourceResponse](#memos-api-v2-GetResourceResponse) | GetResource returns a resource by name. |
| UpdateResource | [UpdateResourceRequest](#memos-api-v2-UpdateResourceRequest) | [UpdateResourceResponse](#memos-api-v2-UpdateResourceResponse) | UpdateResource updates a resource. | | 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. ...@@ -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. | | 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. | | 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) | SearchMemosRequest 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. | | 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. | | 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. | | DeleteMemo | [DeleteMemoRequest](#memos-api-v2-DeleteMemoRequest) | [DeleteMemoResponse](#memos-api-v2-DeleteMemoResponse) | DeleteMemo deletes a memo. |
......
...@@ -46,7 +46,7 @@ type MemoServiceClient interface { ...@@ -46,7 +46,7 @@ type MemoServiceClient interface {
CreateMemo(ctx context.Context, in *CreateMemoRequest, opts ...grpc.CallOption) (*CreateMemoResponse, error) CreateMemo(ctx context.Context, in *CreateMemoRequest, opts ...grpc.CallOption) (*CreateMemoResponse, error)
// ListMemos lists memos with pagination and filter. // ListMemos lists memos with pagination and filter.
ListMemos(ctx context.Context, in *ListMemosRequest, opts ...grpc.CallOption) (*ListMemosResponse, error) ListMemos(ctx context.Context, in *ListMemosRequest, opts ...grpc.CallOption) (*ListMemosResponse, error)
// SearchMemosRequest searches memos. // SearchMemos searches memos.
SearchMemos(ctx context.Context, in *SearchMemosRequest, opts ...grpc.CallOption) (*SearchMemosResponse, error) SearchMemos(ctx context.Context, in *SearchMemosRequest, opts ...grpc.CallOption) (*SearchMemosResponse, error)
// GetMemo gets a memo. // GetMemo gets a memo.
GetMemo(ctx context.Context, in *GetMemoRequest, opts ...grpc.CallOption) (*GetMemoResponse, error) GetMemo(ctx context.Context, in *GetMemoRequest, opts ...grpc.CallOption) (*GetMemoResponse, error)
...@@ -247,7 +247,7 @@ type MemoServiceServer interface { ...@@ -247,7 +247,7 @@ type MemoServiceServer interface {
CreateMemo(context.Context, *CreateMemoRequest) (*CreateMemoResponse, error) CreateMemo(context.Context, *CreateMemoRequest) (*CreateMemoResponse, error)
// ListMemos lists memos with pagination and filter. // ListMemos lists memos with pagination and filter.
ListMemos(context.Context, *ListMemosRequest) (*ListMemosResponse, error) ListMemos(context.Context, *ListMemosRequest) (*ListMemosResponse, error)
// SearchMemosRequest searches memos. // SearchMemos searches memos.
SearchMemos(context.Context, *SearchMemosRequest) (*SearchMemosResponse, error) SearchMemos(context.Context, *SearchMemosRequest) (*SearchMemosResponse, error)
// GetMemo gets a memo. // GetMemo gets a memo.
GetMemo(context.Context, *GetMemoRequest) (*GetMemoResponse, error) GetMemo(context.Context, *GetMemoRequest) (*GetMemoResponse, error)
......
This diff is collapsed.
This diff is collapsed.
...@@ -19,12 +19,12 @@ import ( ...@@ -19,12 +19,12 @@ import (
const _ = grpc.SupportPackageIsVersion7 const _ = grpc.SupportPackageIsVersion7
const ( const (
ResourceService_CreateResource_FullMethodName = "/memos.api.v2.ResourceService/CreateResource" ResourceService_CreateResource_FullMethodName = "/memos.api.v2.ResourceService/CreateResource"
ResourceService_ListResources_FullMethodName = "/memos.api.v2.ResourceService/ListResources" ResourceService_ListResources_FullMethodName = "/memos.api.v2.ResourceService/ListResources"
ResourceService_GetResource_FullMethodName = "/memos.api.v2.ResourceService/GetResource" ResourceService_SearchResources_FullMethodName = "/memos.api.v2.ResourceService/SearchResources"
ResourceService_GetResourceByName_FullMethodName = "/memos.api.v2.ResourceService/GetResourceByName" ResourceService_GetResource_FullMethodName = "/memos.api.v2.ResourceService/GetResource"
ResourceService_UpdateResource_FullMethodName = "/memos.api.v2.ResourceService/UpdateResource" ResourceService_UpdateResource_FullMethodName = "/memos.api.v2.ResourceService/UpdateResource"
ResourceService_DeleteResource_FullMethodName = "/memos.api.v2.ResourceService/DeleteResource" ResourceService_DeleteResource_FullMethodName = "/memos.api.v2.ResourceService/DeleteResource"
) )
// ResourceServiceClient is the client API for ResourceService service. // ResourceServiceClient is the client API for ResourceService service.
...@@ -35,13 +35,13 @@ type ResourceServiceClient interface { ...@@ -35,13 +35,13 @@ type ResourceServiceClient interface {
CreateResource(ctx context.Context, in *CreateResourceRequest, opts ...grpc.CallOption) (*CreateResourceResponse, error) CreateResource(ctx context.Context, in *CreateResourceRequest, opts ...grpc.CallOption) (*CreateResourceResponse, error)
// ListResources lists all resources. // ListResources lists all resources.
ListResources(ctx context.Context, in *ListResourcesRequest, opts ...grpc.CallOption) (*ListResourcesResponse, error) 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) 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 updates a resource.
UpdateResource(ctx context.Context, in *UpdateResourceRequest, opts ...grpc.CallOption) (*UpdateResourceResponse, error) 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) DeleteResource(ctx context.Context, in *DeleteResourceRequest, opts ...grpc.CallOption) (*DeleteResourceResponse, error)
} }
...@@ -71,18 +71,18 @@ func (c *resourceServiceClient) ListResources(ctx context.Context, in *ListResou ...@@ -71,18 +71,18 @@ func (c *resourceServiceClient) ListResources(ctx context.Context, in *ListResou
return out, nil return out, nil
} }
func (c *resourceServiceClient) GetResource(ctx context.Context, in *GetResourceRequest, opts ...grpc.CallOption) (*GetResourceResponse, error) { func (c *resourceServiceClient) SearchResources(ctx context.Context, in *SearchResourcesRequest, opts ...grpc.CallOption) (*SearchResourcesResponse, error) {
out := new(GetResourceResponse) out := new(SearchResourcesResponse)
err := c.cc.Invoke(ctx, ResourceService_GetResource_FullMethodName, in, out, opts...) err := c.cc.Invoke(ctx, ResourceService_SearchResources_FullMethodName, in, out, opts...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return out, nil return out, nil
} }
func (c *resourceServiceClient) GetResourceByName(ctx context.Context, in *GetResourceByNameRequest, opts ...grpc.CallOption) (*GetResourceByNameResponse, error) { func (c *resourceServiceClient) GetResource(ctx context.Context, in *GetResourceRequest, opts ...grpc.CallOption) (*GetResourceResponse, error) {
out := new(GetResourceByNameResponse) out := new(GetResourceResponse)
err := c.cc.Invoke(ctx, ResourceService_GetResourceByName_FullMethodName, in, out, opts...) err := c.cc.Invoke(ctx, ResourceService_GetResource_FullMethodName, in, out, opts...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -115,13 +115,13 @@ type ResourceServiceServer interface { ...@@ -115,13 +115,13 @@ type ResourceServiceServer interface {
CreateResource(context.Context, *CreateResourceRequest) (*CreateResourceResponse, error) CreateResource(context.Context, *CreateResourceRequest) (*CreateResourceResponse, error)
// ListResources lists all resources. // ListResources lists all resources.
ListResources(context.Context, *ListResourcesRequest) (*ListResourcesResponse, error) 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) GetResource(context.Context, *GetResourceRequest) (*GetResourceResponse, error)
// GetResourceByName returns a resource by name.
GetResourceByName(context.Context, *GetResourceByNameRequest) (*GetResourceByNameResponse, error)
// UpdateResource updates a resource. // UpdateResource updates a resource.
UpdateResource(context.Context, *UpdateResourceRequest) (*UpdateResourceResponse, error) UpdateResource(context.Context, *UpdateResourceRequest) (*UpdateResourceResponse, error)
// DeleteResource deletes a resource by id. // DeleteResource deletes a resource by name.
DeleteResource(context.Context, *DeleteResourceRequest) (*DeleteResourceResponse, error) DeleteResource(context.Context, *DeleteResourceRequest) (*DeleteResourceResponse, error)
mustEmbedUnimplementedResourceServiceServer() mustEmbedUnimplementedResourceServiceServer()
} }
...@@ -136,12 +136,12 @@ func (UnimplementedResourceServiceServer) CreateResource(context.Context, *Creat ...@@ -136,12 +136,12 @@ func (UnimplementedResourceServiceServer) CreateResource(context.Context, *Creat
func (UnimplementedResourceServiceServer) ListResources(context.Context, *ListResourcesRequest) (*ListResourcesResponse, error) { func (UnimplementedResourceServiceServer) ListResources(context.Context, *ListResourcesRequest) (*ListResourcesResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method ListResources not implemented") 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) { func (UnimplementedResourceServiceServer) GetResource(context.Context, *GetResourceRequest) (*GetResourceResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetResource not implemented") 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) { func (UnimplementedResourceServiceServer) UpdateResource(context.Context, *UpdateResourceRequest) (*UpdateResourceResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method UpdateResource not implemented") return nil, status.Errorf(codes.Unimplemented, "method UpdateResource not implemented")
} }
...@@ -197,38 +197,38 @@ func _ResourceService_ListResources_Handler(srv interface{}, ctx context.Context ...@@ -197,38 +197,38 @@ func _ResourceService_ListResources_Handler(srv interface{}, ctx context.Context
return interceptor(ctx, in, info, handler) return interceptor(ctx, in, info, handler)
} }
func _ResourceService_GetResource_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { func _ResourceService_SearchResources_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(GetResourceRequest) in := new(SearchResourcesRequest)
if err := dec(in); err != nil { if err := dec(in); err != nil {
return nil, err return nil, err
} }
if interceptor == nil { if interceptor == nil {
return srv.(ResourceServiceServer).GetResource(ctx, in) return srv.(ResourceServiceServer).SearchResources(ctx, in)
} }
info := &grpc.UnaryServerInfo{ info := &grpc.UnaryServerInfo{
Server: srv, Server: srv,
FullMethod: ResourceService_GetResource_FullMethodName, FullMethod: ResourceService_SearchResources_FullMethodName,
} }
handler := func(ctx context.Context, req interface{}) (interface{}, error) { handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ResourceServiceServer).GetResource(ctx, req.(*GetResourceRequest)) return srv.(ResourceServiceServer).SearchResources(ctx, req.(*SearchResourcesRequest))
} }
return interceptor(ctx, in, info, handler) return interceptor(ctx, in, info, handler)
} }
func _ResourceService_GetResourceByName_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { func _ResourceService_GetResource_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(GetResourceByNameRequest) in := new(GetResourceRequest)
if err := dec(in); err != nil { if err := dec(in); err != nil {
return nil, err return nil, err
} }
if interceptor == nil { if interceptor == nil {
return srv.(ResourceServiceServer).GetResourceByName(ctx, in) return srv.(ResourceServiceServer).GetResource(ctx, in)
} }
info := &grpc.UnaryServerInfo{ info := &grpc.UnaryServerInfo{
Server: srv, Server: srv,
FullMethod: ResourceService_GetResourceByName_FullMethodName, FullMethod: ResourceService_GetResource_FullMethodName,
} }
handler := func(ctx context.Context, req interface{}) (interface{}, error) { handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(ResourceServiceServer).GetResourceByName(ctx, req.(*GetResourceByNameRequest)) return srv.(ResourceServiceServer).GetResource(ctx, req.(*GetResourceRequest))
} }
return interceptor(ctx, in, info, handler) return interceptor(ctx, in, info, handler)
} }
...@@ -285,12 +285,12 @@ var ResourceService_ServiceDesc = grpc.ServiceDesc{ ...@@ -285,12 +285,12 @@ var ResourceService_ServiceDesc = grpc.ServiceDesc{
Handler: _ResourceService_ListResources_Handler, Handler: _ResourceService_ListResources_Handler,
}, },
{ {
MethodName: "GetResource", MethodName: "SearchResources",
Handler: _ResourceService_GetResource_Handler, Handler: _ResourceService_SearchResources_Handler,
}, },
{ {
MethodName: "GetResourceByName", MethodName: "GetResource",
Handler: _ResourceService_GetResourceByName_Handler, Handler: _ResourceService_GetResource_Handler,
}, },
{ {
MethodName: "UpdateResource", MethodName: "UpdateResource",
......
...@@ -146,19 +146,19 @@ UpdateInbox updates an inbox. ...@@ -146,19 +146,19 @@ UpdateInbox updates an inbox.
#### GET #### GET
##### Summary ##### Summary
GetMemo gets a memo. GetResource returns a resource by name.
##### Parameters ##### Parameters
| Name | Located in | Description | Required | Schema | | 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 ##### Responses
| Code | Description | Schema | | Code | Description | Schema |
| ---- | ----------- | ------ | | ---- | ----------- | ------ |
| 200 | A successful response. | [v2GetMemoResponse](#v2getmemoresponse) | | 200 | A successful response. | [v2GetResourceResponse](#v2getresourceresponse) |
| default | An unexpected error response. | [googlerpcStatus](#googlerpcstatus) | | default | An unexpected error response. | [googlerpcStatus](#googlerpcstatus) |
#### DELETE #### DELETE
...@@ -288,7 +288,7 @@ ExportMemos exports memos. ...@@ -288,7 +288,7 @@ ExportMemos exports memos.
#### GET #### GET
##### Summary ##### Summary
SearchMemosRequest searches memos. SearchMemos searches memos.
##### Parameters ##### Parameters
...@@ -324,7 +324,7 @@ UpdateMemo updates a memo. ...@@ -324,7 +324,7 @@ UpdateMemo updates a memo.
| 200 | A successful response. | [v2UpdateMemoResponse](#v2updatememoresponse) | | 200 | A successful response. | [v2UpdateMemoResponse](#v2updatememoresponse) |
| default | An unexpected error response. | [googlerpcStatus](#googlerpcstatus) | | default | An unexpected error response. | [googlerpcStatus](#googlerpcstatus) |
### /api/v2/{name_1} ### /api/v2/{name_2}
#### GET #### GET
##### Summary ##### Summary
...@@ -335,7 +335,7 @@ GetMemo gets a memo. ...@@ -335,7 +335,7 @@ GetMemo gets a memo.
| Name | Located in | Description | Required | Schema | | 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 ##### Responses
...@@ -347,22 +347,22 @@ GetMemo gets a memo. ...@@ -347,22 +347,22 @@ GetMemo gets a memo.
#### DELETE #### DELETE
##### Summary ##### Summary
DeleteInbox deletes an inbox. DeleteResource deletes a resource by name.
##### Parameters ##### Parameters
| Name | Located in | Description | Required | Schema | | 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 ##### Responses
| Code | Description | Schema | | Code | Description | Schema |
| ---- | ----------- | ------ | | ---- | ----------- | ------ |
| 200 | A successful response. | [v2DeleteInboxResponse](#v2deleteinboxresponse) | | 200 | A successful response. | [v2DeleteResourceResponse](#v2deleteresourceresponse) |
| default | An unexpected error response. | [googlerpcStatus](#googlerpcstatus) | | default | An unexpected error response. | [googlerpcStatus](#googlerpcstatus) |
### /api/v2/{name_2} ### /api/v2/{name_3}
#### DELETE #### DELETE
##### Summary ##### Summary
...@@ -373,7 +373,7 @@ DeleteMemo deletes a memo. ...@@ -373,7 +373,7 @@ DeleteMemo deletes a memo.
| Name | Located in | Description | Required | Schema | | 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 ##### Responses
...@@ -601,38 +601,38 @@ CreateResource creates a new resource. ...@@ -601,38 +601,38 @@ CreateResource creates a new resource.
| 200 | A successful response. | [v2CreateResourceResponse](#v2createresourceresponse) | | 200 | A successful response. | [v2CreateResourceResponse](#v2createresourceresponse) |
| default | An unexpected error response. | [googlerpcStatus](#googlerpcstatus) | | default | An unexpected error response. | [googlerpcStatus](#googlerpcstatus) |
### /api/v2/resources/name/{name} ### /api/v2/resources:search
#### GET #### GET
##### Summary ##### Summary
GetResourceByName returns a resource by name. SearchResources searches memos.
##### Parameters ##### Parameters
| Name | Located in | Description | Required | Schema | | Name | Located in | Description | Required | Schema |
| ---- | ---------- | ----------- | -------- | ------ | | ---- | ---------- | ----------- | -------- | ------ |
| name | path | | Yes | string | | filter | query | | No | string |
##### Responses ##### Responses
| Code | Description | Schema | | Code | Description | Schema |
| ---- | ----------- | ------ | | ---- | ----------- | ------ |
| 200 | A successful response. | [v2GetResourceByNameResponse](#v2getresourcebynameresponse) | | 200 | A successful response. | [v2SearchResourcesResponse](#v2searchresourcesresponse) |
| default | An unexpected error response. | [googlerpcStatus](#googlerpcstatus) | | default | An unexpected error response. | [googlerpcStatus](#googlerpcstatus) |
### /api/v2/resources/{id} ### /api/v2/{name_1}
#### GET #### GET
##### Summary ##### Summary
GetResource returns a resource by id. GetResource returns a resource by name.
##### Parameters ##### Parameters
| Name | Located in | Description | Required | Schema | | Name | Located in | Description | Required | Schema |
| ---- | ---------- | ----------- | -------- | ------ | | ---- | ---------- | ----------- | -------- | ------ |
| id | path | | Yes | integer | | name_1 | path | | Yes | string |
##### Responses ##### Responses
...@@ -644,13 +644,51 @@ GetResource returns a resource by id. ...@@ -644,13 +644,51 @@ GetResource returns a resource by id.
#### DELETE #### DELETE
##### Summary ##### Summary
DeleteResource deletes a resource by id. DeleteInbox deletes an inbox.
##### Parameters ##### Parameters
| Name | Located in | Description | Required | Schema | | 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 ##### Responses
...@@ -659,7 +697,7 @@ DeleteResource deletes a resource by id. ...@@ -659,7 +697,7 @@ DeleteResource deletes a resource by id.
| 200 | A successful response. | [v2DeleteResourceResponse](#v2deleteresourceresponse) | | 200 | A successful response. | [v2DeleteResourceResponse](#v2deleteresourceresponse) |
| default | An unexpected error response. | [googlerpcStatus](#googlerpcstatus) | | default | An unexpected error response. | [googlerpcStatus](#googlerpcstatus) |
### /api/v2/resources/{resource.id} ### /api/v2/{resource.name}
#### PATCH #### PATCH
##### Summary ##### Summary
...@@ -670,8 +708,8 @@ UpdateResource updates a resource. ...@@ -670,8 +708,8 @@ UpdateResource updates a resource.
| Name | Located in | Description | Required | Schema | | Name | Located in | Description | Required | Schema |
| ---- | ---------- | ----------- | -------- | ------ | | ---- | ---------- | ----------- | -------- | ------ |
| resource.id | path | id is the system generated unique identifier. | Yes | integer | | resource.name | path | The name of the resource. Format: resources/{id} id is the system generated unique identifier. | Yes | string |
| resource | body | | Yes | { **"name"**: string, **"createTime"**: dateTime, **"filename"**: string, **"externalLink"**: string, **"type"**: string, **"size"**: string (int64), **"memoId"**: integer } | | resource | body | | Yes | { **"uid"**: string, **"createTime"**: dateTime, **"filename"**: string, **"externalLink"**: string, **"type"**: string, **"size"**: string (int64), **"memoId"**: integer } |
##### Responses ##### Responses
...@@ -1463,12 +1501,6 @@ GetActivity returns the activity with the given id. ...@@ -1463,12 +1501,6 @@ GetActivity returns the activity with the given id.
| ---- | ---- | ----------- | -------- | | ---- | ---- | ----------- | -------- |
| memo | [v2Memo](#v2memo) | | No | | memo | [v2Memo](#v2memo) | | No |
#### v2GetResourceByNameResponse
| Name | Type | Description | Required |
| ---- | ---- | ----------- | -------- |
| resource | [v2Resource](#v2resource) | | No |
#### v2GetResourceResponse #### v2GetResourceResponse
| Name | Type | Description | Required | | Name | Type | Description | Required |
...@@ -1659,8 +1691,8 @@ GetActivity returns the activity with the given id. ...@@ -1659,8 +1691,8 @@ GetActivity returns the activity with the given id.
| Name | Type | Description | Required | | Name | Type | Description | Required |
| ---- | ---- | ----------- | -------- | | ---- | ---- | ----------- | -------- |
| id | integer | id is the system generated unique identifier. | No | | name | string | The name of the resource. Format: resources/{id} id is the system generated unique identifier. | No |
| name | string | name is the user provided name. | No | | uid | string | The user defined id of the resource. | No |
| createTime | dateTime | | No | | createTime | dateTime | | No |
| filename | string | | No | | filename | string | | No |
| externalLink | string | | No | | externalLink | string | | No |
...@@ -1674,6 +1706,12 @@ GetActivity returns the activity with the given id. ...@@ -1674,6 +1706,12 @@ GetActivity returns the activity with the given id.
| ---- | ---- | ----------- | -------- | | ---- | ---- | ----------- | -------- |
| memos | [ [v2Memo](#v2memo) ] | | No | | memos | [ [v2Memo](#v2memo) ] | | No |
#### v2SearchResourcesResponse
| Name | Type | Description | Required |
| ---- | ---- | ----------- | -------- |
| resources | [ [v2Resource](#v2resource) ] | | No |
#### v2SearchUsersResponse #### v2SearchUsersResponse
| Name | Type | Description | Required | | Name | Type | Description | Required |
......
...@@ -285,7 +285,7 @@ paths: ...@@ -285,7 +285,7 @@ paths:
- MemoService - MemoService
/api/v2/memos:search: /api/v2/memos:search:
get: get:
summary: SearchMemosRequest searches memos. summary: SearchMemos searches memos.
operationId: MemoService_SearchMemos operationId: MemoService_SearchMemos
responses: responses:
"200": "200":
...@@ -353,113 +353,26 @@ paths: ...@@ -353,113 +353,26 @@ paths:
format: int32 format: int32
tags: tags:
- ResourceService - ResourceService
/api/v2/resources/name/{name}: /api/v2/resources:search:
get: get:
summary: GetResourceByName returns a resource by name. summary: SearchResources searches memos.
operationId: ResourceService_GetResourceByName operationId: ResourceService_SearchResources
responses: responses:
"200": "200":
description: A successful response. description: A successful response.
schema: schema:
$ref: '#/definitions/v2GetResourceByNameResponse' $ref: '#/definitions/v2SearchResourcesResponse'
default: default:
description: An unexpected error response. description: An unexpected error response.
schema: schema:
$ref: '#/definitions/googlerpcStatus' $ref: '#/definitions/googlerpcStatus'
parameters: parameters:
- name: name - name: filter
in: path in: query
required: true required: false
type: string type: string
tags: tags:
- ResourceService - 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: /api/v2/tags:
get: get:
summary: ListTags lists tags. summary: ListTags lists tags.
...@@ -978,28 +891,25 @@ paths: ...@@ -978,28 +891,25 @@ paths:
- MemoService - MemoService
/api/v2/{name_1}: /api/v2/{name_1}:
get: get:
summary: GetMemo gets a memo. summary: GetResource returns a resource by name.
operationId: MemoService_GetMemo operationId: ResourceService_GetResource
responses: responses:
"200": "200":
description: A successful response. description: A successful response.
schema: schema:
$ref: '#/definitions/v2GetMemoResponse' $ref: '#/definitions/v2GetResourceResponse'
default: default:
description: An unexpected error response. description: An unexpected error response.
schema: schema:
$ref: '#/definitions/googlerpcStatus' $ref: '#/definitions/googlerpcStatus'
parameters: parameters:
- name: name_1 - name: name_1
description: |-
The name of the memo.
Format: memos/{id}
in: path in: path
required: true required: true
type: string type: string
pattern: memos/[^/]+ pattern: resources/[^/]+
tags: tags:
- MemoService - ResourceService
delete: delete:
summary: DeleteInbox deletes an inbox. summary: DeleteInbox deletes an inbox.
operationId: InboxService_DeleteInbox operationId: InboxService_DeleteInbox
...@@ -1024,6 +934,50 @@ paths: ...@@ -1024,6 +934,50 @@ paths:
tags: tags:
- InboxService - InboxService
/api/v2/{name_2}: /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: delete:
summary: DeleteMemo deletes a memo. summary: DeleteMemo deletes a memo.
operationId: MemoService_DeleteMemo operationId: MemoService_DeleteMemo
...@@ -1037,7 +991,7 @@ paths: ...@@ -1037,7 +991,7 @@ paths:
schema: schema:
$ref: '#/definitions/googlerpcStatus' $ref: '#/definitions/googlerpcStatus'
parameters: parameters:
- name: name_2 - name: name_3
description: |- description: |-
The name of the memo. The name of the memo.
Format: memos/{id} Format: memos/{id}
...@@ -1475,6 +1429,55 @@ paths: ...@@ -1475,6 +1429,55 @@ paths:
pattern: users/[^/]+ pattern: users/[^/]+
tags: tags:
- UserService - 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}: /api/v2/{setting.name}:
patch: patch:
summary: UpdateUserSetting updates the setting of a user. summary: UpdateUserSetting updates the setting of a user.
...@@ -1882,11 +1885,6 @@ definitions: ...@@ -1882,11 +1885,6 @@ definitions:
properties: properties:
memo: memo:
$ref: '#/definitions/v2Memo' $ref: '#/definitions/v2Memo'
v2GetResourceByNameResponse:
type: object
properties:
resource:
$ref: '#/definitions/v2Resource'
v2GetResourceResponse: v2GetResourceResponse:
type: object type: object
properties: properties:
...@@ -2161,13 +2159,15 @@ definitions: ...@@ -2161,13 +2159,15 @@ definitions:
v2Resource: v2Resource:
type: object type: object
properties: properties:
id:
type: integer
format: int32
description: id is the system generated unique identifier.
name: name:
type: string 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: createTime:
type: string type: string
format: date-time format: date-time
...@@ -2191,6 +2191,14 @@ definitions: ...@@ -2191,6 +2191,14 @@ definitions:
items: items:
type: object type: object
$ref: '#/definitions/v2Memo' $ref: '#/definitions/v2Memo'
v2SearchResourcesResponse:
type: object
properties:
resources:
type: array
items:
type: object
$ref: '#/definitions/v2Resource'
v2SearchUsersResponse: v2SearchUsersResponse:
type: object type: object
properties: properties:
......
...@@ -13,12 +13,12 @@ import ( ...@@ -13,12 +13,12 @@ import (
) )
func (s *APIV2Service) SetMemoResources(ctx context.Context, request *apiv2pb.SetMemoResourcesRequest) (*apiv2pb.SetMemoResourcesResponse, error) { 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 { if err != nil {
return nil, status.Errorf(codes.InvalidArgument, "invalid memo name: %v", err) return nil, status.Errorf(codes.InvalidArgument, "invalid memo name: %v", err)
} }
resources, err := s.Store.ListResources(ctx, &store.FindResource{ resources, err := s.Store.ListResources(ctx, &store.FindResource{
MemoID: &id, MemoID: &memoID,
}) })
if err != nil { if err != nil {
return nil, status.Errorf(codes.Internal, "failed to list resources") return nil, status.Errorf(codes.Internal, "failed to list resources")
...@@ -28,7 +28,7 @@ func (s *APIV2Service) SetMemoResources(ctx context.Context, request *apiv2pb.Se ...@@ -28,7 +28,7 @@ func (s *APIV2Service) SetMemoResources(ctx context.Context, request *apiv2pb.Se
for _, resource := range resources { for _, resource := range resources {
found := false found := false
for _, requestResource := range request.Resources { for _, requestResource := range request.Resources {
if resource.ID == int32(requestResource.Id) { if resource.UID == requestResource.Uid {
found = true found = true
break break
} }
...@@ -36,7 +36,7 @@ func (s *APIV2Service) SetMemoResources(ctx context.Context, request *apiv2pb.Se ...@@ -36,7 +36,7 @@ func (s *APIV2Service) SetMemoResources(ctx context.Context, request *apiv2pb.Se
if !found { if !found {
if err = s.Store.DeleteResource(ctx, &store.DeleteResource{ if err = s.Store.DeleteResource(ctx, &store.DeleteResource{
ID: int32(resource.ID), ID: int32(resource.ID),
MemoID: &id, MemoID: &memoID,
}); err != nil { }); err != nil {
return nil, status.Errorf(codes.Internal, "failed to delete resource") return nil, status.Errorf(codes.Internal, "failed to delete resource")
} }
...@@ -46,10 +46,14 @@ func (s *APIV2Service) SetMemoResources(ctx context.Context, request *apiv2pb.Se ...@@ -46,10 +46,14 @@ func (s *APIV2Service) SetMemoResources(ctx context.Context, request *apiv2pb.Se
slices.Reverse(request.Resources) slices.Reverse(request.Resources)
// Update resources' memo_id in the request. // Update resources' memo_id in the request.
for index, resource := range request.Resources { 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) updatedTs := time.Now().Unix() + int64(index)
if _, err := s.Store.UpdateResource(ctx, &store.UpdateResource{ if _, err := s.Store.UpdateResource(ctx, &store.UpdateResource{
ID: resource.Id, ID: id,
MemoID: &id, MemoID: &memoID,
UpdatedTs: &updatedTs, UpdatedTs: &updatedTs,
}); err != nil { }); err != nil {
return nil, status.Errorf(codes.Internal, "failed to update resource: %v", err) return nil, status.Errorf(codes.Internal, "failed to update resource: %v", err)
......
...@@ -874,7 +874,7 @@ func convertMemoToWebhookPayload(memo *apiv2pb.Memo) (*webhook.WebhookPayload, e ...@@ -874,7 +874,7 @@ func convertMemoToWebhookPayload(memo *apiv2pb.Memo) (*webhook.WebhookPayload, e
resources := []*webhook.Resource{} resources := []*webhook.Resource{}
for _, resource := range memo.Resources { for _, resource := range memo.Resources {
resources = append(resources, &webhook.Resource{ resources = append(resources, &webhook.Resource{
ID: resource.Id, UID: resource.Uid,
Filename: resource.Filename, Filename: resource.Filename,
ExternalLink: resource.ExternalLink, ExternalLink: resource.ExternalLink,
Type: resource.Type, Type: resource.Type,
......
...@@ -13,6 +13,7 @@ const ( ...@@ -13,6 +13,7 @@ const (
WorkspaceSettingNamePrefix = "settings/" WorkspaceSettingNamePrefix = "settings/"
UserNamePrefix = "users/" UserNamePrefix = "users/"
MemoNamePrefix = "memos/" MemoNamePrefix = "memos/"
ResourceNamePrefix = "resources/"
InboxNamePrefix = "inboxes/" InboxNamePrefix = "inboxes/"
) )
...@@ -70,6 +71,19 @@ func ExtractMemoIDFromName(name string) (int32, error) { ...@@ -70,6 +71,19 @@ func ExtractMemoIDFromName(name string) (int32, error) {
return id, nil 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. // ExtractInboxIDFromName returns the inbox ID from a resource name.
func ExtractInboxIDFromName(name string) (int32, error) { func ExtractInboxIDFromName(name string) (int32, error) {
tokens, err := GetNameParentTokens(name, InboxNamePrefix) tokens, err := GetNameParentTokens(name, InboxNamePrefix)
......
...@@ -2,10 +2,14 @@ package v2 ...@@ -2,10 +2,14 @@ package v2
import ( import (
"context" "context"
"fmt"
"net/url" "net/url"
"time" "time"
"github.com/google/cel-go/cel"
"github.com/lithammer/shortuuid/v4" "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/codes"
"google.golang.org/grpc/status" "google.golang.org/grpc/status"
"google.golang.org/protobuf/types/known/timestamppb" "google.golang.org/protobuf/types/known/timestamppb"
...@@ -69,25 +73,42 @@ func (s *APIV2Service) ListResources(ctx context.Context, _ *apiv2pb.ListResourc ...@@ -69,25 +73,42 @@ func (s *APIV2Service) ListResources(ctx context.Context, _ *apiv2pb.ListResourc
return response, nil return response, nil
} }
func (s *APIV2Service) GetResource(ctx context.Context, request *apiv2pb.GetResourceRequest) (*apiv2pb.GetResourceResponse, error) { func (s *APIV2Service) SearchResources(ctx context.Context, request *apiv2pb.SearchResourcesRequest) (*apiv2pb.SearchResourcesResponse, error) {
resource, err := s.Store.GetResource(ctx, &store.FindResource{ if request.Filter == "" {
ID: &request.Id, return nil, status.Errorf(codes.InvalidArgument, "filter is empty")
}) }
filter, err := parseSearchResourcesFilter(request.Filter)
if err != nil { if err != nil {
return nil, status.Errorf(codes.Internal, "failed to get resource: %v", err) return nil, status.Errorf(codes.InvalidArgument, "failed to parse filter: %v", err)
} }
if resource == nil { resourceFind := &store.FindResource{}
return nil, status.Errorf(codes.NotFound, "resource not found") 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{ response := &apiv2pb.SearchResourcesResponse{}
Resource: s.convertResourceFromStore(ctx, resource), for _, resource := range resources {
}, nil 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{ resource, err := s.Store.GetResource(ctx, &store.FindResource{
UID: &request.Name, ID: &id,
}) })
if err != nil { if err != nil {
return nil, status.Errorf(codes.Internal, "failed to get resource: %v", err) 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 ...@@ -96,19 +117,23 @@ func (s *APIV2Service) GetResourceByName(ctx context.Context, request *apiv2pb.G
return nil, status.Errorf(codes.NotFound, "resource not found") return nil, status.Errorf(codes.NotFound, "resource not found")
} }
return &apiv2pb.GetResourceByNameResponse{ return &apiv2pb.GetResourceResponse{
Resource: s.convertResourceFromStore(ctx, resource), Resource: s.convertResourceFromStore(ctx, resource),
}, nil }, nil
} }
func (s *APIV2Service) UpdateResource(ctx context.Context, request *apiv2pb.UpdateResourceRequest) (*apiv2pb.UpdateResourceResponse, error) { 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 { if request.UpdateMask == nil || len(request.UpdateMask.Paths) == 0 {
return nil, status.Errorf(codes.InvalidArgument, "update mask is required") return nil, status.Errorf(codes.InvalidArgument, "update mask is required")
} }
currentTs := time.Now().Unix() currentTs := time.Now().Unix()
update := &store.UpdateResource{ update := &store.UpdateResource{
ID: request.Resource.Id, ID: id,
UpdatedTs: &currentTs, UpdatedTs: &currentTs,
} }
for _, field := range request.UpdateMask.Paths { for _, field := range request.UpdateMask.Paths {
...@@ -129,12 +154,16 @@ func (s *APIV2Service) UpdateResource(ctx context.Context, request *apiv2pb.Upda ...@@ -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) { 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) user, err := getCurrentUser(ctx, s.Store)
if err != nil { if err != nil {
return nil, status.Errorf(codes.Internal, "failed to get current user: %v", err) return nil, status.Errorf(codes.Internal, "failed to get current user: %v", err)
} }
resource, err := s.Store.GetResource(ctx, &store.FindResource{ resource, err := s.Store.GetResource(ctx, &store.FindResource{
ID: &request.Id, ID: &id,
CreatorID: &user.ID, CreatorID: &user.ID,
}) })
if err != nil { if err != nil {
...@@ -164,8 +193,8 @@ func (s *APIV2Service) convertResourceFromStore(ctx context.Context, resource *s ...@@ -164,8 +193,8 @@ func (s *APIV2Service) convertResourceFromStore(ctx context.Context, resource *s
} }
return &apiv2pb.Resource{ return &apiv2pb.Resource{
Id: resource.ID, Name: fmt.Sprintf("%s%d", ResourceNamePrefix, resource.ID),
Name: resource.UID, Uid: resource.UID,
CreateTime: timestamppb.New(time.Unix(resource.CreatedTs, 0)), CreateTime: timestamppb.New(time.Unix(resource.CreatedTs, 0)),
Filename: resource.Filename, Filename: resource.Filename,
ExternalLink: resource.ExternalLink, ExternalLink: resource.ExternalLink,
...@@ -174,3 +203,50 @@ func (s *APIV2Service) convertResourceFromStore(ctx context.Context, resource *s ...@@ -174,3 +203,50 @@ func (s *APIV2Service) convertResourceFromStore(ctx context.Context, resource *s
MemoId: memoID, 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)
}
}
}
...@@ -42,7 +42,7 @@ const EmbeddedResource = ({ resourceId, params: paramsStr }: Props) => { ...@@ -42,7 +42,7 @@ const EmbeddedResource = ({ resourceId, params: paramsStr }: Props) => {
const params = new URLSearchParams(paramsStr); const params = new URLSearchParams(paramsStr);
useEffect(() => { useEffect(() => {
resourceStore.getOrFetchResourceByName(resourceId).finally(() => loadingState.setFinish()); resourceStore.searchResources(`uid == ${resourceId}`).finally(() => loadingState.setFinish());
}, [resourceId]); }, [resourceId]);
if (loadingState.isLoading) { if (loadingState.isLoading) {
......
...@@ -10,8 +10,8 @@ interface Props { ...@@ -10,8 +10,8 @@ interface Props {
const ResourceListView = (props: Props) => { const ResourceListView = (props: Props) => {
const { resourceList, setResourceList } = props; const { resourceList, setResourceList } = props;
const handleDeleteResource = async (resourceId: ResourceId) => { const handleDeleteResource = async (name: string) => {
setResourceList(resourceList.filter((resource) => resource.id !== resourceId)); setResourceList(resourceList.filter((resource) => resource.name !== name));
}; };
return ( return (
...@@ -21,14 +21,14 @@ const ResourceListView = (props: Props) => { ...@@ -21,14 +21,14 @@ const ResourceListView = (props: Props) => {
{resourceList.map((resource) => { {resourceList.map((resource) => {
return ( return (
<div <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" 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" /> <ResourceIcon resource={resource} className="!w-4 !h-4 !opacity-100" />
<span className="text-sm max-w-[8rem] truncate">{resource.filename}</span> <span className="text-sm max-w-[8rem] truncate">{resource.filename}</span>
<Icon.X <Icon.X
className="w-4 h-auto cursor-pointer opacity-60 hover:opacity-100" className="w-4 h-auto cursor-pointer opacity-60 hover:opacity-100"
onClick={() => handleDeleteResource(resource.id)} onClick={() => handleDeleteResource(resource.name)}
/> />
</div> </div>
); );
......
...@@ -229,7 +229,7 @@ const MemoEditor = (props: Props) => { ...@@ -229,7 +229,7 @@ const MemoEditor = (props: Props) => {
if (memoId) { if (memoId) {
await resourceStore.updateResource({ await resourceStore.updateResource({
resource: Resource.fromPartial({ resource: Resource.fromPartial({
id: resource.id, name: resource.name,
memoId, memoId,
}), }),
updateMask: ["memo_id"], updateMask: ["memo_id"],
......
...@@ -70,7 +70,7 @@ const MemoResourceListView = ({ resources = [] }: { resources: Resource[] }) => ...@@ -70,7 +70,7 @@ const MemoResourceListView = ({ resources = [] }: { resources: Resource[] }) =>
const cards = resources.map((resource) => ( const cards = resources.map((resource) => (
<SquareDiv <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" className="flex justify-center items-center border dark:border-zinc-900 rounded overflow-hidden hide-scrollbar hover:shadow-md"
> >
<MediaCard resource={resource} thumbnail /> <MediaCard resource={resource} thumbnail />
...@@ -90,7 +90,7 @@ const MemoResourceListView = ({ resources = [] }: { resources: Resource[] }) => ...@@ -90,7 +90,7 @@ const MemoResourceListView = ({ resources = [] }: { resources: Resource[] }) =>
return ( return (
<div className="w-full flex flex-row justify-start flex-wrap gap-2"> <div className="w-full flex flex-row justify-start flex-wrap gap-2">
{otherResources.map((resource) => ( {otherResources.map((resource) => (
<MemoResource key={resource.id} resource={resource} /> <MemoResource key={resource.name} resource={resource} />
))} ))}
</div> </div>
); );
......
...@@ -70,7 +70,7 @@ const Resources = () => { ...@@ -70,7 +70,7 @@ const Resources = () => {
dialogName: "delete-unused-resources-dialog", dialogName: "delete-unused-resources-dialog",
onConfirm: async () => { onConfirm: async () => {
for (const resource of unusedResources) { for (const resource of unusedResources) {
await resourceServiceClient.deleteResource({ id: resource.id }); await resourceServiceClient.deleteResource({ name: resource.name });
} }
setResources(resources.filter((resource) => resource.memoId)); setResources(resources.filter((resource) => resource.memoId));
}, },
...@@ -123,7 +123,7 @@ const Resources = () => { ...@@ -123,7 +123,7 @@ const Resources = () => {
{resources.map((resource) => { {resources.map((resource) => {
const relatedMemo = resource.memoId ? memoStore.getMemoByName(`${MemoNamePrefix}${resource.memoId}`) : null; const relatedMemo = resource.memoId ? memoStore.getMemoByName(`${MemoNamePrefix}${resource.memoId}`) : null;
return ( 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"> <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} /> <ResourceIcon resource={resource} strokeWidth={0.5} />
</div> </div>
...@@ -163,7 +163,7 @@ const Resources = () => { ...@@ -163,7 +163,7 @@ const Resources = () => {
</div> </div>
{unusedResources.map((resource) => { {unusedResources.map((resource) => {
return ( 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"> <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} /> <ResourceIcon resource={resource} strokeWidth={0.5} />
</div> </div>
......
...@@ -21,14 +21,14 @@ const resourceSlice = createSlice({ ...@@ -21,14 +21,14 @@ const resourceSlice = createSlice({
upsertResources: (state, action: PayloadAction<Resource[]>) => { upsertResources: (state, action: PayloadAction<Resource[]>) => {
return { return {
...state, ...state,
resources: uniqBy([...action.payload, ...state.resources], "id"), resources: uniqBy([...action.payload, ...state.resources], "name"),
}; };
}, },
patchResource: (state, action: PayloadAction<Partial<Resource>>) => { patchResource: (state, action: PayloadAction<Partial<Resource>>) => {
return { return {
...state, ...state,
resources: state.resources.map((resource) => { resources: state.resources.map((resource) => {
if (resource.id === action.payload.id) { if (resource.name === action.payload.name) {
return { return {
...resource, ...resource,
...action.payload, ...action.payload,
......
...@@ -4,62 +4,30 @@ import { resourceServiceClient } from "@/grpcweb"; ...@@ -4,62 +4,30 @@ import { resourceServiceClient } from "@/grpcweb";
import { Resource } from "@/types/proto/api/v2/resource_service"; import { Resource } from "@/types/proto/api/v2/resource_service";
interface State { interface State {
resourceMapById: Record<number, Resource>; resourceMapByName: Record<string, Resource>;
} }
const getDefaultState = (): State => ({ const getDefaultState = (): State => ({
resourceMapById: {}, resourceMapByName: {},
}); });
export const useResourceStore = create( export const useResourceStore = create(
combine(getDefaultState(), (set, get) => ({ combine(getDefaultState(), (set, get) => ({
setState: (state: State) => set(state), setState: (state: State) => set(state),
getState: () => get(), getState: () => get(),
getOrFetchResourceById: async (id: number, options?: { skipCache?: boolean; skipStore?: boolean }) => { searchResources: async (filter: string) => {
const resourceMap = get().resourceMapById; const { resources } = await resourceServiceClient.searchResources({
const resource = resourceMap[id]; filter,
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,
}); });
if (!resource) { const resourceMap = get().resourceMapByName;
throw new Error("Resource not found"); for (const resource of resources) {
} resourceMap[resource.name] = resource;
if (!options?.skipStore) {
resourceMap[resource.id] = resource;
set({ resourceMapById: resourceMap });
} }
return resource; set({ resourceMapByName: resourceMap });
return resources;
}, },
getResourceByName: (name: string) => { getResourceByName: (name: string) => {
const resourceMap = get().resourceMapById; const resourceMap = get().resourceMapByName;
return Object.values(resourceMap).find((r) => r.name === name); return Object.values(resourceMap).find((r) => r.name === name);
}, },
})), })),
......
type ResourceId = number;
interface ResourceCreate { interface ResourceCreate {
filename: string; filename: string;
externalLink: string; externalLink: string;
......
...@@ -5,7 +5,7 @@ export const getResourceUrl = (resource: Resource) => { ...@@ -5,7 +5,7 @@ export const getResourceUrl = (resource: Resource) => {
return resource.externalLink; 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) => { export const getResourceType = (resource: Resource) => {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment