Commit 8f51529c authored by Steven's avatar Steven

chore: implement storage service

parent 707e5caf
...@@ -49,29 +49,29 @@ message IdentityProvider { ...@@ -49,29 +49,29 @@ message IdentityProvider {
string identifier_filter = 4; string identifier_filter = 4;
message Config { IdentityProviderConfig config = 5;
message FieldMapping { }
string identifier = 1;
string display_name = 2; message IdentityProviderConfig {
string email = 3; oneof config {
} OAuth2Config oauth2 = 1;
message OAuth2 {
string client_id = 1;
string client_secret = 2;
string auth_url = 3;
string token_url = 4;
string user_info_url = 5;
repeated string scopes = 6;
FieldMapping field_mapping = 7;
}
oneof config {
OAuth2 oauth2 = 1;
}
} }
}
message FieldMapping {
string identifier = 1;
string display_name = 2;
string email = 3;
}
Config config = 5; message OAuth2Config {
string client_id = 1;
string client_secret = 2;
string auth_url = 3;
string token_url = 4;
string user_info_url = 5;
repeated string scopes = 6;
FieldMapping field_mapping = 7;
} }
message ListIdentityProvidersRequest {} message ListIdentityProvidersRequest {}
......
syntax = "proto3";
package memos.api.v2;
import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/protobuf/field_mask.proto";
option go_package = "gen/api/v2";
service StorageService {
// CreateStorage creates a new storage.
rpc CreateStorage(CreateStorageRequest) returns (CreateStorageResponse) {
option (google.api.http) = {
post: "/api/v2/storages"
body: "*"
};
}
// GetStorage returns a storage by id.
rpc GetStorage(GetStorageRequest) returns (GetStorageResponse) {
option (google.api.http) = {get: "/api/v2/storages/{id}"};
option (google.api.method_signature) = "id";
}
// ListStorages returns a list of storages.
rpc ListStorages(ListStoragesRequest) returns (ListStoragesResponse) {
option (google.api.http) = {get: "/api/v2/storages"};
}
// UpdateStorage updates a storage.
rpc UpdateStorage(UpdateStorageRequest) returns (UpdateStorageResponse) {
option (google.api.http) = {
patch: "/api/v2/storages/{storage.id}"
body: "storage"
};
option (google.api.method_signature) = "storage,update_mask";
}
// DeleteStorage deletes a storage by id.
rpc DeleteStorage(DeleteStorageRequest) returns (DeleteStorageResponse) {
option (google.api.http) = {delete: "/api/v2/storages/{id}"};
option (google.api.method_signature) = "id";
}
}
message Storage {
int32 id = 1;
string title = 2;
enum Type {
TYPE_UNSPECIFIED = 0;
S3 = 1;
}
Type type = 3;
StorageConfig config = 4;
}
message StorageConfig {
oneof storage_config {
S3Config s3_config = 1;
}
}
message S3Config {
string end_point = 1;
string path = 2;
string region = 3;
string access_key = 4;
string secret_key = 5;
string bucket = 6;
string url_prefix = 7;
string url_suffix = 8;
bool pre_sign = 9;
}
message CreateStorageRequest {
Storage storage = 1;
}
message CreateStorageResponse {
Storage storage = 1;
}
message GetStorageRequest {
int32 id = 1;
}
message GetStorageResponse {
Storage storage = 1;
}
message ListStoragesRequest {}
message ListStoragesResponse {
repeated Storage storages = 1;
}
message UpdateStorageRequest {
Storage storage = 1;
google.protobuf.FieldMask update_mask = 2;
}
message UpdateStorageResponse {
Storage storage = 1;
}
message DeleteStorageRequest {
int32 id = 1;
}
message DeleteStorageResponse {}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -12,9 +12,9 @@ ...@@ -12,9 +12,9 @@
- [RowStatus](#memos-store-RowStatus) - [RowStatus](#memos-store-RowStatus)
- [store/idp.proto](#store_idp-proto) - [store/idp.proto](#store_idp-proto)
- [FieldMapping](#memos-store-FieldMapping)
- [IdentityProviderConfig](#memos-store-IdentityProviderConfig) - [IdentityProviderConfig](#memos-store-IdentityProviderConfig)
- [IdentityProviderConfig.FieldMapping](#memos-store-IdentityProviderConfig-FieldMapping) - [OAuth2Config](#memos-store-OAuth2Config)
- [IdentityProviderConfig.OAuth2](#memos-store-IdentityProviderConfig-OAuth2)
- [store/inbox.proto](#store_inbox-proto) - [store/inbox.proto](#store_inbox-proto)
- [InboxMessage](#memos-store-InboxMessage) - [InboxMessage](#memos-store-InboxMessage)
...@@ -158,41 +158,41 @@ ...@@ -158,41 +158,41 @@
<a name="memos-store-IdentityProviderConfig"></a> <a name="memos-store-FieldMapping"></a>
### IdentityProviderConfig ### FieldMapping
| Field | Type | Label | Description | | Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- | | ----- | ---- | ----- | ----------- |
| oauth2 | [IdentityProviderConfig.OAuth2](#memos-store-IdentityProviderConfig-OAuth2) | | | | identifier | [string](#string) | | |
| display_name | [string](#string) | | |
| email | [string](#string) | | |
<a name="memos-store-IdentityProviderConfig-FieldMapping"></a> <a name="memos-store-IdentityProviderConfig"></a>
### IdentityProviderConfig.FieldMapping ### IdentityProviderConfig
| Field | Type | Label | Description | | Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- | | ----- | ---- | ----- | ----------- |
| identifier | [string](#string) | | | | oauth2 | [OAuth2Config](#memos-store-OAuth2Config) | | |
| display_name | [string](#string) | | |
| email | [string](#string) | | |
<a name="memos-store-IdentityProviderConfig-OAuth2"></a> <a name="memos-store-OAuth2Config"></a>
### IdentityProviderConfig.OAuth2 ### OAuth2Config
...@@ -204,7 +204,7 @@ ...@@ -204,7 +204,7 @@
| token_url | [string](#string) | | | | token_url | [string](#string) | | |
| user_info_url | [string](#string) | | | | user_info_url | [string](#string) | | |
| scopes | [string](#string) | repeated | | | scopes | [string](#string) | repeated | |
| field_mapping | [IdentityProviderConfig.FieldMapping](#memos-store-IdentityProviderConfig-FieldMapping) | | | | field_mapping | [FieldMapping](#memos-store-FieldMapping) | | |
......
This diff is collapsed.
...@@ -5,23 +5,23 @@ package memos.store; ...@@ -5,23 +5,23 @@ package memos.store;
option go_package = "gen/store"; option go_package = "gen/store";
message IdentityProviderConfig { message IdentityProviderConfig {
message FieldMapping { oneof config {
string identifier = 1; OAuth2Config oauth2 = 1;
string display_name = 2;
string email = 3;
} }
}
message OAuth2 { message FieldMapping {
string client_id = 1; string identifier = 1;
string client_secret = 2; string display_name = 2;
string auth_url = 3; string email = 3;
string token_url = 4; }
string user_info_url = 5;
repeated string scopes = 6;
FieldMapping field_mapping = 7;
}
oneof config { message OAuth2Config {
OAuth2 oauth2 = 1; string client_id = 1;
} string client_secret = 2;
string auth_url = 3;
string token_url = 4;
string user_info_url = 5;
repeated string scopes = 6;
FieldMapping field_mapping = 7;
} }
...@@ -11,6 +11,7 @@ tags: ...@@ -11,6 +11,7 @@ tags:
- name: LinkService - name: LinkService
- name: ResourceService - name: ResourceService
- name: MemoService - name: MemoService
- name: StorageService
- name: TagService - name: TagService
- name: WebhookService - name: WebhookService
- name: WorkspaceService - name: WorkspaceService
...@@ -515,6 +516,115 @@ paths: ...@@ -515,6 +516,115 @@ paths:
type: string type: string
tags: tags:
- ResourceService - ResourceService
/api/v2/storages:
get:
summary: ListStorages returns a list of storages.
operationId: StorageService_ListStorages
responses:
"200":
description: A successful response.
schema:
$ref: '#/definitions/v2ListStoragesResponse'
default:
description: An unexpected error response.
schema:
$ref: '#/definitions/googlerpcStatus'
tags:
- StorageService
post:
summary: CreateStorage creates a new storage.
operationId: StorageService_CreateStorage
responses:
"200":
description: A successful response.
schema:
$ref: '#/definitions/v2CreateStorageResponse'
default:
description: An unexpected error response.
schema:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: body
in: body
required: true
schema:
$ref: '#/definitions/v2CreateStorageRequest'
tags:
- StorageService
/api/v2/storages/{id}:
get:
summary: GetStorage returns a storage by id.
operationId: StorageService_GetStorage
responses:
"200":
description: A successful response.
schema:
$ref: '#/definitions/v2GetStorageResponse'
default:
description: An unexpected error response.
schema:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: id
in: path
required: true
type: integer
format: int32
tags:
- StorageService
delete:
summary: DeleteStorage deletes a storage by id.
operationId: StorageService_DeleteStorage
responses:
"200":
description: A successful response.
schema:
$ref: '#/definitions/v2DeleteStorageResponse'
default:
description: An unexpected error response.
schema:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: id
in: path
required: true
type: integer
format: int32
tags:
- StorageService
/api/v2/storages/{storage.id}:
patch:
summary: UpdateStorage updates a storage.
operationId: StorageService_UpdateStorage
responses:
"200":
description: A successful response.
schema:
$ref: '#/definitions/v2UpdateStorageResponse'
default:
description: An unexpected error response.
schema:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: storage.id
in: path
required: true
type: integer
format: int32
- name: storage
in: body
required: true
schema:
type: object
properties:
title:
type: string
type:
$ref: '#/definitions/apiv2StorageType'
config:
$ref: '#/definitions/apiv2StorageConfig'
tags:
- StorageService
/api/v2/tags: /api/v2/tags:
get: get:
summary: ListTags lists tags. summary: ListTags lists tags.
...@@ -966,7 +1076,7 @@ paths: ...@@ -966,7 +1076,7 @@ paths:
identifierFilter: identifierFilter:
type: string type: string
config: config:
$ref: '#/definitions/IdentityProviderConfig' $ref: '#/definitions/apiv2IdentityProviderConfig'
title: The identityProvider to update. title: The identityProvider to update.
tags: tags:
- IdentityProviderService - IdentityProviderService
...@@ -1834,39 +1944,6 @@ paths: ...@@ -1834,39 +1944,6 @@ paths:
tags: tags:
- ActivityService - ActivityService
definitions: definitions:
IdentityProviderConfig:
type: object
properties:
oauth2:
$ref: '#/definitions/IdentityProviderConfigOAuth2'
IdentityProviderConfigFieldMapping:
type: object
properties:
identifier:
type: string
displayName:
type: string
email:
type: string
IdentityProviderConfigOAuth2:
type: object
properties:
clientId:
type: string
clientSecret:
type: string
authUrl:
type: string
tokenUrl:
type: string
userInfoUrl:
type: string
scopes:
type: array
items:
type: string
fieldMapping:
$ref: '#/definitions/IdentityProviderConfigFieldMapping'
MemoServiceSetMemoRelationsBody: MemoServiceSetMemoRelationsBody:
type: object type: object
properties: properties:
...@@ -1920,6 +1997,39 @@ definitions: ...@@ -1920,6 +1997,39 @@ definitions:
properties: properties:
version: version:
type: string type: string
apiv2FieldMapping:
type: object
properties:
identifier:
type: string
displayName:
type: string
email:
type: string
apiv2IdentityProviderConfig:
type: object
properties:
oauth2:
$ref: '#/definitions/apiv2OAuth2Config'
apiv2OAuth2Config:
type: object
properties:
clientId:
type: string
clientSecret:
type: string
authUrl:
type: string
tokenUrl:
type: string
userInfoUrl:
type: string
scopes:
type: array
items:
type: string
fieldMapping:
$ref: '#/definitions/apiv2FieldMapping'
apiv2Reaction: apiv2Reaction:
type: object type: object
properties: properties:
...@@ -1959,6 +2069,50 @@ definitions: ...@@ -1959,6 +2069,50 @@ definitions:
- ACTIVE - ACTIVE
- ARCHIVED - ARCHIVED
default: ROW_STATUS_UNSPECIFIED default: ROW_STATUS_UNSPECIFIED
apiv2S3Config:
type: object
properties:
endPoint:
type: string
path:
type: string
region:
type: string
accessKey:
type: string
secretKey:
type: string
bucket:
type: string
urlPrefix:
type: string
urlSuffix:
type: string
preSign:
type: boolean
apiv2Storage:
type: object
properties:
id:
type: integer
format: int32
title:
type: string
type:
$ref: '#/definitions/apiv2StorageType'
config:
$ref: '#/definitions/apiv2StorageConfig'
apiv2StorageConfig:
type: object
properties:
s3Config:
$ref: '#/definitions/apiv2S3Config'
apiv2StorageType:
type: string
enum:
- TYPE_UNSPECIFIED
- S3
default: TYPE_UNSPECIFIED
apiv2UserSetting: apiv2UserSetting:
type: object type: object
properties: properties:
...@@ -2163,6 +2317,16 @@ definitions: ...@@ -2163,6 +2317,16 @@ definitions:
properties: properties:
resource: resource:
$ref: '#/definitions/v2Resource' $ref: '#/definitions/v2Resource'
v2CreateStorageRequest:
type: object
properties:
storage:
$ref: '#/definitions/apiv2Storage'
v2CreateStorageResponse:
type: object
properties:
storage:
$ref: '#/definitions/apiv2Storage'
v2CreateUserAccessTokenResponse: v2CreateUserAccessTokenResponse:
type: object type: object
properties: properties:
...@@ -2195,6 +2359,8 @@ definitions: ...@@ -2195,6 +2359,8 @@ definitions:
type: object type: object
v2DeleteResourceResponse: v2DeleteResourceResponse:
type: object type: object
v2DeleteStorageResponse:
type: object
v2DeleteTagResponse: v2DeleteTagResponse:
type: object type: object
v2DeleteUserAccessTokenResponse: v2DeleteUserAccessTokenResponse:
...@@ -2240,6 +2406,11 @@ definitions: ...@@ -2240,6 +2406,11 @@ definitions:
properties: properties:
resource: resource:
$ref: '#/definitions/v2Resource' $ref: '#/definitions/v2Resource'
v2GetStorageResponse:
type: object
properties:
storage:
$ref: '#/definitions/apiv2Storage'
v2GetTagSuggestionsResponse: v2GetTagSuggestionsResponse:
type: object type: object
properties: properties:
...@@ -2298,7 +2469,7 @@ definitions: ...@@ -2298,7 +2469,7 @@ definitions:
identifierFilter: identifierFilter:
type: string type: string
config: config:
$ref: '#/definitions/IdentityProviderConfig' $ref: '#/definitions/apiv2IdentityProviderConfig'
v2IdentityProviderType: v2IdentityProviderType:
type: string type: string
enum: enum:
...@@ -2421,6 +2592,14 @@ definitions: ...@@ -2421,6 +2592,14 @@ definitions:
items: items:
type: object type: object
$ref: '#/definitions/v2Resource' $ref: '#/definitions/v2Resource'
v2ListStoragesResponse:
type: object
properties:
storages:
type: array
items:
type: object
$ref: '#/definitions/apiv2Storage'
v2ListTagsResponse: v2ListTagsResponse:
type: object type: object
properties: properties:
...@@ -2658,6 +2837,11 @@ definitions: ...@@ -2658,6 +2837,11 @@ definitions:
properties: properties:
resource: resource:
$ref: '#/definitions/v2Resource' $ref: '#/definitions/v2Resource'
v2UpdateStorageResponse:
type: object
properties:
storage:
$ref: '#/definitions/apiv2Storage'
v2UpdateUserResponse: v2UpdateUserResponse:
type: object type: object
properties: properties:
......
package v2
import (
"context"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
apiv2pb "github.com/usememos/memos/proto/gen/api/v2"
storepb "github.com/usememos/memos/proto/gen/store"
"github.com/usememos/memos/store"
)
func (s *APIV2Service) CreateStorage(ctx context.Context, request *apiv2pb.CreateStorageRequest) (*apiv2pb.CreateStorageResponse, error) {
currentUser, err := getCurrentUser(ctx, s.Store)
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to get user: %v", err)
}
if currentUser.Role != store.RoleHost {
return nil, status.Errorf(codes.PermissionDenied, "permission denied")
}
storage, err := s.Store.CreateStorageV1(ctx, convertStorageToStore(request.Storage))
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to create storage, error: %+v", err)
}
return &apiv2pb.CreateStorageResponse{
Storage: convertStorageFromStore(storage),
}, nil
}
func (s *APIV2Service) ListStorages(ctx context.Context, _ *apiv2pb.ListStoragesRequest) (*apiv2pb.ListStoragesResponse, error) {
storages, err := s.Store.ListStoragesV1(ctx, &store.FindStorage{})
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to list storages, error: %+v", err)
}
response := &apiv2pb.ListStoragesResponse{
Storages: []*apiv2pb.Storage{},
}
for _, storage := range storages {
response.Storages = append(response.Storages, convertStorageFromStore(storage))
}
return response, nil
}
func (s *APIV2Service) GetStorage(ctx context.Context, request *apiv2pb.GetStorageRequest) (*apiv2pb.GetStorageResponse, error) {
storage, err := s.Store.GetStorageV1(ctx, &store.FindStorage{
ID: &request.Id,
})
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to get storage, error: %+v", err)
}
if storage == nil {
return nil, status.Errorf(codes.NotFound, "storage not found")
}
return &apiv2pb.GetStorageResponse{
Storage: convertStorageFromStore(storage),
}, nil
}
func (s *APIV2Service) UpdateStorage(ctx context.Context, request *apiv2pb.UpdateStorageRequest) (*apiv2pb.UpdateStorageResponse, error) {
if request.UpdateMask == nil || len(request.UpdateMask.Paths) == 0 {
return nil, status.Errorf(codes.InvalidArgument, "update_mask is required")
}
update := &store.UpdateStorageV1{
ID: request.Storage.Id,
Type: storepb.Storage_Type(storepb.Storage_Type_value[request.Storage.Type.String()]),
}
for _, field := range request.UpdateMask.Paths {
switch field {
case "name":
update.Name = &request.Storage.Title
case "config":
update.Config = convertStorageConfigToStore(request.Storage.Type, request.Storage.Config)
}
}
storage, err := s.Store.UpdateStorageV1(ctx, update)
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to update storage, error: %+v", err)
}
return &apiv2pb.UpdateStorageResponse{
Storage: convertStorageFromStore(storage),
}, nil
}
func (s *APIV2Service) DeleteStorage(ctx context.Context, request *apiv2pb.DeleteStorageRequest) (*apiv2pb.DeleteStorageResponse, error) {
err := s.Store.DeleteStorage(ctx, &store.DeleteStorage{
ID: request.Id,
})
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to delete storage, error: %+v", err)
}
return &apiv2pb.DeleteStorageResponse{}, nil
}
func convertStorageFromStore(storage *storepb.Storage) *apiv2pb.Storage {
temp := &apiv2pb.Storage{
Id: storage.Id,
Title: storage.Name,
Type: apiv2pb.Storage_Type(apiv2pb.Storage_Type_value[storage.Type.String()]),
}
if storage.Type == storepb.Storage_S3 {
s3Config := storage.Config.GetS3Config()
temp.Config = &apiv2pb.StorageConfig{
StorageConfig: &apiv2pb.StorageConfig_S3Config{
S3Config: &apiv2pb.S3Config{
EndPoint: s3Config.EndPoint,
Path: s3Config.Path,
Region: s3Config.Region,
AccessKey: s3Config.AccessKey,
SecretKey: s3Config.SecretKey,
Bucket: s3Config.Bucket,
UrlPrefix: s3Config.UrlPrefix,
UrlSuffix: s3Config.UrlSuffix,
PreSign: s3Config.PreSign,
},
},
}
}
return temp
}
func convertStorageToStore(storage *apiv2pb.Storage) *storepb.Storage {
temp := &storepb.Storage{
Id: storage.Id,
Name: storage.Title,
Type: storepb.Storage_Type(storepb.Storage_Type_value[storage.Type.String()]),
Config: convertStorageConfigToStore(storage.Type, storage.Config),
}
return temp
}
func convertStorageConfigToStore(storageType apiv2pb.Storage_Type, config *apiv2pb.StorageConfig) *storepb.StorageConfig {
if storageType == apiv2pb.Storage_S3 {
s3Config := config.GetS3Config()
return &storepb.StorageConfig{
StorageConfig: &storepb.StorageConfig_S3Config{
S3Config: &storepb.S3Config{
EndPoint: s3Config.EndPoint,
Path: s3Config.Path,
Region: s3Config.Region,
AccessKey: s3Config.AccessKey,
SecretKey: s3Config.SecretKey,
Bucket: s3Config.Bucket,
UrlPrefix: s3Config.UrlPrefix,
UrlSuffix: s3Config.UrlSuffix,
PreSign: s3Config.PreSign,
},
},
}
}
return nil
}
...@@ -31,6 +31,7 @@ type APIV2Service struct { ...@@ -31,6 +31,7 @@ type APIV2Service struct {
apiv2pb.UnimplementedActivityServiceServer apiv2pb.UnimplementedActivityServiceServer
apiv2pb.UnimplementedWebhookServiceServer apiv2pb.UnimplementedWebhookServiceServer
apiv2pb.UnimplementedLinkServiceServer apiv2pb.UnimplementedLinkServiceServer
apiv2pb.UnimplementedStorageServiceServer
Secret string Secret string
Profile *profile.Profile Profile *profile.Profile
...@@ -68,6 +69,7 @@ func NewAPIV2Service(secret string, profile *profile.Profile, store *store.Store ...@@ -68,6 +69,7 @@ func NewAPIV2Service(secret string, profile *profile.Profile, store *store.Store
apiv2pb.RegisterActivityServiceServer(grpcServer, apiv2Service) apiv2pb.RegisterActivityServiceServer(grpcServer, apiv2Service)
apiv2pb.RegisterWebhookServiceServer(grpcServer, apiv2Service) apiv2pb.RegisterWebhookServiceServer(grpcServer, apiv2Service)
apiv2pb.RegisterLinkServiceServer(grpcServer, apiv2Service) apiv2pb.RegisterLinkServiceServer(grpcServer, apiv2Service)
apiv2pb.RegisterStorageServiceServer(grpcServer, apiv2Service)
reflection.Register(grpcServer) reflection.Register(grpcServer)
return apiv2Service return apiv2Service
...@@ -124,6 +126,9 @@ func (s *APIV2Service) RegisterGateway(ctx context.Context, e *echo.Echo) error ...@@ -124,6 +126,9 @@ func (s *APIV2Service) RegisterGateway(ctx context.Context, e *echo.Echo) error
if err := apiv2pb.RegisterLinkServiceHandler(context.Background(), gwMux, conn); err != nil { if err := apiv2pb.RegisterLinkServiceHandler(context.Background(), gwMux, conn); err != nil {
return err return err
} }
if err := apiv2pb.RegisterStorageServiceHandler(context.Background(), gwMux, conn); err != nil {
return err
}
e.Any("/api/v2/*", echo.WrapHandler(gwMux)) e.Any("/api/v2/*", echo.WrapHandler(gwMux))
// GRPC web proxy. // GRPC web proxy.
......
...@@ -55,7 +55,7 @@ func (s *APIV2Service) GetWebhook(ctx context.Context, request *apiv2pb.GetWebho ...@@ -55,7 +55,7 @@ func (s *APIV2Service) GetWebhook(ctx context.Context, request *apiv2pb.GetWebho
return nil, status.Errorf(codes.Internal, "failed to get user: %v", err) return nil, status.Errorf(codes.Internal, "failed to get user: %v", err)
} }
webhook, err := s.Store.GetWebhooks(ctx, &store.FindWebhook{ webhook, err := s.Store.GetWebhook(ctx, &store.FindWebhook{
ID: &request.Id, ID: &request.Id,
CreatorID: &currentUser.ID, CreatorID: &currentUser.ID,
}) })
......
...@@ -162,7 +162,7 @@ func convertStorageConfigFromRaw(storageType storepb.Storage_Type, configRaw str ...@@ -162,7 +162,7 @@ func convertStorageConfigFromRaw(storageType storepb.Storage_Type, configRaw str
storageConfig := &storepb.StorageConfig{} storageConfig := &storepb.StorageConfig{}
if storageType == storepb.Storage_S3 { if storageType == storepb.Storage_S3 {
s3Config := &storepb.S3Config{} s3Config := &storepb.S3Config{}
err := proto.Unmarshal([]byte(configRaw), s3Config) err := protojsonUnmarshaler.Unmarshal([]byte(configRaw), s3Config)
if err != nil { if err != nil {
return nil, err return nil, err
} }
......
...@@ -30,7 +30,7 @@ func (s *Store) ListWebhooks(ctx context.Context, find *FindWebhook) ([]*storepb ...@@ -30,7 +30,7 @@ func (s *Store) ListWebhooks(ctx context.Context, find *FindWebhook) ([]*storepb
return s.driver.ListWebhooks(ctx, find) return s.driver.ListWebhooks(ctx, find)
} }
func (s *Store) GetWebhooks(ctx context.Context, find *FindWebhook) (*storepb.Webhook, error) { func (s *Store) GetWebhook(ctx context.Context, find *FindWebhook) (*storepb.Webhook, error) {
list, err := s.ListWebhooks(ctx, find) list, err := s.ListWebhooks(ctx, find)
if err != nil { if err != nil {
return nil, err return nil, err
......
...@@ -5,6 +5,7 @@ import { InboxServiceDefinition } from "./types/proto/api/v2/inbox_service"; ...@@ -5,6 +5,7 @@ import { InboxServiceDefinition } from "./types/proto/api/v2/inbox_service";
import { LinkServiceDefinition } from "./types/proto/api/v2/link_service"; import { LinkServiceDefinition } from "./types/proto/api/v2/link_service";
import { MemoServiceDefinition } from "./types/proto/api/v2/memo_service"; import { MemoServiceDefinition } from "./types/proto/api/v2/memo_service";
import { ResourceServiceDefinition } from "./types/proto/api/v2/resource_service"; import { ResourceServiceDefinition } from "./types/proto/api/v2/resource_service";
import { StorageServiceDefinition } from "./types/proto/api/v2/storage_service";
import { TagServiceDefinition } from "./types/proto/api/v2/tag_service"; import { TagServiceDefinition } from "./types/proto/api/v2/tag_service";
import { UserServiceDefinition } from "./types/proto/api/v2/user_service"; import { UserServiceDefinition } from "./types/proto/api/v2/user_service";
import { WebhookServiceDefinition } from "./types/proto/api/v2/webhook_service"; import { WebhookServiceDefinition } from "./types/proto/api/v2/webhook_service";
...@@ -41,3 +42,5 @@ export const activityServiceClient = clientFactory.create(ActivityServiceDefinit ...@@ -41,3 +42,5 @@ export const activityServiceClient = clientFactory.create(ActivityServiceDefinit
export const webhookServiceClient = clientFactory.create(WebhookServiceDefinition, channel); export const webhookServiceClient = clientFactory.create(WebhookServiceDefinition, channel);
export const linkServiceClient = clientFactory.create(LinkServiceDefinition, channel); export const linkServiceClient = clientFactory.create(LinkServiceDefinition, channel);
export const storageServiceClient = clientFactory.create(StorageServiceDefinition, channel);
...@@ -3,22 +3,6 @@ import axios from "axios"; ...@@ -3,22 +3,6 @@ import axios from "axios";
axios.defaults.baseURL = import.meta.env.VITE_API_BASE_URL || ""; axios.defaults.baseURL = import.meta.env.VITE_API_BASE_URL || "";
axios.defaults.withCredentials = true; axios.defaults.withCredentials = true;
export function getStorageList() {
return axios.get<ObjectStorage[]>(`/api/v1/storage`);
}
export function createStorage(storageCreate: StorageCreate) {
return axios.post<ObjectStorage>(`/api/v1/storage`, storageCreate);
}
export function patchStorage(storagePatch: StoragePatch) {
return axios.patch<ObjectStorage>(`/api/v1/storage/${storagePatch.id}`, storagePatch);
}
export function deleteStorage(storageId: StorageId) {
return axios.delete(`/api/v1/storage/${storageId}`);
}
export function getIdentityProviderList() { export function getIdentityProviderList() {
return axios.get<IdentityProvider[]>(`/api/v1/idp`); return axios.get<IdentityProvider[]>(`/api/v1/idp`);
} }
......
This diff is collapsed.
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