chore: retire storage related functions

This commit is contained in:
Steven 2024-04-28 21:50:09 +08:00
parent 320963098f
commit 4338234641
18 changed files with 9 additions and 3575 deletions

View File

@ -11,7 +11,6 @@ tags:
- name: LinkService
- name: ResourceService
- name: MemoService
- name: StorageService
- name: TagService
- name: WebhookService
- name: WorkspaceService
@ -453,115 +452,6 @@ paths:
type: string
tags:
- ResourceService
/api/v1/storages:
get:
summary: ListStorages returns a list of storages.
operationId: StorageService_ListStorages
responses:
"200":
description: A successful response.
schema:
$ref: '#/definitions/v1ListStoragesResponse'
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/v1CreateStorageResponse'
default:
description: An unexpected error response.
schema:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: body
in: body
required: true
schema:
$ref: '#/definitions/v1CreateStorageRequest'
tags:
- StorageService
/api/v1/storages/{id}:
get:
summary: GetStorage returns a storage by id.
operationId: StorageService_GetStorage
responses:
"200":
description: A successful response.
schema:
$ref: '#/definitions/v1GetStorageResponse'
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/v1DeleteStorageResponse'
default:
description: An unexpected error response.
schema:
$ref: '#/definitions/googlerpcStatus'
parameters:
- name: id
in: path
required: true
type: integer
format: int32
tags:
- StorageService
/api/v1/storages/{storage.id}:
patch:
summary: UpdateStorage updates a storage.
operationId: StorageService_UpdateStorage
responses:
"200":
description: A successful response.
schema:
$ref: '#/definitions/v1UpdateStorageResponse'
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/apiv1StorageType'
config:
$ref: '#/definitions/apiv1StorageConfig'
tags:
- StorageService
/api/v1/tags:
get:
summary: ListTags lists tags.
@ -1935,50 +1825,6 @@ definitions:
type: string
fieldMapping:
$ref: '#/definitions/apiv1FieldMapping'
apiv1S3Config:
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
apiv1Storage:
type: object
properties:
id:
type: integer
format: int32
title:
type: string
type:
$ref: '#/definitions/apiv1StorageType'
config:
$ref: '#/definitions/apiv1StorageConfig'
apiv1StorageConfig:
type: object
properties:
s3Config:
$ref: '#/definitions/apiv1S3Config'
apiv1StorageType:
type: string
enum:
- TYPE_UNSPECIFIED
- S3
default: TYPE_UNSPECIFIED
apiv1UserSetting:
type: object
properties:
@ -2156,16 +2002,6 @@ definitions:
type: string
visibility:
$ref: '#/definitions/v1Visibility'
v1CreateStorageRequest:
type: object
properties:
storage:
$ref: '#/definitions/apiv1Storage'
v1CreateStorageResponse:
type: object
properties:
storage:
$ref: '#/definitions/apiv1Storage'
v1CreateWebhookRequest:
type: object
properties:
@ -2173,8 +2009,6 @@ definitions:
type: string
url:
type: string
v1DeleteStorageResponse:
type: object
v1ExportMemosRequest:
type: object
properties:
@ -2192,11 +2026,6 @@ definitions:
properties:
linkMetadata:
$ref: '#/definitions/v1LinkMetadata'
v1GetStorageResponse:
type: object
properties:
storage:
$ref: '#/definitions/apiv1Storage'
v1GetTagSuggestionsResponse:
type: object
properties:
@ -2331,14 +2160,6 @@ definitions:
items:
type: object
$ref: '#/definitions/v1Resource'
v1ListStoragesResponse:
type: object
properties:
storages:
type: array
items:
type: object
$ref: '#/definitions/apiv1Storage'
v1ListTagsResponse:
type: object
properties:
@ -2575,11 +2396,6 @@ definitions:
title: |-
The creator of tags.
Format: users/{id}
v1UpdateStorageResponse:
type: object
properties:
storage:
$ref: '#/definitions/apiv1Storage'
v1UpsertTagRequest:
type: object
properties:

View File

@ -1,109 +0,0 @@
syntax = "proto3";
package memos.api.v1;
import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/protobuf/field_mask.proto";
option go_package = "gen/api/v1";
service StorageService {
// CreateStorage creates a new storage.
rpc CreateStorage(CreateStorageRequest) returns (CreateStorageResponse) {
option (google.api.http) = {
post: "/api/v1/storages"
body: "*"
};
}
// GetStorage returns a storage by id.
rpc GetStorage(GetStorageRequest) returns (GetStorageResponse) {
option (google.api.http) = {get: "/api/v1/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/v1/storages"};
}
// UpdateStorage updates a storage.
rpc UpdateStorage(UpdateStorageRequest) returns (UpdateStorageResponse) {
option (google.api.http) = {
patch: "/api/v1/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/v1/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 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 {}

File diff suppressed because it is too large Load Diff

View File

@ -1,589 +0,0 @@
// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT.
// source: api/v1/storage_service.proto
/*
Package apiv1 is a reverse proxy.
It translates gRPC into RESTful JSON APIs.
*/
package apiv1
import (
"context"
"io"
"net/http"
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
"github.com/grpc-ecosystem/grpc-gateway/v2/utilities"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/grpclog"
"google.golang.org/grpc/metadata"
"google.golang.org/grpc/status"
"google.golang.org/protobuf/proto"
)
// Suppress "imported and not used" errors
var _ codes.Code
var _ io.Reader
var _ status.Status
var _ = runtime.String
var _ = utilities.NewDoubleArray
var _ = metadata.Join
func request_StorageService_CreateStorage_0(ctx context.Context, marshaler runtime.Marshaler, client StorageServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq CreateStorageRequest
var metadata runtime.ServerMetadata
if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := client.CreateStorage(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
func local_request_StorageService_CreateStorage_0(ctx context.Context, marshaler runtime.Marshaler, server StorageServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq CreateStorageRequest
var metadata runtime.ServerMetadata
if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := server.CreateStorage(ctx, &protoReq)
return msg, metadata, err
}
func request_StorageService_GetStorage_0(ctx context.Context, marshaler runtime.Marshaler, client StorageServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq GetStorageRequest
var metadata runtime.ServerMetadata
var (
val string
ok bool
err error
_ = err
)
val, ok = pathParams["id"]
if !ok {
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id")
}
protoReq.Id, err = runtime.Int32(val)
if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err)
}
msg, err := client.GetStorage(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
func local_request_StorageService_GetStorage_0(ctx context.Context, marshaler runtime.Marshaler, server StorageServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq GetStorageRequest
var metadata runtime.ServerMetadata
var (
val string
ok bool
err error
_ = err
)
val, ok = pathParams["id"]
if !ok {
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id")
}
protoReq.Id, err = runtime.Int32(val)
if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err)
}
msg, err := server.GetStorage(ctx, &protoReq)
return msg, metadata, err
}
func request_StorageService_ListStorages_0(ctx context.Context, marshaler runtime.Marshaler, client StorageServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq ListStoragesRequest
var metadata runtime.ServerMetadata
msg, err := client.ListStorages(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
func local_request_StorageService_ListStorages_0(ctx context.Context, marshaler runtime.Marshaler, server StorageServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq ListStoragesRequest
var metadata runtime.ServerMetadata
msg, err := server.ListStorages(ctx, &protoReq)
return msg, metadata, err
}
var (
filter_StorageService_UpdateStorage_0 = &utilities.DoubleArray{Encoding: map[string]int{"storage": 0, "id": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}}
)
func request_StorageService_UpdateStorage_0(ctx context.Context, marshaler runtime.Marshaler, client StorageServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq UpdateStorageRequest
var metadata runtime.ServerMetadata
newReader, berr := utilities.IOReaderFactory(req.Body)
if berr != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
}
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Storage); err != nil && err != io.EOF {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 {
if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.Storage); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
} else {
protoReq.UpdateMask = fieldMask
}
}
var (
val string
ok bool
err error
_ = err
)
val, ok = pathParams["storage.id"]
if !ok {
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "storage.id")
}
err = runtime.PopulateFieldFromPath(&protoReq, "storage.id", val)
if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "storage.id", err)
}
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_StorageService_UpdateStorage_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := client.UpdateStorage(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
func local_request_StorageService_UpdateStorage_0(ctx context.Context, marshaler runtime.Marshaler, server StorageServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq UpdateStorageRequest
var metadata runtime.ServerMetadata
newReader, berr := utilities.IOReaderFactory(req.Body)
if berr != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
}
if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Storage); err != nil && err != io.EOF {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 {
if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.Storage); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
} else {
protoReq.UpdateMask = fieldMask
}
}
var (
val string
ok bool
err error
_ = err
)
val, ok = pathParams["storage.id"]
if !ok {
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "storage.id")
}
err = runtime.PopulateFieldFromPath(&protoReq, "storage.id", val)
if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "storage.id", err)
}
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_StorageService_UpdateStorage_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := server.UpdateStorage(ctx, &protoReq)
return msg, metadata, err
}
func request_StorageService_DeleteStorage_0(ctx context.Context, marshaler runtime.Marshaler, client StorageServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq DeleteStorageRequest
var metadata runtime.ServerMetadata
var (
val string
ok bool
err error
_ = err
)
val, ok = pathParams["id"]
if !ok {
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id")
}
protoReq.Id, err = runtime.Int32(val)
if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err)
}
msg, err := client.DeleteStorage(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
func local_request_StorageService_DeleteStorage_0(ctx context.Context, marshaler runtime.Marshaler, server StorageServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq DeleteStorageRequest
var metadata runtime.ServerMetadata
var (
val string
ok bool
err error
_ = err
)
val, ok = pathParams["id"]
if !ok {
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id")
}
protoReq.Id, err = runtime.Int32(val)
if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err)
}
msg, err := server.DeleteStorage(ctx, &protoReq)
return msg, metadata, err
}
// RegisterStorageServiceHandlerServer registers the http handlers for service StorageService to "mux".
// UnaryRPC :call StorageServiceServer directly.
// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterStorageServiceHandlerFromEndpoint instead.
func RegisterStorageServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server StorageServiceServer) error {
mux.Handle("POST", pattern_StorageService_CreateStorage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
var stream runtime.ServerTransportStream
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
var err error
var annotatedContext context.Context
annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/memos.api.v1.StorageService/CreateStorage", runtime.WithHTTPPathPattern("/api/v1/storages"))
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := local_request_StorageService_CreateStorage_0(annotatedContext, inboundMarshaler, server, req, pathParams)
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
if err != nil {
runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
return
}
forward_StorageService_CreateStorage_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle("GET", pattern_StorageService_GetStorage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
var stream runtime.ServerTransportStream
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
var err error
var annotatedContext context.Context
annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/memos.api.v1.StorageService/GetStorage", runtime.WithHTTPPathPattern("/api/v1/storages/{id}"))
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := local_request_StorageService_GetStorage_0(annotatedContext, inboundMarshaler, server, req, pathParams)
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
if err != nil {
runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
return
}
forward_StorageService_GetStorage_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle("GET", pattern_StorageService_ListStorages_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
var stream runtime.ServerTransportStream
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
var err error
var annotatedContext context.Context
annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/memos.api.v1.StorageService/ListStorages", runtime.WithHTTPPathPattern("/api/v1/storages"))
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := local_request_StorageService_ListStorages_0(annotatedContext, inboundMarshaler, server, req, pathParams)
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
if err != nil {
runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
return
}
forward_StorageService_ListStorages_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle("PATCH", pattern_StorageService_UpdateStorage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
var stream runtime.ServerTransportStream
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
var err error
var annotatedContext context.Context
annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/memos.api.v1.StorageService/UpdateStorage", runtime.WithHTTPPathPattern("/api/v1/storages/{storage.id}"))
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := local_request_StorageService_UpdateStorage_0(annotatedContext, inboundMarshaler, server, req, pathParams)
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
if err != nil {
runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
return
}
forward_StorageService_UpdateStorage_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle("DELETE", pattern_StorageService_DeleteStorage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
var stream runtime.ServerTransportStream
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
var err error
var annotatedContext context.Context
annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/memos.api.v1.StorageService/DeleteStorage", runtime.WithHTTPPathPattern("/api/v1/storages/{id}"))
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := local_request_StorageService_DeleteStorage_0(annotatedContext, inboundMarshaler, server, req, pathParams)
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
if err != nil {
runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
return
}
forward_StorageService_DeleteStorage_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
return nil
}
// RegisterStorageServiceHandlerFromEndpoint is same as RegisterStorageServiceHandler but
// automatically dials to "endpoint" and closes the connection when "ctx" gets done.
func RegisterStorageServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) {
conn, err := grpc.DialContext(ctx, endpoint, opts...)
if err != nil {
return err
}
defer func() {
if err != nil {
if cerr := conn.Close(); cerr != nil {
grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr)
}
return
}
go func() {
<-ctx.Done()
if cerr := conn.Close(); cerr != nil {
grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr)
}
}()
}()
return RegisterStorageServiceHandler(ctx, mux, conn)
}
// RegisterStorageServiceHandler registers the http handlers for service StorageService to "mux".
// The handlers forward requests to the grpc endpoint over "conn".
func RegisterStorageServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error {
return RegisterStorageServiceHandlerClient(ctx, mux, NewStorageServiceClient(conn))
}
// RegisterStorageServiceHandlerClient registers the http handlers for service StorageService
// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "StorageServiceClient".
// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "StorageServiceClient"
// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in
// "StorageServiceClient" to call the correct interceptors.
func RegisterStorageServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client StorageServiceClient) error {
mux.Handle("POST", pattern_StorageService_CreateStorage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
var err error
var annotatedContext context.Context
annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/memos.api.v1.StorageService/CreateStorage", runtime.WithHTTPPathPattern("/api/v1/storages"))
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := request_StorageService_CreateStorage_0(annotatedContext, inboundMarshaler, client, req, pathParams)
annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
if err != nil {
runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
return
}
forward_StorageService_CreateStorage_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle("GET", pattern_StorageService_GetStorage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
var err error
var annotatedContext context.Context
annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/memos.api.v1.StorageService/GetStorage", runtime.WithHTTPPathPattern("/api/v1/storages/{id}"))
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := request_StorageService_GetStorage_0(annotatedContext, inboundMarshaler, client, req, pathParams)
annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
if err != nil {
runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
return
}
forward_StorageService_GetStorage_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle("GET", pattern_StorageService_ListStorages_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
var err error
var annotatedContext context.Context
annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/memos.api.v1.StorageService/ListStorages", runtime.WithHTTPPathPattern("/api/v1/storages"))
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := request_StorageService_ListStorages_0(annotatedContext, inboundMarshaler, client, req, pathParams)
annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
if err != nil {
runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
return
}
forward_StorageService_ListStorages_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle("PATCH", pattern_StorageService_UpdateStorage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
var err error
var annotatedContext context.Context
annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/memos.api.v1.StorageService/UpdateStorage", runtime.WithHTTPPathPattern("/api/v1/storages/{storage.id}"))
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := request_StorageService_UpdateStorage_0(annotatedContext, inboundMarshaler, client, req, pathParams)
annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
if err != nil {
runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
return
}
forward_StorageService_UpdateStorage_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle("DELETE", pattern_StorageService_DeleteStorage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
var err error
var annotatedContext context.Context
annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/memos.api.v1.StorageService/DeleteStorage", runtime.WithHTTPPathPattern("/api/v1/storages/{id}"))
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := request_StorageService_DeleteStorage_0(annotatedContext, inboundMarshaler, client, req, pathParams)
annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md)
if err != nil {
runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err)
return
}
forward_StorageService_DeleteStorage_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
return nil
}
var (
pattern_StorageService_CreateStorage_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "storages"}, ""))
pattern_StorageService_GetStorage_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "storages", "id"}, ""))
pattern_StorageService_ListStorages_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "storages"}, ""))
pattern_StorageService_UpdateStorage_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "storages", "storage.id"}, ""))
pattern_StorageService_DeleteStorage_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "storages", "id"}, ""))
)
var (
forward_StorageService_CreateStorage_0 = runtime.ForwardResponseMessage
forward_StorageService_GetStorage_0 = runtime.ForwardResponseMessage
forward_StorageService_ListStorages_0 = runtime.ForwardResponseMessage
forward_StorageService_UpdateStorage_0 = runtime.ForwardResponseMessage
forward_StorageService_DeleteStorage_0 = runtime.ForwardResponseMessage
)

View File

@ -1,267 +0,0 @@
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.3.0
// - protoc (unknown)
// source: api/v1/storage_service.proto
package apiv1
import (
context "context"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
)
// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
// Requires gRPC-Go v1.32.0 or later.
const _ = grpc.SupportPackageIsVersion7
const (
StorageService_CreateStorage_FullMethodName = "/memos.api.v1.StorageService/CreateStorage"
StorageService_GetStorage_FullMethodName = "/memos.api.v1.StorageService/GetStorage"
StorageService_ListStorages_FullMethodName = "/memos.api.v1.StorageService/ListStorages"
StorageService_UpdateStorage_FullMethodName = "/memos.api.v1.StorageService/UpdateStorage"
StorageService_DeleteStorage_FullMethodName = "/memos.api.v1.StorageService/DeleteStorage"
)
// StorageServiceClient is the client API for StorageService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
type StorageServiceClient interface {
// CreateStorage creates a new storage.
CreateStorage(ctx context.Context, in *CreateStorageRequest, opts ...grpc.CallOption) (*CreateStorageResponse, error)
// GetStorage returns a storage by id.
GetStorage(ctx context.Context, in *GetStorageRequest, opts ...grpc.CallOption) (*GetStorageResponse, error)
// ListStorages returns a list of storages.
ListStorages(ctx context.Context, in *ListStoragesRequest, opts ...grpc.CallOption) (*ListStoragesResponse, error)
// UpdateStorage updates a storage.
UpdateStorage(ctx context.Context, in *UpdateStorageRequest, opts ...grpc.CallOption) (*UpdateStorageResponse, error)
// DeleteStorage deletes a storage by id.
DeleteStorage(ctx context.Context, in *DeleteStorageRequest, opts ...grpc.CallOption) (*DeleteStorageResponse, error)
}
type storageServiceClient struct {
cc grpc.ClientConnInterface
}
func NewStorageServiceClient(cc grpc.ClientConnInterface) StorageServiceClient {
return &storageServiceClient{cc}
}
func (c *storageServiceClient) CreateStorage(ctx context.Context, in *CreateStorageRequest, opts ...grpc.CallOption) (*CreateStorageResponse, error) {
out := new(CreateStorageResponse)
err := c.cc.Invoke(ctx, StorageService_CreateStorage_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *storageServiceClient) GetStorage(ctx context.Context, in *GetStorageRequest, opts ...grpc.CallOption) (*GetStorageResponse, error) {
out := new(GetStorageResponse)
err := c.cc.Invoke(ctx, StorageService_GetStorage_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *storageServiceClient) ListStorages(ctx context.Context, in *ListStoragesRequest, opts ...grpc.CallOption) (*ListStoragesResponse, error) {
out := new(ListStoragesResponse)
err := c.cc.Invoke(ctx, StorageService_ListStorages_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *storageServiceClient) UpdateStorage(ctx context.Context, in *UpdateStorageRequest, opts ...grpc.CallOption) (*UpdateStorageResponse, error) {
out := new(UpdateStorageResponse)
err := c.cc.Invoke(ctx, StorageService_UpdateStorage_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *storageServiceClient) DeleteStorage(ctx context.Context, in *DeleteStorageRequest, opts ...grpc.CallOption) (*DeleteStorageResponse, error) {
out := new(DeleteStorageResponse)
err := c.cc.Invoke(ctx, StorageService_DeleteStorage_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// StorageServiceServer is the server API for StorageService service.
// All implementations must embed UnimplementedStorageServiceServer
// for forward compatibility
type StorageServiceServer interface {
// CreateStorage creates a new storage.
CreateStorage(context.Context, *CreateStorageRequest) (*CreateStorageResponse, error)
// GetStorage returns a storage by id.
GetStorage(context.Context, *GetStorageRequest) (*GetStorageResponse, error)
// ListStorages returns a list of storages.
ListStorages(context.Context, *ListStoragesRequest) (*ListStoragesResponse, error)
// UpdateStorage updates a storage.
UpdateStorage(context.Context, *UpdateStorageRequest) (*UpdateStorageResponse, error)
// DeleteStorage deletes a storage by id.
DeleteStorage(context.Context, *DeleteStorageRequest) (*DeleteStorageResponse, error)
mustEmbedUnimplementedStorageServiceServer()
}
// UnimplementedStorageServiceServer must be embedded to have forward compatible implementations.
type UnimplementedStorageServiceServer struct {
}
func (UnimplementedStorageServiceServer) CreateStorage(context.Context, *CreateStorageRequest) (*CreateStorageResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method CreateStorage not implemented")
}
func (UnimplementedStorageServiceServer) GetStorage(context.Context, *GetStorageRequest) (*GetStorageResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetStorage not implemented")
}
func (UnimplementedStorageServiceServer) ListStorages(context.Context, *ListStoragesRequest) (*ListStoragesResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method ListStorages not implemented")
}
func (UnimplementedStorageServiceServer) UpdateStorage(context.Context, *UpdateStorageRequest) (*UpdateStorageResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method UpdateStorage not implemented")
}
func (UnimplementedStorageServiceServer) DeleteStorage(context.Context, *DeleteStorageRequest) (*DeleteStorageResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method DeleteStorage not implemented")
}
func (UnimplementedStorageServiceServer) mustEmbedUnimplementedStorageServiceServer() {}
// UnsafeStorageServiceServer may be embedded to opt out of forward compatibility for this service.
// Use of this interface is not recommended, as added methods to StorageServiceServer will
// result in compilation errors.
type UnsafeStorageServiceServer interface {
mustEmbedUnimplementedStorageServiceServer()
}
func RegisterStorageServiceServer(s grpc.ServiceRegistrar, srv StorageServiceServer) {
s.RegisterService(&StorageService_ServiceDesc, srv)
}
func _StorageService_CreateStorage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(CreateStorageRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(StorageServiceServer).CreateStorage(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: StorageService_CreateStorage_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(StorageServiceServer).CreateStorage(ctx, req.(*CreateStorageRequest))
}
return interceptor(ctx, in, info, handler)
}
func _StorageService_GetStorage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(GetStorageRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(StorageServiceServer).GetStorage(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: StorageService_GetStorage_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(StorageServiceServer).GetStorage(ctx, req.(*GetStorageRequest))
}
return interceptor(ctx, in, info, handler)
}
func _StorageService_ListStorages_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ListStoragesRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(StorageServiceServer).ListStorages(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: StorageService_ListStorages_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(StorageServiceServer).ListStorages(ctx, req.(*ListStoragesRequest))
}
return interceptor(ctx, in, info, handler)
}
func _StorageService_UpdateStorage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(UpdateStorageRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(StorageServiceServer).UpdateStorage(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: StorageService_UpdateStorage_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(StorageServiceServer).UpdateStorage(ctx, req.(*UpdateStorageRequest))
}
return interceptor(ctx, in, info, handler)
}
func _StorageService_DeleteStorage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(DeleteStorageRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(StorageServiceServer).DeleteStorage(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: StorageService_DeleteStorage_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(StorageServiceServer).DeleteStorage(ctx, req.(*DeleteStorageRequest))
}
return interceptor(ctx, in, info, handler)
}
// StorageService_ServiceDesc is the grpc.ServiceDesc for StorageService service.
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
var StorageService_ServiceDesc = grpc.ServiceDesc{
ServiceName: "memos.api.v1.StorageService",
HandlerType: (*StorageServiceServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "CreateStorage",
Handler: _StorageService_CreateStorage_Handler,
},
{
MethodName: "GetStorage",
Handler: _StorageService_GetStorage_Handler,
},
{
MethodName: "ListStorages",
Handler: _StorageService_ListStorages_Handler,
},
{
MethodName: "UpdateStorage",
Handler: _StorageService_UpdateStorage_Handler,
},
{
MethodName: "DeleteStorage",
Handler: _StorageService_DeleteStorage_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "api/v1/storage_service.proto",
}

View File

@ -1,465 +0,0 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.33.0
// protoc (unknown)
// source: store/storage.proto
package store
import (
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
reflect "reflect"
sync "sync"
)
const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
type Storage_Type int32
const (
Storage_TYPE_UNSPECIFIED Storage_Type = 0
Storage_S3 Storage_Type = 1
)
// Enum value maps for Storage_Type.
var (
Storage_Type_name = map[int32]string{
0: "TYPE_UNSPECIFIED",
1: "S3",
}
Storage_Type_value = map[string]int32{
"TYPE_UNSPECIFIED": 0,
"S3": 1,
}
)
func (x Storage_Type) Enum() *Storage_Type {
p := new(Storage_Type)
*p = x
return p
}
func (x Storage_Type) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (Storage_Type) Descriptor() protoreflect.EnumDescriptor {
return file_store_storage_proto_enumTypes[0].Descriptor()
}
func (Storage_Type) Type() protoreflect.EnumType {
return &file_store_storage_proto_enumTypes[0]
}
func (x Storage_Type) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use Storage_Type.Descriptor instead.
func (Storage_Type) EnumDescriptor() ([]byte, []int) {
return file_store_storage_proto_rawDescGZIP(), []int{0, 0}
}
type Storage struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
Type Storage_Type `protobuf:"varint,3,opt,name=type,proto3,enum=memos.store.Storage_Type" json:"type,omitempty"`
Config *StorageConfig `protobuf:"bytes,4,opt,name=config,proto3" json:"config,omitempty"`
}
func (x *Storage) Reset() {
*x = Storage{}
if protoimpl.UnsafeEnabled {
mi := &file_store_storage_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *Storage) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Storage) ProtoMessage() {}
func (x *Storage) ProtoReflect() protoreflect.Message {
mi := &file_store_storage_proto_msgTypes[0]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use Storage.ProtoReflect.Descriptor instead.
func (*Storage) Descriptor() ([]byte, []int) {
return file_store_storage_proto_rawDescGZIP(), []int{0}
}
func (x *Storage) GetId() int32 {
if x != nil {
return x.Id
}
return 0
}
func (x *Storage) GetName() string {
if x != nil {
return x.Name
}
return ""
}
func (x *Storage) GetType() Storage_Type {
if x != nil {
return x.Type
}
return Storage_TYPE_UNSPECIFIED
}
func (x *Storage) GetConfig() *StorageConfig {
if x != nil {
return x.Config
}
return nil
}
type StorageConfig struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Types that are assignable to StorageConfig:
//
// *StorageConfig_S3Config
StorageConfig isStorageConfig_StorageConfig `protobuf_oneof:"storage_config"`
}
func (x *StorageConfig) Reset() {
*x = StorageConfig{}
if protoimpl.UnsafeEnabled {
mi := &file_store_storage_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *StorageConfig) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*StorageConfig) ProtoMessage() {}
func (x *StorageConfig) ProtoReflect() protoreflect.Message {
mi := &file_store_storage_proto_msgTypes[1]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use StorageConfig.ProtoReflect.Descriptor instead.
func (*StorageConfig) Descriptor() ([]byte, []int) {
return file_store_storage_proto_rawDescGZIP(), []int{1}
}
func (m *StorageConfig) GetStorageConfig() isStorageConfig_StorageConfig {
if m != nil {
return m.StorageConfig
}
return nil
}
func (x *StorageConfig) GetS3Config() *S3Config {
if x, ok := x.GetStorageConfig().(*StorageConfig_S3Config); ok {
return x.S3Config
}
return nil
}
type isStorageConfig_StorageConfig interface {
isStorageConfig_StorageConfig()
}
type StorageConfig_S3Config struct {
S3Config *S3Config `protobuf:"bytes,1,opt,name=s3_config,json=s3Config,proto3,oneof"`
}
func (*StorageConfig_S3Config) isStorageConfig_StorageConfig() {}
type S3Config struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
EndPoint string `protobuf:"bytes,1,opt,name=end_point,json=endPoint,proto3" json:"end_point,omitempty"`
Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"`
Region string `protobuf:"bytes,3,opt,name=region,proto3" json:"region,omitempty"`
AccessKey string `protobuf:"bytes,4,opt,name=access_key,json=accessKey,proto3" json:"access_key,omitempty"`
SecretKey string `protobuf:"bytes,5,opt,name=secret_key,json=secretKey,proto3" json:"secret_key,omitempty"`
Bucket string `protobuf:"bytes,6,opt,name=bucket,proto3" json:"bucket,omitempty"`
UrlPrefix string `protobuf:"bytes,7,opt,name=url_prefix,json=urlPrefix,proto3" json:"url_prefix,omitempty"`
UrlSuffix string `protobuf:"bytes,8,opt,name=url_suffix,json=urlSuffix,proto3" json:"url_suffix,omitempty"`
PreSign bool `protobuf:"varint,9,opt,name=pre_sign,json=preSign,proto3" json:"pre_sign,omitempty"`
}
func (x *S3Config) Reset() {
*x = S3Config{}
if protoimpl.UnsafeEnabled {
mi := &file_store_storage_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *S3Config) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*S3Config) ProtoMessage() {}
func (x *S3Config) ProtoReflect() protoreflect.Message {
mi := &file_store_storage_proto_msgTypes[2]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use S3Config.ProtoReflect.Descriptor instead.
func (*S3Config) Descriptor() ([]byte, []int) {
return file_store_storage_proto_rawDescGZIP(), []int{2}
}
func (x *S3Config) GetEndPoint() string {
if x != nil {
return x.EndPoint
}
return ""
}
func (x *S3Config) GetPath() string {
if x != nil {
return x.Path
}
return ""
}
func (x *S3Config) GetRegion() string {
if x != nil {
return x.Region
}
return ""
}
func (x *S3Config) GetAccessKey() string {
if x != nil {
return x.AccessKey
}
return ""
}
func (x *S3Config) GetSecretKey() string {
if x != nil {
return x.SecretKey
}
return ""
}
func (x *S3Config) GetBucket() string {
if x != nil {
return x.Bucket
}
return ""
}
func (x *S3Config) GetUrlPrefix() string {
if x != nil {
return x.UrlPrefix
}
return ""
}
func (x *S3Config) GetUrlSuffix() string {
if x != nil {
return x.UrlSuffix
}
return ""
}
func (x *S3Config) GetPreSign() bool {
if x != nil {
return x.PreSign
}
return false
}
var File_store_storage_proto protoreflect.FileDescriptor
var file_store_storage_proto_rawDesc = []byte{
0x0a, 0x13, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x6f,
0x72, 0x65, 0x22, 0xb6, 0x01, 0x0a, 0x07, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x0e,
0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12,
0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e,
0x32, 0x19, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x53,
0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70,
0x65, 0x12, 0x32, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28,
0x0b, 0x32, 0x1a, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e,
0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63,
0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x24, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a,
0x10, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45,
0x44, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x53, 0x33, 0x10, 0x01, 0x22, 0x57, 0x0a, 0x0d, 0x53,
0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x34, 0x0a, 0x09,
0x73, 0x33, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x15, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x33,
0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66,
0x69, 0x67, 0x42, 0x10, 0x0a, 0x0e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f,
0x6e, 0x66, 0x69, 0x67, 0x22, 0x82, 0x02, 0x0a, 0x08, 0x53, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69,
0x67, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01,
0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x12,
0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61,
0x74, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01,
0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63,
0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09,
0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x63,
0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73,
0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b,
0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74,
0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x72, 0x6c, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x07,
0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x72, 0x6c, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12,
0x1d, 0x0a, 0x0a, 0x75, 0x72, 0x6c, 0x5f, 0x73, 0x75, 0x66, 0x66, 0x69, 0x78, 0x18, 0x08, 0x20,
0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x72, 0x6c, 0x53, 0x75, 0x66, 0x66, 0x69, 0x78, 0x12, 0x19,
0x0a, 0x08, 0x70, 0x72, 0x65, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08,
0x52, 0x07, 0x70, 0x72, 0x65, 0x53, 0x69, 0x67, 0x6e, 0x42, 0x97, 0x01, 0x0a, 0x0f, 0x63, 0x6f,
0x6d, 0x2e, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x0c, 0x53,
0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x29, 0x67,
0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x75, 0x73, 0x65, 0x6d, 0x65, 0x6d,
0x6f, 0x73, 0x2f, 0x6d, 0x65, 0x6d, 0x6f, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67,
0x65, 0x6e, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0xa2, 0x02, 0x03, 0x4d, 0x53, 0x58, 0xaa, 0x02,
0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0xca, 0x02, 0x0b, 0x4d,
0x65, 0x6d, 0x6f, 0x73, 0x5c, 0x53, 0x74, 0x6f, 0x72, 0x65, 0xe2, 0x02, 0x17, 0x4d, 0x65, 0x6d,
0x6f, 0x73, 0x5c, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61,
0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0c, 0x4d, 0x65, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x53, 0x74,
0x6f, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
file_store_storage_proto_rawDescOnce sync.Once
file_store_storage_proto_rawDescData = file_store_storage_proto_rawDesc
)
func file_store_storage_proto_rawDescGZIP() []byte {
file_store_storage_proto_rawDescOnce.Do(func() {
file_store_storage_proto_rawDescData = protoimpl.X.CompressGZIP(file_store_storage_proto_rawDescData)
})
return file_store_storage_proto_rawDescData
}
var file_store_storage_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_store_storage_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
var file_store_storage_proto_goTypes = []interface{}{
(Storage_Type)(0), // 0: memos.store.Storage.Type
(*Storage)(nil), // 1: memos.store.Storage
(*StorageConfig)(nil), // 2: memos.store.StorageConfig
(*S3Config)(nil), // 3: memos.store.S3Config
}
var file_store_storage_proto_depIdxs = []int32{
0, // 0: memos.store.Storage.type:type_name -> memos.store.Storage.Type
2, // 1: memos.store.Storage.config:type_name -> memos.store.StorageConfig
3, // 2: memos.store.StorageConfig.s3_config:type_name -> memos.store.S3Config
3, // [3:3] is the sub-list for method output_type
3, // [3:3] is the sub-list for method input_type
3, // [3:3] is the sub-list for extension type_name
3, // [3:3] is the sub-list for extension extendee
0, // [0:3] is the sub-list for field type_name
}
func init() { file_store_storage_proto_init() }
func file_store_storage_proto_init() {
if File_store_storage_proto != nil {
return
}
if !protoimpl.UnsafeEnabled {
file_store_storage_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Storage); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_store_storage_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*StorageConfig); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_store_storage_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*S3Config); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
}
file_store_storage_proto_msgTypes[1].OneofWrappers = []interface{}{
(*StorageConfig_S3Config)(nil),
}
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_store_storage_proto_rawDesc,
NumEnums: 1,
NumMessages: 3,
NumExtensions: 0,
NumServices: 0,
},
GoTypes: file_store_storage_proto_goTypes,
DependencyIndexes: file_store_storage_proto_depIdxs,
EnumInfos: file_store_storage_proto_enumTypes,
MessageInfos: file_store_storage_proto_msgTypes,
}.Build()
File_store_storage_proto = out.File
file_store_storage_proto_rawDesc = nil
file_store_storage_proto_goTypes = nil
file_store_storage_proto_depIdxs = nil
}

View File

@ -1,35 +0,0 @@
syntax = "proto3";
package memos.store;
option go_package = "gen/store";
message Storage {
int32 id = 1;
string name = 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;
}

View File

@ -1,156 +0,0 @@
package v1
import (
"context"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
v1pb "github.com/usememos/memos/proto/gen/api/v1"
storepb "github.com/usememos/memos/proto/gen/store"
"github.com/usememos/memos/store"
)
func (s *APIV1Service) CreateStorage(ctx context.Context, request *v1pb.CreateStorageRequest) (*v1pb.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.CreateStorage(ctx, convertStorageToStore(request.Storage))
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to create storage, error: %+v", err)
}
return &v1pb.CreateStorageResponse{
Storage: ConvertStorageFromStore(storage),
}, nil
}
func (s *APIV1Service) ListStorages(ctx context.Context, _ *v1pb.ListStoragesRequest) (*v1pb.ListStoragesResponse, error) {
storages, err := s.Store.ListStorages(ctx, &store.FindStorage{})
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to list storages, error: %+v", err)
}
response := &v1pb.ListStoragesResponse{
Storages: []*v1pb.Storage{},
}
for _, storage := range storages {
response.Storages = append(response.Storages, ConvertStorageFromStore(storage))
}
return response, nil
}
func (s *APIV1Service) GetStorage(ctx context.Context, request *v1pb.GetStorageRequest) (*v1pb.GetStorageResponse, error) {
storage, err := s.Store.GetStorage(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 &v1pb.GetStorageResponse{
Storage: ConvertStorageFromStore(storage),
}, nil
}
func (s *APIV1Service) UpdateStorage(ctx context.Context, request *v1pb.UpdateStorageRequest) (*v1pb.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.UpdateStorage(ctx, update)
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to update storage, error: %+v", err)
}
return &v1pb.UpdateStorageResponse{
Storage: ConvertStorageFromStore(storage),
}, nil
}
func (s *APIV1Service) DeleteStorage(ctx context.Context, request *v1pb.DeleteStorageRequest) (*v1pb.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 &v1pb.DeleteStorageResponse{}, nil
}
func ConvertStorageFromStore(storage *storepb.Storage) *v1pb.Storage {
temp := &v1pb.Storage{
Id: storage.Id,
Title: storage.Name,
Type: v1pb.Storage_Type(v1pb.Storage_Type_value[storage.Type.String()]),
}
if storage.Type == storepb.Storage_S3 {
s3Config := storage.Config.GetS3Config()
temp.Config = &v1pb.StorageConfig{
Config: &v1pb.StorageConfig_S3Config{
S3Config: &v1pb.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 *v1pb.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 v1pb.Storage_Type, config *v1pb.StorageConfig) *storepb.StorageConfig {
if storageType == v1pb.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
}

View File

@ -28,7 +28,6 @@ type APIV1Service struct {
v1pb.UnimplementedActivityServiceServer
v1pb.UnimplementedWebhookServiceServer
v1pb.UnimplementedLinkServiceServer
v1pb.UnimplementedStorageServiceServer
v1pb.UnimplementedIdentityProviderServiceServer
Secret string
@ -57,7 +56,6 @@ func NewAPIV1Service(secret string, profile *profile.Profile, store *store.Store
v1pb.RegisterActivityServiceServer(grpcServer, apiv1Service)
v1pb.RegisterWebhookServiceServer(grpcServer, apiv1Service)
v1pb.RegisterLinkServiceServer(grpcServer, apiv1Service)
v1pb.RegisterStorageServiceServer(grpcServer, apiv1Service)
v1pb.RegisterIdentityProviderServiceServer(grpcServer, apiv1Service)
reflection.Register(grpcServer)
return apiv1Service
@ -110,9 +108,6 @@ func (s *APIV1Service) RegisterGateway(ctx context.Context, echoServer *echo.Ech
if err := v1pb.RegisterLinkServiceHandler(context.Background(), gwMux, conn); err != nil {
return err
}
if err := v1pb.RegisterStorageServiceHandler(context.Background(), gwMux, conn); err != nil {
return err
}
if err := v1pb.RegisterIdentityProviderServiceHandler(context.Background(), gwMux, conn); err != nil {
return err
}

View File

@ -1,107 +0,0 @@
package mysql
import (
"context"
"strings"
"github.com/usememos/memos/store"
)
func (d *DB) CreateStorage(ctx context.Context, create *store.Storage) (*store.Storage, error) {
fields := []string{"`name`", "`type`", "`config`"}
placeholder := []string{"?", "?", "?"}
args := []any{create.Name, create.Type, create.Config}
stmt := "INSERT INTO `storage` (" + strings.Join(fields, ", ") + ") VALUES (" + strings.Join(placeholder, ", ") + ")"
result, err := d.db.ExecContext(ctx, stmt, args...)
if err != nil {
return nil, err
}
id, err := result.LastInsertId()
if err != nil {
return nil, err
}
create.ID = int32(id)
return create, nil
}
func (d *DB) ListStorages(ctx context.Context, find *store.FindStorage) ([]*store.Storage, error) {
where, args := []string{"1 = 1"}, []any{}
if find.ID != nil {
where, args = append(where, "`id` = ?"), append(args, *find.ID)
}
rows, err := d.db.QueryContext(ctx, "SELECT `id`, `name`, `type`, `config` FROM `storage` WHERE "+strings.Join(where, " AND ")+" ORDER BY `id` DESC",
args...,
)
if err != nil {
return nil, err
}
defer rows.Close()
list := []*store.Storage{}
for rows.Next() {
storage := &store.Storage{}
if err := rows.Scan(
&storage.ID,
&storage.Name,
&storage.Type,
&storage.Config,
); err != nil {
return nil, err
}
list = append(list, storage)
}
if err := rows.Err(); err != nil {
return nil, err
}
return list, nil
}
func (d *DB) UpdateStorage(ctx context.Context, update *store.UpdateStorage) (*store.Storage, error) {
set, args := []string{}, []any{}
if update.Name != nil {
set = append(set, "`name` = ?")
args = append(args, *update.Name)
}
if update.Config != nil {
set = append(set, "`config` = ?")
args = append(args, *update.Config)
}
args = append(args, update.ID)
stmt := "UPDATE `storage` SET " + strings.Join(set, ", ") + " WHERE `id` = ?"
_, err := d.db.ExecContext(ctx, stmt, args...)
if err != nil {
return nil, err
}
storage := &store.Storage{}
stmt = "SELECT `id`, `name`, `type`, `config` FROM `storage` WHERE `id` = ?"
if err := d.db.QueryRowContext(ctx, stmt, update.ID).Scan(
&storage.ID,
&storage.Name,
&storage.Type,
&storage.Config,
); err != nil {
return nil, err
}
return storage, nil
}
func (d *DB) DeleteStorage(ctx context.Context, delete *store.DeleteStorage) error {
stmt := "DELETE FROM `storage` WHERE `id` = ?"
result, err := d.db.ExecContext(ctx, stmt, delete.ID)
if err != nil {
return err
}
if _, err := result.RowsAffected(); err != nil {
return err
}
return nil
}

View File

@ -1,102 +0,0 @@
package postgres
import (
"context"
"strings"
"github.com/usememos/memos/store"
)
func (d *DB) CreateStorage(ctx context.Context, create *store.Storage) (*store.Storage, error) {
fields := []string{"name", "type", "config"}
args := []any{create.Name, create.Type, create.Config}
stmt := "INSERT INTO storage (" + strings.Join(fields, ", ") + ") VALUES (" + placeholders(len(args)) + ") RETURNING id"
if err := d.db.QueryRowContext(ctx, stmt, args...).Scan(
&create.ID,
); err != nil {
return nil, err
}
storage := create
return storage, nil
}
func (d *DB) ListStorages(ctx context.Context, find *store.FindStorage) ([]*store.Storage, error) {
where, args := []string{"1 = 1"}, []any{}
if find.ID != nil {
where, args = append(where, "id = "+placeholder(len(args)+1)), append(args, *find.ID)
}
rows, err := d.db.QueryContext(ctx, `
SELECT
id,
name,
type,
config
FROM storage
WHERE `+strings.Join(where, " AND ")+`
ORDER BY id DESC`,
args...,
)
if err != nil {
return nil, err
}
defer rows.Close()
list := []*store.Storage{}
for rows.Next() {
storage := &store.Storage{}
if err := rows.Scan(
&storage.ID,
&storage.Name,
&storage.Type,
&storage.Config,
); err != nil {
return nil, err
}
list = append(list, storage)
}
if err := rows.Err(); err != nil {
return nil, err
}
return list, nil
}
func (d *DB) UpdateStorage(ctx context.Context, update *store.UpdateStorage) (*store.Storage, error) {
set, args := []string{}, []any{}
if update.Name != nil {
set, args = append(set, "name = "+placeholder(len(args)+1)), append(args, *update.Name)
}
if update.Config != nil {
set, args = append(set, "config = "+placeholder(len(args)+1)), append(args, *update.Config)
}
stmt := `UPDATE storage SET ` + strings.Join(set, ", ") + ` WHERE id = ` + placeholder(len(args)+1) + ` RETURNING id, name, type, config`
args = append(args, update.ID)
storage := &store.Storage{}
if err := d.db.QueryRowContext(ctx, stmt, args...).Scan(
&storage.ID,
&storage.Name,
&storage.Type,
&storage.Config,
); err != nil {
return nil, err
}
return storage, nil
}
func (d *DB) DeleteStorage(ctx context.Context, delete *store.DeleteStorage) error {
stmt := `DELETE FROM storage WHERE id = $1`
result, err := d.db.ExecContext(ctx, stmt, delete.ID)
if err != nil {
return err
}
if _, err := result.RowsAffected(); err != nil {
return err
}
return nil
}

View File

@ -1,117 +0,0 @@
package sqlite
import (
"context"
"strings"
"github.com/usememos/memos/store"
)
func (d *DB) CreateStorage(ctx context.Context, create *store.Storage) (*store.Storage, error) {
fields := []string{"`name`", "`type`", "`config`"}
placeholder := []string{"?", "?", "?"}
args := []any{create.Name, create.Type, create.Config}
stmt := "INSERT INTO `storage` (" + strings.Join(fields, ", ") + ") VALUES (" + strings.Join(placeholder, ", ") + ") RETURNING `id`"
if err := d.db.QueryRowContext(ctx, stmt, args...).Scan(
&create.ID,
); err != nil {
return nil, err
}
storage := create
return storage, nil
}
func (d *DB) ListStorages(ctx context.Context, find *store.FindStorage) ([]*store.Storage, error) {
where, args := []string{"1 = 1"}, []any{}
if find.ID != nil {
where, args = append(where, "id = ?"), append(args, *find.ID)
}
rows, err := d.db.QueryContext(ctx, `
SELECT
id,
name,
type,
config
FROM storage
WHERE `+strings.Join(where, " AND ")+`
ORDER BY id DESC`,
args...,
)
if err != nil {
return nil, err
}
defer rows.Close()
list := []*store.Storage{}
for rows.Next() {
storage := &store.Storage{}
if err := rows.Scan(
&storage.ID,
&storage.Name,
&storage.Type,
&storage.Config,
); err != nil {
return nil, err
}
list = append(list, storage)
}
if err := rows.Err(); err != nil {
return nil, err
}
return list, nil
}
func (d *DB) UpdateStorage(ctx context.Context, update *store.UpdateStorage) (*store.Storage, error) {
set, args := []string{}, []any{}
if update.Name != nil {
set = append(set, "name = ?")
args = append(args, *update.Name)
}
if update.Config != nil {
set = append(set, "config = ?")
args = append(args, *update.Config)
}
args = append(args, update.ID)
stmt := `
UPDATE storage
SET ` + strings.Join(set, ", ") + `
WHERE id = ?
RETURNING
id,
name,
type,
config
`
storage := &store.Storage{}
if err := d.db.QueryRowContext(ctx, stmt, args...).Scan(
&storage.ID,
&storage.Name,
&storage.Type,
&storage.Config,
); err != nil {
return nil, err
}
return storage, nil
}
func (d *DB) DeleteStorage(ctx context.Context, delete *store.DeleteStorage) error {
stmt := `
DELETE FROM storage
WHERE id = ?
`
result, err := d.db.ExecContext(ctx, stmt, delete.ID)
if err != nil {
return err
}
if _, err := result.RowsAffected(); err != nil {
return err
}
return nil
}

View File

@ -73,12 +73,6 @@ type Driver interface {
ListTags(ctx context.Context, find *FindTag) ([]*Tag, error)
DeleteTag(ctx context.Context, delete *DeleteTag) error
// Storage model related methods.
CreateStorage(ctx context.Context, create *Storage) (*Storage, error)
ListStorages(ctx context.Context, find *FindStorage) ([]*Storage, error)
UpdateStorage(ctx context.Context, update *UpdateStorage) (*Storage, error)
DeleteStorage(ctx context.Context, delete *DeleteStorage) error
// Inbox model related methods.
CreateInbox(ctx context.Context, create *Inbox) (*Inbox, error)
ListInboxes(ctx context.Context, find *FindInbox) ([]*Inbox, error)

View File

@ -1,160 +0,0 @@
package store
import (
"context"
"github.com/pkg/errors"
"google.golang.org/protobuf/encoding/protojson"
storepb "github.com/usememos/memos/proto/gen/store"
)
type Storage struct {
ID int32
Name string
Type string
Config string
}
type FindStorage struct {
ID *int32
}
type UpdateStorage struct {
ID int32
Name *string
Config *string
}
type DeleteStorage struct {
ID int32
}
func (s *Store) CreateStorage(ctx context.Context, create *storepb.Storage) (*storepb.Storage, error) {
storageRaw := &Storage{
Name: create.Name,
Type: create.Type.String(),
}
if create.Type == storepb.Storage_S3 {
configBytes, err := protojson.Marshal(create.Config.GetS3Config())
if err != nil {
return nil, errors.Wrap(err, "failed to marshal s3 config")
}
storageRaw.Config = string(configBytes)
}
storageRaw, err := s.driver.CreateStorage(ctx, storageRaw)
if err != nil {
return nil, err
}
storage, err := convertStorageFromRaw(storageRaw)
if err != nil {
return nil, err
}
return storage, nil
}
func (s *Store) ListStorages(ctx context.Context, find *FindStorage) ([]*storepb.Storage, error) {
list, err := s.driver.ListStorages(ctx, find)
if err != nil {
return nil, err
}
storages := []*storepb.Storage{}
for _, storageRaw := range list {
storage, err := convertStorageFromRaw(storageRaw)
if err != nil {
return nil, err
}
storages = append(storages, storage)
}
return storages, nil
}
func (s *Store) GetStorage(ctx context.Context, find *FindStorage) (*storepb.Storage, error) {
list, err := s.ListStorages(ctx, find)
if err != nil {
return nil, err
}
if len(list) == 0 {
return nil, nil
}
return list[0], nil
}
type UpdateStorageV1 struct {
ID int32
Type storepb.Storage_Type
Name *string
Config *storepb.StorageConfig
}
func (s *Store) UpdateStorage(ctx context.Context, update *UpdateStorageV1) (*storepb.Storage, error) {
updateRaw := &UpdateStorage{
ID: update.ID,
}
if update.Name != nil {
updateRaw.Name = update.Name
}
if update.Config != nil {
configRaw, err := convertStorageConfigToRaw(update.Type, update.Config)
if err != nil {
return nil, err
}
updateRaw.Config = &configRaw
}
storageRaw, err := s.driver.UpdateStorage(ctx, updateRaw)
if err != nil {
return nil, err
}
storage, err := convertStorageFromRaw(storageRaw)
if err != nil {
return nil, err
}
return storage, nil
}
func (s *Store) DeleteStorage(ctx context.Context, delete *DeleteStorage) error {
return s.driver.DeleteStorage(ctx, delete)
}
func convertStorageFromRaw(storageRaw *Storage) (*storepb.Storage, error) {
storage := &storepb.Storage{
Id: storageRaw.ID,
Name: storageRaw.Name,
Type: storepb.Storage_Type(storepb.Storage_Type_value[storageRaw.Type]),
}
storageConfig, err := convertStorageConfigFromRaw(storage.Type, storageRaw.Config)
if err != nil {
return nil, err
}
storage.Config = storageConfig
return storage, nil
}
func convertStorageConfigFromRaw(storageType storepb.Storage_Type, configRaw string) (*storepb.StorageConfig, error) {
storageConfig := &storepb.StorageConfig{}
if storageType == storepb.Storage_S3 {
s3Config := &storepb.S3Config{}
err := protojsonUnmarshaler.Unmarshal([]byte(configRaw), s3Config)
if err != nil {
return nil, err
}
storageConfig.StorageConfig = &storepb.StorageConfig_S3Config{S3Config: s3Config}
}
return storageConfig, nil
}
func convertStorageConfigToRaw(storageType storepb.Storage_Type, config *storepb.StorageConfig) (string, error) {
raw := ""
if storageType == storepb.Storage_S3 {
bytes, err := protojson.Marshal(config.GetS3Config())
if err != nil {
return "", err
}
raw = string(bytes)
}
return raw, nil
}

View File

@ -1,48 +0,0 @@
package teststore
import (
"context"
"testing"
"github.com/stretchr/testify/require"
storepb "github.com/usememos/memos/proto/gen/store"
"github.com/usememos/memos/store"
)
func TestStorageStore(t *testing.T) {
ctx := context.Background()
ts := NewTestingStore(ctx, t)
storage, err := ts.CreateStorage(ctx, &storepb.Storage{
Name: "test_storage",
Type: storepb.Storage_S3,
Config: &storepb.StorageConfig{
StorageConfig: &storepb.StorageConfig_S3Config{
S3Config: &storepb.S3Config{
EndPoint: "http://localhost:9000",
},
},
},
})
require.NoError(t, err)
newStorageName := "new_storage_name"
updatedStorage, err := ts.UpdateStorage(ctx, &store.UpdateStorageV1{
ID: storage.Id,
Type: storage.Type,
Name: &newStorageName,
})
require.NoError(t, err)
require.Equal(t, newStorageName, updatedStorage.Name)
storageList, err := ts.ListStorages(ctx, &store.FindStorage{})
require.NoError(t, err)
require.Equal(t, 1, len(storageList))
require.Equal(t, updatedStorage, storageList[0])
err = ts.DeleteStorage(ctx, &store.DeleteStorage{
ID: storage.Id,
})
require.NoError(t, err)
storageList, err = ts.ListStorages(ctx, &store.FindStorage{})
require.NoError(t, err)
require.Equal(t, 0, len(storageList))
ts.Close()
}

View File

@ -2,7 +2,7 @@ import { useColorScheme } from "@mui/joy";
import { useEffect } from "react";
import { useTranslation } from "react-i18next";
import { Outlet } from "react-router-dom";
import storage from "./helpers/storage";
import useLocalStorage from "react-use/lib/useLocalStorage";
import { getSystemColorScheme } from "./helpers/utils";
import useNavigateTo from "./hooks/useNavigateTo";
import { useCommonContext } from "./layouts/CommonContextProvider";
@ -16,8 +16,11 @@ const App = () => {
const workspaceSettingStore = useWorkspaceSettingStore();
const userStore = useUserStore();
const commonContext = useCommonContext();
const [, setLocale] = useLocalStorage("locale", "en");
const [, setAppearance] = useLocalStorage("appearance", "system");
const workspaceProfile = commonContext.profile;
const userSetting = userStore.userSetting;
const workspaceGeneralSetting =
workspaceSettingStore.getWorkspaceSettingByKey(WorkspaceSettingKey.WORKSPACE_SETTING_GENERAL).generalSetting ||
WorkspaceGeneralSetting.fromPartial({});
@ -86,9 +89,7 @@ const App = () => {
} else {
document.documentElement.setAttribute("dir", "ltr");
}
storage.set({
locale: currentLocale,
});
setLocale(currentLocale);
}, [commonContext.locale]);
useEffect(() => {
@ -97,9 +98,7 @@ const App = () => {
currentAppearance = getSystemColorScheme();
}
setMode(currentAppearance);
storage.set({
appearance: currentAppearance,
});
setAppearance(currentAppearance);
}, [commonContext.appearance]);
useEffect(() => {

View File

@ -1,52 +0,0 @@
/**
* Define storage data type
*/
interface StorageData {
// locale
locale: Locale;
// appearance
appearance: Appearance;
}
type StorageKey = keyof StorageData;
const storage = {
get: (keys: StorageKey[]): Partial<StorageData> => {
const data: Partial<StorageData> = {};
for (const key of keys) {
try {
const stringifyValue = localStorage.getItem(key);
if (stringifyValue !== null) {
const val = JSON.parse(stringifyValue);
data[key] = val;
}
} catch (error: any) {
console.error("Get storage failed in ", key, error);
}
}
return data;
},
set: (data: Partial<StorageData>) => {
for (const key in data) {
try {
const stringifyValue = JSON.stringify(data[key as StorageKey]);
localStorage.setItem(key, stringifyValue);
} catch (error: any) {
console.error("Save storage failed in ", key, error);
}
}
},
remove: (keys: StorageKey[]) => {
for (const key of keys) {
try {
localStorage.removeItem(key);
} catch (error: any) {
console.error("Remove storage failed in ", key, error);
}
}
},
};
export default storage;

View File

@ -1,6 +1,6 @@
import { createContext, useContext, useEffect, useState } from "react";
import useLocalStorage from "react-use/lib/useLocalStorage";
import { workspaceServiceClient } from "@/grpcweb";
import storage from "@/helpers/storage";
import { useUserStore, useWorkspaceSettingStore } from "@/store/v1";
import { WorkspaceProfile } from "@/types/proto/api/v1/workspace_service";
import { WorkspaceGeneralSetting, WorkspaceSettingKey } from "@/types/proto/store/workspace_setting";
@ -30,6 +30,8 @@ const CommonContextProvider = ({ children }: { children: React.ReactNode }) => {
appearance: "system",
profile: WorkspaceProfile.fromPartial({}),
});
const [locale] = useLocalStorage("locale", "en");
const [appearance] = useLocalStorage("appearance", "system");
useEffect(() => {
const initialWorkspace = async () => {
@ -39,8 +41,6 @@ const CommonContextProvider = ({ children }: { children: React.ReactNode }) => {
const workspaceGeneralSetting =
workspaceSettingStore.getWorkspaceSettingByKey(WorkspaceSettingKey.WORKSPACE_SETTING_GENERAL).generalSetting ||
WorkspaceGeneralSetting.fromPartial({});
const { locale } = storage.get(["locale"]);
const { appearance } = storage.get(["appearance"]);
setCommonContext({
locale: locale || workspaceGeneralSetting.customProfile?.locale || "en",
appearance: appearance || workspaceGeneralSetting.customProfile?.appearance || "system",