From 41eea8b57114c2c90caab5a8a9b36b64eb4d2bdd Mon Sep 17 00:00:00 2001 From: Steven Date: Thu, 21 Sep 2023 23:09:38 +0800 Subject: [PATCH] feat: add subscription service --- api/v2/subscription_service.go | 98 ++++ api/v2/v2.go | 4 + api/v2/workspace_service.go | 4 +- frontend/web/src/grpcweb.ts | 5 +- plugin/license/license.go | 142 +++++ plugin/license/license_test.go | 68 +++ proto/api/v2/subscription_service.proto | 51 ++ proto/gen/api/v2/README.md | 123 +++++ proto/gen/api/v2/subscription_service.pb.go | 519 ++++++++++++++++++ .../gen/api/v2/subscription_service.pb.gw.go | 240 ++++++++ .../api/v2/subscription_service_grpc.pb.go | 146 +++++ proto/gen/store/README.md | 2 +- proto/gen/store/workspace_setting.pb.go | 64 +-- proto/store/workspace_setting.proto | 2 +- store/workspace_setting.go | 4 +- 15 files changed, 1433 insertions(+), 39 deletions(-) create mode 100644 api/v2/subscription_service.go create mode 100644 plugin/license/license.go create mode 100644 plugin/license/license_test.go create mode 100644 proto/api/v2/subscription_service.proto create mode 100644 proto/gen/api/v2/subscription_service.pb.go create mode 100644 proto/gen/api/v2/subscription_service.pb.gw.go create mode 100644 proto/gen/api/v2/subscription_service_grpc.pb.go diff --git a/api/v2/subscription_service.go b/api/v2/subscription_service.go new file mode 100644 index 0000000..e30ee74 --- /dev/null +++ b/api/v2/subscription_service.go @@ -0,0 +1,98 @@ +package v2 + +import ( + "context" + "time" + + "github.com/boojack/slash/plugin/license" + apiv2pb "github.com/boojack/slash/proto/gen/api/v2" + storepb "github.com/boojack/slash/proto/gen/store" + "github.com/boojack/slash/server/profile" + "github.com/boojack/slash/store" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/timestamppb" +) + +type SubscriptionService struct { + apiv2pb.UnimplementedSubscriptionServiceServer + + Profile *profile.Profile + Store *store.Store +} + +// NewSubscriptionService creates a new SubscriptionService. +func NewSubscriptionService(profile *profile.Profile, store *store.Store) *SubscriptionService { + return &SubscriptionService{ + Profile: profile, + Store: store, + } +} + +func (s *SubscriptionService) GetSubscription(ctx context.Context, _ *apiv2pb.GetSubscriptionRequest) (*apiv2pb.GetSubscriptionResponse, error) { + workspaceSetting, err := s.Store.GetWorkspaceSetting(ctx, &store.FindWorkspaceSetting{ + Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY, + }) + if err != nil { + return nil, status.Errorf(codes.Internal, "failed to get workspace setting: %v", err) + } + subscription := &apiv2pb.Subscription{ + Plan: apiv2pb.PlanType_FREE, + } + licenseKey := "" + if workspaceSetting != nil { + licenseKey = workspaceSetting.GetLicenseKey() + } + if licenseKey == "" { + return &apiv2pb.GetSubscriptionResponse{ + Subscription: subscription, + }, nil + } + + validateResponse, err := license.ValidateLicenseKey(licenseKey, "") + if err != nil { + return nil, status.Errorf(codes.Internal, "failed to validate license key: %v", err) + } + if validateResponse.Valid { + subscription.Plan = apiv2pb.PlanType_PRO + if validateResponse.LicenseKey.ExpiresAt != nil && *validateResponse.LicenseKey.ExpiresAt != "" { + expiresTime, err := time.Parse("2006-01-02 15:04:05", *validateResponse.LicenseKey.ExpiresAt) + if err != nil { + return nil, status.Errorf(codes.Internal, "failed to parse license key expired time: %v", err) + } + subscription.ExpiresTime = timestamppb.New(expiresTime) + } + startedTime, err := time.Parse("2006-01-02 15:04:05", validateResponse.LicenseKey.CreatedAt) + if err != nil { + return nil, status.Errorf(codes.Internal, "failed to parse license key created time: %v", err) + } + subscription.StartedTime = timestamppb.New(startedTime) + } + return &apiv2pb.GetSubscriptionResponse{ + Subscription: subscription, + }, nil +} + +func (s *SubscriptionService) UpdateSubscription(ctx context.Context, request *apiv2pb.UpdateSubscriptionRequest) (*apiv2pb.UpdateSubscriptionResponse, error) { + licenseKey := request.LicenseKey + if licenseKey == "" { + return nil, status.Errorf(codes.InvalidArgument, "license key is required") + } + validateResponse, err := license.ValidateLicenseKey(licenseKey, "") + if err != nil { + return nil, status.Errorf(codes.Internal, "failed to validate license key: %v", err) + } + if !validateResponse.Valid { + return nil, status.Errorf(codes.InvalidArgument, "invalid license key") + } + _, err = s.Store.UpsertWorkspaceSetting(ctx, &storepb.WorkspaceSetting{ + Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY, + Value: &storepb.WorkspaceSetting_LicenseKey{ + LicenseKey: licenseKey, + }, + }) + if err != nil { + return nil, status.Errorf(codes.Internal, "failed to update license key: %v", err) + } + return &apiv2pb.UpdateSubscriptionResponse{}, nil +} diff --git a/api/v2/v2.go b/api/v2/v2.go index 6320225..7665772 100644 --- a/api/v2/v2.go +++ b/api/v2/v2.go @@ -31,6 +31,7 @@ func NewAPIV2Service(secret string, profile *profile.Profile, store *store.Store authProvider.AuthenticationInterceptor, ), ) + apiv2pb.RegisterSubscriptionServiceServer(grpcServer, NewSubscriptionService(profile, store)) apiv2pb.RegisterWorkspaceServiceServer(grpcServer, NewWorkspaceService(profile, store)) apiv2pb.RegisterUserServiceServer(grpcServer, NewUserService(secret, store)) apiv2pb.RegisterUserSettingServiceServer(grpcServer, NewUserSettingService(store)) @@ -64,6 +65,9 @@ func (s *APIV2Service) RegisterGateway(ctx context.Context, e *echo.Echo) error } gwMux := grpcRuntime.NewServeMux() + if err := apiv2pb.RegisterSubscriptionServiceHandler(context.Background(), gwMux, conn); err != nil { + return err + } if err := apiv2pb.RegisterWorkspaceServiceHandler(context.Background(), gwMux, conn); err != nil { return err } diff --git a/api/v2/workspace_service.go b/api/v2/workspace_service.go index 0f0cc7b..2f4c9b2 100644 --- a/api/v2/workspace_service.go +++ b/api/v2/workspace_service.go @@ -71,7 +71,7 @@ func (s *WorkspaceService) GetWorkspaceSetting(ctx context.Context, _ *apiv2pb.G workspaceSetting.CustomScript = v.GetCustomScript() } else if isAdmin { // For some settings, only admin can get the value. - if v.Key == storepb.WorkspaceSettingKey_WORKSPACE_LICENSE_KEY { + if v.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY { workspaceSetting.LicenseKey = v.GetLicenseKey() } else if v.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_RESOURCE_RELATIVE_PATH { workspaceSetting.ResourceRelativePath = v.GetResourceRelativePath() @@ -91,7 +91,7 @@ func (s *WorkspaceService) UpdateWorkspaceSetting(ctx context.Context, request * for _, path := range request.UpdateMask { if path == "license_key" { if _, err := s.Store.UpsertWorkspaceSetting(ctx, &storepb.WorkspaceSetting{ - Key: storepb.WorkspaceSettingKey_WORKSPACE_LICENSE_KEY, + Key: storepb.WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY, Value: &storepb.WorkspaceSetting_LicenseKey{ LicenseKey: request.Setting.LicenseKey, }, diff --git a/frontend/web/src/grpcweb.ts b/frontend/web/src/grpcweb.ts index 5f278c4..8ad6de4 100644 --- a/frontend/web/src/grpcweb.ts +++ b/frontend/web/src/grpcweb.ts @@ -1,4 +1,5 @@ import { createChannel, createClientFactory, FetchTransport } from "nice-grpc-web"; +import { SubscriptionServiceDefinition } from "./types/proto/api/v2/subscription_service"; import { UserServiceDefinition } from "./types/proto/api/v2/user_service"; import { WorkspaceServiceDefinition } from "./types/proto/api/v2/workspace_service"; @@ -13,6 +14,8 @@ const channel = createChannel( const clientFactory = createClientFactory(); -export const userServiceClient = clientFactory.create(UserServiceDefinition, channel); +export const subscriptionServiceClient = clientFactory.create(SubscriptionServiceDefinition, channel); export const workspaceServiceClient = clientFactory.create(WorkspaceServiceDefinition, channel); + +export const userServiceClient = clientFactory.create(UserServiceDefinition, channel); diff --git a/plugin/license/license.go b/plugin/license/license.go new file mode 100644 index 0000000..4c55aa0 --- /dev/null +++ b/plugin/license/license.go @@ -0,0 +1,142 @@ +package license + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + + "github.com/pkg/errors" +) + +const ( + // The base API URL for the Lemon Squeezy API. + baseAPIURL = "https://api.lemonsqueezy.com" + // The store ID for the yourselfhosted store. + // Link: https://yourselfhosted.lemonsqueezy.com + storeID = 15634 + // The product ID for the subscription pro product. + // Link: https://yourselfhosted.lemonsqueezy.com/checkout/buy/d03a2696-8a8b-49c9-9e19-d425e3884fd7 + subscriptionProProductID = 98995 +) + +type licenseKey struct { + ID int32 `json:"id"` + Status string `json:"status"` + Key string `json:"key"` + CreatedAt string `json:"created_at"` + ExpiresAt *string `json:"updated_at"` +} + +type licenseKeyMeta struct { + StoreID int32 `json:"store_id"` + OrderID int32 `json:"order_id"` + OrderItemID int32 `json:"order_item_id"` + ProductID int32 `json:"product_id"` + ProductName string `json:"product_name"` + VariantID int32 `json:"variant_id"` + VariantName string `json:"variant_name"` + CustomerID int32 `json:"customer_id"` + CustomerName string `json:"customer_name"` + CustomerEmail string `json:"customer_email"` +} + +type ValidateLicenseKeyResponse struct { + Valid bool `json:"valid"` + Error *string `json:"error"` + LicenseKey *licenseKey `json:"license_key"` + Meta *licenseKeyMeta `json:"meta"` +} + +type ActiveLicenseKeyResponse struct { + Activated bool `json:"activated"` + Error *string `json:"error"` + LicenseKey *licenseKey `json:"license_key"` + Meta *licenseKeyMeta `json:"meta"` +} + +func ValidateLicenseKey(licenseKey string, instanceName string) (*ValidateLicenseKeyResponse, error) { + data := map[string]string{"license_key": licenseKey} + if instanceName != "" { + data["instance_name"] = instanceName + } + payload, err := json.Marshal(data) + if err != nil { + return nil, errors.Wrap(err, "failed to marshal data") + } + + req, err := http.NewRequest("POST", fmt.Sprintf("%s/v1/licenses/validate", baseAPIURL), bytes.NewBuffer(payload)) + if err != nil { + return nil, errors.Wrap(err, "failed to create request") + } + req.Header.Set("Accept", "application/json") + req.Header.Set("Content-Type", "application/json") + + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + return nil, errors.Wrap(err, "failed to do request") + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + var response ValidateLicenseKeyResponse + if err := json.Unmarshal(body, &response); err != nil { + return nil, err + } + if response.Error == nil { + if response.Meta == nil { + return nil, errors.New("meta is nil") + } + if response.Meta.StoreID != storeID || response.Meta.ProductID != subscriptionProProductID { + return nil, errors.New("invalid store or product id") + } + } + return &response, nil +} + +func ActiveLicenseKey(licenseKey string, instanceName string) (*ActiveLicenseKeyResponse, error) { + data := map[string]string{"license_key": licenseKey, "instance_name": instanceName} + payload, err := json.Marshal(data) + if err != nil { + return nil, errors.Wrap(err, "failed to marshal data") + } + + req, err := http.NewRequest("POST", fmt.Sprintf("%s/v1/licenses/activate", baseAPIURL), bytes.NewBuffer(payload)) + if err != nil { + return nil, errors.Wrap(err, "failed to create request") + } + req.Header.Set("Accept", "application/json") + req.Header.Set("Content-Type", "application/json") + + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + return nil, errors.Wrap(err, "failed to do request") + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + var response ActiveLicenseKeyResponse + if err := json.Unmarshal(body, &response); err != nil { + return nil, err + } + if response.Error == nil { + if response.Meta == nil { + return nil, errors.New("meta is nil") + } + if response.Meta.StoreID != storeID || response.Meta.ProductID != subscriptionProProductID { + return nil, errors.New("invalid store or product id") + } + } + return &response, nil +} diff --git a/plugin/license/license_test.go b/plugin/license/license_test.go new file mode 100644 index 0000000..c71581e --- /dev/null +++ b/plugin/license/license_test.go @@ -0,0 +1,68 @@ +package license + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestValidateLicenseKey(t *testing.T) { + tests := []struct { + name string + key string + expected bool + err error + }{ + { + name: "Testing license key", + key: "26B383EE-95B2-4458-9C58-B376BD6183B1", + expected: false, + err: errors.New("invalid store or product id"), + }, + { + name: "invalid key", + key: "invalid-key", + expected: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + response, err := ValidateLicenseKey(tt.key, "test-instance") + if tt.err != nil { + require.EqualError(t, err, tt.err.Error()) + return + } + require.NoError(t, err) + require.Equal(t, tt.expected, response.Valid) + }) + } +} + +func TestActiveLicenseKey(t *testing.T) { + tests := []struct { + name string + key string + expected bool + }{ + { + name: "Testing license key", + key: "26B383EE-95B2-4458-9C58-B376BD6183B1", + expected: false, + }, + { + name: "invalid key", + key: "invalid-key", + expected: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + response, err := ActiveLicenseKey(tt.key, "test-instance") + require.NoError(t, err) + require.Equal(t, tt.expected, response.Activated) + }) + } +} diff --git a/proto/api/v2/subscription_service.proto b/proto/api/v2/subscription_service.proto new file mode 100644 index 0000000..88d5b2b --- /dev/null +++ b/proto/api/v2/subscription_service.proto @@ -0,0 +1,51 @@ +syntax = "proto3"; + +package slash.api.v2; + +import "google/api/annotations.proto"; +import "google/api/field_behavior.proto"; +import "google/protobuf/timestamp.proto"; + +option go_package = "gen/api/v2"; + +service SubscriptionService { + rpc GetSubscription(GetSubscriptionRequest) returns (GetSubscriptionResponse) { + option (google.api.http) = {get: "/v1/subscription"}; + } + rpc UpdateSubscription(UpdateSubscriptionRequest) returns (UpdateSubscriptionResponse) { + option (google.api.http) = { + patch: "/v1/subscription" + body: "*" + }; + } +} + +message Subscription { + PlanType plan = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; + + google.protobuf.Timestamp started_time = 2 [(google.api.field_behavior) = OUTPUT_ONLY]; + + google.protobuf.Timestamp expires_time = 3 [(google.api.field_behavior) = OUTPUT_ONLY]; +} + +enum PlanType { + PLAN_TYPE_UNSPECIFIED = 0; + + FREE = 1; + + PRO = 2; +} + +message GetSubscriptionRequest {} + +message GetSubscriptionResponse { + Subscription subscription = 1; +} + +message UpdateSubscriptionRequest { + string license_key = 1 [(google.api.field_behavior) = REQUIRED]; +} + +message UpdateSubscriptionResponse { + Subscription subscription = 1; +} diff --git a/proto/gen/api/v2/README.md b/proto/gen/api/v2/README.md index 06801a1..e28bcf8 100644 --- a/proto/gen/api/v2/README.md +++ b/proto/gen/api/v2/README.md @@ -22,6 +22,17 @@ - [ShortcutService](#slash-api-v2-ShortcutService) +- [api/v2/subscription_service.proto](#api_v2_subscription_service-proto) + - [GetSubscriptionRequest](#slash-api-v2-GetSubscriptionRequest) + - [GetSubscriptionResponse](#slash-api-v2-GetSubscriptionResponse) + - [Subscription](#slash-api-v2-Subscription) + - [UpdateSubscriptionRequest](#slash-api-v2-UpdateSubscriptionRequest) + - [UpdateSubscriptionResponse](#slash-api-v2-UpdateSubscriptionResponse) + + - [PlanType](#slash-api-v2-PlanType) + + - [SubscriptionService](#slash-api-v2-SubscriptionService) + - [api/v2/user_service.proto](#api_v2_user_service-proto) - [CreateUserAccessTokenRequest](#slash-api-v2-CreateUserAccessTokenRequest) - [CreateUserAccessTokenResponse](#slash-api-v2-CreateUserAccessTokenResponse) @@ -300,6 +311,118 @@ + +

Top

+ +## api/v2/subscription_service.proto + + + + + +### GetSubscriptionRequest + + + + + + + + + +### GetSubscriptionResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| subscription | [Subscription](#slash-api-v2-Subscription) | | | + + + + + + + + +### Subscription + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| plan | [PlanType](#slash-api-v2-PlanType) | | | +| started_time | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | | | +| expires_time | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | | | + + + + + + + + +### UpdateSubscriptionRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| license_key | [string](#string) | | | + + + + + + + + +### UpdateSubscriptionResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| subscription | [Subscription](#slash-api-v2-Subscription) | | | + + + + + + + + + + +### PlanType + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| PLAN_TYPE_UNSPECIFIED | 0 | | +| FREE | 1 | | +| PRO | 2 | | + + + + + + + + + +### SubscriptionService + + +| Method Name | Request Type | Response Type | Description | +| ----------- | ------------ | ------------- | ------------| +| GetSubscription | [GetSubscriptionRequest](#slash-api-v2-GetSubscriptionRequest) | [GetSubscriptionResponse](#slash-api-v2-GetSubscriptionResponse) | | +| UpdateSubscription | [UpdateSubscriptionRequest](#slash-api-v2-UpdateSubscriptionRequest) | [UpdateSubscriptionResponse](#slash-api-v2-UpdateSubscriptionResponse) | | + + + + +

Top

diff --git a/proto/gen/api/v2/subscription_service.pb.go b/proto/gen/api/v2/subscription_service.pb.go new file mode 100644 index 0000000..8efe57a --- /dev/null +++ b/proto/gen/api/v2/subscription_service.pb.go @@ -0,0 +1,519 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.31.0 +// protoc (unknown) +// source: api/v2/subscription_service.proto + +package apiv2 + +import ( + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + 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 PlanType int32 + +const ( + PlanType_PLAN_TYPE_UNSPECIFIED PlanType = 0 + PlanType_FREE PlanType = 1 + PlanType_PRO PlanType = 2 +) + +// Enum value maps for PlanType. +var ( + PlanType_name = map[int32]string{ + 0: "PLAN_TYPE_UNSPECIFIED", + 1: "FREE", + 2: "PRO", + } + PlanType_value = map[string]int32{ + "PLAN_TYPE_UNSPECIFIED": 0, + "FREE": 1, + "PRO": 2, + } +) + +func (x PlanType) Enum() *PlanType { + p := new(PlanType) + *p = x + return p +} + +func (x PlanType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (PlanType) Descriptor() protoreflect.EnumDescriptor { + return file_api_v2_subscription_service_proto_enumTypes[0].Descriptor() +} + +func (PlanType) Type() protoreflect.EnumType { + return &file_api_v2_subscription_service_proto_enumTypes[0] +} + +func (x PlanType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use PlanType.Descriptor instead. +func (PlanType) EnumDescriptor() ([]byte, []int) { + return file_api_v2_subscription_service_proto_rawDescGZIP(), []int{0} +} + +type Subscription struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Plan PlanType `protobuf:"varint,1,opt,name=plan,proto3,enum=slash.api.v2.PlanType" json:"plan,omitempty"` + StartedTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=started_time,json=startedTime,proto3" json:"started_time,omitempty"` + ExpiresTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=expires_time,json=expiresTime,proto3" json:"expires_time,omitempty"` +} + +func (x *Subscription) Reset() { + *x = Subscription{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v2_subscription_service_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Subscription) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Subscription) ProtoMessage() {} + +func (x *Subscription) ProtoReflect() protoreflect.Message { + mi := &file_api_v2_subscription_service_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 Subscription.ProtoReflect.Descriptor instead. +func (*Subscription) Descriptor() ([]byte, []int) { + return file_api_v2_subscription_service_proto_rawDescGZIP(), []int{0} +} + +func (x *Subscription) GetPlan() PlanType { + if x != nil { + return x.Plan + } + return PlanType_PLAN_TYPE_UNSPECIFIED +} + +func (x *Subscription) GetStartedTime() *timestamppb.Timestamp { + if x != nil { + return x.StartedTime + } + return nil +} + +func (x *Subscription) GetExpiresTime() *timestamppb.Timestamp { + if x != nil { + return x.ExpiresTime + } + return nil +} + +type GetSubscriptionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *GetSubscriptionRequest) Reset() { + *x = GetSubscriptionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v2_subscription_service_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSubscriptionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSubscriptionRequest) ProtoMessage() {} + +func (x *GetSubscriptionRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v2_subscription_service_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 GetSubscriptionRequest.ProtoReflect.Descriptor instead. +func (*GetSubscriptionRequest) Descriptor() ([]byte, []int) { + return file_api_v2_subscription_service_proto_rawDescGZIP(), []int{1} +} + +type GetSubscriptionResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Subscription *Subscription `protobuf:"bytes,1,opt,name=subscription,proto3" json:"subscription,omitempty"` +} + +func (x *GetSubscriptionResponse) Reset() { + *x = GetSubscriptionResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v2_subscription_service_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetSubscriptionResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetSubscriptionResponse) ProtoMessage() {} + +func (x *GetSubscriptionResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v2_subscription_service_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 GetSubscriptionResponse.ProtoReflect.Descriptor instead. +func (*GetSubscriptionResponse) Descriptor() ([]byte, []int) { + return file_api_v2_subscription_service_proto_rawDescGZIP(), []int{2} +} + +func (x *GetSubscriptionResponse) GetSubscription() *Subscription { + if x != nil { + return x.Subscription + } + return nil +} + +type UpdateSubscriptionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + LicenseKey string `protobuf:"bytes,1,opt,name=license_key,json=licenseKey,proto3" json:"license_key,omitempty"` +} + +func (x *UpdateSubscriptionRequest) Reset() { + *x = UpdateSubscriptionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v2_subscription_service_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateSubscriptionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateSubscriptionRequest) ProtoMessage() {} + +func (x *UpdateSubscriptionRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v2_subscription_service_proto_msgTypes[3] + 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 UpdateSubscriptionRequest.ProtoReflect.Descriptor instead. +func (*UpdateSubscriptionRequest) Descriptor() ([]byte, []int) { + return file_api_v2_subscription_service_proto_rawDescGZIP(), []int{3} +} + +func (x *UpdateSubscriptionRequest) GetLicenseKey() string { + if x != nil { + return x.LicenseKey + } + return "" +} + +type UpdateSubscriptionResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Subscription *Subscription `protobuf:"bytes,1,opt,name=subscription,proto3" json:"subscription,omitempty"` +} + +func (x *UpdateSubscriptionResponse) Reset() { + *x = UpdateSubscriptionResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v2_subscription_service_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateSubscriptionResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateSubscriptionResponse) ProtoMessage() {} + +func (x *UpdateSubscriptionResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v2_subscription_service_proto_msgTypes[4] + 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 UpdateSubscriptionResponse.ProtoReflect.Descriptor instead. +func (*UpdateSubscriptionResponse) Descriptor() ([]byte, []int) { + return file_api_v2_subscription_service_proto_rawDescGZIP(), []int{4} +} + +func (x *UpdateSubscriptionResponse) GetSubscription() *Subscription { + if x != nil { + return x.Subscription + } + return nil +} + +var File_api_v2_subscription_service_proto protoreflect.FileDescriptor + +var file_api_v2_subscription_service_proto_rawDesc = []byte{ + 0x0a, 0x21, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x32, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, + 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0xc7, 0x01, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x04, 0x70, 0x6c, 0x61, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x16, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, + 0x50, 0x6c, 0x61, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x04, 0x70, + 0x6c, 0x61, 0x6e, 0x12, 0x42, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x0c, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x65, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x03, 0x52, 0x0b, + 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x47, + 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x59, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x3e, 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x41, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, + 0x0b, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0a, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, + 0x4b, 0x65, 0x79, 0x22, 0x5c, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x3e, 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x2a, 0x38, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, + 0x15, 0x50, 0x4c, 0x41, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x52, 0x45, 0x45, + 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x52, 0x4f, 0x10, 0x02, 0x32, 0x96, 0x02, 0x0a, 0x13, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x78, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x73, + 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x76, 0x31, + 0x2f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x84, 0x01, + 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, + 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, + 0x01, 0x2a, 0x32, 0x10, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x42, 0xaf, 0x01, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x6c, 0x61, + 0x73, 0x68, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x32, 0x42, 0x18, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x62, 0x6f, 0x6f, 0x6a, 0x61, 0x63, 0x6b, 0x2f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x32, + 0x3b, 0x61, 0x70, 0x69, 0x76, 0x32, 0xa2, 0x02, 0x03, 0x53, 0x41, 0x58, 0xaa, 0x02, 0x0c, 0x53, + 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x32, 0xca, 0x02, 0x0c, 0x53, 0x6c, + 0x61, 0x73, 0x68, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x32, 0xe2, 0x02, 0x18, 0x53, 0x6c, 0x61, + 0x73, 0x68, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x32, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x3a, 0x3a, 0x41, + 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_api_v2_subscription_service_proto_rawDescOnce sync.Once + file_api_v2_subscription_service_proto_rawDescData = file_api_v2_subscription_service_proto_rawDesc +) + +func file_api_v2_subscription_service_proto_rawDescGZIP() []byte { + file_api_v2_subscription_service_proto_rawDescOnce.Do(func() { + file_api_v2_subscription_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_v2_subscription_service_proto_rawDescData) + }) + return file_api_v2_subscription_service_proto_rawDescData +} + +var file_api_v2_subscription_service_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_api_v2_subscription_service_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_api_v2_subscription_service_proto_goTypes = []interface{}{ + (PlanType)(0), // 0: slash.api.v2.PlanType + (*Subscription)(nil), // 1: slash.api.v2.Subscription + (*GetSubscriptionRequest)(nil), // 2: slash.api.v2.GetSubscriptionRequest + (*GetSubscriptionResponse)(nil), // 3: slash.api.v2.GetSubscriptionResponse + (*UpdateSubscriptionRequest)(nil), // 4: slash.api.v2.UpdateSubscriptionRequest + (*UpdateSubscriptionResponse)(nil), // 5: slash.api.v2.UpdateSubscriptionResponse + (*timestamppb.Timestamp)(nil), // 6: google.protobuf.Timestamp +} +var file_api_v2_subscription_service_proto_depIdxs = []int32{ + 0, // 0: slash.api.v2.Subscription.plan:type_name -> slash.api.v2.PlanType + 6, // 1: slash.api.v2.Subscription.started_time:type_name -> google.protobuf.Timestamp + 6, // 2: slash.api.v2.Subscription.expires_time:type_name -> google.protobuf.Timestamp + 1, // 3: slash.api.v2.GetSubscriptionResponse.subscription:type_name -> slash.api.v2.Subscription + 1, // 4: slash.api.v2.UpdateSubscriptionResponse.subscription:type_name -> slash.api.v2.Subscription + 2, // 5: slash.api.v2.SubscriptionService.GetSubscription:input_type -> slash.api.v2.GetSubscriptionRequest + 4, // 6: slash.api.v2.SubscriptionService.UpdateSubscription:input_type -> slash.api.v2.UpdateSubscriptionRequest + 3, // 7: slash.api.v2.SubscriptionService.GetSubscription:output_type -> slash.api.v2.GetSubscriptionResponse + 5, // 8: slash.api.v2.SubscriptionService.UpdateSubscription:output_type -> slash.api.v2.UpdateSubscriptionResponse + 7, // [7:9] is the sub-list for method output_type + 5, // [5:7] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name +} + +func init() { file_api_v2_subscription_service_proto_init() } +func file_api_v2_subscription_service_proto_init() { + if File_api_v2_subscription_service_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_api_v2_subscription_service_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Subscription); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v2_subscription_service_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetSubscriptionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v2_subscription_service_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetSubscriptionResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v2_subscription_service_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateSubscriptionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v2_subscription_service_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateSubscriptionResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_api_v2_subscription_service_proto_rawDesc, + NumEnums: 1, + NumMessages: 5, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_api_v2_subscription_service_proto_goTypes, + DependencyIndexes: file_api_v2_subscription_service_proto_depIdxs, + EnumInfos: file_api_v2_subscription_service_proto_enumTypes, + MessageInfos: file_api_v2_subscription_service_proto_msgTypes, + }.Build() + File_api_v2_subscription_service_proto = out.File + file_api_v2_subscription_service_proto_rawDesc = nil + file_api_v2_subscription_service_proto_goTypes = nil + file_api_v2_subscription_service_proto_depIdxs = nil +} diff --git a/proto/gen/api/v2/subscription_service.pb.gw.go b/proto/gen/api/v2/subscription_service.pb.gw.go new file mode 100644 index 0000000..ee113ff --- /dev/null +++ b/proto/gen/api/v2/subscription_service.pb.gw.go @@ -0,0 +1,240 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: api/v2/subscription_service.proto + +/* +Package apiv2 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package apiv2 + +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_SubscriptionService_GetSubscription_0(ctx context.Context, marshaler runtime.Marshaler, client SubscriptionServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetSubscriptionRequest + var metadata runtime.ServerMetadata + + msg, err := client.GetSubscription(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_SubscriptionService_GetSubscription_0(ctx context.Context, marshaler runtime.Marshaler, server SubscriptionServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetSubscriptionRequest + var metadata runtime.ServerMetadata + + msg, err := server.GetSubscription(ctx, &protoReq) + return msg, metadata, err + +} + +func request_SubscriptionService_UpdateSubscription_0(ctx context.Context, marshaler runtime.Marshaler, client SubscriptionServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq UpdateSubscriptionRequest + 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); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.UpdateSubscription(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_SubscriptionService_UpdateSubscription_0(ctx context.Context, marshaler runtime.Marshaler, server SubscriptionServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq UpdateSubscriptionRequest + 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); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.UpdateSubscription(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterSubscriptionServiceHandlerServer registers the http handlers for service SubscriptionService to "mux". +// UnaryRPC :call SubscriptionServiceServer 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 RegisterSubscriptionServiceHandlerFromEndpoint instead. +func RegisterSubscriptionServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server SubscriptionServiceServer) error { + + mux.Handle("GET", pattern_SubscriptionService_GetSubscription_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, "/slash.api.v2.SubscriptionService/GetSubscription", runtime.WithHTTPPathPattern("/v1/subscription")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SubscriptionService_GetSubscription_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_SubscriptionService_GetSubscription_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PATCH", pattern_SubscriptionService_UpdateSubscription_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, "/slash.api.v2.SubscriptionService/UpdateSubscription", runtime.WithHTTPPathPattern("/v1/subscription")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SubscriptionService_UpdateSubscription_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_SubscriptionService_UpdateSubscription_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterSubscriptionServiceHandlerFromEndpoint is same as RegisterSubscriptionServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterSubscriptionServiceHandlerFromEndpoint(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 RegisterSubscriptionServiceHandler(ctx, mux, conn) +} + +// RegisterSubscriptionServiceHandler registers the http handlers for service SubscriptionService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterSubscriptionServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterSubscriptionServiceHandlerClient(ctx, mux, NewSubscriptionServiceClient(conn)) +} + +// RegisterSubscriptionServiceHandlerClient registers the http handlers for service SubscriptionService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "SubscriptionServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "SubscriptionServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "SubscriptionServiceClient" to call the correct interceptors. +func RegisterSubscriptionServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client SubscriptionServiceClient) error { + + mux.Handle("GET", pattern_SubscriptionService_GetSubscription_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, "/slash.api.v2.SubscriptionService/GetSubscription", runtime.WithHTTPPathPattern("/v1/subscription")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SubscriptionService_GetSubscription_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_SubscriptionService_GetSubscription_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PATCH", pattern_SubscriptionService_UpdateSubscription_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, "/slash.api.v2.SubscriptionService/UpdateSubscription", runtime.WithHTTPPathPattern("/v1/subscription")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SubscriptionService_UpdateSubscription_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_SubscriptionService_UpdateSubscription_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_SubscriptionService_GetSubscription_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "subscription"}, "")) + + pattern_SubscriptionService_UpdateSubscription_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "subscription"}, "")) +) + +var ( + forward_SubscriptionService_GetSubscription_0 = runtime.ForwardResponseMessage + + forward_SubscriptionService_UpdateSubscription_0 = runtime.ForwardResponseMessage +) diff --git a/proto/gen/api/v2/subscription_service_grpc.pb.go b/proto/gen/api/v2/subscription_service_grpc.pb.go new file mode 100644 index 0000000..bb6651d --- /dev/null +++ b/proto/gen/api/v2/subscription_service_grpc.pb.go @@ -0,0 +1,146 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc (unknown) +// source: api/v2/subscription_service.proto + +package apiv2 + +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 ( + SubscriptionService_GetSubscription_FullMethodName = "/slash.api.v2.SubscriptionService/GetSubscription" + SubscriptionService_UpdateSubscription_FullMethodName = "/slash.api.v2.SubscriptionService/UpdateSubscription" +) + +// SubscriptionServiceClient is the client API for SubscriptionService 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 SubscriptionServiceClient interface { + GetSubscription(ctx context.Context, in *GetSubscriptionRequest, opts ...grpc.CallOption) (*GetSubscriptionResponse, error) + UpdateSubscription(ctx context.Context, in *UpdateSubscriptionRequest, opts ...grpc.CallOption) (*UpdateSubscriptionResponse, error) +} + +type subscriptionServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewSubscriptionServiceClient(cc grpc.ClientConnInterface) SubscriptionServiceClient { + return &subscriptionServiceClient{cc} +} + +func (c *subscriptionServiceClient) GetSubscription(ctx context.Context, in *GetSubscriptionRequest, opts ...grpc.CallOption) (*GetSubscriptionResponse, error) { + out := new(GetSubscriptionResponse) + err := c.cc.Invoke(ctx, SubscriptionService_GetSubscription_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *subscriptionServiceClient) UpdateSubscription(ctx context.Context, in *UpdateSubscriptionRequest, opts ...grpc.CallOption) (*UpdateSubscriptionResponse, error) { + out := new(UpdateSubscriptionResponse) + err := c.cc.Invoke(ctx, SubscriptionService_UpdateSubscription_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// SubscriptionServiceServer is the server API for SubscriptionService service. +// All implementations must embed UnimplementedSubscriptionServiceServer +// for forward compatibility +type SubscriptionServiceServer interface { + GetSubscription(context.Context, *GetSubscriptionRequest) (*GetSubscriptionResponse, error) + UpdateSubscription(context.Context, *UpdateSubscriptionRequest) (*UpdateSubscriptionResponse, error) + mustEmbedUnimplementedSubscriptionServiceServer() +} + +// UnimplementedSubscriptionServiceServer must be embedded to have forward compatible implementations. +type UnimplementedSubscriptionServiceServer struct { +} + +func (UnimplementedSubscriptionServiceServer) GetSubscription(context.Context, *GetSubscriptionRequest) (*GetSubscriptionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetSubscription not implemented") +} +func (UnimplementedSubscriptionServiceServer) UpdateSubscription(context.Context, *UpdateSubscriptionRequest) (*UpdateSubscriptionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateSubscription not implemented") +} +func (UnimplementedSubscriptionServiceServer) mustEmbedUnimplementedSubscriptionServiceServer() {} + +// UnsafeSubscriptionServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to SubscriptionServiceServer will +// result in compilation errors. +type UnsafeSubscriptionServiceServer interface { + mustEmbedUnimplementedSubscriptionServiceServer() +} + +func RegisterSubscriptionServiceServer(s grpc.ServiceRegistrar, srv SubscriptionServiceServer) { + s.RegisterService(&SubscriptionService_ServiceDesc, srv) +} + +func _SubscriptionService_GetSubscription_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetSubscriptionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SubscriptionServiceServer).GetSubscription(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SubscriptionService_GetSubscription_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SubscriptionServiceServer).GetSubscription(ctx, req.(*GetSubscriptionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SubscriptionService_UpdateSubscription_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateSubscriptionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SubscriptionServiceServer).UpdateSubscription(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SubscriptionService_UpdateSubscription_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SubscriptionServiceServer).UpdateSubscription(ctx, req.(*UpdateSubscriptionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// SubscriptionService_ServiceDesc is the grpc.ServiceDesc for SubscriptionService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var SubscriptionService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "slash.api.v2.SubscriptionService", + HandlerType: (*SubscriptionServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetSubscription", + Handler: _SubscriptionService_GetSubscription_Handler, + }, + { + MethodName: "UpdateSubscription", + Handler: _SubscriptionService_UpdateSubscription_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "api/v2/subscription_service.proto", +} diff --git a/proto/gen/store/README.md b/proto/gen/store/README.md index ba9c237..455e548 100644 --- a/proto/gen/store/README.md +++ b/proto/gen/store/README.md @@ -329,7 +329,7 @@ | Name | Number | Description | | ---- | ------ | ----------- | | WORKSPACE_SETTING_KEY_UNSPECIFIED | 0 | | -| WORKSPACE_LICENSE_KEY | 1 | The license key. | +| WORKSPACE_SETTING_LICENSE_KEY | 1 | The license key. | | WORKSPACE_SETTING_SECRET_SESSION | 2 | The secret session key used to encrypt session data. | | WORKSAPCE_SETTING_ENABLE_SIGNUP | 3 | Whether to enable other users to sign up. | | WORKSPACE_SETTING_RESOURCE_RELATIVE_PATH | 4 | The relative path of the resource directory. | diff --git a/proto/gen/store/workspace_setting.pb.go b/proto/gen/store/workspace_setting.pb.go index 01c90ad..2eea22b 100644 --- a/proto/gen/store/workspace_setting.pb.go +++ b/proto/gen/store/workspace_setting.pb.go @@ -25,7 +25,7 @@ type WorkspaceSettingKey int32 const ( WorkspaceSettingKey_WORKSPACE_SETTING_KEY_UNSPECIFIED WorkspaceSettingKey = 0 // The license key. - WorkspaceSettingKey_WORKSPACE_LICENSE_KEY WorkspaceSettingKey = 1 + WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY WorkspaceSettingKey = 1 // The secret session key used to encrypt session data. WorkspaceSettingKey_WORKSPACE_SETTING_SECRET_SESSION WorkspaceSettingKey = 2 // Whether to enable other users to sign up. @@ -44,7 +44,7 @@ const ( var ( WorkspaceSettingKey_name = map[int32]string{ 0: "WORKSPACE_SETTING_KEY_UNSPECIFIED", - 1: "WORKSPACE_LICENSE_KEY", + 1: "WORKSPACE_SETTING_LICENSE_KEY", 2: "WORKSPACE_SETTING_SECRET_SESSION", 3: "WORKSAPCE_SETTING_ENABLE_SIGNUP", 4: "WORKSPACE_SETTING_RESOURCE_RELATIVE_PATH", @@ -54,7 +54,7 @@ var ( } WorkspaceSettingKey_value = map[string]int32{ "WORKSPACE_SETTING_KEY_UNSPECIFIED": 0, - "WORKSPACE_LICENSE_KEY": 1, + "WORKSPACE_SETTING_LICENSE_KEY": 1, "WORKSPACE_SETTING_SECRET_SESSION": 2, "WORKSAPCE_SETTING_ENABLE_SIGNUP": 3, "WORKSPACE_SETTING_RESOURCE_RELATIVE_PATH": 4, @@ -356,38 +356,38 @@ var file_store_workspace_setting_proto_rawDesc = []byte{ 0x6e, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x72, 0x6f, 0x6e, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x6b, 0x65, 0x65, 0x70, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x65, 0x70, 0x2a, 0xbc, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x65, 0x70, 0x2a, 0xc4, 0x02, 0x0a, 0x13, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x0a, 0x21, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, - 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, - 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x57, 0x4f, 0x52, 0x4b, 0x53, - 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x45, 0x43, - 0x52, 0x45, 0x54, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x23, 0x0a, - 0x1f, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x41, 0x50, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, - 0x4e, 0x47, 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x55, 0x50, - 0x10, 0x03, 0x12, 0x2c, 0x0a, 0x28, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, - 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, - 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x10, 0x04, - 0x12, 0x22, 0x0a, 0x1e, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, - 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x53, 0x54, 0x59, - 0x4c, 0x45, 0x10, 0x05, 0x12, 0x23, 0x0a, 0x1f, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, - 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, - 0x5f, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x10, 0x06, 0x12, 0x21, 0x0a, 0x1d, 0x57, 0x4f, 0x52, - 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x41, - 0x55, 0x54, 0x4f, 0x5f, 0x42, 0x41, 0x43, 0x4b, 0x55, 0x50, 0x10, 0x07, 0x42, 0x9f, 0x01, 0x0a, - 0x0f, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x42, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x6f, 0x6f, 0x6a, 0x61, 0x63, 0x6b, 0x2f, 0x73, 0x6c, - 0x61, 0x73, 0x68, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0xa2, 0x02, 0x03, 0x53, 0x53, 0x58, 0xaa, 0x02, 0x0b, 0x53, 0x6c, 0x61, 0x73, - 0x68, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0xca, 0x02, 0x0b, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x5c, - 0x53, 0x74, 0x6f, 0x72, 0x65, 0xe2, 0x02, 0x17, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x5c, 0x53, 0x74, - 0x6f, 0x72, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, - 0x02, 0x0c, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x3a, 0x3a, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, + 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, + 0x47, 0x5f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x01, 0x12, + 0x24, 0x0a, 0x20, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, + 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x45, 0x43, 0x52, 0x45, 0x54, 0x5f, 0x53, 0x45, 0x53, 0x53, + 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x23, 0x0a, 0x1f, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x41, 0x50, + 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x45, 0x4e, 0x41, 0x42, 0x4c, + 0x45, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x55, 0x50, 0x10, 0x03, 0x12, 0x2c, 0x0a, 0x28, 0x57, 0x4f, + 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, + 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, + 0x45, 0x5f, 0x50, 0x41, 0x54, 0x48, 0x10, 0x04, 0x12, 0x22, 0x0a, 0x1e, 0x57, 0x4f, 0x52, 0x4b, + 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x55, + 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x53, 0x54, 0x59, 0x4c, 0x45, 0x10, 0x05, 0x12, 0x23, 0x0a, 0x1f, + 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x49, 0x4e, + 0x47, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x10, + 0x06, 0x12, 0x21, 0x0a, 0x1d, 0x57, 0x4f, 0x52, 0x4b, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x53, + 0x45, 0x54, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x42, 0x41, 0x43, 0x4b, + 0x55, 0x50, 0x10, 0x07, 0x42, 0x9f, 0x01, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x6c, 0x61, + 0x73, 0x68, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x6f, + 0x6f, 0x6a, 0x61, 0x63, 0x6b, 0x2f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0xa2, 0x02, 0x03, 0x53, 0x53, + 0x58, 0xaa, 0x02, 0x0b, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0xca, + 0x02, 0x0b, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x5c, 0x53, 0x74, 0x6f, 0x72, 0x65, 0xe2, 0x02, 0x17, + 0x53, 0x6c, 0x61, 0x73, 0x68, 0x5c, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0c, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x3a, + 0x3a, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/store/workspace_setting.proto b/proto/store/workspace_setting.proto index 01f33a2..5d33e14 100644 --- a/proto/store/workspace_setting.proto +++ b/proto/store/workspace_setting.proto @@ -21,7 +21,7 @@ message WorkspaceSetting { enum WorkspaceSettingKey { WORKSPACE_SETTING_KEY_UNSPECIFIED = 0; // The license key. - WORKSPACE_LICENSE_KEY = 1; + WORKSPACE_SETTING_LICENSE_KEY = 1; // The secret session key used to encrypt session data. WORKSPACE_SETTING_SECRET_SESSION = 2; // Whether to enable other users to sign up. diff --git a/store/workspace_setting.go b/store/workspace_setting.go index 282866e..d1d78a9 100644 --- a/store/workspace_setting.go +++ b/store/workspace_setting.go @@ -25,7 +25,7 @@ func (s *Store) UpsertWorkspaceSetting(ctx context.Context, upsert *storepb.Work SET value = EXCLUDED.value ` var valueString string - if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_LICENSE_KEY { + if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY { valueString = upsert.GetLicenseKey() } else if upsert.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SECRET_SESSION { valueString = upsert.GetSecretSession() @@ -87,7 +87,7 @@ func (s *Store) ListWorkspaceSettings(ctx context.Context, find *FindWorkspaceSe return nil, err } workspaceSetting.Key = storepb.WorkspaceSettingKey(storepb.WorkspaceSettingKey_value[keyString]) - if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_LICENSE_KEY { + if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_LICENSE_KEY { workspaceSetting.Value = &storepb.WorkspaceSetting_LicenseKey{LicenseKey: valueString} } else if workspaceSetting.Key == storepb.WorkspaceSettingKey_WORKSPACE_SETTING_SECRET_SESSION { workspaceSetting.Value = &storepb.WorkspaceSetting_SecretSession{SecretSession: valueString}