From 073b46fa342847f028aa72a19e6e5d19877d6591 Mon Sep 17 00:00:00 2001 From: Stefan Majer Date: Thu, 4 Apr 2024 16:32:16 +0200 Subject: [PATCH] Provide Tenant Invitations (#145) --- docs/docs.json | 1128 +++++++- examples/README.md | 12 +- examples/ts/bun.lockb | Bin 0 -> 12152 bytes examples/ts/cluster-list.ts | 4 +- examples/ts/package.json | 2 +- generate/Makefile | 2 +- go/admin/v1/cluster.pb.go | 2 +- go/admin/v1/machine.pb.go | 2 +- go/admin/v1/storage.pb.go | 2 +- go/api/v1/apiv1connect/tenant.connect.go | 253 ++ go/api/v1/assets.pb.go | 2 +- go/api/v1/cluster.pb.go | 8 +- go/api/v1/payment.pb.go | 787 +++--- go/api/v1/payment.pb.validate.go | 64 +- go/api/v1/project.pb.go | 2 +- go/api/v1/tenant.pb.go | 2274 ++++++++++++--- go/api/v1/tenant.pb.validate.go | 2501 ++++++++++++++++- go/api/v1/volume.pb.go | 4 +- go/permissions/servicepermissions.go | 27 +- .../v1/adminv1connect/ClusterServiceClient.go | 2 +- .../adminv1connect/ClusterServiceHandler.go | 2 +- .../v1/adminv1connect/PaymentServiceClient.go | 2 +- .../adminv1connect/PaymentServiceHandler.go | 2 +- .../v1/adminv1connect/StorageServiceClient.go | 2 +- .../adminv1connect/StorageServiceHandler.go | 2 +- .../v1/adminv1connect/TenantServiceClient.go | 2 +- .../v1/adminv1connect/TenantServiceHandler.go | 2 +- .../v1/adminv1connect/TokenServiceClient.go | 2 +- .../v1/adminv1connect/TokenServiceHandler.go | 2 +- .../api/v1/apiv1connect/AssetServiceClient.go | 2 +- .../v1/apiv1connect/AssetServiceHandler.go | 2 +- .../v1/apiv1connect/ClusterServiceClient.go | 2 +- .../v1/apiv1connect/ClusterServiceHandler.go | 2 +- .../v1/apiv1connect/HealthServiceClient.go | 2 +- .../v1/apiv1connect/HealthServiceHandler.go | 2 +- .../api/v1/apiv1connect/IPServiceClient.go | 2 +- .../api/v1/apiv1connect/IPServiceHandler.go | 2 +- .../v1/apiv1connect/MethodServiceClient.go | 2 +- .../v1/apiv1connect/MethodServiceHandler.go | 2 +- .../v1/apiv1connect/PaymentServiceClient.go | 2 +- .../v1/apiv1connect/PaymentServiceHandler.go | 2 +- .../v1/apiv1connect/ProjectServiceClient.go | 2 +- .../v1/apiv1connect/ProjectServiceHandler.go | 2 +- .../v1/apiv1connect/SnapshotServiceClient.go | 2 +- .../v1/apiv1connect/SnapshotServiceHandler.go | 2 +- .../v1/apiv1connect/TenantServiceClient.go | 242 +- .../v1/apiv1connect/TenantServiceHandler.go | 242 +- .../api/v1/apiv1connect/TokenServiceClient.go | 2 +- .../v1/apiv1connect/TokenServiceHandler.go | 2 +- .../api/v1/apiv1connect/UserServiceClient.go | 2 +- .../api/v1/apiv1connect/UserServiceHandler.go | 2 +- .../v1/apiv1connect/VersionServiceClient.go | 2 +- .../v1/apiv1connect/VersionServiceHandler.go | 2 +- .../v1/apiv1connect/VolumeServiceClient.go | 2 +- .../v1/apiv1connect/VolumeServiceHandler.go | 2 +- go/tests/mocks/client/Adminv1.go | 2 +- go/tests/mocks/client/Apiv1.go | 2 +- go/tests/mocks/client/Client.go | 2 +- go/tests/mocks/client/Statusv1.go | 2 +- .../statusv1connect/MessageServiceClient.go | 2 +- .../statusv1connect/MessageServiceHandler.go | 2 +- .../v1/statusv1connect/StatusServiceClient.go | 2 +- .../statusv1connect/StatusServiceHandler.go | 2 +- js/admin/v1/cluster_pb.d.ts | 2 +- js/admin/v1/cluster_pb.ts | 2 +- js/admin/v1/machine_pb.d.ts | 2 +- js/admin/v1/machine_pb.js | 2 +- js/admin/v1/machine_pb.ts | 2 +- js/admin/v1/storage_pb.d.ts | 2 +- js/admin/v1/storage_pb.js | 2 +- js/admin/v1/storage_pb.ts | 2 +- js/api/v1/assets_pb.d.ts | 2 +- js/api/v1/assets_pb.js | 2 +- js/api/v1/assets_pb.ts | 2 +- js/api/v1/cluster_pb.d.ts | 8 +- js/api/v1/cluster_pb.js | 8 +- js/api/v1/cluster_pb.ts | 8 +- js/api/v1/project_pb.d.ts | 2 +- js/api/v1/project_pb.ts | 2 +- js/api/v1/tenant_connect.d.ts | 90 +- js/api/v1/tenant_connect.js | 90 +- js/api/v1/tenant_connect.ts | 90 +- js/api/v1/tenant_pb.d.ts | 528 +++- js/api/v1/tenant_pb.js | 705 ++++- js/api/v1/tenant_pb.ts | 936 +++++- js/api/v1/volume_pb.d.ts | 4 +- js/api/v1/volume_pb.js | 4 +- js/api/v1/volume_pb.ts | 4 +- js/bun.lockb | Bin 2844 -> 2844 bytes js/package.json | 2 +- js/permissions/servicepermissions.json | 29 +- proto/admin/v1/cluster.proto | 2 +- proto/admin/v1/machine.proto | 2 +- proto/admin/v1/storage.proto | 2 +- proto/api/v1/assets.proto | 2 +- proto/api/v1/cluster.proto | 8 +- proto/api/v1/payment.proto | 2 +- proto/api/v1/project.proto | 2 +- proto/api/v1/tenant.proto | 229 +- proto/api/v1/volume.proto | 4 +- proto/buf.gen.yaml | 5 +- proto/buf.lock | 4 +- proto/buf.yaml | 1 + 103 files changed, 9353 insertions(+), 1086 deletions(-) create mode 100755 examples/ts/bun.lockb diff --git a/docs/docs.json b/docs/docs.json index 461581b8..268f0b22 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -263,7 +263,7 @@ }, { "name": "prefixes", - "description": "Prefixes availalble in this network", + "description": "Prefixes available in this network", "label": "repeated", "type": "string", "longType": "string", @@ -710,7 +710,7 @@ "name": "Operate", "longName": "Operate", "fullName": "api.v1.Operate", - "description": "Operate defines the types of reconcilation to be triggered", + "description": "Operate defines the types of reconciliation to be triggered", "values": [ { "name": "OPERATE_UNSPECIFIED", @@ -730,7 +730,7 @@ { "name": "OPERATE_RETRY", "number": "3", - "description": "OPERATE_RETRY retry the reconcilation of the cluster" + "description": "OPERATE_RETRY retry the reconciliation of the cluster" } ] } @@ -1757,7 +1757,7 @@ }, { "name": "progress", - "description": "Progress of the cluster reconcilation", + "description": "Progress of the cluster reconciliation", "label": "", "type": "uint32", "longType": "uint32", @@ -1841,7 +1841,7 @@ }, { "name": "last_errors", - "description": "LastErrors is a list of the last known errors occured during the cluster reconcilation", + "description": "LastErrors is a list of the last known errors occurred during the cluster reconciliation", "label": "repeated", "type": "ClusterStatusLastError", "longType": "ClusterStatusLastError", @@ -2844,7 +2844,7 @@ }, { "name": "partition", - "description": "Partiton of the cluster", + "description": "Partition of the cluster", "label": "optional", "type": "string", "longType": "string", @@ -3521,7 +3521,15 @@ "ismap": false, "isoneof": true, "oneofdecl": "_email", - "defaultValue": "" + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "string.email", + "value": true + } + ] + } }, { "name": "card", @@ -6203,7 +6211,7 @@ }, { "name": "compression_ratio", - "description": "CommpressionRatio\n\ncompression ratio userWritten/physicalCapacity", + "description": "CompressionRatio\n\ncompression ratio userWritten/physicalCapacity", "label": "", "type": "double", "longType": "double", @@ -6215,7 +6223,7 @@ }, { "name": "total_compression_ratio", - "description": "TotalCommpressionRatio\n\ncompression ratio sum(userWritten) / sum(physical capacity)", + "description": "TotalCompressionRatio\n\ncompression ratio sum(userWritten) / sum(physical capacity)", "label": "", "type": "double", "longType": "double", @@ -6618,7 +6626,7 @@ }, { "name": "compression_ratio", - "description": "commpression ratio\n\ncompression ratio logicalUsedStorage/physicalUsedStorage", + "description": "compression ratio\n\ncompression ratio logicalUsedStorage/physicalUsedStorage", "label": "", "type": "double", "longType": "double", @@ -7377,7 +7385,7 @@ }, { "name": "name", - "description": "Name if the tenant", + "description": "Name of the tenant", "label": "", "type": "string", "longType": "string", @@ -7399,6 +7407,18 @@ "oneofdecl": "", "defaultValue": "" }, + { + "name": "description", + "description": "Description of this tenant", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, { "name": "avatar_url", "description": "AvatarUrl of the tenant", @@ -7495,6 +7515,30 @@ "oneofdecl": "", "defaultValue": "" }, + { + "name": "tenant_members", + "description": "TenantMembers of this tenant", + "label": "repeated", + "type": "TenantMember", + "longType": "TenantMember", + "fullType": "api.v1.TenantMember", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "created_by", + "description": "CreatedBy stores who created this tenant", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, { "name": "created_at", "description": "CreatedAt the date when this tenant was created", @@ -7534,114 +7578,90 @@ ] }, { - "name": "TenantServiceCreateOrUpdateRequest", - "longName": "TenantServiceCreateOrUpdateRequest", - "fullName": "api.v1.TenantServiceCreateOrUpdateRequest", - "description": "TenantServiceCreateOrUpdateRequest is the request payload of the tenant create or update request", + "name": "TenantInvite", + "longName": "TenantInvite", + "fullName": "api.v1.TenantInvite", + "description": "TenantInvite defines invite to tenant", "hasExtensions": false, "hasFields": true, "hasOneofs": false, "extensions": [], "fields": [ { - "name": "tenant", - "description": "Tenant the tenant to create or update", + "name": "secret", + "description": "Secret is the secret part of the invite, typically part of the url", "label": "", - "type": "Tenant", - "longType": "Tenant", - "fullType": "api.v1.Tenant", + "type": "string", + "longType": "string", + "fullType": "string", "ismap": false, "isoneof": false, "oneofdecl": "", "defaultValue": "" - } - ] - }, - { - "name": "TenantServiceCreateOrUpdateResponse", - "longName": "TenantServiceCreateOrUpdateResponse", - "fullName": "api.v1.TenantServiceCreateOrUpdateResponse", - "description": "TenantServiceCreateOrUpdateResponse is the response payload of the tenant create or update request", - "hasExtensions": false, - "hasFields": true, - "hasOneofs": false, - "extensions": [], - "fields": [ + }, { - "name": "tenant", - "description": "Tenant is the tenant", + "name": "target_tenant", + "description": "TargetTenant is the tenant id for which this invite was created", "label": "", - "type": "Tenant", - "longType": "Tenant", - "fullType": "api.v1.Tenant", + "type": "string", + "longType": "string", + "fullType": "string", "ismap": false, "isoneof": false, "oneofdecl": "", "defaultValue": "" - } - ] - }, - { - "name": "TenantServiceCreateRequest", - "longName": "TenantServiceCreateRequest", - "fullName": "api.v1.TenantServiceCreateRequest", - "description": "TenantServiceCreateRequest is the request payload of the tenant create request", - "hasExtensions": false, - "hasFields": true, - "hasOneofs": false, - "extensions": [], - "fields": [ + }, { - "name": "tenant", - "description": "Tenant the tenant to create", + "name": "role", + "description": "Role is the role in this tenant the user will get after accepting the invitation", "label": "", - "type": "Tenant", - "longType": "Tenant", - "fullType": "api.v1.Tenant", + "type": "TenantRole", + "longType": "TenantRole", + "fullType": "api.v1.TenantRole", "ismap": false, "isoneof": false, "oneofdecl": "", "defaultValue": "" - } - ] - }, - { - "name": "TenantServiceCreateResponse", - "longName": "TenantServiceCreateResponse", - "fullName": "api.v1.TenantServiceCreateResponse", - "description": "TenantServiceCreateResponse is the response payload of the tenant create request", - "hasExtensions": false, - "hasFields": true, - "hasOneofs": false, - "extensions": [], - "fields": [ + }, + { + "name": "joined", + "description": "Joined is false as long as a user has not accepted the invite", + "label": "", + "type": "bool", + "longType": "bool", + "fullType": "bool", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "target_tenant_name", + "description": "TargetTenantName is the tenant name for which this invite was created", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, { "name": "tenant", - "description": "Tenant is the tenant", + "description": "Tenant is the login of tenant who invites to join this tenant", "label": "", - "type": "Tenant", - "longType": "Tenant", - "fullType": "api.v1.Tenant", + "type": "string", + "longType": "string", + "fullType": "string", "ismap": false, "isoneof": false, "oneofdecl": "", "defaultValue": "" - } - ] - }, - { - "name": "TenantServiceDeleteRequest", - "longName": "TenantServiceDeleteRequest", - "fullName": "api.v1.TenantServiceDeleteRequest", - "description": "TenantServiceDeleteRequest is the request payload of the tenant delete request", - "hasExtensions": false, - "hasFields": true, - "hasOneofs": false, - "extensions": [], - "fields": [ + }, { - "name": "login", - "description": "Login of the tenant", + "name": "tenant_name", + "description": "TenantName is the name of tenant who invites to join this tenant", "label": "", "type": "string", "longType": "string", @@ -7650,26 +7670,74 @@ "isoneof": false, "oneofdecl": "", "defaultValue": "" + }, + { + "name": "expires_at", + "description": "ExpiresAt the date when this invite expires", + "label": "", + "type": "Timestamp", + "longType": "google.protobuf.Timestamp", + "fullType": "google.protobuf.Timestamp", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "joined_at", + "description": "JoinedAt the date when the member accepted this invite", + "label": "", + "type": "Timestamp", + "longType": "google.protobuf.Timestamp", + "fullType": "google.protobuf.Timestamp", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" } ] }, { - "name": "TenantServiceDeleteResponse", - "longName": "TenantServiceDeleteResponse", - "fullName": "api.v1.TenantServiceDeleteResponse", - "description": "TenantServiceDeleteResponse is the response payload of the tenant delete request", + "name": "TenantMember", + "longName": "TenantMember", + "fullName": "api.v1.TenantMember", + "description": "TenantMember defines a user that participates at a tenant", "hasExtensions": false, "hasFields": true, "hasOneofs": false, "extensions": [], "fields": [ { - "name": "tenant", - "description": "Tenant is the tenant", + "name": "id", + "description": "Id is the user id of the member", "label": "", - "type": "Tenant", - "longType": "Tenant", - "fullType": "api.v1.Tenant", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "role", + "description": "Role is the role of the member", + "label": "", + "type": "TenantRole", + "longType": "TenantRole", + "fullType": "api.v1.TenantRole", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "created_at", + "description": "CreatedAt the date when the member was added to the tenant", + "label": "", + "type": "Timestamp", + "longType": "google.protobuf.Timestamp", + "fullType": "google.protobuf.Timestamp", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -7678,22 +7746,22 @@ ] }, { - "name": "TenantServiceGetRequest", - "longName": "TenantServiceGetRequest", - "fullName": "api.v1.TenantServiceGetRequest", - "description": "TenantServiceGetRequest is the request payload of the tenant get request", + "name": "TenantServiceCreateOrUpdateRequest", + "longName": "TenantServiceCreateOrUpdateRequest", + "fullName": "api.v1.TenantServiceCreateOrUpdateRequest", + "description": "TenantServiceCreateOrUpdateRequest is the request payload of the tenant create or update request", "hasExtensions": false, "hasFields": true, "hasOneofs": false, "extensions": [], "fields": [ { - "name": "login", - "description": "Login of the tenant", + "name": "tenant", + "description": "Tenant the tenant to create or update", "label": "", - "type": "string", - "longType": "string", - "fullType": "string", + "type": "Tenant", + "longType": "Tenant", + "fullType": "api.v1.Tenant", "ismap": false, "isoneof": false, "oneofdecl": "", @@ -7702,10 +7770,10 @@ ] }, { - "name": "TenantServiceGetResponse", - "longName": "TenantServiceGetResponse", - "fullName": "api.v1.TenantServiceGetResponse", - "description": "TenantServiceGetResponse is the response payload of the tenant get request", + "name": "TenantServiceCreateOrUpdateResponse", + "longName": "TenantServiceCreateOrUpdateResponse", + "fullName": "api.v1.TenantServiceCreateOrUpdateResponse", + "description": "TenantServiceCreateOrUpdateResponse is the response payload of the tenant create or update request", "hasExtensions": false, "hasFields": true, "hasOneofs": false, @@ -7726,18 +7794,18 @@ ] }, { - "name": "TenantServiceUpdateRequest", - "longName": "TenantServiceUpdateRequest", - "fullName": "api.v1.TenantServiceUpdateRequest", - "description": "TenantServiceUpdateRequest is the request payload of the tenant update request", + "name": "TenantServiceCreateRequest", + "longName": "TenantServiceCreateRequest", + "fullName": "api.v1.TenantServiceCreateRequest", + "description": "TenantServiceCreateRequest is the request payload of the tenant create request", "hasExtensions": false, "hasFields": true, "hasOneofs": true, "extensions": [], "fields": [ { - "name": "login", - "description": "Login of the tenant", + "name": "name", + "description": "Name of this tenant", "label": "", "type": "string", "longType": "string", @@ -7745,11 +7813,498 @@ "ismap": false, "isoneof": false, "oneofdecl": "", - "defaultValue": "" + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "string.min_len", + "value": 2 + }, + { + "name": "string.max_len", + "value": 64 + } + ] + } + }, + { + "name": "description", + "description": "Description of this tenant", + "label": "optional", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": true, + "oneofdecl": "_description", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "string.min_len", + "value": 2 + }, + { + "name": "string.max_len", + "value": 512 + } + ] + } + }, + { + "name": "email", + "description": "Email of the tenant, if not set will be inherited from the creator", + "label": "optional", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": true, + "oneofdecl": "_email", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "string.email", + "value": true + } + ] + } + }, + { + "name": "avatar_url", + "description": "AvatarUrl of the tenant", + "label": "optional", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": true, + "oneofdecl": "_avatar_url", + "defaultValue": "" + }, + { + "name": "phone_number", + "description": "PhoneNumber of the tenant", + "label": "optional", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": true, + "oneofdecl": "_phone_number", + "defaultValue": "" + } + ] + }, + { + "name": "TenantServiceCreateResponse", + "longName": "TenantServiceCreateResponse", + "fullName": "api.v1.TenantServiceCreateResponse", + "description": "TenantServiceCreateResponse is the response payload of the tenant create request", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "tenant", + "description": "Tenant is the tenant", + "label": "", + "type": "Tenant", + "longType": "Tenant", + "fullType": "api.v1.Tenant", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "TenantServiceDeleteRequest", + "longName": "TenantServiceDeleteRequest", + "fullName": "api.v1.TenantServiceDeleteRequest", + "description": "TenantServiceDeleteRequest is the request payload of the tenant delete request", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "login", + "description": "Login of the tenant", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "TenantServiceDeleteResponse", + "longName": "TenantServiceDeleteResponse", + "fullName": "api.v1.TenantServiceDeleteResponse", + "description": "TenantServiceDeleteResponse is the response payload of the tenant delete request", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "tenant", + "description": "Tenant is the tenant", + "label": "", + "type": "Tenant", + "longType": "Tenant", + "fullType": "api.v1.Tenant", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "TenantServiceGetRequest", + "longName": "TenantServiceGetRequest", + "fullName": "api.v1.TenantServiceGetRequest", + "description": "TenantServiceGetRequest is the request payload of the tenant get request", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "login", + "description": "Login of the tenant", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "TenantServiceGetResponse", + "longName": "TenantServiceGetResponse", + "fullName": "api.v1.TenantServiceGetResponse", + "description": "TenantServiceGetResponse is the response payload of the tenant get request", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "tenant", + "description": "Tenant is the tenant", + "label": "", + "type": "Tenant", + "longType": "Tenant", + "fullType": "api.v1.Tenant", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "TenantServiceInviteAcceptRequest", + "longName": "TenantServiceInviteAcceptRequest", + "fullName": "api.v1.TenantServiceInviteAcceptRequest", + "description": "TenantServiceInviteAcceptRequest is the request payload to a accept invite request", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "secret", + "description": "Secret is the invitation secret part of the invitation url", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "TenantServiceInviteAcceptResponse", + "longName": "TenantServiceInviteAcceptResponse", + "fullName": "api.v1.TenantServiceInviteAcceptResponse", + "description": "TenantServiceInvitesListResponse is the response payload to a accept invite request", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "tenant", + "description": "Tenant ID of the joined tenant", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "tenant_name", + "description": "TenantName of the joined tenant", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "TenantServiceInviteDeleteRequest", + "longName": "TenantServiceInviteDeleteRequest", + "fullName": "api.v1.TenantServiceInviteDeleteRequest", + "description": "TenantServiceInviteDeleteRequest is the request payload to a delete invite", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "login", + "description": "Login of the tenant", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "secret", + "description": "Secret of the invite to delete", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "TenantServiceInviteDeleteResponse", + "longName": "TenantServiceInviteDeleteResponse", + "fullName": "api.v1.TenantServiceInviteDeleteResponse", + "description": "TenantServiceInviteDeleteResponse is the response payload of a delete invite request", + "hasExtensions": false, + "hasFields": false, + "hasOneofs": false, + "extensions": [], + "fields": [] + }, + { + "name": "TenantServiceInviteGetRequest", + "longName": "TenantServiceInviteGetRequest", + "fullName": "api.v1.TenantServiceInviteGetRequest", + "description": "TenantServiceInviteGetRequest is the request payload to get a invite", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "secret", + "description": "Secret of the invite to get", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "TenantServiceInviteGetResponse", + "longName": "TenantServiceInviteGetResponse", + "fullName": "api.v1.TenantServiceInviteGetResponse", + "description": "TenantServiceInviteGetResponse is the response payload to a get invite request", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "invite", + "description": "Invite is the invite", + "label": "", + "type": "TenantInvite", + "longType": "TenantInvite", + "fullType": "api.v1.TenantInvite", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "TenantServiceInviteRequest", + "longName": "TenantServiceInviteRequest", + "fullName": "api.v1.TenantServiceInviteRequest", + "description": "TenantServiceInviteRequest is used to invite a member to a tenant", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "login", + "description": "Login of the tenant", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "role", + "description": "Role of this user in this tenant", + "label": "", + "type": "TenantRole", + "longType": "TenantRole", + "fullType": "api.v1.TenantRole", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "TenantServiceInviteResponse", + "longName": "TenantServiceInviteResponse", + "fullName": "api.v1.TenantServiceInviteResponse", + "description": "TenantServiceInviteRequest is the response payload to a invite member request", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "invite", + "description": "Invite contains a secret which can be sent to a potential user\ncan be appended to the invitation endpoint at our cloud console like\nconsole.metalstack.cloud/invite/\u003csecret\u003e", + "label": "", + "type": "TenantInvite", + "longType": "TenantInvite", + "fullType": "api.v1.TenantInvite", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "TenantServiceInvitesListRequest", + "longName": "TenantServiceInvitesListRequest", + "fullName": "api.v1.TenantServiceInvitesListRequest", + "description": "TenantServiceInvitesListRequest is the request payload to a list invites request", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "login", + "description": "Login of the tenant", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "TenantServiceInvitesListResponse", + "longName": "TenantServiceInvitesListResponse", + "fullName": "api.v1.TenantServiceInvitesListResponse", + "description": "TenantServiceInvitesListResponse is the response payload to a list invites request", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "invites", + "description": "Invites not already accepted the invitation to this tenant", + "label": "repeated", + "type": "TenantInvite", + "longType": "TenantInvite", + "fullType": "api.v1.TenantInvite", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "TenantServiceListRequest", + "longName": "TenantServiceListRequest", + "fullName": "api.v1.TenantServiceListRequest", + "description": "TenantServiceListRequest is the request payload of the tenant list request", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": true, + "extensions": [], + "fields": [ + { + "name": "id", + "description": "Id filters tenants by id", + "label": "optional", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": true, + "oneofdecl": "_id", + "defaultValue": "" }, { "name": "name", - "description": "Name of the tenant", + "description": "Name filters tenants by name", "label": "optional", "type": "string", "longType": "string", @@ -7757,8 +8312,211 @@ "ismap": false, "isoneof": true, "oneofdecl": "_name", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "string.min_len", + "value": 2 + }, + { + "name": "string.max_len", + "value": 64 + } + ] + } + } + ] + }, + { + "name": "TenantServiceListResponse", + "longName": "TenantServiceListResponse", + "fullName": "api.v1.TenantServiceListResponse", + "description": "TenantServiceListResponse is the response payload of the tenant list request", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "tenants", + "description": "Tenants is the list of tenants", + "label": "repeated", + "type": "Tenant", + "longType": "Tenant", + "fullType": "api.v1.Tenant", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "TenantServiceRemoveMemberRequest", + "longName": "TenantServiceRemoveMemberRequest", + "fullName": "api.v1.TenantServiceRemoveMemberRequest", + "description": "TenantServiceRemoveMemberRequest is used to remove a member from a tenant", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "login", + "description": "Login of the tenant", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "member_id", + "description": "MemberID is the id of the member to remove from this tenant", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "TenantServiceRemoveMemberResponse", + "longName": "TenantServiceRemoveMemberResponse", + "fullName": "api.v1.TenantServiceRemoveMemberResponse", + "description": "TenantServiceRemoveMemberResponse is the response payload to a remove member request", + "hasExtensions": false, + "hasFields": false, + "hasOneofs": false, + "extensions": [], + "fields": [] + }, + { + "name": "TenantServiceUpdateMemberRequest", + "longName": "TenantServiceUpdateMemberRequest", + "fullName": "api.v1.TenantServiceUpdateMemberRequest", + "description": "TenantServiceUpdateMemberRequest is used to update a member from a tenant", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "login", + "description": "Login of the tenant", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "member_id", + "description": "MemberID is the id of the member to update in this tenant", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "role", + "description": "Role of this user in this tenant", + "label": "", + "type": "TenantRole", + "longType": "TenantRole", + "fullType": "api.v1.TenantRole", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "TenantServiceUpdateMemberResponse", + "longName": "TenantServiceUpdateMemberResponse", + "fullName": "api.v1.TenantServiceUpdateMemberResponse", + "description": "TenantServiceUpdateMemberResponse is the response payload to a update member request", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "tenant_member", + "description": "TenantMember is the updated membership", + "label": "", + "type": "TenantMember", + "longType": "TenantMember", + "fullType": "api.v1.TenantMember", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, + { + "name": "TenantServiceUpdateRequest", + "longName": "TenantServiceUpdateRequest", + "fullName": "api.v1.TenantServiceUpdateRequest", + "description": "TenantServiceUpdateRequest is the request payload of the tenant update request", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": true, + "extensions": [], + "fields": [ + { + "name": "login", + "description": "Login of the tenant", + "label": "", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": false, + "oneofdecl": "", "defaultValue": "" }, + { + "name": "name", + "description": "Name of the tenant", + "label": "optional", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": true, + "oneofdecl": "_name", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "string.min_len", + "value": 2 + }, + { + "name": "string.max_len", + "value": 64 + } + ] + } + }, { "name": "email", "description": "Email of the tenant", @@ -7769,7 +8527,39 @@ "ismap": false, "isoneof": true, "oneofdecl": "_email", - "defaultValue": "" + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "string.email", + "value": true + } + ] + } + }, + { + "name": "description", + "description": "Description of this tenant", + "label": "optional", + "type": "string", + "longType": "string", + "fullType": "string", + "ismap": false, + "isoneof": true, + "oneofdecl": "_description", + "defaultValue": "", + "options": { + "validate.rules": [ + { + "name": "string.min_len", + "value": 2 + }, + { + "name": "string.max_len", + "value": 512 + } + ] + } }, { "name": "avatar_url", @@ -7949,6 +8739,18 @@ "responseFullType": "api.v1.TenantServiceCreateOrUpdateResponse", "responseStreaming": false }, + { + "name": "List", + "description": "List tenants", + "requestType": "TenantServiceListRequest", + "requestLongType": "TenantServiceListRequest", + "requestFullType": "api.v1.TenantServiceListRequest", + "requestStreaming": false, + "responseType": "TenantServiceListResponse", + "responseLongType": "TenantServiceListResponse", + "responseFullType": "api.v1.TenantServiceListResponse", + "responseStreaming": false + }, { "name": "Get", "description": "Get a tenant", @@ -7984,6 +8786,90 @@ "responseLongType": "TenantServiceDeleteResponse", "responseFullType": "api.v1.TenantServiceDeleteResponse", "responseStreaming": false + }, + { + "name": "RemoveMember", + "description": "RemoveMember remove a member of a tenant", + "requestType": "TenantServiceRemoveMemberRequest", + "requestLongType": "TenantServiceRemoveMemberRequest", + "requestFullType": "api.v1.TenantServiceRemoveMemberRequest", + "requestStreaming": false, + "responseType": "TenantServiceRemoveMemberResponse", + "responseLongType": "TenantServiceRemoveMemberResponse", + "responseFullType": "api.v1.TenantServiceRemoveMemberResponse", + "responseStreaming": false + }, + { + "name": "UpdateMember", + "description": "UpdateMember update a member of a tenant", + "requestType": "TenantServiceUpdateMemberRequest", + "requestLongType": "TenantServiceUpdateMemberRequest", + "requestFullType": "api.v1.TenantServiceUpdateMemberRequest", + "requestStreaming": false, + "responseType": "TenantServiceUpdateMemberResponse", + "responseLongType": "TenantServiceUpdateMemberResponse", + "responseFullType": "api.v1.TenantServiceUpdateMemberResponse", + "responseStreaming": false + }, + { + "name": "Invite", + "description": "Invite a user to a tenant", + "requestType": "TenantServiceInviteRequest", + "requestLongType": "TenantServiceInviteRequest", + "requestFullType": "api.v1.TenantServiceInviteRequest", + "requestStreaming": false, + "responseType": "TenantServiceInviteResponse", + "responseLongType": "TenantServiceInviteResponse", + "responseFullType": "api.v1.TenantServiceInviteResponse", + "responseStreaming": false + }, + { + "name": "InviteAccept", + "description": "InviteAccept is called from a user to accept an invitation", + "requestType": "TenantServiceInviteAcceptRequest", + "requestLongType": "TenantServiceInviteAcceptRequest", + "requestFullType": "api.v1.TenantServiceInviteAcceptRequest", + "requestStreaming": false, + "responseType": "TenantServiceInviteAcceptResponse", + "responseLongType": "TenantServiceInviteAcceptResponse", + "responseFullType": "api.v1.TenantServiceInviteAcceptResponse", + "responseStreaming": false + }, + { + "name": "InviteDelete", + "description": "InviteDelete deletes a pending invitation", + "requestType": "TenantServiceInviteDeleteRequest", + "requestLongType": "TenantServiceInviteDeleteRequest", + "requestFullType": "api.v1.TenantServiceInviteDeleteRequest", + "requestStreaming": false, + "responseType": "TenantServiceInviteDeleteResponse", + "responseLongType": "TenantServiceInviteDeleteResponse", + "responseFullType": "api.v1.TenantServiceInviteDeleteResponse", + "responseStreaming": false + }, + { + "name": "InvitesList", + "description": "InvitesList list all invites to a tenant", + "requestType": "TenantServiceInvitesListRequest", + "requestLongType": "TenantServiceInvitesListRequest", + "requestFullType": "api.v1.TenantServiceInvitesListRequest", + "requestStreaming": false, + "responseType": "TenantServiceInvitesListResponse", + "responseLongType": "TenantServiceInvitesListResponse", + "responseFullType": "api.v1.TenantServiceInvitesListResponse", + "responseStreaming": false + }, + { + "name": "InviteGet", + "description": "InviteGet get an invite", + "requestType": "TenantServiceInviteGetRequest", + "requestLongType": "TenantServiceInviteGetRequest", + "requestFullType": "api.v1.TenantServiceInviteGetRequest", + "requestStreaming": false, + "responseType": "TenantServiceInviteGetResponse", + "responseLongType": "TenantServiceInviteGetResponse", + "responseFullType": "api.v1.TenantServiceInviteGetResponse", + "responseStreaming": false } ] } @@ -9317,7 +10203,7 @@ "name": "AssetServiceListResponse", "longName": "AssetServiceListResponse", "fullName": "api.v1.AssetServiceListResponse", - "description": "AssetServiceListResponse is the response payload which containes the the Asset list", + "description": "AssetServiceListResponse is the response payload which contains the the Asset list", "hasExtensions": false, "hasFields": true, "hasOneofs": false, @@ -11666,7 +12552,7 @@ "fields": [ { "name": "invite", - "description": "Inviter contains a secret which can be sent to a potential user\ncan appended to the invitation endpoint at our api server like\nconsole.metalstack.cloud/invite/\u003csecret\u003e", + "description": "Inviter contains a secret which can be sent to a potential user\ncan be appended to the invitation endpoint at our cloud console like\nconsole.metalstack.cloud/invite/\u003csecret\u003e", "label": "", "type": "ProjectInvite", "longType": "ProjectInvite", diff --git a/examples/README.md b/examples/README.md index 193c4340..1c426585 100644 --- a/examples/README.md +++ b/examples/README.md @@ -9,16 +9,24 @@ export API_TOKEN=yourapitoken export PROJECT_ID=yourprojectuuid ``` -Then you can execute them as follwoing: +Then you can execute them as following: ```bash Golang: go run go/cluster-list.go Typescript: -cd ts && npm install +cd ts + +With npm: +npm install npx tsx cluster-list.ts +With bun (bun >= v1.1.0): +bun install +bun cluster-list.ts + + Ansible: ansible-playbook ansible/cluster-list.yaml diff --git a/examples/ts/bun.lockb b/examples/ts/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..fa980374852eb096bbb97e740c5e7dee817f18ce GIT binary patch literal 12152 zcmeHN2Ut|c7G7{wM5PE(L}`ks!7VIZq*zdiSi#spS(dxFubb)t*VxUz0)b}v;w`?*x;a?a$%c7>kq?W6+^ z-x|B7_}Jm1$0L2d9eB9I!>iA_?Vl+c5%~#c#RAoh_}HHp`!6tm@Wc6bE)z#`I#l$i z8Jjt_hfRrT{pjo7Ip>}%4J*p|^?qB=ju+E64&Y8qdUDMqWoJq9(p^p-=t(pZ2wg2OT7b(vn~3PQfJ8*$1>}Fot{!9^w#6)c@_N z26T%S5y5YSi-B7G=72;yT0#VW4KDft9&N{%wluB;Zw$aOT0H9gSUex_7(c|J4Ik_O zIskD2&qU=w#4b(k!~e;1#{oY?tN-8f9~8sjq}ES-_^{SD9HQSF@aR8|Xz2gP#xE7{ zj#@m7Yib#9w0!uA=-&%?FTfMMP;C(r{2%Y&(TA20!8<~S^`_}ZA6h~LF9ST?etd^p zLIj@&_z9pNG1vwq4p?uB2;Lex>?kcBeg9bfIe-t)`j4@PvAjh@^gjgrXMiVt=VR^n zY|CIc10Lou2I~LV@k0jqfq+M&F@7kcB}DAs1$eX{?QSU+QgWvAf4v-Rj@_nhv(( z8g4TmBps0$F#Y*!bJchGmQhg~7t-X?$2_Lpm_;7-Un>UbZyOu4a=q2(D$~!WJKnAE zsPex2N33GI>y~_*>tixT9k=CtpSpTdLhB&T{22u+Y@S@+KjIVNt;CHqx%6?I8DPm% zQ9FvmJ<<<;o^+UfdV$0)A|uT_{ajg%Gs9iyz}|t654)`NNWN=!fB(apZ4=lrG1S5{ zbAP#*+S#+izS%cva_Q?c=D}~yF74H3#+h){(%*OQH0|Ch`3pu_xk=g4@e|C~ITmO8 z{`kdu^Xdr^I}fF%bE6;ItUn?w->AA|BI9_cb+2$-b-C}H(Y_PvzrDHAvhG3XytXkX+H%7yrW*~u z&dAH^cIx`pKc+h!(%*DpINy2btxIR`(B#tRd8V>#?zH&&pNIZN9$i_Z+)$2bT|9lrv5|y=Ngvf|73I6vggq`X>;zFbnutb zs*|zR_jqA7&vd=6E;(v=B(gMVN0hEAu5MBz`Rk+-1KZuZclEfms*s8?TbP-y z!}Z91aFFjG9>z4w{dW2C!YW6T2%216ml0wvx?nawDDc6nkgGBFi+4WGSl`MbZi~zP zA-OZ3xP4=BtE*r`{Gn9q!D*Jksn#nUs6I=6=&Q4(&4R8v_U6HvHTSpBx7h-p(f zGG+6~D<^Mo$Mt@_EA?JsR?V6I+g}y834c}^v%J%5W52xd(o;Y7HtwFSUwbfleTDt` z`4N3qx8@Yj>r|0=dJau4e5+_6W^I?;z1xH3hksPHpCSv7a>@$bIoV|O(5Fe$b)U?s zU#ZjiF|WU#&d-UnO0J(hk4?a>c?*{3Gw zanDKbiSXMDnTK%SO^B(q>zbB-S#Y6gUSaN3CtKpTeURKxEvaav< z-tJvhb8_a9eoMBFj`xce#!I6LJ#wEeIC*JTz9~)aCqyWeOkwzl^Tq3*UWygyiKn<# zuCr>NabZ&TkQ;-i8&Lx>ot|0dvnPxa>UOeNs8j|xe>Y-GevGv8c)VU|tWL4w>Vq+(+pSpi-0a2B zkOL153S5nzsGWj%3+v4p>sfw4ASNf5*f-@N#9V#2KrDdt@7}_NU1u>p~RH z{62HZvQ4U`z2cu5KY3O#$>v^#ZQI+=_dW)=yb>d|Tdy zYh~;DPMWw(^sFQI7SG=2OPXA=u2joixIFc&yL;j=%0BSqUHcrt>@!0PR?I97INk2g zqQv12d+&dJIo-I^vig&U>+CEKZf;{3+-X>$W8#w^zp~tPY~jc(np|8*5@K$(@;$KB zsL#SW1EpEfg^S1Y_M9H-XIHX%M{$<9Yu3xLyPo|~m*J=X+|1T3i8El>MC011S-ziM zof+p^&T_xucbX;_zWFr}^QTtf-;}N>t*k4pNS#&t!?C={mVT0O+oD~IMt(gdX^3&f zu#A-D-jvsZJ~n$y-ADUbxsILXvf`p;!jr7LamNa;)8vwME(&MXE}V9}=(54Mj*B-u zioMg@rEF`*cCMm>m36KCYP_u0w$i^i$-P^3hIOm5w}5{G(V83-c{*k5fms?KJ3GYEL`= z?%}74cX%F%9BQ9gZn$Rou8_M4V>Y-Y@6H3cjS*S$Cy&eaAe9eG{=Y8ZwR>GM`gH=#`OvAPjN4a`##*G;eHDDKDbZ8H9D@R zZQ+OOR9pk&x)Rrb!?iZmw$L`jAs(?P6J_Jx0_QQ*iMr7Sv;}QK+t5a|6>Ub_(FgPg z{nCc&HTsG^qrYf3?t{>F)Q5VA-B@BwNgdaPM%M5T=u}TlsXt%}&m~yt22JGB5Mzh8 znn-OIo@0}9U0t224s16zSMx;{G^@x7u$tq990w2&zN^R?@EeXFaKK6xIX!;E2>}kC zqm%Px;BY~YBZEOs+Q|ttVqDlxY-a|^5g=#h$lVg5(ka#}Q%x9FkQ* zvJG@~9Kir!Fz$iXxF(((R2eeMU;mb=j+dtco5yzMKGkwoP3z(vTHDe04Tt1xkX!~M zolij$63OZy*$ze^jfaiEAo(36??G25*_q9Q_GXYw43eRstHWhGvfTkgaxzG+g4Q4C zJ0xp^WHYE^05Rn@-mhJu>o7jtNAVq{zY9j#cbpJ|0~h^WFw#K=G~9c7-e5>32+5ED z+rU%o^8bz=l21bNEI=9$+7wK%#^DUeT6-k&_E;^aqGBl-+c#c8$s~MnfI=pcgnL;# zycrPO-Wm|zedl69GK^cQj6D{4ozwDq&C=Er_U-92w(8#5MNo%vPBm)KgcGtd_oZvK ze7AP)>(_7hWpC2*^L~jl891cdkwU1$n5Yu>Sk^iDVC4EkP{){OrX9$w%y&3(8tOPs zY&-SaS39SDdf+zHVO&*J-Mm`l-9i+Cd%jcv9B(uenh+a+5+X z00e_^;JIn8Y}GPTOmxC~hIJbT{ALkTq>#%g8AK$w+IrSF;fO!Gz+emQp-OdguF{D& zcr`{F#Y=3p7@VVE{B-!x@W~K}m2wCzODvKrd_tANP^Cy5#)+0m6;i1A2&57TB~Zws z1sv^VBe&F

tP>qe6Y6D426uF!2f^Spuv{5OnFe+L`3HS;MO_{Dx zM9cegI5H|6ESDv)CDBn4a<)_!4vnLBpTi{g6wf_RXU^)ej9O@&F!={u`>WetOJjzFr5KYO|MyRjUG1YWCO;>Bm zd4#F~=zl|nl2+>8|o z5`ZO0Sn7GCnP(e|C!ia<4f4R3X5_tTDUkA}!g7Gvse{mj<2bJZ3JVsDSLz4!h3ngx?ENYFB{rVa(SIaA)3M3bUkJvJxdz10K=APWny0T#1=Q37o9nv?Lp z7i6|30Z~spE%8S)w}21YNk+36Mgx3=e7Qm-OyGnn<)PAqrn>CgPl7NFgvEo`Q2iom KR&D=#|NjMaJ (req) => { - req.header.append('Authorization', 'Bearer ' + process.env.API_TOKEN) - return next(req) + req.header.append('Authorization', 'Bearer ' + process.env.API_TOKEN); + return next(req); } const transport = createConnectTransport({ diff --git a/examples/ts/package.json b/examples/ts/package.json index 958509ba..6d698b36 100644 --- a/examples/ts/package.json +++ b/examples/ts/package.json @@ -12,4 +12,4 @@ "ts-node": "^10.9.2", "@connectrpc/connect-web": "^1.4.0" } -} \ No newline at end of file +} diff --git a/generate/Makefile b/generate/Makefile index 424990aa..8e2a1e86 100644 --- a/generate/Makefile +++ b/generate/Makefile @@ -17,4 +17,4 @@ go-mocks: --user $$(id -u):$$(id -g) \ -w /work \ -v $(PWD):/work \ - vektra/mockery:v2.41.0 --keeptree --inpackage --dir go --output go/tests/mocks --all --log-level debug + vektra/mockery:v2.42.0 --keeptree --inpackage --dir go --output go/tests/mocks --all --log-level debug diff --git a/go/admin/v1/cluster.pb.go b/go/admin/v1/cluster.pb.go index 22fe05df..88f725af 100644 --- a/go/admin/v1/cluster.pb.go +++ b/go/admin/v1/cluster.pb.go @@ -93,7 +93,7 @@ type ClusterServiceListRequest struct { Project *string `protobuf:"bytes,2,opt,name=project,proto3,oneof" json:"project,omitempty"` // Tenant of the cluster Tenant *string `protobuf:"bytes,3,opt,name=tenant,proto3,oneof" json:"tenant,omitempty"` - // Partiton of the cluster + // Partition of the cluster Partition *string `protobuf:"bytes,4,opt,name=partition,proto3,oneof" json:"partition,omitempty"` // Seed of the cluster Seed *string `protobuf:"bytes,5,opt,name=seed,proto3,oneof" json:"seed,omitempty"` diff --git a/go/admin/v1/machine.pb.go b/go/admin/v1/machine.pb.go index 2043233f..fe885268 100644 --- a/go/admin/v1/machine.pb.go +++ b/go/admin/v1/machine.pb.go @@ -231,7 +231,7 @@ type MachineNetwork struct { // Network is the uuid of this network Network string `protobuf:"bytes,1,opt,name=network,proto3" json:"network,omitempty"` - // Prefixes availalble in this network + // Prefixes available in this network Prefixes []string `protobuf:"bytes,2,rep,name=prefixes,proto3" json:"prefixes,omitempty"` // Ips attached for the machine in this network Ips []string `protobuf:"bytes,3,rep,name=ips,proto3" json:"ips,omitempty"` diff --git a/go/admin/v1/storage.pb.go b/go/admin/v1/storage.pb.go index dd742a90..d03c05f9 100644 --- a/go/admin/v1/storage.pb.go +++ b/go/admin/v1/storage.pb.go @@ -502,7 +502,7 @@ type ClusterStatisticsApi struct { // // Estimate of total available logical storage based on current compression ratio (effective * compression) EstimatedLogicalStorage uint64 `protobuf:"varint,10,opt,name=estimated_logical_storage,json=estimatedLogicalStorage,proto3" json:"estimated_logical_storage,omitempty"` - // commpression ratio + // compression ratio // // compression ratio logicalUsedStorage/physicalUsedStorage CompressionRatio float64 `protobuf:"fixed64,11,opt,name=compression_ratio,json=compressionRatio,proto3" json:"compression_ratio,omitempty"` diff --git a/go/api/v1/apiv1connect/tenant.connect.go b/go/api/v1/apiv1connect/tenant.connect.go index f3784ad0..6de0b7a0 100644 --- a/go/api/v1/apiv1connect/tenant.connect.go +++ b/go/api/v1/apiv1connect/tenant.connect.go @@ -38,12 +38,33 @@ const ( // TenantServiceCreateOrUpdateProcedure is the fully-qualified name of the TenantService's // CreateOrUpdate RPC. TenantServiceCreateOrUpdateProcedure = "/api.v1.TenantService/CreateOrUpdate" + // TenantServiceListProcedure is the fully-qualified name of the TenantService's List RPC. + TenantServiceListProcedure = "/api.v1.TenantService/List" // TenantServiceGetProcedure is the fully-qualified name of the TenantService's Get RPC. TenantServiceGetProcedure = "/api.v1.TenantService/Get" // TenantServiceUpdateProcedure is the fully-qualified name of the TenantService's Update RPC. TenantServiceUpdateProcedure = "/api.v1.TenantService/Update" // TenantServiceDeleteProcedure is the fully-qualified name of the TenantService's Delete RPC. TenantServiceDeleteProcedure = "/api.v1.TenantService/Delete" + // TenantServiceRemoveMemberProcedure is the fully-qualified name of the TenantService's + // RemoveMember RPC. + TenantServiceRemoveMemberProcedure = "/api.v1.TenantService/RemoveMember" + // TenantServiceUpdateMemberProcedure is the fully-qualified name of the TenantService's + // UpdateMember RPC. + TenantServiceUpdateMemberProcedure = "/api.v1.TenantService/UpdateMember" + // TenantServiceInviteProcedure is the fully-qualified name of the TenantService's Invite RPC. + TenantServiceInviteProcedure = "/api.v1.TenantService/Invite" + // TenantServiceInviteAcceptProcedure is the fully-qualified name of the TenantService's + // InviteAccept RPC. + TenantServiceInviteAcceptProcedure = "/api.v1.TenantService/InviteAccept" + // TenantServiceInviteDeleteProcedure is the fully-qualified name of the TenantService's + // InviteDelete RPC. + TenantServiceInviteDeleteProcedure = "/api.v1.TenantService/InviteDelete" + // TenantServiceInvitesListProcedure is the fully-qualified name of the TenantService's InvitesList + // RPC. + TenantServiceInvitesListProcedure = "/api.v1.TenantService/InvitesList" + // TenantServiceInviteGetProcedure is the fully-qualified name of the TenantService's InviteGet RPC. + TenantServiceInviteGetProcedure = "/api.v1.TenantService/InviteGet" ) // These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. @@ -51,9 +72,17 @@ var ( tenantServiceServiceDescriptor = v1.File_api_v1_tenant_proto.Services().ByName("TenantService") tenantServiceCreateMethodDescriptor = tenantServiceServiceDescriptor.Methods().ByName("Create") tenantServiceCreateOrUpdateMethodDescriptor = tenantServiceServiceDescriptor.Methods().ByName("CreateOrUpdate") + tenantServiceListMethodDescriptor = tenantServiceServiceDescriptor.Methods().ByName("List") tenantServiceGetMethodDescriptor = tenantServiceServiceDescriptor.Methods().ByName("Get") tenantServiceUpdateMethodDescriptor = tenantServiceServiceDescriptor.Methods().ByName("Update") tenantServiceDeleteMethodDescriptor = tenantServiceServiceDescriptor.Methods().ByName("Delete") + tenantServiceRemoveMemberMethodDescriptor = tenantServiceServiceDescriptor.Methods().ByName("RemoveMember") + tenantServiceUpdateMemberMethodDescriptor = tenantServiceServiceDescriptor.Methods().ByName("UpdateMember") + tenantServiceInviteMethodDescriptor = tenantServiceServiceDescriptor.Methods().ByName("Invite") + tenantServiceInviteAcceptMethodDescriptor = tenantServiceServiceDescriptor.Methods().ByName("InviteAccept") + tenantServiceInviteDeleteMethodDescriptor = tenantServiceServiceDescriptor.Methods().ByName("InviteDelete") + tenantServiceInvitesListMethodDescriptor = tenantServiceServiceDescriptor.Methods().ByName("InvitesList") + tenantServiceInviteGetMethodDescriptor = tenantServiceServiceDescriptor.Methods().ByName("InviteGet") ) // TenantServiceClient is a client for the api.v1.TenantService service. @@ -63,12 +92,28 @@ type TenantServiceClient interface { // CreateOrUpdate should only be used from within the application // will check if tenant already exists and updates if necessary, otherwise create a new tenant CreateOrUpdate(context.Context, *connect.Request[v1.TenantServiceCreateOrUpdateRequest]) (*connect.Response[v1.TenantServiceCreateOrUpdateResponse], error) + // List tenants + List(context.Context, *connect.Request[v1.TenantServiceListRequest]) (*connect.Response[v1.TenantServiceListResponse], error) // Get a tenant Get(context.Context, *connect.Request[v1.TenantServiceGetRequest]) (*connect.Response[v1.TenantServiceGetResponse], error) // Update a tenant Update(context.Context, *connect.Request[v1.TenantServiceUpdateRequest]) (*connect.Response[v1.TenantServiceUpdateResponse], error) // Delete a tenant Delete(context.Context, *connect.Request[v1.TenantServiceDeleteRequest]) (*connect.Response[v1.TenantServiceDeleteResponse], error) + // RemoveMember remove a member of a tenant + RemoveMember(context.Context, *connect.Request[v1.TenantServiceRemoveMemberRequest]) (*connect.Response[v1.TenantServiceRemoveMemberResponse], error) + // UpdateMember update a member of a tenant + UpdateMember(context.Context, *connect.Request[v1.TenantServiceUpdateMemberRequest]) (*connect.Response[v1.TenantServiceUpdateMemberResponse], error) + // Invite a user to a tenant + Invite(context.Context, *connect.Request[v1.TenantServiceInviteRequest]) (*connect.Response[v1.TenantServiceInviteResponse], error) + // InviteAccept is called from a user to accept an invitation + InviteAccept(context.Context, *connect.Request[v1.TenantServiceInviteAcceptRequest]) (*connect.Response[v1.TenantServiceInviteAcceptResponse], error) + // InviteDelete deletes a pending invitation + InviteDelete(context.Context, *connect.Request[v1.TenantServiceInviteDeleteRequest]) (*connect.Response[v1.TenantServiceInviteDeleteResponse], error) + // InvitesList list all invites to a tenant + InvitesList(context.Context, *connect.Request[v1.TenantServiceInvitesListRequest]) (*connect.Response[v1.TenantServiceInvitesListResponse], error) + // InviteGet get an invite + InviteGet(context.Context, *connect.Request[v1.TenantServiceInviteGetRequest]) (*connect.Response[v1.TenantServiceInviteGetResponse], error) } // NewTenantServiceClient constructs a client for the api.v1.TenantService service. By default, it @@ -93,6 +138,12 @@ func NewTenantServiceClient(httpClient connect.HTTPClient, baseURL string, opts connect.WithSchema(tenantServiceCreateOrUpdateMethodDescriptor), connect.WithClientOptions(opts...), ), + list: connect.NewClient[v1.TenantServiceListRequest, v1.TenantServiceListResponse]( + httpClient, + baseURL+TenantServiceListProcedure, + connect.WithSchema(tenantServiceListMethodDescriptor), + connect.WithClientOptions(opts...), + ), get: connect.NewClient[v1.TenantServiceGetRequest, v1.TenantServiceGetResponse]( httpClient, baseURL+TenantServiceGetProcedure, @@ -111,6 +162,48 @@ func NewTenantServiceClient(httpClient connect.HTTPClient, baseURL string, opts connect.WithSchema(tenantServiceDeleteMethodDescriptor), connect.WithClientOptions(opts...), ), + removeMember: connect.NewClient[v1.TenantServiceRemoveMemberRequest, v1.TenantServiceRemoveMemberResponse]( + httpClient, + baseURL+TenantServiceRemoveMemberProcedure, + connect.WithSchema(tenantServiceRemoveMemberMethodDescriptor), + connect.WithClientOptions(opts...), + ), + updateMember: connect.NewClient[v1.TenantServiceUpdateMemberRequest, v1.TenantServiceUpdateMemberResponse]( + httpClient, + baseURL+TenantServiceUpdateMemberProcedure, + connect.WithSchema(tenantServiceUpdateMemberMethodDescriptor), + connect.WithClientOptions(opts...), + ), + invite: connect.NewClient[v1.TenantServiceInviteRequest, v1.TenantServiceInviteResponse]( + httpClient, + baseURL+TenantServiceInviteProcedure, + connect.WithSchema(tenantServiceInviteMethodDescriptor), + connect.WithClientOptions(opts...), + ), + inviteAccept: connect.NewClient[v1.TenantServiceInviteAcceptRequest, v1.TenantServiceInviteAcceptResponse]( + httpClient, + baseURL+TenantServiceInviteAcceptProcedure, + connect.WithSchema(tenantServiceInviteAcceptMethodDescriptor), + connect.WithClientOptions(opts...), + ), + inviteDelete: connect.NewClient[v1.TenantServiceInviteDeleteRequest, v1.TenantServiceInviteDeleteResponse]( + httpClient, + baseURL+TenantServiceInviteDeleteProcedure, + connect.WithSchema(tenantServiceInviteDeleteMethodDescriptor), + connect.WithClientOptions(opts...), + ), + invitesList: connect.NewClient[v1.TenantServiceInvitesListRequest, v1.TenantServiceInvitesListResponse]( + httpClient, + baseURL+TenantServiceInvitesListProcedure, + connect.WithSchema(tenantServiceInvitesListMethodDescriptor), + connect.WithClientOptions(opts...), + ), + inviteGet: connect.NewClient[v1.TenantServiceInviteGetRequest, v1.TenantServiceInviteGetResponse]( + httpClient, + baseURL+TenantServiceInviteGetProcedure, + connect.WithSchema(tenantServiceInviteGetMethodDescriptor), + connect.WithClientOptions(opts...), + ), } } @@ -118,9 +211,17 @@ func NewTenantServiceClient(httpClient connect.HTTPClient, baseURL string, opts type tenantServiceClient struct { create *connect.Client[v1.TenantServiceCreateRequest, v1.TenantServiceCreateResponse] createOrUpdate *connect.Client[v1.TenantServiceCreateOrUpdateRequest, v1.TenantServiceCreateOrUpdateResponse] + list *connect.Client[v1.TenantServiceListRequest, v1.TenantServiceListResponse] get *connect.Client[v1.TenantServiceGetRequest, v1.TenantServiceGetResponse] update *connect.Client[v1.TenantServiceUpdateRequest, v1.TenantServiceUpdateResponse] delete *connect.Client[v1.TenantServiceDeleteRequest, v1.TenantServiceDeleteResponse] + removeMember *connect.Client[v1.TenantServiceRemoveMemberRequest, v1.TenantServiceRemoveMemberResponse] + updateMember *connect.Client[v1.TenantServiceUpdateMemberRequest, v1.TenantServiceUpdateMemberResponse] + invite *connect.Client[v1.TenantServiceInviteRequest, v1.TenantServiceInviteResponse] + inviteAccept *connect.Client[v1.TenantServiceInviteAcceptRequest, v1.TenantServiceInviteAcceptResponse] + inviteDelete *connect.Client[v1.TenantServiceInviteDeleteRequest, v1.TenantServiceInviteDeleteResponse] + invitesList *connect.Client[v1.TenantServiceInvitesListRequest, v1.TenantServiceInvitesListResponse] + inviteGet *connect.Client[v1.TenantServiceInviteGetRequest, v1.TenantServiceInviteGetResponse] } // Create calls api.v1.TenantService.Create. @@ -133,6 +234,11 @@ func (c *tenantServiceClient) CreateOrUpdate(ctx context.Context, req *connect.R return c.createOrUpdate.CallUnary(ctx, req) } +// List calls api.v1.TenantService.List. +func (c *tenantServiceClient) List(ctx context.Context, req *connect.Request[v1.TenantServiceListRequest]) (*connect.Response[v1.TenantServiceListResponse], error) { + return c.list.CallUnary(ctx, req) +} + // Get calls api.v1.TenantService.Get. func (c *tenantServiceClient) Get(ctx context.Context, req *connect.Request[v1.TenantServiceGetRequest]) (*connect.Response[v1.TenantServiceGetResponse], error) { return c.get.CallUnary(ctx, req) @@ -148,6 +254,41 @@ func (c *tenantServiceClient) Delete(ctx context.Context, req *connect.Request[v return c.delete.CallUnary(ctx, req) } +// RemoveMember calls api.v1.TenantService.RemoveMember. +func (c *tenantServiceClient) RemoveMember(ctx context.Context, req *connect.Request[v1.TenantServiceRemoveMemberRequest]) (*connect.Response[v1.TenantServiceRemoveMemberResponse], error) { + return c.removeMember.CallUnary(ctx, req) +} + +// UpdateMember calls api.v1.TenantService.UpdateMember. +func (c *tenantServiceClient) UpdateMember(ctx context.Context, req *connect.Request[v1.TenantServiceUpdateMemberRequest]) (*connect.Response[v1.TenantServiceUpdateMemberResponse], error) { + return c.updateMember.CallUnary(ctx, req) +} + +// Invite calls api.v1.TenantService.Invite. +func (c *tenantServiceClient) Invite(ctx context.Context, req *connect.Request[v1.TenantServiceInviteRequest]) (*connect.Response[v1.TenantServiceInviteResponse], error) { + return c.invite.CallUnary(ctx, req) +} + +// InviteAccept calls api.v1.TenantService.InviteAccept. +func (c *tenantServiceClient) InviteAccept(ctx context.Context, req *connect.Request[v1.TenantServiceInviteAcceptRequest]) (*connect.Response[v1.TenantServiceInviteAcceptResponse], error) { + return c.inviteAccept.CallUnary(ctx, req) +} + +// InviteDelete calls api.v1.TenantService.InviteDelete. +func (c *tenantServiceClient) InviteDelete(ctx context.Context, req *connect.Request[v1.TenantServiceInviteDeleteRequest]) (*connect.Response[v1.TenantServiceInviteDeleteResponse], error) { + return c.inviteDelete.CallUnary(ctx, req) +} + +// InvitesList calls api.v1.TenantService.InvitesList. +func (c *tenantServiceClient) InvitesList(ctx context.Context, req *connect.Request[v1.TenantServiceInvitesListRequest]) (*connect.Response[v1.TenantServiceInvitesListResponse], error) { + return c.invitesList.CallUnary(ctx, req) +} + +// InviteGet calls api.v1.TenantService.InviteGet. +func (c *tenantServiceClient) InviteGet(ctx context.Context, req *connect.Request[v1.TenantServiceInviteGetRequest]) (*connect.Response[v1.TenantServiceInviteGetResponse], error) { + return c.inviteGet.CallUnary(ctx, req) +} + // TenantServiceHandler is an implementation of the api.v1.TenantService service. type TenantServiceHandler interface { // Create a tenant @@ -155,12 +296,28 @@ type TenantServiceHandler interface { // CreateOrUpdate should only be used from within the application // will check if tenant already exists and updates if necessary, otherwise create a new tenant CreateOrUpdate(context.Context, *connect.Request[v1.TenantServiceCreateOrUpdateRequest]) (*connect.Response[v1.TenantServiceCreateOrUpdateResponse], error) + // List tenants + List(context.Context, *connect.Request[v1.TenantServiceListRequest]) (*connect.Response[v1.TenantServiceListResponse], error) // Get a tenant Get(context.Context, *connect.Request[v1.TenantServiceGetRequest]) (*connect.Response[v1.TenantServiceGetResponse], error) // Update a tenant Update(context.Context, *connect.Request[v1.TenantServiceUpdateRequest]) (*connect.Response[v1.TenantServiceUpdateResponse], error) // Delete a tenant Delete(context.Context, *connect.Request[v1.TenantServiceDeleteRequest]) (*connect.Response[v1.TenantServiceDeleteResponse], error) + // RemoveMember remove a member of a tenant + RemoveMember(context.Context, *connect.Request[v1.TenantServiceRemoveMemberRequest]) (*connect.Response[v1.TenantServiceRemoveMemberResponse], error) + // UpdateMember update a member of a tenant + UpdateMember(context.Context, *connect.Request[v1.TenantServiceUpdateMemberRequest]) (*connect.Response[v1.TenantServiceUpdateMemberResponse], error) + // Invite a user to a tenant + Invite(context.Context, *connect.Request[v1.TenantServiceInviteRequest]) (*connect.Response[v1.TenantServiceInviteResponse], error) + // InviteAccept is called from a user to accept an invitation + InviteAccept(context.Context, *connect.Request[v1.TenantServiceInviteAcceptRequest]) (*connect.Response[v1.TenantServiceInviteAcceptResponse], error) + // InviteDelete deletes a pending invitation + InviteDelete(context.Context, *connect.Request[v1.TenantServiceInviteDeleteRequest]) (*connect.Response[v1.TenantServiceInviteDeleteResponse], error) + // InvitesList list all invites to a tenant + InvitesList(context.Context, *connect.Request[v1.TenantServiceInvitesListRequest]) (*connect.Response[v1.TenantServiceInvitesListResponse], error) + // InviteGet get an invite + InviteGet(context.Context, *connect.Request[v1.TenantServiceInviteGetRequest]) (*connect.Response[v1.TenantServiceInviteGetResponse], error) } // NewTenantServiceHandler builds an HTTP handler from the service implementation. It returns the @@ -181,6 +338,12 @@ func NewTenantServiceHandler(svc TenantServiceHandler, opts ...connect.HandlerOp connect.WithSchema(tenantServiceCreateOrUpdateMethodDescriptor), connect.WithHandlerOptions(opts...), ) + tenantServiceListHandler := connect.NewUnaryHandler( + TenantServiceListProcedure, + svc.List, + connect.WithSchema(tenantServiceListMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) tenantServiceGetHandler := connect.NewUnaryHandler( TenantServiceGetProcedure, svc.Get, @@ -199,18 +362,76 @@ func NewTenantServiceHandler(svc TenantServiceHandler, opts ...connect.HandlerOp connect.WithSchema(tenantServiceDeleteMethodDescriptor), connect.WithHandlerOptions(opts...), ) + tenantServiceRemoveMemberHandler := connect.NewUnaryHandler( + TenantServiceRemoveMemberProcedure, + svc.RemoveMember, + connect.WithSchema(tenantServiceRemoveMemberMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + tenantServiceUpdateMemberHandler := connect.NewUnaryHandler( + TenantServiceUpdateMemberProcedure, + svc.UpdateMember, + connect.WithSchema(tenantServiceUpdateMemberMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + tenantServiceInviteHandler := connect.NewUnaryHandler( + TenantServiceInviteProcedure, + svc.Invite, + connect.WithSchema(tenantServiceInviteMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + tenantServiceInviteAcceptHandler := connect.NewUnaryHandler( + TenantServiceInviteAcceptProcedure, + svc.InviteAccept, + connect.WithSchema(tenantServiceInviteAcceptMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + tenantServiceInviteDeleteHandler := connect.NewUnaryHandler( + TenantServiceInviteDeleteProcedure, + svc.InviteDelete, + connect.WithSchema(tenantServiceInviteDeleteMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + tenantServiceInvitesListHandler := connect.NewUnaryHandler( + TenantServiceInvitesListProcedure, + svc.InvitesList, + connect.WithSchema(tenantServiceInvitesListMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + tenantServiceInviteGetHandler := connect.NewUnaryHandler( + TenantServiceInviteGetProcedure, + svc.InviteGet, + connect.WithSchema(tenantServiceInviteGetMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) return "/api.v1.TenantService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { case TenantServiceCreateProcedure: tenantServiceCreateHandler.ServeHTTP(w, r) case TenantServiceCreateOrUpdateProcedure: tenantServiceCreateOrUpdateHandler.ServeHTTP(w, r) + case TenantServiceListProcedure: + tenantServiceListHandler.ServeHTTP(w, r) case TenantServiceGetProcedure: tenantServiceGetHandler.ServeHTTP(w, r) case TenantServiceUpdateProcedure: tenantServiceUpdateHandler.ServeHTTP(w, r) case TenantServiceDeleteProcedure: tenantServiceDeleteHandler.ServeHTTP(w, r) + case TenantServiceRemoveMemberProcedure: + tenantServiceRemoveMemberHandler.ServeHTTP(w, r) + case TenantServiceUpdateMemberProcedure: + tenantServiceUpdateMemberHandler.ServeHTTP(w, r) + case TenantServiceInviteProcedure: + tenantServiceInviteHandler.ServeHTTP(w, r) + case TenantServiceInviteAcceptProcedure: + tenantServiceInviteAcceptHandler.ServeHTTP(w, r) + case TenantServiceInviteDeleteProcedure: + tenantServiceInviteDeleteHandler.ServeHTTP(w, r) + case TenantServiceInvitesListProcedure: + tenantServiceInvitesListHandler.ServeHTTP(w, r) + case TenantServiceInviteGetProcedure: + tenantServiceInviteGetHandler.ServeHTTP(w, r) default: http.NotFound(w, r) } @@ -228,6 +449,10 @@ func (UnimplementedTenantServiceHandler) CreateOrUpdate(context.Context, *connec return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.TenantService.CreateOrUpdate is not implemented")) } +func (UnimplementedTenantServiceHandler) List(context.Context, *connect.Request[v1.TenantServiceListRequest]) (*connect.Response[v1.TenantServiceListResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.TenantService.List is not implemented")) +} + func (UnimplementedTenantServiceHandler) Get(context.Context, *connect.Request[v1.TenantServiceGetRequest]) (*connect.Response[v1.TenantServiceGetResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.TenantService.Get is not implemented")) } @@ -239,3 +464,31 @@ func (UnimplementedTenantServiceHandler) Update(context.Context, *connect.Reques func (UnimplementedTenantServiceHandler) Delete(context.Context, *connect.Request[v1.TenantServiceDeleteRequest]) (*connect.Response[v1.TenantServiceDeleteResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.TenantService.Delete is not implemented")) } + +func (UnimplementedTenantServiceHandler) RemoveMember(context.Context, *connect.Request[v1.TenantServiceRemoveMemberRequest]) (*connect.Response[v1.TenantServiceRemoveMemberResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.TenantService.RemoveMember is not implemented")) +} + +func (UnimplementedTenantServiceHandler) UpdateMember(context.Context, *connect.Request[v1.TenantServiceUpdateMemberRequest]) (*connect.Response[v1.TenantServiceUpdateMemberResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.TenantService.UpdateMember is not implemented")) +} + +func (UnimplementedTenantServiceHandler) Invite(context.Context, *connect.Request[v1.TenantServiceInviteRequest]) (*connect.Response[v1.TenantServiceInviteResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.TenantService.Invite is not implemented")) +} + +func (UnimplementedTenantServiceHandler) InviteAccept(context.Context, *connect.Request[v1.TenantServiceInviteAcceptRequest]) (*connect.Response[v1.TenantServiceInviteAcceptResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.TenantService.InviteAccept is not implemented")) +} + +func (UnimplementedTenantServiceHandler) InviteDelete(context.Context, *connect.Request[v1.TenantServiceInviteDeleteRequest]) (*connect.Response[v1.TenantServiceInviteDeleteResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.TenantService.InviteDelete is not implemented")) +} + +func (UnimplementedTenantServiceHandler) InvitesList(context.Context, *connect.Request[v1.TenantServiceInvitesListRequest]) (*connect.Response[v1.TenantServiceInvitesListResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.TenantService.InvitesList is not implemented")) +} + +func (UnimplementedTenantServiceHandler) InviteGet(context.Context, *connect.Request[v1.TenantServiceInviteGetRequest]) (*connect.Response[v1.TenantServiceInviteGetResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("api.v1.TenantService.InviteGet is not implemented")) +} diff --git a/go/api/v1/assets.pb.go b/go/api/v1/assets.pb.go index 48d5d76d..f5fe51ce 100644 --- a/go/api/v1/assets.pb.go +++ b/go/api/v1/assets.pb.go @@ -561,7 +561,7 @@ func (*AssetServiceListRequest) Descriptor() ([]byte, []int) { return file_api_v1_assets_proto_rawDescGZIP(), []int{6} } -// AssetServiceListResponse is the response payload which containes the the Asset list +// AssetServiceListResponse is the response payload which contains the the Asset list type AssetServiceListResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache diff --git a/go/api/v1/cluster.pb.go b/go/api/v1/cluster.pb.go index ceabd6e3..902d0c2a 100644 --- a/go/api/v1/cluster.pb.go +++ b/go/api/v1/cluster.pb.go @@ -23,7 +23,7 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// Operate defines the types of reconcilation to be triggered +// Operate defines the types of reconciliation to be triggered type Operate int32 const ( @@ -33,7 +33,7 @@ const ( Operate_OPERATE_RECONCILE Operate = 1 // OPERATE_MAINTAIN maintain the cluster Operate_OPERATE_MAINTAIN Operate = 2 - // OPERATE_RETRY retry the reconcilation of the cluster + // OPERATE_RETRY retry the reconciliation of the cluster Operate_OPERATE_RETRY Operate = 3 ) @@ -1219,7 +1219,7 @@ type ClusterStatus struct { // Uuid of the cluster Uuid string `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"` - // Progress of the cluster reconcilation + // Progress of the cluster reconciliation Progress uint32 `protobuf:"varint,2,opt,name=progress,proto3" json:"progress,omitempty"` // State of the cluster State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` @@ -1233,7 +1233,7 @@ type ClusterStatus struct { NodesReady string `protobuf:"bytes,12,opt,name=nodes_ready,json=nodesReady,proto3" json:"nodes_ready,omitempty"` // SystemComponentsReady represents the ready state of the system components SystemComponentsReady string `protobuf:"bytes,13,opt,name=system_components_ready,json=systemComponentsReady,proto3" json:"system_components_ready,omitempty"` - // LastErrors is a list of the last known errors occured during the cluster reconcilation + // LastErrors is a list of the last known errors occurred during the cluster reconciliation LastErrors []*ClusterStatusLastError `protobuf:"bytes,14,rep,name=last_errors,json=lastErrors,proto3" json:"last_errors,omitempty"` // ClusterStatusConditions is a list of status conditions of the cluster Conditions []*ClusterStatusCondition `protobuf:"bytes,15,rep,name=conditions,proto3" json:"conditions,omitempty"` diff --git a/go/api/v1/payment.pb.go b/go/api/v1/payment.pb.go index af0dcc40..c1d82cc5 100644 --- a/go/api/v1/payment.pb.go +++ b/go/api/v1/payment.pb.go @@ -2272,7 +2272,7 @@ var file_api_v1_payment_proto_rawDesc = []byte{ 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, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd1, 0x04, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xda, 0x04, 0x0a, 0x0f, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, @@ -2285,245 +2285,125 @@ var file_api_v1_payment_proto_rawDesc = []byte{ 0x6f, 0x64, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x12, 0x19, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x03, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x04, 0x63, - 0x61, 0x72, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x48, 0x04, 0x52, 0x04, 0x63, 0x61, 0x72, 0x64, 0x88, - 0x01, 0x01, 0x12, 0x25, 0x0a, 0x06, 0x70, 0x72, 0x69, 0x63, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x63, - 0x65, 0x52, 0x06, 0x70, 0x72, 0x69, 0x63, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x07, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x2b, 0x0a, 0x06, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, - 0x75, 0x70, 0x6f, 0x6e, 0x48, 0x05, 0x52, 0x06, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x88, 0x01, - 0x01, 0x12, 0x15, 0x0a, 0x03, 0x76, 0x61, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, - 0x52, 0x03, 0x76, 0x61, 0x74, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x70, 0x68, 0x6f, 0x6e, - 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x07, - 0x52, 0x0b, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x88, 0x01, 0x01, - 0x12, 0x1d, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x03, 0x48, 0x08, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x88, 0x01, 0x01, 0x42, - 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x70, 0x61, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x69, 0x64, 0x42, 0x08, - 0x0a, 0x06, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x63, 0x61, 0x72, - 0x64, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x42, 0x06, 0x0a, 0x04, - 0x5f, 0x76, 0x61, 0x74, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x5f, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, - 0x65, 0x22, 0x85, 0x01, 0x0a, 0x04, 0x43, 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x72, - 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x62, 0x72, 0x61, 0x6e, 0x64, - 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x78, - 0x70, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x65, - 0x78, 0x70, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x5f, 0x79, - 0x65, 0x61, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x78, 0x70, 0x59, 0x65, - 0x61, 0x72, 0x12, 0x15, 0x0a, 0x06, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x34, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x73, 0x74, 0x34, 0x22, 0x81, 0x02, 0x0a, 0x05, 0x50, 0x72, - 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x75, 0x6e, 0x69, 0x74, 0x5f, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x75, 0x6e, 0x69, 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x63, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x63, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x74, 0x5f, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x6e, 0x69, 0x74, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x12, 0x36, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x70, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x31, 0x0a, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x02, 0x18, 0xf4, 0x03, 0x48, 0x00, 0x52, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, - 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9a, 0x01, - 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6e, - 0x65, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x69, 0x6e, 0x65, 0x31, 0x12, - 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6e, 0x65, 0x32, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x6c, 0x69, 0x6e, 0x65, 0x32, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x73, 0x74, 0x61, 0x6c, 0x5f, - 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x74, - 0x61, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x69, 0x74, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x9a, 0x02, 0x0a, 0x15, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x61, 0x67, 0x65, - 0x49, 0x74, 0x65, 0x6d, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x12, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3d, 0x0a, - 0x0c, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, 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, 0x52, - 0x0b, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x39, 0x0a, 0x0a, - 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x05, 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, 0x52, 0x09, 0x70, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x45, 0x6e, 0x64, 0x22, 0xbd, 0x01, 0x0a, 0x07, 0x49, 0x6e, 0x76, 0x6f, - 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x70, 0x64, 0x66, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, - 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, - 0x64, 0x66, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x72, 0x6c, 0x12, 0x3d, 0x0a, - 0x0c, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, 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, 0x52, - 0x0b, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x39, 0x0a, 0x0a, - 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x05, 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, 0x52, 0x09, 0x70, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x45, 0x6e, 0x64, 0x22, 0xf8, 0x02, 0x0a, 0x06, 0x43, 0x6f, 0x75, 0x70, - 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 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, 0x1d, 0x0a, 0x0a, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x5f, 0x6f, 0x66, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x61, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x4f, 0x66, 0x66, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, - 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, - 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, - 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x64, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x39, 0x0a, - 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 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, 0x52, 0x09, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x37, 0x0a, 0x09, 0x72, 0x65, 0x64, 0x65, - 0x65, 0x6d, 0x5f, 0x62, 0x79, 0x18, 0x07, 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, 0x52, 0x08, 0x72, 0x65, 0x64, 0x65, 0x65, 0x6d, 0x42, - 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x64, 0x65, 0x65, - 0x6d, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x52, 0x65, 0x64, 0x65, 0x65, 0x6d, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, - 0x72, 0x65, 0x64, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x64, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6c, 0x65, 0x66, 0x74, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x65, - 0x66, 0x74, 0x22, 0xc7, 0x01, 0x0a, 0x2b, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x20, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x02, 0x18, 0x80, 0x01, 0x52, 0x05, 0x6c, - 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x52, - 0x08, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x1d, 0x61, 0x63, 0x63, - 0x65, 0x70, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, - 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x1a, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x41, - 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x63, 0x0a, 0x2c, + 0x12, 0x22, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x60, 0x01, 0x48, 0x03, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, + 0x6c, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x04, 0x63, 0x61, 0x72, 0x64, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x72, 0x64, + 0x48, 0x04, 0x52, 0x04, 0x63, 0x61, 0x72, 0x64, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x06, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x06, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x73, 0x12, 0x29, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2b, 0x0a, + 0x06, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x48, 0x05, 0x52, + 0x06, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, 0x76, 0x61, + 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x03, 0x76, 0x61, 0x74, 0x88, 0x01, + 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x07, 0x52, 0x0b, 0x70, 0x68, 0x6f, 0x6e, 0x65, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x62, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x48, 0x08, 0x52, 0x07, 0x62, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x69, 0x64, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x6d, 0x61, 0x69, + 0x6c, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x63, 0x61, 0x72, 0x64, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x63, + 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x76, 0x61, 0x74, 0x42, 0x0f, 0x0a, + 0x0d, 0x5f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x42, 0x0a, + 0x0a, 0x08, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x85, 0x01, 0x0a, 0x04, 0x43, + 0x61, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x78, 0x70, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x65, 0x78, 0x70, 0x4d, 0x6f, 0x6e, 0x74, 0x68, + 0x12, 0x19, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x5f, 0x79, 0x65, 0x61, 0x72, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x07, 0x65, 0x78, 0x70, 0x59, 0x65, 0x61, 0x72, 0x12, 0x15, 0x0a, 0x06, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x34, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x73, + 0x74, 0x34, 0x22, 0x81, 0x02, 0x0a, 0x05, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x2e, 0x0a, 0x13, 0x75, 0x6e, 0x69, 0x74, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, + 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x75, + 0x6e, 0x69, 0x74, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, + 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x1d, 0x0a, 0x0a, + 0x75, 0x6e, 0x69, 0x74, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x75, 0x6e, 0x69, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x36, 0x0a, 0x0c, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x13, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x31, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, + 0x02, 0x18, 0xf4, 0x03, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9a, 0x01, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6e, 0x65, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x6c, 0x69, 0x6e, 0x65, 0x31, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6e, 0x65, + 0x32, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x69, 0x6e, 0x65, 0x32, 0x12, 0x1f, + 0x0a, 0x0b, 0x70, 0x6f, 0x73, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x63, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, + 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x72, 0x79, 0x22, 0x9a, 0x02, 0x0a, 0x15, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x61, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x30, 0x0a, + 0x14, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x74, + 0x65, 0x6d, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x12, + 0x34, 0x0a, 0x16, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x74, 0x65, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x14, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x74, 0x65, + 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x75, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3d, 0x0a, 0x0c, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, 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, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, + 0x65, 0x6e, 0x64, 0x18, 0x05, 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, 0x52, 0x09, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x45, 0x6e, 0x64, + 0x22, 0xbd, 0x01, 0x0a, 0x07, 0x49, 0x6e, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x28, 0x0a, 0x10, + 0x70, 0x64, 0x66, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x75, 0x72, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x64, 0x66, 0x44, 0x6f, 0x77, 0x6e, 0x6c, + 0x6f, 0x61, 0x64, 0x55, 0x72, 0x6c, 0x12, 0x3d, 0x0a, 0x0c, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x04, 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, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, + 0x65, 0x6e, 0x64, 0x18, 0x05, 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, 0x52, 0x09, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x45, 0x6e, 0x64, + 0x22, 0xf8, 0x02, 0x0a, 0x06, 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 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, + 0x1d, 0x0a, 0x0a, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6f, 0x66, 0x66, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x4f, 0x66, 0x66, 0x12, 0x1a, + 0x0a, 0x08, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x6e, 0x4d, 0x6f, 0x6e, 0x74, 0x68, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 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, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x37, 0x0a, 0x09, 0x72, 0x65, 0x64, 0x65, 0x65, 0x6d, 0x5f, 0x62, 0x79, 0x18, 0x07, + 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, + 0x52, 0x08, 0x72, 0x65, 0x64, 0x65, 0x65, 0x6d, 0x42, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x64, 0x65, 0x65, 0x6d, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x64, 0x65, 0x65, 0x6d, 0x65, + 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x64, 0x65, 0x6d, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x52, + 0x65, 0x64, 0x65, 0x6d, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0a, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x4c, 0x65, 0x66, 0x74, 0x22, 0xc7, 0x01, 0x0a, 0x2b, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x08, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x52, 0x08, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, - 0x72, 0x22, 0x65, 0x0a, 0x20, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x02, 0x18, 0x80, 0x01, - 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x49, 0x64, 0x22, 0x58, 0x0a, 0x21, 0x50, 0x61, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x43, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, - 0x08, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x52, 0x08, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x29, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x57, - 0x69, 0x74, 0x68, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x20, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, - 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x02, 0x18, 0x80, 0x01, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, - 0x6e, 0x22, 0x61, 0x0a, 0x2a, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x57, 0x69, - 0x74, 0x68, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x33, 0x0a, 0x08, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x52, 0x08, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x65, 0x72, 0x22, 0x4e, 0x0a, 0x2a, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x66, 0x43, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x20, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x02, 0x18, 0x80, 0x01, 0x52, 0x05, 0x6c, - 0x6f, 0x67, 0x69, 0x6e, 0x22, 0x7a, 0x0a, 0x2b, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x66, 0x43, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x52, 0x08, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x78, 0x69, 0x73, - 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, - 0x22, 0x6f, 0x0a, 0x25, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x48, 0x61, 0x73, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x68, - 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x05, 0x6c, 0x6f, 0x67, - 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, - 0x02, 0x18, 0x80, 0x01, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x24, 0x0a, 0x07, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, - 0x07, 0x72, 0x05, 0x10, 0x02, 0x18, 0x80, 0x01, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x22, 0x8c, 0x01, 0x0a, 0x26, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x48, 0x61, 0x73, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x65, 0x78, - 0x69, 0x73, 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x5f, 0x6c, - 0x65, 0x66, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x63, 0x6f, 0x75, 0x70, 0x6f, - 0x6e, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, - 0x65, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x22, 0x4c, 0x0a, 0x28, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, - 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x05, - 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, - 0x72, 0x05, 0x10, 0x02, 0x18, 0x80, 0x01, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x22, 0x2b, - 0x0a, 0x29, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, - 0x68, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0x0a, 0x29, 0x50, - 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x61, 0x67, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x02, - 0x18, 0x80, 0x01, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x22, 0x85, 0x01, 0x0a, 0x2a, 0x50, - 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x61, 0x67, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x57, 0x0a, 0x18, 0x73, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, - 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x55, 0x73, 0x61, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x16, 0x73, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x61, 0x67, 0x65, 0x49, 0x74, 0x65, - 0x6d, 0x73, 0x22, 0x70, 0x0a, 0x20, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x02, 0x18, 0x80, - 0x01, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x2a, 0x0a, 0x0b, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xfa, - 0x42, 0x06, 0x72, 0x04, 0x10, 0x12, 0x18, 0x12, 0x52, 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x65, 0x72, 0x49, 0x64, 0x22, 0x50, 0x0a, 0x21, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x76, 0x6f, 0x69, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x08, 0x69, 0x6e, 0x76, - 0x6f, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x52, 0x08, 0x69, 0x6e, - 0x76, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x22, 0x27, 0x0a, 0x25, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x4f, 0x0a, 0x26, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x06, 0x70, 0x72, 0x69, - 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x06, 0x70, 0x72, 0x69, 0x63, 0x65, 0x73, - 0x22, 0x3a, 0x0a, 0x22, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x41, 0x64, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x22, 0x5f, 0x0a, 0x23, - 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x41, 0x64, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x64, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x64, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x12, - 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x22, 0xda, 0x01, - 0x0a, 0x25, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x33, 0x0a, + 0x6f, 0x6d, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x05, 0x6c, + 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, + 0x05, 0x10, 0x02, 0x18, 0x80, 0x01, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x52, 0x08, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, @@ -2531,170 +2411,291 @@ var file_api_v1_payment_proto_rawDesc = []byte{ 0x65, 0x72, 0x6d, 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x41, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x63, - 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x65, 0x6d, - 0x61, 0x69, 0x6c, 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x74, 0x22, 0x28, 0x0a, 0x26, 0x50, 0x61, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x41, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x0a, 0x2b, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x61, 0x73, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x61, - 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x22, 0x53, 0x0a, 0x2c, 0x50, 0x61, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x61, 0x73, 0x43, 0x68, - 0x61, 0x72, 0x67, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x61, 0x73, - 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0c, 0x68, 0x61, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x57, - 0x0a, 0x21, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x53, 0x65, 0x74, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x62, - 0x6f, 0x61, 0x72, 0x64, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, 0x64, 0x22, 0x42, 0x0a, 0x22, 0x50, 0x61, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x65, 0x74, 0x4f, 0x6e, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x09, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, 0x64, 0x22, 0x39, 0x0a, 0x21, 0x50, - 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, - 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x22, 0x42, 0x0a, 0x22, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x62, 0x6f, 0x61, - 0x72, 0x64, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x09, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2a, 0x96, 0x01, 0x0a, 0x0b, 0x50, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x52, - 0x4f, 0x44, 0x55, 0x43, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x52, 0x4f, 0x44, - 0x55, 0x43, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, - 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, - 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x54, - 0x57, 0x4f, 0x52, 0x4b, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, - 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4b, 0x55, 0x42, 0x45, 0x52, 0x4e, 0x45, 0x54, 0x45, - 0x53, 0x10, 0x05, 0x32, 0x8a, 0x0e, 0x0a, 0x0e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x89, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, - 0x72, 0x12, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, - 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x04, 0xc0, 0xf3, - 0x18, 0x01, 0x12, 0x6c, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, - 0x72, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x63, 0x0a, 0x2c, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, + 0x52, 0x08, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x22, 0x65, 0x0a, 0x20, 0x50, 0x61, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, + 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, + 0x42, 0x07, 0x72, 0x05, 0x10, 0x02, 0x18, 0x80, 0x01, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, + 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x49, + 0x64, 0x22, 0x58, 0x0a, 0x21, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0xc0, 0xf3, 0x18, 0x01, 0xe8, 0xf3, 0x18, 0x02, - 0x12, 0x83, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, - 0x57, 0x69, 0x74, 0x68, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x47, 0x65, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x57, 0x69, 0x74, 0x68, - 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x57, - 0x69, 0x74, 0x68, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x04, 0xc0, 0xf3, 0x18, 0x01, 0x12, 0x8a, 0x01, 0x0a, 0x15, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x49, 0x66, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, - 0x12, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x66, 0x43, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x49, 0x66, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x45, 0x78, 0x69, 0x73, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0xc0, 0xf3, 0x18, 0x01, 0xe8, - 0xf3, 0x18, 0x02, 0x12, 0x83, 0x01, 0x0a, 0x10, 0x48, 0x61, 0x73, 0x50, 0x61, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x48, 0x61, 0x73, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, - 0x61, 0x73, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x10, 0xc0, 0xf3, 0x18, 0x01, 0xc0, 0xf3, 0x18, - 0x02, 0xc0, 0xf3, 0x18, 0x03, 0xe8, 0xf3, 0x18, 0x02, 0x12, 0x80, 0x01, 0x0a, 0x13, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, - 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, + 0x72, 0x52, 0x08, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x29, 0x50, + 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x6f, 0x67, 0x69, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x02, + 0x18, 0x80, 0x01, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x22, 0x61, 0x0a, 0x2a, 0x50, 0x61, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x6f, 0x67, 0x69, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x65, 0x72, 0x52, 0x08, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x22, 0x4e, 0x0a, + 0x2a, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x49, 0x66, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x45, 0x78, + 0x69, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x05, 0x6c, + 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, + 0x05, 0x10, 0x02, 0x18, 0x80, 0x01, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x22, 0x7a, 0x0a, + 0x2b, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x49, 0x66, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x45, 0x78, + 0x69, 0x73, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x08, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x52, 0x08, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, + 0x72, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x22, 0x6f, 0x0a, 0x25, 0x50, 0x61, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x61, 0x73, 0x50, 0x61, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x20, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x02, 0x18, 0x80, 0x01, 0x52, 0x05, 0x6c, + 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x24, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x02, 0x18, 0x80, + 0x01, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x8c, 0x01, 0x0a, 0x26, 0x50, + 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x61, 0x73, + 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, 0x1f, 0x0a, + 0x0b, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0a, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x29, + 0x0a, 0x10, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x76, 0x65, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x4c, 0x0a, 0x28, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x04, 0xc0, 0xf3, 0x18, 0x01, 0x12, 0x87, 0x01, 0x0a, - 0x14, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x61, 0x67, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x55, - 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0xc0, 0xf3, - 0x18, 0x01, 0xe8, 0xf3, 0x18, 0x02, 0x12, 0x6c, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x76, - 0x6f, 0x69, 0x63, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x02, 0x18, 0x80, 0x01, + 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x22, 0x2b, 0x0a, 0x29, 0x50, 0x61, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, + 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0x0a, 0x29, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x20, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x02, 0x18, 0x80, 0x01, 0x52, 0x05, 0x6c, 0x6f, + 0x67, 0x69, 0x6e, 0x22, 0x85, 0x01, 0x0a, 0x2a, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x57, 0x0a, 0x18, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x61, 0x67, 0x65, 0x49, + 0x74, 0x65, 0x6d, 0x52, 0x16, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x55, 0x73, 0x61, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x70, 0x0a, 0x20, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, - 0x49, 0x6e, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x76, 0x6f, 0x69, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0xc0, 0xf3, 0x18, 0x01, - 0xe8, 0xf3, 0x18, 0x02, 0x12, 0x7b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x12, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, - 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0xd8, 0xf3, 0x18, 0x01, 0xe8, 0xf3, 0x18, - 0x02, 0x12, 0x7a, 0x0a, 0x0d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x41, 0x64, 0x6d, 0x69, 0x74, 0x74, - 0x65, 0x64, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x41, - 0x64, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x41, 0x64, 0x6d, 0x69, 0x74, - 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x10, 0xc0, 0xf3, 0x18, - 0x01, 0xc0, 0xf3, 0x18, 0x02, 0xc0, 0xf3, 0x18, 0x03, 0xe8, 0xf3, 0x18, 0x02, 0x12, 0x7f, 0x0a, - 0x10, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, + 0x49, 0x6e, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x20, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, + 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x02, 0x18, 0x80, 0x01, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, + 0x6e, 0x12, 0x2a, 0x0a, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x72, 0x04, 0x10, 0x12, 0x18, + 0x12, 0x52, 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x49, 0x64, 0x22, 0x50, 0x0a, + 0x21, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, + 0x65, 0x74, 0x49, 0x6e, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x08, 0x69, 0x6e, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, + 0x76, 0x6f, 0x69, 0x63, 0x65, 0x52, 0x08, 0x69, 0x6e, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x22, + 0x27, 0x0a, 0x25, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4f, 0x0a, 0x26, 0x50, 0x61, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x25, 0x0a, 0x06, 0x70, 0x72, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x52, 0x06, 0x70, 0x72, 0x69, 0x63, 0x65, 0x73, 0x22, 0x3a, 0x0a, 0x22, 0x50, 0x61, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x41, 0x64, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x22, 0x5f, 0x0a, 0x23, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x41, 0x64, 0x6d, 0x69, + 0x74, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x61, 0x64, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x61, 0x64, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x22, 0xda, 0x01, 0x0a, 0x25, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, - 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x0c, 0xc0, 0xf3, 0x18, 0x01, 0xc0, 0xf3, 0x18, 0x02, 0xe8, 0xf3, 0x18, 0x02, 0x12, 0x95, - 0x01, 0x0a, 0x16, 0x48, 0x61, 0x73, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x61, 0x62, 0x6c, 0x65, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x33, 0x0a, 0x08, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, + 0x72, 0x52, 0x08, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x1d, 0x61, + 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x5f, 0x61, 0x6e, + 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x1a, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x54, 0x65, 0x72, 0x6d, + 0x73, 0x41, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, + 0x0a, 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x43, 0x6f, 0x6e, 0x73, + 0x65, 0x6e, 0x74, 0x22, 0x28, 0x0a, 0x26, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x64, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x0a, + 0x2b, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, + 0x61, 0x73, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x6f, 0x67, + 0x69, 0x6e, 0x22, 0x53, 0x0a, 0x2c, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x48, 0x61, 0x73, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x61, 0x62, 0x6c, + 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x68, 0x61, 0x73, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x57, 0x0a, 0x21, 0x50, 0x61, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x65, 0x74, 0x4f, 0x6e, 0x62, 0x6f, + 0x61, 0x72, 0x64, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x6f, 0x67, + 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, 0x64, + 0x22, 0x42, 0x0a, 0x22, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x53, 0x65, 0x74, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, + 0x64, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x65, 0x64, 0x22, 0x39, 0x0a, 0x21, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, + 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x67, + 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x22, + 0x42, 0x0a, 0x22, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, 0x64, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, + 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, + 0x64, 0x65, 0x64, 0x2a, 0x96, 0x01, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x50, + 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x50, + 0x55, 0x54, 0x45, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x10, 0x03, 0x12, + 0x1b, 0x0a, 0x17, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x4b, 0x55, 0x42, 0x45, 0x52, 0x4e, 0x45, 0x54, 0x45, 0x53, 0x10, 0x05, 0x32, 0x8a, 0x0e, 0x0a, + 0x0e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x89, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x12, 0x33, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x34, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x04, 0xc0, 0xf3, 0x18, 0x01, 0x12, 0x6c, 0x0a, 0x0b, 0x47, + 0x65, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x47, 0x65, 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x08, 0xc0, 0xf3, 0x18, 0x01, 0xe8, 0xf3, 0x18, 0x02, 0x12, 0x83, 0x01, 0x0a, 0x14, 0x47, 0x65, + 0x74, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x6f, 0x67, + 0x69, 0x6e, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x43, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x6f, 0x67, 0x69, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x04, 0xc0, 0xf3, 0x18, 0x01, 0x12, + 0x8a, 0x01, 0x0a, 0x15, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x66, 0x43, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x65, 0x72, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x48, 0x61, 0x73, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, + 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x66, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, + 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x66, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x65, 0x72, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x08, 0xc0, 0xf3, 0x18, 0x01, 0xe8, 0xf3, 0x18, 0x02, 0x12, 0x83, 0x01, 0x0a, + 0x10, 0x48, 0x61, 0x73, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x12, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x61, 0x73, 0x50, 0x61, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x61, 0x73, 0x50, 0x61, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x10, 0xc0, 0xf3, 0x18, 0x01, 0xc0, 0xf3, 0x18, 0x02, 0xc0, 0xf3, 0x18, 0x03, 0xe8, 0xf3, + 0x18, 0x02, 0x12, 0x80, 0x01, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x61, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x30, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x04, 0xc0, 0xf3, 0x18, 0x01, 0x12, 0x87, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x61, 0x73, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x61, - 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x10, 0xc0, 0xf3, 0x18, 0x01, 0xc0, 0xf3, 0x18, 0x02, 0xc0, 0xf3, - 0x18, 0x03, 0xe8, 0xf3, 0x18, 0x02, 0x12, 0x6b, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x4f, 0x6e, 0x62, - 0x6f, 0x61, 0x72, 0x64, 0x65, 0x64, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x65, - 0x74, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x65, 0x74, 0x4f, 0x6e, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x04, 0xc0, - 0xf3, 0x18, 0x01, 0x12, 0x6b, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x65, 0x64, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x4f, 0x6e, - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x32, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0xc0, 0xf3, 0x18, 0x01, 0xe8, 0xf3, 0x18, 0x02, 0x12, + 0x6c, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x04, 0xc0, 0xf3, 0x18, 0x01, - 0x42, 0x85, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, - 0x0c, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, - 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65, 0x74, 0x61, - 0x6c, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x70, 0x69, 0x76, - 0x31, 0xa2, 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, 0x02, 0x06, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x31, - 0xca, 0x02, 0x06, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x12, 0x41, 0x70, 0x69, 0x5c, - 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, - 0x07, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x76, 0x6f, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x47, 0x65, 0x74, 0x49, 0x6e, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x08, 0xc0, 0xf3, 0x18, 0x01, 0xe8, 0xf3, 0x18, 0x02, 0x12, 0x7b, 0x0a, + 0x10, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x73, 0x12, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x08, 0xd8, 0xf3, 0x18, 0x01, 0xe8, 0xf3, 0x18, 0x02, 0x12, 0x7a, 0x0a, 0x0d, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x41, 0x64, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x12, 0x2a, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x41, 0x64, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x41, 0x64, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x10, 0xc0, 0xf3, 0x18, 0x01, 0xc0, 0xf3, 0x18, 0x02, 0xc0, 0xf3, + 0x18, 0x03, 0xe8, 0xf3, 0x18, 0x02, 0x12, 0x7f, 0x0a, 0x10, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x41, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x41, 0x64, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0xc0, 0xf3, 0x18, 0x01, 0xc0, + 0xf3, 0x18, 0x02, 0xe8, 0xf3, 0x18, 0x02, 0x12, 0x95, 0x01, 0x0a, 0x16, 0x48, 0x61, 0x73, 0x43, + 0x68, 0x61, 0x72, 0x67, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x12, 0x33, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x61, 0x73, 0x43, 0x68, 0x61, + 0x72, 0x67, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, + 0x61, 0x73, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x10, 0xc0, + 0xf3, 0x18, 0x01, 0xc0, 0xf3, 0x18, 0x02, 0xc0, 0xf3, 0x18, 0x03, 0xe8, 0xf3, 0x18, 0x02, 0x12, + 0x6b, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, 0x64, 0x12, + 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x65, 0x74, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, + 0x64, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x53, 0x65, 0x74, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x04, 0xc0, 0xf3, 0x18, 0x01, 0x12, 0x6b, 0x0a, 0x0c, + 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, 0x64, 0x12, 0x29, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, + 0x65, 0x74, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x04, 0xc0, 0xf3, 0x18, 0x01, 0x42, 0x85, 0x01, 0x0a, 0x0a, 0x63, 0x6f, + 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0c, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, + 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x41, 0x58, 0x58, + 0xaa, 0x02, 0x06, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x06, 0x41, 0x70, 0x69, 0x5c, + 0x56, 0x31, 0xe2, 0x02, 0x12, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x07, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x56, + 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/go/api/v1/payment.pb.validate.go b/go/api/v1/payment.pb.validate.go index 66707ef8..d7b2166a 100644 --- a/go/api/v1/payment.pb.validate.go +++ b/go/api/v1/payment.pb.validate.go @@ -137,7 +137,19 @@ func (m *PaymentCustomer) validate(all bool) error { } if m.Email != nil { - // no validation rules for Email + + if err := m._validateEmail(m.GetEmail()); err != nil { + err = PaymentCustomerValidationError{ + field: "Email", + reason: "value must be a valid email address", + cause: err, + } + if !all { + return err + } + errors = append(errors, err) + } + } if m.Card != nil { @@ -225,6 +237,56 @@ func (m *PaymentCustomer) validate(all bool) error { return nil } +func (m *PaymentCustomer) _validateHostname(host string) error { + s := strings.ToLower(strings.TrimSuffix(host, ".")) + + if len(host) > 253 { + return errors.New("hostname cannot exceed 253 characters") + } + + for _, part := range strings.Split(s, ".") { + if l := len(part); l == 0 || l > 63 { + return errors.New("hostname part must be non-empty and cannot exceed 63 characters") + } + + if part[0] == '-' { + return errors.New("hostname parts cannot begin with hyphens") + } + + if part[len(part)-1] == '-' { + return errors.New("hostname parts cannot end with hyphens") + } + + for _, r := range part { + if (r < 'a' || r > 'z') && (r < '0' || r > '9') && r != '-' { + return fmt.Errorf("hostname parts can only contain alphanumeric characters or hyphens, got %q", string(r)) + } + } + } + + return nil +} + +func (m *PaymentCustomer) _validateEmail(addr string) error { + a, err := mail.ParseAddress(addr) + if err != nil { + return err + } + addr = a.Address + + if len(addr) > 254 { + return errors.New("email addresses cannot exceed 254 characters") + } + + parts := strings.SplitN(addr, "@", 2) + + if len(parts[0]) > 64 { + return errors.New("email address local phrase cannot exceed 64 characters") + } + + return m._validateHostname(parts[1]) +} + // PaymentCustomerMultiError is an error wrapping multiple validation errors // returned by PaymentCustomer.ValidateAll() if the designated constraints // aren't met. diff --git a/go/api/v1/project.pb.go b/go/api/v1/project.pb.go index e8e9eeed..190fd3a1 100644 --- a/go/api/v1/project.pb.go +++ b/go/api/v1/project.pb.go @@ -915,7 +915,7 @@ type ProjectServiceInviteResponse struct { unknownFields protoimpl.UnknownFields // Inviter contains a secret which can be sent to a potential user - // can appended to the invitation endpoint at our api server like + // can be appended to the invitation endpoint at our cloud console like // console.metalstack.cloud/invite/ Invite *ProjectInvite `protobuf:"bytes,1,opt,name=invite,proto3" json:"invite,omitempty"` } diff --git a/go/api/v1/tenant.pb.go b/go/api/v1/tenant.pb.go index 5fa94272..4ece08e9 100644 --- a/go/api/v1/tenant.pb.go +++ b/go/api/v1/tenant.pb.go @@ -7,6 +7,7 @@ package apiv1 import ( + _ "github.com/envoyproxy/protoc-gen-validate/validate" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" timestamppb "google.golang.org/protobuf/types/known/timestamppb" @@ -29,10 +30,12 @@ type Tenant struct { // Login of the tenant Login string `protobuf:"bytes,1,opt,name=login,proto3" json:"login,omitempty"` - // Name if the tenant + // Name of the tenant Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` // Email of the tenant Email string `protobuf:"bytes,3,opt,name=email,proto3" json:"email,omitempty"` + // Description of this tenant + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` // AvatarUrl of the tenant AvatarUrl string `protobuf:"bytes,5,opt,name=avatar_url,json=avatarUrl,proto3" json:"avatar_url,omitempty"` // OauthProvider of the tenant @@ -49,6 +52,10 @@ type Tenant struct { EmailConsent bool `protobuf:"varint,12,opt,name=email_consent,json=emailConsent,proto3" json:"email_consent,omitempty"` // Onboarded checks if the tenant was asked to be onboarded Onboarded bool `protobuf:"varint,13,opt,name=onboarded,proto3" json:"onboarded,omitempty"` + // TenantMembers of this tenant + TenantMembers []*TenantMember `protobuf:"bytes,14,rep,name=tenant_members,json=tenantMembers,proto3" json:"tenant_members,omitempty"` + // CreatedBy stores who created this tenant + CreatedBy string `protobuf:"bytes,15,opt,name=created_by,json=createdBy,proto3" json:"created_by,omitempty"` // CreatedAt the date when this tenant was created CreatedAt *timestamppb.Timestamp `protobuf:"bytes,20,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` // UpdatedAt the date when this tenant was updated @@ -110,6 +117,13 @@ func (x *Tenant) GetEmail() string { return "" } +func (x *Tenant) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + func (x *Tenant) GetAvatarUrl() string { if x != nil { return x.AvatarUrl @@ -166,6 +180,20 @@ func (x *Tenant) GetOnboarded() bool { return false } +func (x *Tenant) GetTenantMembers() []*TenantMember { + if x != nil { + return x.TenantMembers + } + return nil +} + +func (x *Tenant) GetCreatedBy() string { + if x != nil { + return x.CreatedBy + } + return "" +} + func (x *Tenant) GetCreatedAt() *timestamppb.Timestamp { if x != nil { return x.CreatedAt @@ -187,6 +215,194 @@ func (x *Tenant) GetDeletedAt() *timestamppb.Timestamp { return nil } +// TenantMember defines a user that participates at a tenant +type TenantMember struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Id is the user id of the member + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // Role is the role of the member + Role TenantRole `protobuf:"varint,2,opt,name=role,proto3,enum=api.v1.TenantRole" json:"role,omitempty"` + // CreatedAt the date when the member was added to the tenant + CreatedAt *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` +} + +func (x *TenantMember) Reset() { + *x = TenantMember{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_tenant_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TenantMember) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TenantMember) ProtoMessage() {} + +func (x *TenantMember) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_tenant_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 TenantMember.ProtoReflect.Descriptor instead. +func (*TenantMember) Descriptor() ([]byte, []int) { + return file_api_v1_tenant_proto_rawDescGZIP(), []int{1} +} + +func (x *TenantMember) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *TenantMember) GetRole() TenantRole { + if x != nil { + return x.Role + } + return TenantRole_TENANT_ROLE_UNSPECIFIED +} + +func (x *TenantMember) GetCreatedAt() *timestamppb.Timestamp { + if x != nil { + return x.CreatedAt + } + return nil +} + +// TenantInvite defines invite to tenant +type TenantInvite struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Secret is the secret part of the invite, typically part of the url + Secret string `protobuf:"bytes,1,opt,name=secret,proto3" json:"secret,omitempty"` + // TargetTenant is the tenant id for which this invite was created + TargetTenant string `protobuf:"bytes,2,opt,name=target_tenant,json=targetTenant,proto3" json:"target_tenant,omitempty"` + // Role is the role in this tenant the user will get after accepting the invitation + Role TenantRole `protobuf:"varint,3,opt,name=role,proto3,enum=api.v1.TenantRole" json:"role,omitempty"` + // Joined is false as long as a user has not accepted the invite + Joined bool `protobuf:"varint,4,opt,name=joined,proto3" json:"joined,omitempty"` + // TargetTenantName is the tenant name for which this invite was created + TargetTenantName string `protobuf:"bytes,5,opt,name=target_tenant_name,json=targetTenantName,proto3" json:"target_tenant_name,omitempty"` + // Tenant is the login of tenant who invites to join this tenant + Tenant string `protobuf:"bytes,6,opt,name=tenant,proto3" json:"tenant,omitempty"` + // TenantName is the name of tenant who invites to join this tenant + TenantName string `protobuf:"bytes,7,opt,name=tenant_name,json=tenantName,proto3" json:"tenant_name,omitempty"` + // ExpiresAt the date when this invite expires + ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"` + // JoinedAt the date when the member accepted this invite + JoinedAt *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=joined_at,json=joinedAt,proto3" json:"joined_at,omitempty"` +} + +func (x *TenantInvite) Reset() { + *x = TenantInvite{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_tenant_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TenantInvite) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TenantInvite) ProtoMessage() {} + +func (x *TenantInvite) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_tenant_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 TenantInvite.ProtoReflect.Descriptor instead. +func (*TenantInvite) Descriptor() ([]byte, []int) { + return file_api_v1_tenant_proto_rawDescGZIP(), []int{2} +} + +func (x *TenantInvite) GetSecret() string { + if x != nil { + return x.Secret + } + return "" +} + +func (x *TenantInvite) GetTargetTenant() string { + if x != nil { + return x.TargetTenant + } + return "" +} + +func (x *TenantInvite) GetRole() TenantRole { + if x != nil { + return x.Role + } + return TenantRole_TENANT_ROLE_UNSPECIFIED +} + +func (x *TenantInvite) GetJoined() bool { + if x != nil { + return x.Joined + } + return false +} + +func (x *TenantInvite) GetTargetTenantName() string { + if x != nil { + return x.TargetTenantName + } + return "" +} + +func (x *TenantInvite) GetTenant() string { + if x != nil { + return x.Tenant + } + return "" +} + +func (x *TenantInvite) GetTenantName() string { + if x != nil { + return x.TenantName + } + return "" +} + +func (x *TenantInvite) GetExpiresAt() *timestamppb.Timestamp { + if x != nil { + return x.ExpiresAt + } + return nil +} + +func (x *TenantInvite) GetJoinedAt() *timestamppb.Timestamp { + if x != nil { + return x.JoinedAt + } + return nil +} + // PaymentDetails of a tenant type PaymentDetails struct { state protoimpl.MessageState @@ -208,7 +424,7 @@ type PaymentDetails struct { func (x *PaymentDetails) Reset() { *x = PaymentDetails{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_tenant_proto_msgTypes[1] + mi := &file_api_v1_tenant_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -221,7 +437,7 @@ func (x *PaymentDetails) String() string { func (*PaymentDetails) ProtoMessage() {} func (x *PaymentDetails) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_tenant_proto_msgTypes[1] + mi := &file_api_v1_tenant_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -234,7 +450,7 @@ func (x *PaymentDetails) ProtoReflect() protoreflect.Message { // Deprecated: Use PaymentDetails.ProtoReflect.Descriptor instead. func (*PaymentDetails) Descriptor() ([]byte, []int) { - return file_api_v1_tenant_proto_rawDescGZIP(), []int{1} + return file_api_v1_tenant_proto_rawDescGZIP(), []int{3} } func (x *PaymentDetails) GetCustomerId() string { @@ -291,7 +507,7 @@ type PaymentDetailsUpdate struct { func (x *PaymentDetailsUpdate) Reset() { *x = PaymentDetailsUpdate{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_tenant_proto_msgTypes[2] + mi := &file_api_v1_tenant_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -304,7 +520,7 @@ func (x *PaymentDetailsUpdate) String() string { func (*PaymentDetailsUpdate) ProtoMessage() {} func (x *PaymentDetailsUpdate) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_tenant_proto_msgTypes[2] + mi := &file_api_v1_tenant_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -317,7 +533,7 @@ func (x *PaymentDetailsUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use PaymentDetailsUpdate.ProtoReflect.Descriptor instead. func (*PaymentDetailsUpdate) Descriptor() ([]byte, []int) { - return file_api_v1_tenant_proto_rawDescGZIP(), []int{2} + return file_api_v1_tenant_proto_rawDescGZIP(), []int{4} } func (x *PaymentDetailsUpdate) GetCustomerId() string { @@ -363,7 +579,7 @@ type TermsAndConditions struct { func (x *TermsAndConditions) Reset() { *x = TermsAndConditions{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_tenant_proto_msgTypes[3] + mi := &file_api_v1_tenant_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -376,7 +592,7 @@ func (x *TermsAndConditions) String() string { func (*TermsAndConditions) ProtoMessage() {} func (x *TermsAndConditions) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_tenant_proto_msgTypes[3] + mi := &file_api_v1_tenant_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -389,7 +605,7 @@ func (x *TermsAndConditions) ProtoReflect() protoreflect.Message { // Deprecated: Use TermsAndConditions.ProtoReflect.Descriptor instead. func (*TermsAndConditions) Descriptor() ([]byte, []int) { - return file_api_v1_tenant_proto_rawDescGZIP(), []int{3} + return file_api_v1_tenant_proto_rawDescGZIP(), []int{5} } func (x *TermsAndConditions) GetAccepted() bool { @@ -421,7 +637,7 @@ type TermsAndConditionsUpdate struct { func (x *TermsAndConditionsUpdate) Reset() { *x = TermsAndConditionsUpdate{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_tenant_proto_msgTypes[4] + mi := &file_api_v1_tenant_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -434,7 +650,7 @@ func (x *TermsAndConditionsUpdate) String() string { func (*TermsAndConditionsUpdate) ProtoMessage() {} func (x *TermsAndConditionsUpdate) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_tenant_proto_msgTypes[4] + mi := &file_api_v1_tenant_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -447,7 +663,7 @@ func (x *TermsAndConditionsUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use TermsAndConditionsUpdate.ProtoReflect.Descriptor instead. func (*TermsAndConditionsUpdate) Descriptor() ([]byte, []int) { - return file_api_v1_tenant_proto_rawDescGZIP(), []int{4} + return file_api_v1_tenant_proto_rawDescGZIP(), []int{6} } func (x *TermsAndConditionsUpdate) GetAccepted() bool { @@ -464,6 +680,64 @@ func (x *TermsAndConditionsUpdate) GetWhen() *timestamppb.Timestamp { return nil } +// TenantServiceListRequest is the request payload of the tenant list request +type TenantServiceListRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Id filters tenants by id + Id *string `protobuf:"bytes,1,opt,name=id,proto3,oneof" json:"id,omitempty"` + // Name filters tenants by name + Name *string `protobuf:"bytes,2,opt,name=name,proto3,oneof" json:"name,omitempty"` +} + +func (x *TenantServiceListRequest) Reset() { + *x = TenantServiceListRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_tenant_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TenantServiceListRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TenantServiceListRequest) ProtoMessage() {} + +func (x *TenantServiceListRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_tenant_proto_msgTypes[7] + 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 TenantServiceListRequest.ProtoReflect.Descriptor instead. +func (*TenantServiceListRequest) Descriptor() ([]byte, []int) { + return file_api_v1_tenant_proto_rawDescGZIP(), []int{7} +} + +func (x *TenantServiceListRequest) GetId() string { + if x != nil && x.Id != nil { + return *x.Id + } + return "" +} + +func (x *TenantServiceListRequest) GetName() string { + if x != nil && x.Name != nil { + return *x.Name + } + return "" +} + // TenantServiceGetRequest is the request payload of the tenant get request type TenantServiceGetRequest struct { state protoimpl.MessageState @@ -477,7 +751,7 @@ type TenantServiceGetRequest struct { func (x *TenantServiceGetRequest) Reset() { *x = TenantServiceGetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_tenant_proto_msgTypes[5] + mi := &file_api_v1_tenant_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -490,7 +764,7 @@ func (x *TenantServiceGetRequest) String() string { func (*TenantServiceGetRequest) ProtoMessage() {} func (x *TenantServiceGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_tenant_proto_msgTypes[5] + mi := &file_api_v1_tenant_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -503,7 +777,7 @@ func (x *TenantServiceGetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TenantServiceGetRequest.ProtoReflect.Descriptor instead. func (*TenantServiceGetRequest) Descriptor() ([]byte, []int) { - return file_api_v1_tenant_proto_rawDescGZIP(), []int{5} + return file_api_v1_tenant_proto_rawDescGZIP(), []int{8} } func (x *TenantServiceGetRequest) GetLogin() string { @@ -519,14 +793,22 @@ type TenantServiceCreateRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Tenant the tenant to create - Tenant *Tenant `protobuf:"bytes,1,opt,name=tenant,proto3" json:"tenant,omitempty"` + // Name of this tenant + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Description of this tenant + Description *string `protobuf:"bytes,2,opt,name=description,proto3,oneof" json:"description,omitempty"` + // Email of the tenant, if not set will be inherited from the creator + Email *string `protobuf:"bytes,3,opt,name=email,proto3,oneof" json:"email,omitempty"` + // AvatarUrl of the tenant + AvatarUrl *string `protobuf:"bytes,4,opt,name=avatar_url,json=avatarUrl,proto3,oneof" json:"avatar_url,omitempty"` + // PhoneNumber of the tenant + PhoneNumber *string `protobuf:"bytes,5,opt,name=phone_number,json=phoneNumber,proto3,oneof" json:"phone_number,omitempty"` } func (x *TenantServiceCreateRequest) Reset() { *x = TenantServiceCreateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_tenant_proto_msgTypes[6] + mi := &file_api_v1_tenant_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -539,7 +821,7 @@ func (x *TenantServiceCreateRequest) String() string { func (*TenantServiceCreateRequest) ProtoMessage() {} func (x *TenantServiceCreateRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_tenant_proto_msgTypes[6] + mi := &file_api_v1_tenant_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -552,14 +834,42 @@ func (x *TenantServiceCreateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TenantServiceCreateRequest.ProtoReflect.Descriptor instead. func (*TenantServiceCreateRequest) Descriptor() ([]byte, []int) { - return file_api_v1_tenant_proto_rawDescGZIP(), []int{6} + return file_api_v1_tenant_proto_rawDescGZIP(), []int{9} } -func (x *TenantServiceCreateRequest) GetTenant() *Tenant { +func (x *TenantServiceCreateRequest) GetName() string { if x != nil { - return x.Tenant + return x.Name } - return nil + return "" +} + +func (x *TenantServiceCreateRequest) GetDescription() string { + if x != nil && x.Description != nil { + return *x.Description + } + return "" +} + +func (x *TenantServiceCreateRequest) GetEmail() string { + if x != nil && x.Email != nil { + return *x.Email + } + return "" +} + +func (x *TenantServiceCreateRequest) GetAvatarUrl() string { + if x != nil && x.AvatarUrl != nil { + return *x.AvatarUrl + } + return "" +} + +func (x *TenantServiceCreateRequest) GetPhoneNumber() string { + if x != nil && x.PhoneNumber != nil { + return *x.PhoneNumber + } + return "" } // TenantServiceCreateOrUpdateRequest is the request payload of the tenant create or update request @@ -575,7 +885,7 @@ type TenantServiceCreateOrUpdateRequest struct { func (x *TenantServiceCreateOrUpdateRequest) Reset() { *x = TenantServiceCreateOrUpdateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_tenant_proto_msgTypes[7] + mi := &file_api_v1_tenant_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -588,7 +898,7 @@ func (x *TenantServiceCreateOrUpdateRequest) String() string { func (*TenantServiceCreateOrUpdateRequest) ProtoMessage() {} func (x *TenantServiceCreateOrUpdateRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_tenant_proto_msgTypes[7] + mi := &file_api_v1_tenant_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -601,7 +911,7 @@ func (x *TenantServiceCreateOrUpdateRequest) ProtoReflect() protoreflect.Message // Deprecated: Use TenantServiceCreateOrUpdateRequest.ProtoReflect.Descriptor instead. func (*TenantServiceCreateOrUpdateRequest) Descriptor() ([]byte, []int) { - return file_api_v1_tenant_proto_rawDescGZIP(), []int{7} + return file_api_v1_tenant_proto_rawDescGZIP(), []int{10} } func (x *TenantServiceCreateOrUpdateRequest) GetTenant() *Tenant { @@ -623,6 +933,8 @@ type TenantServiceUpdateRequest struct { Name *string `protobuf:"bytes,2,opt,name=name,proto3,oneof" json:"name,omitempty"` // Email of the tenant Email *string `protobuf:"bytes,3,opt,name=email,proto3,oneof" json:"email,omitempty"` + // Description of this tenant + Description *string `protobuf:"bytes,4,opt,name=description,proto3,oneof" json:"description,omitempty"` // AvatarUrl of the tenant AvatarUrl *string `protobuf:"bytes,5,opt,name=avatar_url,json=avatarUrl,proto3,oneof" json:"avatar_url,omitempty"` // PaymentDetails of the tenant @@ -636,7 +948,7 @@ type TenantServiceUpdateRequest struct { func (x *TenantServiceUpdateRequest) Reset() { *x = TenantServiceUpdateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_tenant_proto_msgTypes[8] + mi := &file_api_v1_tenant_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -649,7 +961,7 @@ func (x *TenantServiceUpdateRequest) String() string { func (*TenantServiceUpdateRequest) ProtoMessage() {} func (x *TenantServiceUpdateRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_tenant_proto_msgTypes[8] + mi := &file_api_v1_tenant_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -662,7 +974,7 @@ func (x *TenantServiceUpdateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TenantServiceUpdateRequest.ProtoReflect.Descriptor instead. func (*TenantServiceUpdateRequest) Descriptor() ([]byte, []int) { - return file_api_v1_tenant_proto_rawDescGZIP(), []int{8} + return file_api_v1_tenant_proto_rawDescGZIP(), []int{11} } func (x *TenantServiceUpdateRequest) GetLogin() string { @@ -686,8 +998,15 @@ func (x *TenantServiceUpdateRequest) GetEmail() string { return "" } -func (x *TenantServiceUpdateRequest) GetAvatarUrl() string { - if x != nil && x.AvatarUrl != nil { +func (x *TenantServiceUpdateRequest) GetDescription() string { + if x != nil && x.Description != nil { + return *x.Description + } + return "" +} + +func (x *TenantServiceUpdateRequest) GetAvatarUrl() string { + if x != nil && x.AvatarUrl != nil { return *x.AvatarUrl } return "" @@ -727,7 +1046,7 @@ type TenantServiceDeleteRequest struct { func (x *TenantServiceDeleteRequest) Reset() { *x = TenantServiceDeleteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_tenant_proto_msgTypes[9] + mi := &file_api_v1_tenant_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -740,7 +1059,7 @@ func (x *TenantServiceDeleteRequest) String() string { func (*TenantServiceDeleteRequest) ProtoMessage() {} func (x *TenantServiceDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_tenant_proto_msgTypes[9] + mi := &file_api_v1_tenant_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -753,7 +1072,7 @@ func (x *TenantServiceDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TenantServiceDeleteRequest.ProtoReflect.Descriptor instead. func (*TenantServiceDeleteRequest) Descriptor() ([]byte, []int) { - return file_api_v1_tenant_proto_rawDescGZIP(), []int{9} + return file_api_v1_tenant_proto_rawDescGZIP(), []int{12} } func (x *TenantServiceDeleteRequest) GetLogin() string { @@ -776,7 +1095,7 @@ type TenantServiceGetResponse struct { func (x *TenantServiceGetResponse) Reset() { *x = TenantServiceGetResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_tenant_proto_msgTypes[10] + mi := &file_api_v1_tenant_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -789,7 +1108,7 @@ func (x *TenantServiceGetResponse) String() string { func (*TenantServiceGetResponse) ProtoMessage() {} func (x *TenantServiceGetResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_tenant_proto_msgTypes[10] + mi := &file_api_v1_tenant_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -802,7 +1121,7 @@ func (x *TenantServiceGetResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TenantServiceGetResponse.ProtoReflect.Descriptor instead. func (*TenantServiceGetResponse) Descriptor() ([]byte, []int) { - return file_api_v1_tenant_proto_rawDescGZIP(), []int{10} + return file_api_v1_tenant_proto_rawDescGZIP(), []int{13} } func (x *TenantServiceGetResponse) GetTenant() *Tenant { @@ -812,6 +1131,55 @@ func (x *TenantServiceGetResponse) GetTenant() *Tenant { return nil } +// TenantServiceListResponse is the response payload of the tenant list request +type TenantServiceListResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Tenants is the list of tenants + Tenants []*Tenant `protobuf:"bytes,1,rep,name=tenants,proto3" json:"tenants,omitempty"` +} + +func (x *TenantServiceListResponse) Reset() { + *x = TenantServiceListResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_tenant_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TenantServiceListResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TenantServiceListResponse) ProtoMessage() {} + +func (x *TenantServiceListResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_tenant_proto_msgTypes[14] + 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 TenantServiceListResponse.ProtoReflect.Descriptor instead. +func (*TenantServiceListResponse) Descriptor() ([]byte, []int) { + return file_api_v1_tenant_proto_rawDescGZIP(), []int{14} +} + +func (x *TenantServiceListResponse) GetTenants() []*Tenant { + if x != nil { + return x.Tenants + } + return nil +} + // TenantServiceCreateResponse is the response payload of the tenant create request type TenantServiceCreateResponse struct { state protoimpl.MessageState @@ -825,7 +1193,7 @@ type TenantServiceCreateResponse struct { func (x *TenantServiceCreateResponse) Reset() { *x = TenantServiceCreateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_tenant_proto_msgTypes[11] + mi := &file_api_v1_tenant_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -838,7 +1206,7 @@ func (x *TenantServiceCreateResponse) String() string { func (*TenantServiceCreateResponse) ProtoMessage() {} func (x *TenantServiceCreateResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_tenant_proto_msgTypes[11] + mi := &file_api_v1_tenant_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -851,7 +1219,7 @@ func (x *TenantServiceCreateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TenantServiceCreateResponse.ProtoReflect.Descriptor instead. func (*TenantServiceCreateResponse) Descriptor() ([]byte, []int) { - return file_api_v1_tenant_proto_rawDescGZIP(), []int{11} + return file_api_v1_tenant_proto_rawDescGZIP(), []int{15} } func (x *TenantServiceCreateResponse) GetTenant() *Tenant { @@ -874,7 +1242,7 @@ type TenantServiceCreateOrUpdateResponse struct { func (x *TenantServiceCreateOrUpdateResponse) Reset() { *x = TenantServiceCreateOrUpdateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_tenant_proto_msgTypes[12] + mi := &file_api_v1_tenant_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -887,7 +1255,7 @@ func (x *TenantServiceCreateOrUpdateResponse) String() string { func (*TenantServiceCreateOrUpdateResponse) ProtoMessage() {} func (x *TenantServiceCreateOrUpdateResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_tenant_proto_msgTypes[12] + mi := &file_api_v1_tenant_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -900,7 +1268,7 @@ func (x *TenantServiceCreateOrUpdateResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use TenantServiceCreateOrUpdateResponse.ProtoReflect.Descriptor instead. func (*TenantServiceCreateOrUpdateResponse) Descriptor() ([]byte, []int) { - return file_api_v1_tenant_proto_rawDescGZIP(), []int{12} + return file_api_v1_tenant_proto_rawDescGZIP(), []int{16} } func (x *TenantServiceCreateOrUpdateResponse) GetTenant() *Tenant { @@ -923,7 +1291,7 @@ type TenantServiceUpdateResponse struct { func (x *TenantServiceUpdateResponse) Reset() { *x = TenantServiceUpdateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_tenant_proto_msgTypes[13] + mi := &file_api_v1_tenant_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -936,7 +1304,7 @@ func (x *TenantServiceUpdateResponse) String() string { func (*TenantServiceUpdateResponse) ProtoMessage() {} func (x *TenantServiceUpdateResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_tenant_proto_msgTypes[13] + mi := &file_api_v1_tenant_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -949,7 +1317,7 @@ func (x *TenantServiceUpdateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TenantServiceUpdateResponse.ProtoReflect.Descriptor instead. func (*TenantServiceUpdateResponse) Descriptor() ([]byte, []int) { - return file_api_v1_tenant_proto_rawDescGZIP(), []int{13} + return file_api_v1_tenant_proto_rawDescGZIP(), []int{17} } func (x *TenantServiceUpdateResponse) GetTenant() *Tenant { @@ -972,7 +1340,7 @@ type TenantServiceDeleteResponse struct { func (x *TenantServiceDeleteResponse) Reset() { *x = TenantServiceDeleteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_v1_tenant_proto_msgTypes[14] + mi := &file_api_v1_tenant_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -985,7 +1353,7 @@ func (x *TenantServiceDeleteResponse) String() string { func (*TenantServiceDeleteResponse) ProtoMessage() {} func (x *TenantServiceDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_v1_tenant_proto_msgTypes[14] + mi := &file_api_v1_tenant_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -998,7 +1366,7 @@ func (x *TenantServiceDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use TenantServiceDeleteResponse.ProtoReflect.Descriptor instead. func (*TenantServiceDeleteResponse) Descriptor() ([]byte, []int) { - return file_api_v1_tenant_proto_rawDescGZIP(), []int{14} + return file_api_v1_tenant_proto_rawDescGZIP(), []int{18} } func (x *TenantServiceDeleteResponse) GetTenant() *Tenant { @@ -1008,321 +1376,1279 @@ func (x *TenantServiceDeleteResponse) GetTenant() *Tenant { return nil } -var File_api_v1_tenant_proto protoreflect.FileDescriptor +// TenantServiceInviteRequest is used to invite a member to a tenant +type TenantServiceInviteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -var file_api_v1_tenant_proto_rawDesc = []byte{ - 0x0a, 0x13, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x1a, 0x13, 0x61, - 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x14, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x61, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 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, 0xe7, 0x04, 0x0a, 0x06, 0x54, 0x65, - 0x6e, 0x61, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, - 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, - 0x55, 0x72, 0x6c, 0x12, 0x3c, 0x0a, 0x0e, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x52, 0x0d, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x12, 0x3f, 0x0a, 0x0f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x52, 0x0e, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x64, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x64, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x12, 0x21, - 0x0a, 0x0c, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x12, 0x4c, 0x0a, 0x14, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x63, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x41, 0x6e, - 0x64, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x74, 0x65, 0x72, - 0x6d, 0x73, 0x41, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x23, 0x0a, 0x0d, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x74, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x43, 0x6f, 0x6e, - 0x73, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, - 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x65, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x18, 0x14, 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, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, - 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x15, 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, 0x52, 0x09, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x16, 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, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x22, 0xdd, 0x01, 0x0a, 0x0e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x44, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x11, 0x70, 0x61, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, - 0x68, 0x6f, 0x64, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x12, 0x28, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x75, 0x70, - 0x6f, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x76, - 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x76, 0x61, 0x74, 0x42, 0x14, 0x0a, - 0x12, 0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x5f, 0x69, 0x64, 0x22, 0xf4, 0x01, 0x0a, 0x14, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x44, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x24, 0x0a, 0x0b, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x49, 0x64, 0x88, - 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, - 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, - 0x0f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x49, 0x64, - 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0e, - 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x88, 0x01, - 0x01, 0x12, 0x15, 0x0a, 0x03, 0x76, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, - 0x52, 0x03, 0x76, 0x61, 0x74, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x70, 0x61, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x69, 0x64, 0x42, 0x12, - 0x0a, 0x10, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x64, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x76, 0x61, 0x74, 0x22, 0x60, 0x0a, 0x12, 0x54, 0x65, - 0x72, 0x6d, 0x73, 0x41, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x08, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x04, - 0x77, 0x68, 0x65, 0x6e, 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, 0x52, 0x04, 0x77, 0x68, 0x65, 0x6e, 0x22, 0x86, 0x01, 0x0a, - 0x18, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x41, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x08, 0x61, 0x63, 0x63, - 0x65, 0x70, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x08, 0x61, - 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x04, 0x77, 0x68, - 0x65, 0x6e, 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, 0x48, 0x01, 0x52, 0x04, 0x77, 0x68, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x42, - 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x42, 0x07, 0x0a, 0x05, - 0x5f, 0x77, 0x68, 0x65, 0x6e, 0x22, 0x2f, 0x0a, 0x17, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x22, 0x44, 0x0a, 0x1a, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, - 0x6e, 0x61, 0x6e, 0x74, 0x52, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x22, 0x4c, 0x0a, 0x22, - 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, - 0x6e, 0x74, 0x52, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x22, 0xaf, 0x03, 0x0a, 0x1a, 0x54, - 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x67, - 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, - 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, - 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, - 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, - 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, - 0x72, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a, 0x0f, 0x70, 0x61, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x03, - 0x52, 0x0e, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x88, 0x01, 0x01, 0x12, 0x57, 0x0a, 0x14, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x5f, 0x61, 0x6e, 0x64, - 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x73, - 0x41, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x48, 0x04, 0x52, 0x12, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x41, 0x6e, 0x64, 0x43, - 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, - 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x48, - 0x05, 0x52, 0x09, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, 0x64, 0x88, 0x01, 0x01, 0x42, - 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x6d, 0x61, - 0x69, 0x6c, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, - 0x6c, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x5f, - 0x61, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x0c, - 0x0a, 0x0a, 0x5f, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, 0x64, 0x22, 0x32, 0x0a, 0x1a, - 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x6f, - 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, - 0x22, 0x42, 0x0a, 0x18, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, - 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x52, 0x06, 0x74, 0x65, - 0x6e, 0x61, 0x6e, 0x74, 0x22, 0x45, 0x0a, 0x1b, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, - 0x61, 0x6e, 0x74, 0x52, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x22, 0x4d, 0x0a, 0x23, 0x54, - 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, - 0x6e, 0x74, 0x52, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x22, 0x45, 0x0a, 0x1b, 0x54, 0x65, - 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x65, 0x6e, - 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x52, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, - 0x74, 0x22, 0x45, 0x0a, 0x1b, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x26, 0x0a, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, - 0x52, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x32, 0xf3, 0x03, 0x0a, 0x0d, 0x54, 0x65, 0x6e, - 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x06, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, - 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0xc0, - 0xf3, 0x18, 0x01, 0xc0, 0xf3, 0x18, 0x02, 0x12, 0x6f, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, - 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x04, 0xd8, 0xf3, 0x18, 0x02, 0x12, 0x5a, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, - 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x10, 0xc0, 0xf3, 0x18, 0x01, 0xc0, 0xf3, 0x18, 0x02, 0xc0, 0xf3, 0x18, 0x03, - 0xe8, 0xf3, 0x18, 0x02, 0x12, 0x5b, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x22, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, - 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0xc0, 0xf3, 0x18, 0x01, 0xc0, 0xf3, 0x18, - 0x02, 0x12, 0x5b, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0xc0, 0xf3, 0x18, 0x01, 0xc0, 0xf3, 0x18, 0x02, 0x42, 0x84, - 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x54, - 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x30, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x2d, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, - 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, 0x02, - 0x03, 0x41, 0x58, 0x58, 0xaa, 0x02, 0x06, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x06, - 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x12, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0x5c, - 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x07, 0x41, 0x70, - 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + // Login of the tenant + Login string `protobuf:"bytes,1,opt,name=login,proto3" json:"login,omitempty"` + // Role of this user in this tenant + Role TenantRole `protobuf:"varint,2,opt,name=role,proto3,enum=api.v1.TenantRole" json:"role,omitempty"` } -var ( - file_api_v1_tenant_proto_rawDescOnce sync.Once - file_api_v1_tenant_proto_rawDescData = file_api_v1_tenant_proto_rawDesc -) +func (x *TenantServiceInviteRequest) Reset() { + *x = TenantServiceInviteRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_tenant_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} -func file_api_v1_tenant_proto_rawDescGZIP() []byte { - file_api_v1_tenant_proto_rawDescOnce.Do(func() { - file_api_v1_tenant_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_v1_tenant_proto_rawDescData) - }) - return file_api_v1_tenant_proto_rawDescData +func (x *TenantServiceInviteRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -var file_api_v1_tenant_proto_msgTypes = make([]protoimpl.MessageInfo, 15) -var file_api_v1_tenant_proto_goTypes = []interface{}{ - (*Tenant)(nil), // 0: api.v1.Tenant - (*PaymentDetails)(nil), // 1: api.v1.PaymentDetails - (*PaymentDetailsUpdate)(nil), // 2: api.v1.PaymentDetailsUpdate - (*TermsAndConditions)(nil), // 3: api.v1.TermsAndConditions - (*TermsAndConditionsUpdate)(nil), // 4: api.v1.TermsAndConditionsUpdate - (*TenantServiceGetRequest)(nil), // 5: api.v1.TenantServiceGetRequest - (*TenantServiceCreateRequest)(nil), // 6: api.v1.TenantServiceCreateRequest - (*TenantServiceCreateOrUpdateRequest)(nil), // 7: api.v1.TenantServiceCreateOrUpdateRequest - (*TenantServiceUpdateRequest)(nil), // 8: api.v1.TenantServiceUpdateRequest - (*TenantServiceDeleteRequest)(nil), // 9: api.v1.TenantServiceDeleteRequest - (*TenantServiceGetResponse)(nil), // 10: api.v1.TenantServiceGetResponse - (*TenantServiceCreateResponse)(nil), // 11: api.v1.TenantServiceCreateResponse - (*TenantServiceCreateOrUpdateResponse)(nil), // 12: api.v1.TenantServiceCreateOrUpdateResponse - (*TenantServiceUpdateResponse)(nil), // 13: api.v1.TenantServiceUpdateResponse - (*TenantServiceDeleteResponse)(nil), // 14: api.v1.TenantServiceDeleteResponse - (OAuthProvider)(0), // 15: api.v1.OAuthProvider - (*timestamppb.Timestamp)(nil), // 16: google.protobuf.Timestamp - (*Coupon)(nil), // 17: api.v1.Coupon +func (*TenantServiceInviteRequest) ProtoMessage() {} + +func (x *TenantServiceInviteRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_tenant_proto_msgTypes[19] + 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) } -var file_api_v1_tenant_proto_depIdxs = []int32{ - 15, // 0: api.v1.Tenant.oauth_provider:type_name -> api.v1.OAuthProvider - 1, // 1: api.v1.Tenant.payment_details:type_name -> api.v1.PaymentDetails - 3, // 2: api.v1.Tenant.terms_and_conditions:type_name -> api.v1.TermsAndConditions - 16, // 3: api.v1.Tenant.created_at:type_name -> google.protobuf.Timestamp - 16, // 4: api.v1.Tenant.updated_at:type_name -> google.protobuf.Timestamp - 16, // 5: api.v1.Tenant.deleted_at:type_name -> google.protobuf.Timestamp - 17, // 6: api.v1.PaymentDetails.coupons:type_name -> api.v1.Coupon - 16, // 7: api.v1.TermsAndConditions.when:type_name -> google.protobuf.Timestamp - 16, // 8: api.v1.TermsAndConditionsUpdate.when:type_name -> google.protobuf.Timestamp - 0, // 9: api.v1.TenantServiceCreateRequest.tenant:type_name -> api.v1.Tenant - 0, // 10: api.v1.TenantServiceCreateOrUpdateRequest.tenant:type_name -> api.v1.Tenant - 2, // 11: api.v1.TenantServiceUpdateRequest.payment_details:type_name -> api.v1.PaymentDetailsUpdate - 4, // 12: api.v1.TenantServiceUpdateRequest.terms_and_conditions:type_name -> api.v1.TermsAndConditionsUpdate - 0, // 13: api.v1.TenantServiceGetResponse.tenant:type_name -> api.v1.Tenant - 0, // 14: api.v1.TenantServiceCreateResponse.tenant:type_name -> api.v1.Tenant - 0, // 15: api.v1.TenantServiceCreateOrUpdateResponse.tenant:type_name -> api.v1.Tenant - 0, // 16: api.v1.TenantServiceUpdateResponse.tenant:type_name -> api.v1.Tenant - 0, // 17: api.v1.TenantServiceDeleteResponse.tenant:type_name -> api.v1.Tenant - 6, // 18: api.v1.TenantService.Create:input_type -> api.v1.TenantServiceCreateRequest - 7, // 19: api.v1.TenantService.CreateOrUpdate:input_type -> api.v1.TenantServiceCreateOrUpdateRequest - 5, // 20: api.v1.TenantService.Get:input_type -> api.v1.TenantServiceGetRequest - 8, // 21: api.v1.TenantService.Update:input_type -> api.v1.TenantServiceUpdateRequest - 9, // 22: api.v1.TenantService.Delete:input_type -> api.v1.TenantServiceDeleteRequest - 11, // 23: api.v1.TenantService.Create:output_type -> api.v1.TenantServiceCreateResponse - 12, // 24: api.v1.TenantService.CreateOrUpdate:output_type -> api.v1.TenantServiceCreateOrUpdateResponse - 10, // 25: api.v1.TenantService.Get:output_type -> api.v1.TenantServiceGetResponse - 13, // 26: api.v1.TenantService.Update:output_type -> api.v1.TenantServiceUpdateResponse - 14, // 27: api.v1.TenantService.Delete:output_type -> api.v1.TenantServiceDeleteResponse - 23, // [23:28] is the sub-list for method output_type - 18, // [18:23] is the sub-list for method input_type - 18, // [18:18] is the sub-list for extension type_name - 18, // [18:18] is the sub-list for extension extendee - 0, // [0:18] is the sub-list for field type_name + +// Deprecated: Use TenantServiceInviteRequest.ProtoReflect.Descriptor instead. +func (*TenantServiceInviteRequest) Descriptor() ([]byte, []int) { + return file_api_v1_tenant_proto_rawDescGZIP(), []int{19} } -func init() { file_api_v1_tenant_proto_init() } -func file_api_v1_tenant_proto_init() { - if File_api_v1_tenant_proto != nil { - return +func (x *TenantServiceInviteRequest) GetLogin() string { + if x != nil { + return x.Login } - file_api_v1_common_proto_init() - file_api_v1_payment_proto_init() - if !protoimpl.UnsafeEnabled { - file_api_v1_tenant_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Tenant); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } + return "" +} + +func (x *TenantServiceInviteRequest) GetRole() TenantRole { + if x != nil { + return x.Role + } + return TenantRole_TENANT_ROLE_UNSPECIFIED +} + +// TenantServiceInviteRequest is the response payload to a invite member request +type TenantServiceInviteResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Invite contains a secret which can be sent to a potential user + // can be appended to the invitation endpoint at our cloud console like + // console.metalstack.cloud/invite/ + Invite *TenantInvite `protobuf:"bytes,1,opt,name=invite,proto3" json:"invite,omitempty"` +} + +func (x *TenantServiceInviteResponse) Reset() { + *x = TenantServiceInviteResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_tenant_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TenantServiceInviteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TenantServiceInviteResponse) ProtoMessage() {} + +func (x *TenantServiceInviteResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_tenant_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - file_api_v1_tenant_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PaymentDetails); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TenantServiceInviteResponse.ProtoReflect.Descriptor instead. +func (*TenantServiceInviteResponse) Descriptor() ([]byte, []int) { + return file_api_v1_tenant_proto_rawDescGZIP(), []int{20} +} + +func (x *TenantServiceInviteResponse) GetInvite() *TenantInvite { + if x != nil { + return x.Invite + } + return nil +} + +// TenantServiceInvitesListRequest is the request payload to a list invites request +type TenantServiceInvitesListRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Login of the tenant + Login string `protobuf:"bytes,1,opt,name=login,proto3" json:"login,omitempty"` +} + +func (x *TenantServiceInvitesListRequest) Reset() { + *x = TenantServiceInvitesListRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_tenant_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TenantServiceInvitesListRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TenantServiceInvitesListRequest) ProtoMessage() {} + +func (x *TenantServiceInvitesListRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_tenant_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - file_api_v1_tenant_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PaymentDetailsUpdate); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TenantServiceInvitesListRequest.ProtoReflect.Descriptor instead. +func (*TenantServiceInvitesListRequest) Descriptor() ([]byte, []int) { + return file_api_v1_tenant_proto_rawDescGZIP(), []int{21} +} + +func (x *TenantServiceInvitesListRequest) GetLogin() string { + if x != nil { + return x.Login + } + return "" +} + +// TenantServiceInvitesListResponse is the response payload to a list invites request +type TenantServiceInvitesListResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Invites not already accepted the invitation to this tenant + Invites []*TenantInvite `protobuf:"bytes,1,rep,name=invites,proto3" json:"invites,omitempty"` +} + +func (x *TenantServiceInvitesListResponse) Reset() { + *x = TenantServiceInvitesListResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_tenant_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TenantServiceInvitesListResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TenantServiceInvitesListResponse) ProtoMessage() {} + +func (x *TenantServiceInvitesListResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_tenant_proto_msgTypes[22] + 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 TenantServiceInvitesListResponse.ProtoReflect.Descriptor instead. +func (*TenantServiceInvitesListResponse) Descriptor() ([]byte, []int) { + return file_api_v1_tenant_proto_rawDescGZIP(), []int{22} +} + +func (x *TenantServiceInvitesListResponse) GetInvites() []*TenantInvite { + if x != nil { + return x.Invites + } + return nil +} + +// TenantServiceInviteGetRequest is the request payload to get a invite +type TenantServiceInviteGetRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Secret of the invite to get + Secret string `protobuf:"bytes,1,opt,name=secret,proto3" json:"secret,omitempty"` +} + +func (x *TenantServiceInviteGetRequest) Reset() { + *x = TenantServiceInviteGetRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_tenant_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TenantServiceInviteGetRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TenantServiceInviteGetRequest) ProtoMessage() {} + +func (x *TenantServiceInviteGetRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_tenant_proto_msgTypes[23] + 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 TenantServiceInviteGetRequest.ProtoReflect.Descriptor instead. +func (*TenantServiceInviteGetRequest) Descriptor() ([]byte, []int) { + return file_api_v1_tenant_proto_rawDescGZIP(), []int{23} +} + +func (x *TenantServiceInviteGetRequest) GetSecret() string { + if x != nil { + return x.Secret + } + return "" +} + +// TenantServiceInviteGetResponse is the response payload to a get invite request +type TenantServiceInviteGetResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Invite is the invite + Invite *TenantInvite `protobuf:"bytes,1,opt,name=invite,proto3" json:"invite,omitempty"` +} + +func (x *TenantServiceInviteGetResponse) Reset() { + *x = TenantServiceInviteGetResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_tenant_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TenantServiceInviteGetResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TenantServiceInviteGetResponse) ProtoMessage() {} + +func (x *TenantServiceInviteGetResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_tenant_proto_msgTypes[24] + 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 TenantServiceInviteGetResponse.ProtoReflect.Descriptor instead. +func (*TenantServiceInviteGetResponse) Descriptor() ([]byte, []int) { + return file_api_v1_tenant_proto_rawDescGZIP(), []int{24} +} + +func (x *TenantServiceInviteGetResponse) GetInvite() *TenantInvite { + if x != nil { + return x.Invite + } + return nil +} + +// TenantServiceRemoveMemberRequest is used to remove a member from a tenant +type TenantServiceRemoveMemberRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Login of the tenant + Login string `protobuf:"bytes,1,opt,name=login,proto3" json:"login,omitempty"` + // MemberID is the id of the member to remove from this tenant + MemberId string `protobuf:"bytes,2,opt,name=member_id,json=memberId,proto3" json:"member_id,omitempty"` +} + +func (x *TenantServiceRemoveMemberRequest) Reset() { + *x = TenantServiceRemoveMemberRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_tenant_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TenantServiceRemoveMemberRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TenantServiceRemoveMemberRequest) ProtoMessage() {} + +func (x *TenantServiceRemoveMemberRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_tenant_proto_msgTypes[25] + 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 TenantServiceRemoveMemberRequest.ProtoReflect.Descriptor instead. +func (*TenantServiceRemoveMemberRequest) Descriptor() ([]byte, []int) { + return file_api_v1_tenant_proto_rawDescGZIP(), []int{25} +} + +func (x *TenantServiceRemoveMemberRequest) GetLogin() string { + if x != nil { + return x.Login + } + return "" +} + +func (x *TenantServiceRemoveMemberRequest) GetMemberId() string { + if x != nil { + return x.MemberId + } + return "" +} + +// TenantServiceRemoveMemberResponse is the response payload to a remove member request +type TenantServiceRemoveMemberResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *TenantServiceRemoveMemberResponse) Reset() { + *x = TenantServiceRemoveMemberResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_tenant_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TenantServiceRemoveMemberResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TenantServiceRemoveMemberResponse) ProtoMessage() {} + +func (x *TenantServiceRemoveMemberResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_tenant_proto_msgTypes[26] + 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 TenantServiceRemoveMemberResponse.ProtoReflect.Descriptor instead. +func (*TenantServiceRemoveMemberResponse) Descriptor() ([]byte, []int) { + return file_api_v1_tenant_proto_rawDescGZIP(), []int{26} +} + +// TenantServiceInviteAcceptRequest is the request payload to a accept invite request +type TenantServiceInviteAcceptRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Secret is the invitation secret part of the invitation url + Secret string `protobuf:"bytes,1,opt,name=secret,proto3" json:"secret,omitempty"` +} + +func (x *TenantServiceInviteAcceptRequest) Reset() { + *x = TenantServiceInviteAcceptRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_tenant_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TenantServiceInviteAcceptRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TenantServiceInviteAcceptRequest) ProtoMessage() {} + +func (x *TenantServiceInviteAcceptRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_tenant_proto_msgTypes[27] + 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 TenantServiceInviteAcceptRequest.ProtoReflect.Descriptor instead. +func (*TenantServiceInviteAcceptRequest) Descriptor() ([]byte, []int) { + return file_api_v1_tenant_proto_rawDescGZIP(), []int{27} +} + +func (x *TenantServiceInviteAcceptRequest) GetSecret() string { + if x != nil { + return x.Secret + } + return "" +} + +// TenantServiceInvitesListResponse is the response payload to a accept invite request +type TenantServiceInviteAcceptResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Tenant ID of the joined tenant + Tenant string `protobuf:"bytes,1,opt,name=tenant,proto3" json:"tenant,omitempty"` + // TenantName of the joined tenant + TenantName string `protobuf:"bytes,2,opt,name=tenant_name,json=tenantName,proto3" json:"tenant_name,omitempty"` +} + +func (x *TenantServiceInviteAcceptResponse) Reset() { + *x = TenantServiceInviteAcceptResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_tenant_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TenantServiceInviteAcceptResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TenantServiceInviteAcceptResponse) ProtoMessage() {} + +func (x *TenantServiceInviteAcceptResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_tenant_proto_msgTypes[28] + 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 TenantServiceInviteAcceptResponse.ProtoReflect.Descriptor instead. +func (*TenantServiceInviteAcceptResponse) Descriptor() ([]byte, []int) { + return file_api_v1_tenant_proto_rawDescGZIP(), []int{28} +} + +func (x *TenantServiceInviteAcceptResponse) GetTenant() string { + if x != nil { + return x.Tenant + } + return "" +} + +func (x *TenantServiceInviteAcceptResponse) GetTenantName() string { + if x != nil { + return x.TenantName + } + return "" +} + +// TenantServiceInviteDeleteRequest is the request payload to a delete invite +type TenantServiceInviteDeleteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Login of the tenant + Login string `protobuf:"bytes,1,opt,name=login,proto3" json:"login,omitempty"` + // Secret of the invite to delete + Secret string `protobuf:"bytes,2,opt,name=secret,proto3" json:"secret,omitempty"` +} + +func (x *TenantServiceInviteDeleteRequest) Reset() { + *x = TenantServiceInviteDeleteRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_tenant_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TenantServiceInviteDeleteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TenantServiceInviteDeleteRequest) ProtoMessage() {} + +func (x *TenantServiceInviteDeleteRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_tenant_proto_msgTypes[29] + 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 TenantServiceInviteDeleteRequest.ProtoReflect.Descriptor instead. +func (*TenantServiceInviteDeleteRequest) Descriptor() ([]byte, []int) { + return file_api_v1_tenant_proto_rawDescGZIP(), []int{29} +} + +func (x *TenantServiceInviteDeleteRequest) GetLogin() string { + if x != nil { + return x.Login + } + return "" +} + +func (x *TenantServiceInviteDeleteRequest) GetSecret() string { + if x != nil { + return x.Secret + } + return "" +} + +// TenantServiceInviteDeleteResponse is the response payload of a delete invite request +type TenantServiceInviteDeleteResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *TenantServiceInviteDeleteResponse) Reset() { + *x = TenantServiceInviteDeleteResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_tenant_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TenantServiceInviteDeleteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TenantServiceInviteDeleteResponse) ProtoMessage() {} + +func (x *TenantServiceInviteDeleteResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_tenant_proto_msgTypes[30] + 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 TenantServiceInviteDeleteResponse.ProtoReflect.Descriptor instead. +func (*TenantServiceInviteDeleteResponse) Descriptor() ([]byte, []int) { + return file_api_v1_tenant_proto_rawDescGZIP(), []int{30} +} + +// TenantServiceUpdateMemberRequest is used to update a member from a tenant +type TenantServiceUpdateMemberRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Login of the tenant + Login string `protobuf:"bytes,1,opt,name=login,proto3" json:"login,omitempty"` + // MemberID is the id of the member to update in this tenant + MemberId string `protobuf:"bytes,2,opt,name=member_id,json=memberId,proto3" json:"member_id,omitempty"` + // Role of this user in this tenant + Role TenantRole `protobuf:"varint,3,opt,name=role,proto3,enum=api.v1.TenantRole" json:"role,omitempty"` +} + +func (x *TenantServiceUpdateMemberRequest) Reset() { + *x = TenantServiceUpdateMemberRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_tenant_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TenantServiceUpdateMemberRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TenantServiceUpdateMemberRequest) ProtoMessage() {} + +func (x *TenantServiceUpdateMemberRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_tenant_proto_msgTypes[31] + 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 TenantServiceUpdateMemberRequest.ProtoReflect.Descriptor instead. +func (*TenantServiceUpdateMemberRequest) Descriptor() ([]byte, []int) { + return file_api_v1_tenant_proto_rawDescGZIP(), []int{31} +} + +func (x *TenantServiceUpdateMemberRequest) GetLogin() string { + if x != nil { + return x.Login + } + return "" +} + +func (x *TenantServiceUpdateMemberRequest) GetMemberId() string { + if x != nil { + return x.MemberId + } + return "" +} + +func (x *TenantServiceUpdateMemberRequest) GetRole() TenantRole { + if x != nil { + return x.Role + } + return TenantRole_TENANT_ROLE_UNSPECIFIED +} + +// TenantServiceUpdateMemberResponse is the response payload to a update member request +type TenantServiceUpdateMemberResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // TenantMember is the updated membership + TenantMember *TenantMember `protobuf:"bytes,1,opt,name=tenant_member,json=tenantMember,proto3" json:"tenant_member,omitempty"` +} + +func (x *TenantServiceUpdateMemberResponse) Reset() { + *x = TenantServiceUpdateMemberResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_v1_tenant_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TenantServiceUpdateMemberResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TenantServiceUpdateMemberResponse) ProtoMessage() {} + +func (x *TenantServiceUpdateMemberResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_v1_tenant_proto_msgTypes[32] + 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 TenantServiceUpdateMemberResponse.ProtoReflect.Descriptor instead. +func (*TenantServiceUpdateMemberResponse) Descriptor() ([]byte, []int) { + return file_api_v1_tenant_proto_rawDescGZIP(), []int{32} +} + +func (x *TenantServiceUpdateMemberResponse) GetTenantMember() *TenantMember { + if x != nil { + return x.TenantMember + } + return nil +} + +var File_api_v1_tenant_proto protoreflect.FileDescriptor + +var file_api_v1_tenant_proto_rawDesc = []byte{ + 0x0a, 0x13, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x1a, 0x13, 0x61, + 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x14, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x61, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 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, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x22, 0xe5, 0x05, 0x0a, 0x06, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x6f, + 0x67, 0x69, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x1d, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x12, 0x3c, + 0x0a, 0x0e, 0x6f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x4f, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x0d, 0x6f, + 0x61, 0x75, 0x74, 0x68, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x0f, + 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x0e, 0x70, + 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1a, 0x0a, + 0x08, 0x61, 0x64, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x08, 0x61, 0x64, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x68, 0x6f, + 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x4c, 0x0a, 0x14, + 0x74, 0x65, 0x72, 0x6d, 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x41, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x41, 0x6e, 0x64, + 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6d, + 0x61, 0x69, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0c, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x43, 0x6f, 0x6e, 0x73, 0x65, 0x6e, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, 0x64, 0x12, 0x3b, 0x0a, + 0x0e, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, + 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x0d, 0x74, 0x65, 0x6e, + 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x14, 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, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x15, 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, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x16, 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, 0x52, + 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x81, 0x01, 0x0a, 0x0c, 0x54, + 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x26, 0x0a, 0x04, 0x72, + 0x6f, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, + 0x6f, 0x6c, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x0a, 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, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xe6, + 0x02, 0x0a, 0x0c, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x5f, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x04, + 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, + 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x12, 0x2c, 0x0a, 0x12, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x65, + 0x6e, 0x61, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x6e, 0x61, + 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, + 0x74, 0x18, 0x0a, 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, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x12, 0x37, + 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0b, 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, 0x52, 0x08, 0x6a, + 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x41, 0x74, 0x22, 0xdd, 0x01, 0x0a, 0x0e, 0x50, 0x61, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x11, 0x70, + 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0f, + 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x70, 0x6f, 0x6e, 0x73, 0x12, + 0x10, 0x0a, 0x03, 0x76, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x76, 0x61, + 0x74, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, + 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x69, 0x64, 0x22, 0xf4, 0x01, 0x0a, 0x14, 0x50, 0x61, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x12, 0x24, 0x0a, 0x0b, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, + 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x01, 0x52, 0x0f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f, 0x73, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x02, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, 0x76, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x03, 0x52, 0x03, 0x76, 0x61, 0x74, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, + 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x14, 0x0a, 0x12, + 0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, + 0x69, 0x64, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x76, 0x61, 0x74, 0x22, 0x60, + 0x0a, 0x12, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x41, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, + 0x12, 0x2e, 0x0a, 0x04, 0x77, 0x68, 0x65, 0x6e, 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, 0x52, 0x04, 0x77, 0x68, 0x65, 0x6e, + 0x22, 0x86, 0x01, 0x0a, 0x18, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x41, 0x6e, 0x64, 0x43, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, + 0x08, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, + 0x00, 0x52, 0x08, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x33, + 0x0a, 0x04, 0x77, 0x68, 0x65, 0x6e, 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, 0x48, 0x01, 0x52, 0x04, 0x77, 0x68, 0x65, 0x6e, + 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, + 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x77, 0x68, 0x65, 0x6e, 0x22, 0x63, 0x0a, 0x18, 0x54, 0x65, 0x6e, + 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x72, 0x04, 0x10, + 0x02, 0x18, 0x40, 0x48, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x05, + 0x0a, 0x03, 0x5f, 0x69, 0x64, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2f, + 0x0a, 0x17, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x67, + 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x22, + 0x98, 0x02, 0x0a, 0x1a, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xfa, 0x42, + 0x06, 0x72, 0x04, 0x10, 0x02, 0x18, 0x40, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x31, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x02, 0x18, 0x80, 0x04, 0x48, 0x00, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, + 0x12, 0x22, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x60, 0x01, 0x48, 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, + 0x6c, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, + 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x09, 0x61, 0x76, 0x61, 0x74, + 0x61, 0x72, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x70, 0x68, 0x6f, 0x6e, + 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, + 0x52, 0x0b, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x88, 0x01, 0x01, + 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, + 0x76, 0x61, 0x74, 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x70, 0x68, + 0x6f, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x4c, 0x0a, 0x22, 0x54, 0x65, + 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x26, 0x0a, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, + 0x52, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x22, 0x86, 0x04, 0x0a, 0x1a, 0x54, 0x65, 0x6e, + 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x22, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xfa, 0x42, 0x06, + 0x72, 0x04, 0x10, 0x02, 0x18, 0x40, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, + 0x01, 0x12, 0x22, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x60, 0x01, 0x48, 0x01, 0x52, 0x05, 0x65, 0x6d, 0x61, + 0x69, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, + 0x05, 0x10, 0x02, 0x18, 0x80, 0x04, 0x48, 0x02, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, + 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x09, + 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x55, 0x72, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a, 0x0f, + 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x48, 0x04, 0x52, 0x0e, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x57, 0x0a, 0x14, 0x74, 0x65, 0x72, 0x6d, + 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x65, 0x72, 0x6d, 0x73, 0x41, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x48, 0x05, 0x52, 0x12, 0x74, 0x65, 0x72, 0x6d, + 0x73, 0x41, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, + 0x01, 0x12, 0x21, 0x0a, 0x09, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, 0x64, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x06, 0x52, 0x09, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, + 0x64, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x08, 0x0a, + 0x06, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x61, 0x76, 0x61, 0x74, + 0x61, 0x72, 0x5f, 0x75, 0x72, 0x6c, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x74, + 0x65, 0x72, 0x6d, 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x65, + 0x64, 0x22, 0x32, 0x0a, 0x1a, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x22, 0x42, 0x0a, 0x18, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, + 0x74, 0x52, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x22, 0x45, 0x0a, 0x19, 0x54, 0x65, 0x6e, + 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x07, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x52, 0x07, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x73, + 0x22, 0x45, 0x0a, 0x1b, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x26, 0x0a, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x52, + 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x22, 0x4d, 0x0a, 0x23, 0x54, 0x65, 0x6e, 0x61, 0x6e, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, + 0x0a, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x52, 0x06, + 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x22, 0x45, 0x0a, 0x1b, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x52, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x22, 0x45, 0x0a, + 0x1b, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x06, + 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x52, 0x06, 0x74, 0x65, + 0x6e, 0x61, 0x6e, 0x74, 0x22, 0x5a, 0x0a, 0x1a, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x26, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, + 0x22, 0x4b, 0x0a, 0x1b, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x2c, 0x0a, 0x06, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, + 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x06, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x22, 0x37, 0x0a, + 0x1f, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, + 0x76, 0x69, 0x74, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x22, 0x52, 0x0a, 0x20, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x69, 0x6e, + 0x76, 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, + 0x65, 0x52, 0x07, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x22, 0x37, 0x0a, 0x1d, 0x54, 0x65, + 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, + 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x22, 0x4e, 0x0a, 0x1e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x06, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x06, 0x69, 0x6e, 0x76, + 0x69, 0x74, 0x65, 0x22, 0x55, 0x0a, 0x20, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x0a, + 0x09, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x64, 0x22, 0x23, 0x0a, 0x21, 0x54, 0x65, + 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x3a, 0x0a, 0x20, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x5c, 0x0a, 0x21, 0x54, + 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x76, 0x69, + 0x74, 0x65, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x65, 0x6e, 0x61, + 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, + 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x50, 0x0a, 0x20, 0x54, 0x65, 0x6e, + 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x6f, + 0x67, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x23, 0x0a, 0x21, 0x54, + 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x76, 0x69, + 0x74, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x7d, 0x0a, 0x20, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, + 0x5e, 0x0a, 0x21, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x6d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x52, 0x0c, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x32, + 0xbd, 0x0a, 0x0a, 0x0d, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x5b, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0xd8, 0xf3, 0x18, 0x03, 0xe8, 0xf3, 0x18, 0x01, 0x12, 0x6f, + 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x12, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x04, 0xd8, 0xf3, 0x18, 0x02, 0x12, + 0x55, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0xd8, 0xf3, + 0x18, 0x03, 0xe8, 0xf3, 0x18, 0x02, 0x12, 0x5a, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x1f, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x10, 0xc0, 0xf3, 0x18, 0x01, 0xc0, 0xf3, 0x18, 0x02, 0xc0, 0xf3, 0x18, 0x03, 0xe8, 0xf3, + 0x18, 0x02, 0x12, 0x5f, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0xc0, 0xf3, 0x18, 0x01, 0xc0, 0xf3, 0x18, 0x02, 0xe8, + 0xf3, 0x18, 0x01, 0x12, 0x5f, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x22, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0c, 0xc0, 0xf3, 0x18, 0x01, 0xc0, 0xf3, 0x18, 0x02, + 0xe8, 0xf3, 0x18, 0x01, 0x12, 0x6d, 0x0a, 0x0c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, + 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0xc0, 0xf3, 0x18, 0x01, 0xe8, + 0xf3, 0x18, 0x01, 0x12, 0x6d, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, + 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0xc0, 0xf3, 0x18, 0x01, 0xe8, 0xf3, + 0x18, 0x01, 0x12, 0x5b, 0x0a, 0x06, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x23, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0xc0, 0xf3, 0x18, 0x01, 0xe8, 0xf3, 0x18, 0x01, 0x12, + 0x6d, 0x0a, 0x0c, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x12, + 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x41, 0x63, 0x63, 0x65, + 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0xd8, 0xf3, 0x18, 0x03, 0xe8, 0xf3, 0x18, 0x01, 0x12, 0x6d, + 0x0a, 0x0c, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x28, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x6e, 0x76, 0x69, 0x74, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x08, 0xc0, 0xf3, 0x18, 0x01, 0xe8, 0xf3, 0x18, 0x01, 0x12, 0x6a, 0x0a, + 0x0b, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x27, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x76, 0x69, + 0x74, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x08, 0xc0, 0xf3, 0x18, 0x01, 0xe8, 0xf3, 0x18, 0x02, 0x12, 0x64, 0x0a, 0x09, 0x49, 0x6e, 0x76, + 0x69, 0x74, 0x65, 0x47, 0x65, 0x74, 0x12, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x76, + 0x69, 0x74, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x65, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0xd8, 0xf3, 0x18, 0x03, 0xe8, 0xf3, 0x18, 0x02, 0x42, + 0x84, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0b, + 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x30, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x6c, 0x2d, + 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x67, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x70, 0x69, 0x76, 0x31, 0xa2, + 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, 0x02, 0x06, 0x41, 0x70, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, + 0x06, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x12, 0x41, 0x70, 0x69, 0x5c, 0x56, 0x31, + 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x07, 0x41, + 0x70, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_api_v1_tenant_proto_rawDescOnce sync.Once + file_api_v1_tenant_proto_rawDescData = file_api_v1_tenant_proto_rawDesc +) + +func file_api_v1_tenant_proto_rawDescGZIP() []byte { + file_api_v1_tenant_proto_rawDescOnce.Do(func() { + file_api_v1_tenant_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_v1_tenant_proto_rawDescData) + }) + return file_api_v1_tenant_proto_rawDescData +} + +var file_api_v1_tenant_proto_msgTypes = make([]protoimpl.MessageInfo, 33) +var file_api_v1_tenant_proto_goTypes = []interface{}{ + (*Tenant)(nil), // 0: api.v1.Tenant + (*TenantMember)(nil), // 1: api.v1.TenantMember + (*TenantInvite)(nil), // 2: api.v1.TenantInvite + (*PaymentDetails)(nil), // 3: api.v1.PaymentDetails + (*PaymentDetailsUpdate)(nil), // 4: api.v1.PaymentDetailsUpdate + (*TermsAndConditions)(nil), // 5: api.v1.TermsAndConditions + (*TermsAndConditionsUpdate)(nil), // 6: api.v1.TermsAndConditionsUpdate + (*TenantServiceListRequest)(nil), // 7: api.v1.TenantServiceListRequest + (*TenantServiceGetRequest)(nil), // 8: api.v1.TenantServiceGetRequest + (*TenantServiceCreateRequest)(nil), // 9: api.v1.TenantServiceCreateRequest + (*TenantServiceCreateOrUpdateRequest)(nil), // 10: api.v1.TenantServiceCreateOrUpdateRequest + (*TenantServiceUpdateRequest)(nil), // 11: api.v1.TenantServiceUpdateRequest + (*TenantServiceDeleteRequest)(nil), // 12: api.v1.TenantServiceDeleteRequest + (*TenantServiceGetResponse)(nil), // 13: api.v1.TenantServiceGetResponse + (*TenantServiceListResponse)(nil), // 14: api.v1.TenantServiceListResponse + (*TenantServiceCreateResponse)(nil), // 15: api.v1.TenantServiceCreateResponse + (*TenantServiceCreateOrUpdateResponse)(nil), // 16: api.v1.TenantServiceCreateOrUpdateResponse + (*TenantServiceUpdateResponse)(nil), // 17: api.v1.TenantServiceUpdateResponse + (*TenantServiceDeleteResponse)(nil), // 18: api.v1.TenantServiceDeleteResponse + (*TenantServiceInviteRequest)(nil), // 19: api.v1.TenantServiceInviteRequest + (*TenantServiceInviteResponse)(nil), // 20: api.v1.TenantServiceInviteResponse + (*TenantServiceInvitesListRequest)(nil), // 21: api.v1.TenantServiceInvitesListRequest + (*TenantServiceInvitesListResponse)(nil), // 22: api.v1.TenantServiceInvitesListResponse + (*TenantServiceInviteGetRequest)(nil), // 23: api.v1.TenantServiceInviteGetRequest + (*TenantServiceInviteGetResponse)(nil), // 24: api.v1.TenantServiceInviteGetResponse + (*TenantServiceRemoveMemberRequest)(nil), // 25: api.v1.TenantServiceRemoveMemberRequest + (*TenantServiceRemoveMemberResponse)(nil), // 26: api.v1.TenantServiceRemoveMemberResponse + (*TenantServiceInviteAcceptRequest)(nil), // 27: api.v1.TenantServiceInviteAcceptRequest + (*TenantServiceInviteAcceptResponse)(nil), // 28: api.v1.TenantServiceInviteAcceptResponse + (*TenantServiceInviteDeleteRequest)(nil), // 29: api.v1.TenantServiceInviteDeleteRequest + (*TenantServiceInviteDeleteResponse)(nil), // 30: api.v1.TenantServiceInviteDeleteResponse + (*TenantServiceUpdateMemberRequest)(nil), // 31: api.v1.TenantServiceUpdateMemberRequest + (*TenantServiceUpdateMemberResponse)(nil), // 32: api.v1.TenantServiceUpdateMemberResponse + (OAuthProvider)(0), // 33: api.v1.OAuthProvider + (*timestamppb.Timestamp)(nil), // 34: google.protobuf.Timestamp + (TenantRole)(0), // 35: api.v1.TenantRole + (*Coupon)(nil), // 36: api.v1.Coupon +} +var file_api_v1_tenant_proto_depIdxs = []int32{ + 33, // 0: api.v1.Tenant.oauth_provider:type_name -> api.v1.OAuthProvider + 3, // 1: api.v1.Tenant.payment_details:type_name -> api.v1.PaymentDetails + 5, // 2: api.v1.Tenant.terms_and_conditions:type_name -> api.v1.TermsAndConditions + 1, // 3: api.v1.Tenant.tenant_members:type_name -> api.v1.TenantMember + 34, // 4: api.v1.Tenant.created_at:type_name -> google.protobuf.Timestamp + 34, // 5: api.v1.Tenant.updated_at:type_name -> google.protobuf.Timestamp + 34, // 6: api.v1.Tenant.deleted_at:type_name -> google.protobuf.Timestamp + 35, // 7: api.v1.TenantMember.role:type_name -> api.v1.TenantRole + 34, // 8: api.v1.TenantMember.created_at:type_name -> google.protobuf.Timestamp + 35, // 9: api.v1.TenantInvite.role:type_name -> api.v1.TenantRole + 34, // 10: api.v1.TenantInvite.expires_at:type_name -> google.protobuf.Timestamp + 34, // 11: api.v1.TenantInvite.joined_at:type_name -> google.protobuf.Timestamp + 36, // 12: api.v1.PaymentDetails.coupons:type_name -> api.v1.Coupon + 34, // 13: api.v1.TermsAndConditions.when:type_name -> google.protobuf.Timestamp + 34, // 14: api.v1.TermsAndConditionsUpdate.when:type_name -> google.protobuf.Timestamp + 0, // 15: api.v1.TenantServiceCreateOrUpdateRequest.tenant:type_name -> api.v1.Tenant + 4, // 16: api.v1.TenantServiceUpdateRequest.payment_details:type_name -> api.v1.PaymentDetailsUpdate + 6, // 17: api.v1.TenantServiceUpdateRequest.terms_and_conditions:type_name -> api.v1.TermsAndConditionsUpdate + 0, // 18: api.v1.TenantServiceGetResponse.tenant:type_name -> api.v1.Tenant + 0, // 19: api.v1.TenantServiceListResponse.tenants:type_name -> api.v1.Tenant + 0, // 20: api.v1.TenantServiceCreateResponse.tenant:type_name -> api.v1.Tenant + 0, // 21: api.v1.TenantServiceCreateOrUpdateResponse.tenant:type_name -> api.v1.Tenant + 0, // 22: api.v1.TenantServiceUpdateResponse.tenant:type_name -> api.v1.Tenant + 0, // 23: api.v1.TenantServiceDeleteResponse.tenant:type_name -> api.v1.Tenant + 35, // 24: api.v1.TenantServiceInviteRequest.role:type_name -> api.v1.TenantRole + 2, // 25: api.v1.TenantServiceInviteResponse.invite:type_name -> api.v1.TenantInvite + 2, // 26: api.v1.TenantServiceInvitesListResponse.invites:type_name -> api.v1.TenantInvite + 2, // 27: api.v1.TenantServiceInviteGetResponse.invite:type_name -> api.v1.TenantInvite + 35, // 28: api.v1.TenantServiceUpdateMemberRequest.role:type_name -> api.v1.TenantRole + 1, // 29: api.v1.TenantServiceUpdateMemberResponse.tenant_member:type_name -> api.v1.TenantMember + 9, // 30: api.v1.TenantService.Create:input_type -> api.v1.TenantServiceCreateRequest + 10, // 31: api.v1.TenantService.CreateOrUpdate:input_type -> api.v1.TenantServiceCreateOrUpdateRequest + 7, // 32: api.v1.TenantService.List:input_type -> api.v1.TenantServiceListRequest + 8, // 33: api.v1.TenantService.Get:input_type -> api.v1.TenantServiceGetRequest + 11, // 34: api.v1.TenantService.Update:input_type -> api.v1.TenantServiceUpdateRequest + 12, // 35: api.v1.TenantService.Delete:input_type -> api.v1.TenantServiceDeleteRequest + 25, // 36: api.v1.TenantService.RemoveMember:input_type -> api.v1.TenantServiceRemoveMemberRequest + 31, // 37: api.v1.TenantService.UpdateMember:input_type -> api.v1.TenantServiceUpdateMemberRequest + 19, // 38: api.v1.TenantService.Invite:input_type -> api.v1.TenantServiceInviteRequest + 27, // 39: api.v1.TenantService.InviteAccept:input_type -> api.v1.TenantServiceInviteAcceptRequest + 29, // 40: api.v1.TenantService.InviteDelete:input_type -> api.v1.TenantServiceInviteDeleteRequest + 21, // 41: api.v1.TenantService.InvitesList:input_type -> api.v1.TenantServiceInvitesListRequest + 23, // 42: api.v1.TenantService.InviteGet:input_type -> api.v1.TenantServiceInviteGetRequest + 15, // 43: api.v1.TenantService.Create:output_type -> api.v1.TenantServiceCreateResponse + 16, // 44: api.v1.TenantService.CreateOrUpdate:output_type -> api.v1.TenantServiceCreateOrUpdateResponse + 14, // 45: api.v1.TenantService.List:output_type -> api.v1.TenantServiceListResponse + 13, // 46: api.v1.TenantService.Get:output_type -> api.v1.TenantServiceGetResponse + 17, // 47: api.v1.TenantService.Update:output_type -> api.v1.TenantServiceUpdateResponse + 18, // 48: api.v1.TenantService.Delete:output_type -> api.v1.TenantServiceDeleteResponse + 26, // 49: api.v1.TenantService.RemoveMember:output_type -> api.v1.TenantServiceRemoveMemberResponse + 32, // 50: api.v1.TenantService.UpdateMember:output_type -> api.v1.TenantServiceUpdateMemberResponse + 20, // 51: api.v1.TenantService.Invite:output_type -> api.v1.TenantServiceInviteResponse + 28, // 52: api.v1.TenantService.InviteAccept:output_type -> api.v1.TenantServiceInviteAcceptResponse + 30, // 53: api.v1.TenantService.InviteDelete:output_type -> api.v1.TenantServiceInviteDeleteResponse + 22, // 54: api.v1.TenantService.InvitesList:output_type -> api.v1.TenantServiceInvitesListResponse + 24, // 55: api.v1.TenantService.InviteGet:output_type -> api.v1.TenantServiceInviteGetResponse + 43, // [43:56] is the sub-list for method output_type + 30, // [30:43] is the sub-list for method input_type + 30, // [30:30] is the sub-list for extension type_name + 30, // [30:30] is the sub-list for extension extendee + 0, // [0:30] is the sub-list for field type_name +} + +func init() { file_api_v1_tenant_proto_init() } +func file_api_v1_tenant_proto_init() { + if File_api_v1_tenant_proto != nil { + return + } + file_api_v1_common_proto_init() + file_api_v1_payment_proto_init() + if !protoimpl.UnsafeEnabled { + file_api_v1_tenant_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Tenant); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_tenant_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TenantMember); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_tenant_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TenantInvite); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } } file_api_v1_tenant_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TermsAndConditions); i { + switch v := v.(*PaymentDetails); i { case 0: return &v.state case 1: @@ -1334,7 +2660,7 @@ func file_api_v1_tenant_proto_init() { } } file_api_v1_tenant_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TermsAndConditionsUpdate); i { + switch v := v.(*PaymentDetailsUpdate); i { case 0: return &v.state case 1: @@ -1346,7 +2672,7 @@ func file_api_v1_tenant_proto_init() { } } file_api_v1_tenant_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TenantServiceGetRequest); i { + switch v := v.(*TermsAndConditions); i { case 0: return &v.state case 1: @@ -1358,7 +2684,7 @@ func file_api_v1_tenant_proto_init() { } } file_api_v1_tenant_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TenantServiceCreateRequest); i { + switch v := v.(*TermsAndConditionsUpdate); i { case 0: return &v.state case 1: @@ -1370,7 +2696,7 @@ func file_api_v1_tenant_proto_init() { } } file_api_v1_tenant_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TenantServiceCreateOrUpdateRequest); i { + switch v := v.(*TenantServiceListRequest); i { case 0: return &v.state case 1: @@ -1382,7 +2708,7 @@ func file_api_v1_tenant_proto_init() { } } file_api_v1_tenant_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TenantServiceUpdateRequest); i { + switch v := v.(*TenantServiceGetRequest); i { case 0: return &v.state case 1: @@ -1394,7 +2720,7 @@ func file_api_v1_tenant_proto_init() { } } file_api_v1_tenant_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TenantServiceDeleteRequest); i { + switch v := v.(*TenantServiceCreateRequest); i { case 0: return &v.state case 1: @@ -1406,7 +2732,7 @@ func file_api_v1_tenant_proto_init() { } } file_api_v1_tenant_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TenantServiceGetResponse); i { + switch v := v.(*TenantServiceCreateOrUpdateRequest); i { case 0: return &v.state case 1: @@ -1418,7 +2744,7 @@ func file_api_v1_tenant_proto_init() { } } file_api_v1_tenant_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TenantServiceCreateResponse); i { + switch v := v.(*TenantServiceUpdateRequest); i { case 0: return &v.state case 1: @@ -1430,7 +2756,7 @@ func file_api_v1_tenant_proto_init() { } } file_api_v1_tenant_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TenantServiceCreateOrUpdateResponse); i { + switch v := v.(*TenantServiceDeleteRequest); i { case 0: return &v.state case 1: @@ -1442,7 +2768,7 @@ func file_api_v1_tenant_proto_init() { } } file_api_v1_tenant_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TenantServiceUpdateResponse); i { + switch v := v.(*TenantServiceGetResponse); i { case 0: return &v.state case 1: @@ -1454,6 +2780,54 @@ func file_api_v1_tenant_proto_init() { } } file_api_v1_tenant_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TenantServiceListResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_tenant_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TenantServiceCreateResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_tenant_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TenantServiceCreateOrUpdateResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_tenant_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TenantServiceUpdateResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_tenant_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TenantServiceDeleteResponse); i { case 0: return &v.state @@ -1465,18 +2839,188 @@ func file_api_v1_tenant_proto_init() { return nil } } + file_api_v1_tenant_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TenantServiceInviteRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_tenant_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TenantServiceInviteResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_tenant_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TenantServiceInvitesListRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_tenant_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TenantServiceInvitesListResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_tenant_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TenantServiceInviteGetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_tenant_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TenantServiceInviteGetResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_tenant_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TenantServiceRemoveMemberRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_tenant_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TenantServiceRemoveMemberResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_tenant_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TenantServiceInviteAcceptRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_tenant_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TenantServiceInviteAcceptResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_tenant_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TenantServiceInviteDeleteRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_tenant_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TenantServiceInviteDeleteResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_tenant_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TenantServiceUpdateMemberRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_v1_tenant_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TenantServiceUpdateMemberResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } - file_api_v1_tenant_proto_msgTypes[1].OneofWrappers = []interface{}{} - file_api_v1_tenant_proto_msgTypes[2].OneofWrappers = []interface{}{} + file_api_v1_tenant_proto_msgTypes[3].OneofWrappers = []interface{}{} file_api_v1_tenant_proto_msgTypes[4].OneofWrappers = []interface{}{} - file_api_v1_tenant_proto_msgTypes[8].OneofWrappers = []interface{}{} + file_api_v1_tenant_proto_msgTypes[6].OneofWrappers = []interface{}{} + file_api_v1_tenant_proto_msgTypes[7].OneofWrappers = []interface{}{} + file_api_v1_tenant_proto_msgTypes[9].OneofWrappers = []interface{}{} + file_api_v1_tenant_proto_msgTypes[11].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_api_v1_tenant_proto_rawDesc, NumEnums: 0, - NumMessages: 15, + NumMessages: 33, NumExtensions: 0, NumServices: 1, }, diff --git a/go/api/v1/tenant.pb.validate.go b/go/api/v1/tenant.pb.validate.go index 2df3fee8..19f5ee14 100644 --- a/go/api/v1/tenant.pb.validate.go +++ b/go/api/v1/tenant.pb.validate.go @@ -62,6 +62,8 @@ func (m *Tenant) validate(all bool) error { // no validation rules for Email + // no validation rules for Description + // no validation rules for AvatarUrl // no validation rules for OauthProvider @@ -132,6 +134,42 @@ func (m *Tenant) validate(all bool) error { // no validation rules for Onboarded + for idx, item := range m.GetTenantMembers() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, TenantValidationError{ + field: fmt.Sprintf("TenantMembers[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, TenantValidationError{ + field: fmt.Sprintf("TenantMembers[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return TenantValidationError{ + field: fmt.Sprintf("TenantMembers[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + // no validation rules for CreatedBy + if all { switch v := interface{}(m.GetCreatedAt()).(type) { case interface{ ValidateAll() error }: @@ -296,6 +334,309 @@ var _ interface { ErrorName() string } = TenantValidationError{} +// Validate checks the field values on TenantMember with the rules defined in +// the proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *TenantMember) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on TenantMember with the rules defined +// in the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in TenantMemberMultiError, or +// nil if none found. +func (m *TenantMember) ValidateAll() error { + return m.validate(true) +} + +func (m *TenantMember) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Id + + // no validation rules for Role + + if all { + switch v := interface{}(m.GetCreatedAt()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, TenantMemberValidationError{ + field: "CreatedAt", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, TenantMemberValidationError{ + field: "CreatedAt", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetCreatedAt()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return TenantMemberValidationError{ + field: "CreatedAt", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if len(errors) > 0 { + return TenantMemberMultiError(errors) + } + + return nil +} + +// TenantMemberMultiError is an error wrapping multiple validation errors +// returned by TenantMember.ValidateAll() if the designated constraints aren't met. +type TenantMemberMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m TenantMemberMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m TenantMemberMultiError) AllErrors() []error { return m } + +// TenantMemberValidationError is the validation error returned by +// TenantMember.Validate if the designated constraints aren't met. +type TenantMemberValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e TenantMemberValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e TenantMemberValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e TenantMemberValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e TenantMemberValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e TenantMemberValidationError) ErrorName() string { return "TenantMemberValidationError" } + +// Error satisfies the builtin error interface +func (e TenantMemberValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sTenantMember.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = TenantMemberValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = TenantMemberValidationError{} + +// Validate checks the field values on TenantInvite with the rules defined in +// the proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *TenantInvite) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on TenantInvite with the rules defined +// in the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in TenantInviteMultiError, or +// nil if none found. +func (m *TenantInvite) ValidateAll() error { + return m.validate(true) +} + +func (m *TenantInvite) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Secret + + // no validation rules for TargetTenant + + // no validation rules for Role + + // no validation rules for Joined + + // no validation rules for TargetTenantName + + // no validation rules for Tenant + + // no validation rules for TenantName + + if all { + switch v := interface{}(m.GetExpiresAt()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, TenantInviteValidationError{ + field: "ExpiresAt", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, TenantInviteValidationError{ + field: "ExpiresAt", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetExpiresAt()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return TenantInviteValidationError{ + field: "ExpiresAt", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetJoinedAt()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, TenantInviteValidationError{ + field: "JoinedAt", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, TenantInviteValidationError{ + field: "JoinedAt", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetJoinedAt()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return TenantInviteValidationError{ + field: "JoinedAt", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if len(errors) > 0 { + return TenantInviteMultiError(errors) + } + + return nil +} + +// TenantInviteMultiError is an error wrapping multiple validation errors +// returned by TenantInvite.ValidateAll() if the designated constraints aren't met. +type TenantInviteMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m TenantInviteMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m TenantInviteMultiError) AllErrors() []error { return m } + +// TenantInviteValidationError is the validation error returned by +// TenantInvite.Validate if the designated constraints aren't met. +type TenantInviteValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e TenantInviteValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e TenantInviteValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e TenantInviteValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e TenantInviteValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e TenantInviteValidationError) ErrorName() string { return "TenantInviteValidationError" } + +// Error satisfies the builtin error interface +func (e TenantInviteValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sTenantInvite.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = TenantInviteValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = TenantInviteValidationError{} + // Validate checks the field values on PaymentDetails with the rules defined in // the proto definition for this message. If any rules are violated, the first // error encountered is returned, or nil if there are no violations. @@ -830,10 +1171,131 @@ var _ interface { ErrorName() string } = TermsAndConditionsUpdateValidationError{} -// Validate checks the field values on TenantServiceGetRequest with the rules +// Validate checks the field values on TenantServiceListRequest with the rules // defined in the proto definition for this message. If any rules are // violated, the first error encountered is returned, or nil if there are no violations. -func (m *TenantServiceGetRequest) Validate() error { +func (m *TenantServiceListRequest) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on TenantServiceListRequest with the +// rules defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// TenantServiceListRequestMultiError, or nil if none found. +func (m *TenantServiceListRequest) ValidateAll() error { + return m.validate(true) +} + +func (m *TenantServiceListRequest) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if m.Id != nil { + // no validation rules for Id + } + + if m.Name != nil { + + if l := utf8.RuneCountInString(m.GetName()); l < 2 || l > 64 { + err := TenantServiceListRequestValidationError{ + field: "Name", + reason: "value length must be between 2 and 64 runes, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + + if len(errors) > 0 { + return TenantServiceListRequestMultiError(errors) + } + + return nil +} + +// TenantServiceListRequestMultiError is an error wrapping multiple validation +// errors returned by TenantServiceListRequest.ValidateAll() if the designated +// constraints aren't met. +type TenantServiceListRequestMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m TenantServiceListRequestMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m TenantServiceListRequestMultiError) AllErrors() []error { return m } + +// TenantServiceListRequestValidationError is the validation error returned by +// TenantServiceListRequest.Validate if the designated constraints aren't met. +type TenantServiceListRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e TenantServiceListRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e TenantServiceListRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e TenantServiceListRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e TenantServiceListRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e TenantServiceListRequestValidationError) ErrorName() string { + return "TenantServiceListRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e TenantServiceListRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sTenantServiceListRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = TenantServiceListRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = TenantServiceListRequestValidationError{} + +// Validate checks the field values on TenantServiceGetRequest with the rules +// defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *TenantServiceGetRequest) Validate() error { return m.validate(false) } @@ -956,33 +1418,54 @@ func (m *TenantServiceCreateRequest) validate(all bool) error { var errors []error - if all { - switch v := interface{}(m.GetTenant()).(type) { - case interface{ ValidateAll() error }: - if err := v.ValidateAll(); err != nil { - errors = append(errors, TenantServiceCreateRequestValidationError{ - field: "Tenant", - reason: "embedded message failed validation", - cause: err, - }) + if l := utf8.RuneCountInString(m.GetName()); l < 2 || l > 64 { + err := TenantServiceCreateRequestValidationError{ + field: "Name", + reason: "value length must be between 2 and 64 runes, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + + if m.Description != nil { + + if l := utf8.RuneCountInString(m.GetDescription()); l < 2 || l > 512 { + err := TenantServiceCreateRequestValidationError{ + field: "Description", + reason: "value length must be between 2 and 512 runes, inclusive", } - case interface{ Validate() error }: - if err := v.Validate(); err != nil { - errors = append(errors, TenantServiceCreateRequestValidationError{ - field: "Tenant", - reason: "embedded message failed validation", - cause: err, - }) + if !all { + return err } + errors = append(errors, err) } - } else if v, ok := interface{}(m.GetTenant()).(interface{ Validate() error }); ok { - if err := v.Validate(); err != nil { - return TenantServiceCreateRequestValidationError{ - field: "Tenant", - reason: "embedded message failed validation", + + } + + if m.Email != nil { + + if err := m._validateEmail(m.GetEmail()); err != nil { + err = TenantServiceCreateRequestValidationError{ + field: "Email", + reason: "value must be a valid email address", cause: err, } + if !all { + return err + } + errors = append(errors, err) } + + } + + if m.AvatarUrl != nil { + // no validation rules for AvatarUrl + } + + if m.PhoneNumber != nil { + // no validation rules for PhoneNumber } if len(errors) > 0 { @@ -992,6 +1475,56 @@ func (m *TenantServiceCreateRequest) validate(all bool) error { return nil } +func (m *TenantServiceCreateRequest) _validateHostname(host string) error { + s := strings.ToLower(strings.TrimSuffix(host, ".")) + + if len(host) > 253 { + return errors.New("hostname cannot exceed 253 characters") + } + + for _, part := range strings.Split(s, ".") { + if l := len(part); l == 0 || l > 63 { + return errors.New("hostname part must be non-empty and cannot exceed 63 characters") + } + + if part[0] == '-' { + return errors.New("hostname parts cannot begin with hyphens") + } + + if part[len(part)-1] == '-' { + return errors.New("hostname parts cannot end with hyphens") + } + + for _, r := range part { + if (r < 'a' || r > 'z') && (r < '0' || r > '9') && r != '-' { + return fmt.Errorf("hostname parts can only contain alphanumeric characters or hyphens, got %q", string(r)) + } + } + } + + return nil +} + +func (m *TenantServiceCreateRequest) _validateEmail(addr string) error { + a, err := mail.ParseAddress(addr) + if err != nil { + return err + } + addr = a.Address + + if len(addr) > 254 { + return errors.New("email addresses cannot exceed 254 characters") + } + + parts := strings.SplitN(addr, "@", 2) + + if len(parts[0]) > 64 { + return errors.New("email address local phrase cannot exceed 64 characters") + } + + return m._validateHostname(parts[1]) +} + // TenantServiceCreateRequestMultiError is an error wrapping multiple // validation errors returned by TenantServiceCreateRequest.ValidateAll() if // the designated constraints aren't met. @@ -1224,11 +1757,49 @@ func (m *TenantServiceUpdateRequest) validate(all bool) error { // no validation rules for Login if m.Name != nil { - // no validation rules for Name + + if l := utf8.RuneCountInString(m.GetName()); l < 2 || l > 64 { + err := TenantServiceUpdateRequestValidationError{ + field: "Name", + reason: "value length must be between 2 and 64 runes, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + } if m.Email != nil { - // no validation rules for Email + + if err := m._validateEmail(m.GetEmail()); err != nil { + err = TenantServiceUpdateRequestValidationError{ + field: "Email", + reason: "value must be a valid email address", + cause: err, + } + if !all { + return err + } + errors = append(errors, err) + } + + } + + if m.Description != nil { + + if l := utf8.RuneCountInString(m.GetDescription()); l < 2 || l > 512 { + err := TenantServiceUpdateRequestValidationError{ + field: "Description", + reason: "value length must be between 2 and 512 runes, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + } if m.AvatarUrl != nil { @@ -1312,6 +1883,56 @@ func (m *TenantServiceUpdateRequest) validate(all bool) error { return nil } +func (m *TenantServiceUpdateRequest) _validateHostname(host string) error { + s := strings.ToLower(strings.TrimSuffix(host, ".")) + + if len(host) > 253 { + return errors.New("hostname cannot exceed 253 characters") + } + + for _, part := range strings.Split(s, ".") { + if l := len(part); l == 0 || l > 63 { + return errors.New("hostname part must be non-empty and cannot exceed 63 characters") + } + + if part[0] == '-' { + return errors.New("hostname parts cannot begin with hyphens") + } + + if part[len(part)-1] == '-' { + return errors.New("hostname parts cannot end with hyphens") + } + + for _, r := range part { + if (r < 'a' || r > 'z') && (r < '0' || r > '9') && r != '-' { + return fmt.Errorf("hostname parts can only contain alphanumeric characters or hyphens, got %q", string(r)) + } + } + } + + return nil +} + +func (m *TenantServiceUpdateRequest) _validateEmail(addr string) error { + a, err := mail.ParseAddress(addr) + if err != nil { + return err + } + addr = a.Address + + if len(addr) > 254 { + return errors.New("email addresses cannot exceed 254 characters") + } + + parts := strings.SplitN(addr, "@", 2) + + if len(parts[0]) > 64 { + return errors.New("email address local phrase cannot exceed 64 characters") + } + + return m._validateHostname(parts[1]) +} + // TenantServiceUpdateRequestMultiError is an error wrapping multiple // validation errors returned by TenantServiceUpdateRequest.ValidateAll() if // the designated constraints aren't met. @@ -1620,71 +2241,76 @@ var _ interface { ErrorName() string } = TenantServiceGetResponseValidationError{} -// Validate checks the field values on TenantServiceCreateResponse with the -// rules defined in the proto definition for this message. If any rules are +// Validate checks the field values on TenantServiceListResponse with the rules +// defined in the proto definition for this message. If any rules are // violated, the first error encountered is returned, or nil if there are no violations. -func (m *TenantServiceCreateResponse) Validate() error { +func (m *TenantServiceListResponse) Validate() error { return m.validate(false) } -// ValidateAll checks the field values on TenantServiceCreateResponse with the +// ValidateAll checks the field values on TenantServiceListResponse with the // rules defined in the proto definition for this message. If any rules are // violated, the result is a list of violation errors wrapped in -// TenantServiceCreateResponseMultiError, or nil if none found. -func (m *TenantServiceCreateResponse) ValidateAll() error { +// TenantServiceListResponseMultiError, or nil if none found. +func (m *TenantServiceListResponse) ValidateAll() error { return m.validate(true) } -func (m *TenantServiceCreateResponse) validate(all bool) error { +func (m *TenantServiceListResponse) validate(all bool) error { if m == nil { return nil } var errors []error - if all { - switch v := interface{}(m.GetTenant()).(type) { - case interface{ ValidateAll() error }: - if err := v.ValidateAll(); err != nil { - errors = append(errors, TenantServiceCreateResponseValidationError{ - field: "Tenant", - reason: "embedded message failed validation", - cause: err, - }) + for idx, item := range m.GetTenants() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, TenantServiceListResponseValidationError{ + field: fmt.Sprintf("Tenants[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, TenantServiceListResponseValidationError{ + field: fmt.Sprintf("Tenants[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } } - case interface{ Validate() error }: + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { if err := v.Validate(); err != nil { - errors = append(errors, TenantServiceCreateResponseValidationError{ - field: "Tenant", + return TenantServiceListResponseValidationError{ + field: fmt.Sprintf("Tenants[%v]", idx), reason: "embedded message failed validation", cause: err, - }) - } - } - } else if v, ok := interface{}(m.GetTenant()).(interface{ Validate() error }); ok { - if err := v.Validate(); err != nil { - return TenantServiceCreateResponseValidationError{ - field: "Tenant", - reason: "embedded message failed validation", - cause: err, + } } } + } if len(errors) > 0 { - return TenantServiceCreateResponseMultiError(errors) + return TenantServiceListResponseMultiError(errors) } return nil } -// TenantServiceCreateResponseMultiError is an error wrapping multiple -// validation errors returned by TenantServiceCreateResponse.ValidateAll() if -// the designated constraints aren't met. -type TenantServiceCreateResponseMultiError []error +// TenantServiceListResponseMultiError is an error wrapping multiple validation +// errors returned by TenantServiceListResponse.ValidateAll() if the +// designated constraints aren't met. +type TenantServiceListResponseMultiError []error // Error returns a concatenation of all the error messages it wraps. -func (m TenantServiceCreateResponseMultiError) Error() string { +func (m TenantServiceListResponseMultiError) Error() string { var msgs []string for _, err := range m { msgs = append(msgs, err.Error()) @@ -1693,12 +2319,11 @@ func (m TenantServiceCreateResponseMultiError) Error() string { } // AllErrors returns a list of validation violation errors. -func (m TenantServiceCreateResponseMultiError) AllErrors() []error { return m } +func (m TenantServiceListResponseMultiError) AllErrors() []error { return m } -// TenantServiceCreateResponseValidationError is the validation error returned -// by TenantServiceCreateResponse.Validate if the designated constraints -// aren't met. -type TenantServiceCreateResponseValidationError struct { +// TenantServiceListResponseValidationError is the validation error returned by +// TenantServiceListResponse.Validate if the designated constraints aren't met. +type TenantServiceListResponseValidationError struct { field string reason string cause error @@ -1706,16 +2331,148 @@ type TenantServiceCreateResponseValidationError struct { } // Field function returns field value. -func (e TenantServiceCreateResponseValidationError) Field() string { return e.field } +func (e TenantServiceListResponseValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e TenantServiceCreateResponseValidationError) Reason() string { return e.reason } +func (e TenantServiceListResponseValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e TenantServiceCreateResponseValidationError) Cause() error { return e.cause } +func (e TenantServiceListResponseValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e TenantServiceCreateResponseValidationError) Key() bool { return e.key } +func (e TenantServiceListResponseValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e TenantServiceListResponseValidationError) ErrorName() string { + return "TenantServiceListResponseValidationError" +} + +// Error satisfies the builtin error interface +func (e TenantServiceListResponseValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sTenantServiceListResponse.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = TenantServiceListResponseValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = TenantServiceListResponseValidationError{} + +// Validate checks the field values on TenantServiceCreateResponse with the +// rules defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *TenantServiceCreateResponse) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on TenantServiceCreateResponse with the +// rules defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// TenantServiceCreateResponseMultiError, or nil if none found. +func (m *TenantServiceCreateResponse) ValidateAll() error { + return m.validate(true) +} + +func (m *TenantServiceCreateResponse) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if all { + switch v := interface{}(m.GetTenant()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, TenantServiceCreateResponseValidationError{ + field: "Tenant", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, TenantServiceCreateResponseValidationError{ + field: "Tenant", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetTenant()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return TenantServiceCreateResponseValidationError{ + field: "Tenant", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if len(errors) > 0 { + return TenantServiceCreateResponseMultiError(errors) + } + + return nil +} + +// TenantServiceCreateResponseMultiError is an error wrapping multiple +// validation errors returned by TenantServiceCreateResponse.ValidateAll() if +// the designated constraints aren't met. +type TenantServiceCreateResponseMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m TenantServiceCreateResponseMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m TenantServiceCreateResponseMultiError) AllErrors() []error { return m } + +// TenantServiceCreateResponseValidationError is the validation error returned +// by TenantServiceCreateResponse.Validate if the designated constraints +// aren't met. +type TenantServiceCreateResponseValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e TenantServiceCreateResponseValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e TenantServiceCreateResponseValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e TenantServiceCreateResponseValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e TenantServiceCreateResponseValidationError) Key() bool { return e.key } // ErrorName returns error name. func (e TenantServiceCreateResponseValidationError) ErrorName() string { @@ -2149,3 +2906,1611 @@ var _ interface { Cause() error ErrorName() string } = TenantServiceDeleteResponseValidationError{} + +// Validate checks the field values on TenantServiceInviteRequest with the +// rules defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *TenantServiceInviteRequest) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on TenantServiceInviteRequest with the +// rules defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// TenantServiceInviteRequestMultiError, or nil if none found. +func (m *TenantServiceInviteRequest) ValidateAll() error { + return m.validate(true) +} + +func (m *TenantServiceInviteRequest) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Login + + // no validation rules for Role + + if len(errors) > 0 { + return TenantServiceInviteRequestMultiError(errors) + } + + return nil +} + +// TenantServiceInviteRequestMultiError is an error wrapping multiple +// validation errors returned by TenantServiceInviteRequest.ValidateAll() if +// the designated constraints aren't met. +type TenantServiceInviteRequestMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m TenantServiceInviteRequestMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m TenantServiceInviteRequestMultiError) AllErrors() []error { return m } + +// TenantServiceInviteRequestValidationError is the validation error returned +// by TenantServiceInviteRequest.Validate if the designated constraints aren't met. +type TenantServiceInviteRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e TenantServiceInviteRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e TenantServiceInviteRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e TenantServiceInviteRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e TenantServiceInviteRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e TenantServiceInviteRequestValidationError) ErrorName() string { + return "TenantServiceInviteRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e TenantServiceInviteRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sTenantServiceInviteRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = TenantServiceInviteRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = TenantServiceInviteRequestValidationError{} + +// Validate checks the field values on TenantServiceInviteResponse with the +// rules defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *TenantServiceInviteResponse) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on TenantServiceInviteResponse with the +// rules defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// TenantServiceInviteResponseMultiError, or nil if none found. +func (m *TenantServiceInviteResponse) ValidateAll() error { + return m.validate(true) +} + +func (m *TenantServiceInviteResponse) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if all { + switch v := interface{}(m.GetInvite()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, TenantServiceInviteResponseValidationError{ + field: "Invite", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, TenantServiceInviteResponseValidationError{ + field: "Invite", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetInvite()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return TenantServiceInviteResponseValidationError{ + field: "Invite", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if len(errors) > 0 { + return TenantServiceInviteResponseMultiError(errors) + } + + return nil +} + +// TenantServiceInviteResponseMultiError is an error wrapping multiple +// validation errors returned by TenantServiceInviteResponse.ValidateAll() if +// the designated constraints aren't met. +type TenantServiceInviteResponseMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m TenantServiceInviteResponseMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m TenantServiceInviteResponseMultiError) AllErrors() []error { return m } + +// TenantServiceInviteResponseValidationError is the validation error returned +// by TenantServiceInviteResponse.Validate if the designated constraints +// aren't met. +type TenantServiceInviteResponseValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e TenantServiceInviteResponseValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e TenantServiceInviteResponseValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e TenantServiceInviteResponseValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e TenantServiceInviteResponseValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e TenantServiceInviteResponseValidationError) ErrorName() string { + return "TenantServiceInviteResponseValidationError" +} + +// Error satisfies the builtin error interface +func (e TenantServiceInviteResponseValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sTenantServiceInviteResponse.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = TenantServiceInviteResponseValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = TenantServiceInviteResponseValidationError{} + +// Validate checks the field values on TenantServiceInvitesListRequest with the +// rules defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *TenantServiceInvitesListRequest) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on TenantServiceInvitesListRequest with +// the rules defined in the proto definition for this message. If any rules +// are violated, the result is a list of violation errors wrapped in +// TenantServiceInvitesListRequestMultiError, or nil if none found. +func (m *TenantServiceInvitesListRequest) ValidateAll() error { + return m.validate(true) +} + +func (m *TenantServiceInvitesListRequest) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Login + + if len(errors) > 0 { + return TenantServiceInvitesListRequestMultiError(errors) + } + + return nil +} + +// TenantServiceInvitesListRequestMultiError is an error wrapping multiple +// validation errors returned by TenantServiceInvitesListRequest.ValidateAll() +// if the designated constraints aren't met. +type TenantServiceInvitesListRequestMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m TenantServiceInvitesListRequestMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m TenantServiceInvitesListRequestMultiError) AllErrors() []error { return m } + +// TenantServiceInvitesListRequestValidationError is the validation error +// returned by TenantServiceInvitesListRequest.Validate if the designated +// constraints aren't met. +type TenantServiceInvitesListRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e TenantServiceInvitesListRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e TenantServiceInvitesListRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e TenantServiceInvitesListRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e TenantServiceInvitesListRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e TenantServiceInvitesListRequestValidationError) ErrorName() string { + return "TenantServiceInvitesListRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e TenantServiceInvitesListRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sTenantServiceInvitesListRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = TenantServiceInvitesListRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = TenantServiceInvitesListRequestValidationError{} + +// Validate checks the field values on TenantServiceInvitesListResponse with +// the rules defined in the proto definition for this message. If any rules +// are violated, the first error encountered is returned, or nil if there are +// no violations. +func (m *TenantServiceInvitesListResponse) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on TenantServiceInvitesListResponse with +// the rules defined in the proto definition for this message. If any rules +// are violated, the result is a list of violation errors wrapped in +// TenantServiceInvitesListResponseMultiError, or nil if none found. +func (m *TenantServiceInvitesListResponse) ValidateAll() error { + return m.validate(true) +} + +func (m *TenantServiceInvitesListResponse) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + for idx, item := range m.GetInvites() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, TenantServiceInvitesListResponseValidationError{ + field: fmt.Sprintf("Invites[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, TenantServiceInvitesListResponseValidationError{ + field: fmt.Sprintf("Invites[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return TenantServiceInvitesListResponseValidationError{ + field: fmt.Sprintf("Invites[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if len(errors) > 0 { + return TenantServiceInvitesListResponseMultiError(errors) + } + + return nil +} + +// TenantServiceInvitesListResponseMultiError is an error wrapping multiple +// validation errors returned by +// TenantServiceInvitesListResponse.ValidateAll() if the designated +// constraints aren't met. +type TenantServiceInvitesListResponseMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m TenantServiceInvitesListResponseMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m TenantServiceInvitesListResponseMultiError) AllErrors() []error { return m } + +// TenantServiceInvitesListResponseValidationError is the validation error +// returned by TenantServiceInvitesListResponse.Validate if the designated +// constraints aren't met. +type TenantServiceInvitesListResponseValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e TenantServiceInvitesListResponseValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e TenantServiceInvitesListResponseValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e TenantServiceInvitesListResponseValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e TenantServiceInvitesListResponseValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e TenantServiceInvitesListResponseValidationError) ErrorName() string { + return "TenantServiceInvitesListResponseValidationError" +} + +// Error satisfies the builtin error interface +func (e TenantServiceInvitesListResponseValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sTenantServiceInvitesListResponse.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = TenantServiceInvitesListResponseValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = TenantServiceInvitesListResponseValidationError{} + +// Validate checks the field values on TenantServiceInviteGetRequest with the +// rules defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *TenantServiceInviteGetRequest) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on TenantServiceInviteGetRequest with +// the rules defined in the proto definition for this message. If any rules +// are violated, the result is a list of violation errors wrapped in +// TenantServiceInviteGetRequestMultiError, or nil if none found. +func (m *TenantServiceInviteGetRequest) ValidateAll() error { + return m.validate(true) +} + +func (m *TenantServiceInviteGetRequest) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Secret + + if len(errors) > 0 { + return TenantServiceInviteGetRequestMultiError(errors) + } + + return nil +} + +// TenantServiceInviteGetRequestMultiError is an error wrapping multiple +// validation errors returned by TenantServiceInviteGetRequest.ValidateAll() +// if the designated constraints aren't met. +type TenantServiceInviteGetRequestMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m TenantServiceInviteGetRequestMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m TenantServiceInviteGetRequestMultiError) AllErrors() []error { return m } + +// TenantServiceInviteGetRequestValidationError is the validation error +// returned by TenantServiceInviteGetRequest.Validate if the designated +// constraints aren't met. +type TenantServiceInviteGetRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e TenantServiceInviteGetRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e TenantServiceInviteGetRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e TenantServiceInviteGetRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e TenantServiceInviteGetRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e TenantServiceInviteGetRequestValidationError) ErrorName() string { + return "TenantServiceInviteGetRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e TenantServiceInviteGetRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sTenantServiceInviteGetRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = TenantServiceInviteGetRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = TenantServiceInviteGetRequestValidationError{} + +// Validate checks the field values on TenantServiceInviteGetResponse with the +// rules defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *TenantServiceInviteGetResponse) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on TenantServiceInviteGetResponse with +// the rules defined in the proto definition for this message. If any rules +// are violated, the result is a list of violation errors wrapped in +// TenantServiceInviteGetResponseMultiError, or nil if none found. +func (m *TenantServiceInviteGetResponse) ValidateAll() error { + return m.validate(true) +} + +func (m *TenantServiceInviteGetResponse) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if all { + switch v := interface{}(m.GetInvite()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, TenantServiceInviteGetResponseValidationError{ + field: "Invite", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, TenantServiceInviteGetResponseValidationError{ + field: "Invite", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetInvite()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return TenantServiceInviteGetResponseValidationError{ + field: "Invite", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if len(errors) > 0 { + return TenantServiceInviteGetResponseMultiError(errors) + } + + return nil +} + +// TenantServiceInviteGetResponseMultiError is an error wrapping multiple +// validation errors returned by TenantServiceInviteGetResponse.ValidateAll() +// if the designated constraints aren't met. +type TenantServiceInviteGetResponseMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m TenantServiceInviteGetResponseMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m TenantServiceInviteGetResponseMultiError) AllErrors() []error { return m } + +// TenantServiceInviteGetResponseValidationError is the validation error +// returned by TenantServiceInviteGetResponse.Validate if the designated +// constraints aren't met. +type TenantServiceInviteGetResponseValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e TenantServiceInviteGetResponseValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e TenantServiceInviteGetResponseValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e TenantServiceInviteGetResponseValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e TenantServiceInviteGetResponseValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e TenantServiceInviteGetResponseValidationError) ErrorName() string { + return "TenantServiceInviteGetResponseValidationError" +} + +// Error satisfies the builtin error interface +func (e TenantServiceInviteGetResponseValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sTenantServiceInviteGetResponse.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = TenantServiceInviteGetResponseValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = TenantServiceInviteGetResponseValidationError{} + +// Validate checks the field values on TenantServiceRemoveMemberRequest with +// the rules defined in the proto definition for this message. If any rules +// are violated, the first error encountered is returned, or nil if there are +// no violations. +func (m *TenantServiceRemoveMemberRequest) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on TenantServiceRemoveMemberRequest with +// the rules defined in the proto definition for this message. If any rules +// are violated, the result is a list of violation errors wrapped in +// TenantServiceRemoveMemberRequestMultiError, or nil if none found. +func (m *TenantServiceRemoveMemberRequest) ValidateAll() error { + return m.validate(true) +} + +func (m *TenantServiceRemoveMemberRequest) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Login + + // no validation rules for MemberId + + if len(errors) > 0 { + return TenantServiceRemoveMemberRequestMultiError(errors) + } + + return nil +} + +// TenantServiceRemoveMemberRequestMultiError is an error wrapping multiple +// validation errors returned by +// TenantServiceRemoveMemberRequest.ValidateAll() if the designated +// constraints aren't met. +type TenantServiceRemoveMemberRequestMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m TenantServiceRemoveMemberRequestMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m TenantServiceRemoveMemberRequestMultiError) AllErrors() []error { return m } + +// TenantServiceRemoveMemberRequestValidationError is the validation error +// returned by TenantServiceRemoveMemberRequest.Validate if the designated +// constraints aren't met. +type TenantServiceRemoveMemberRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e TenantServiceRemoveMemberRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e TenantServiceRemoveMemberRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e TenantServiceRemoveMemberRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e TenantServiceRemoveMemberRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e TenantServiceRemoveMemberRequestValidationError) ErrorName() string { + return "TenantServiceRemoveMemberRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e TenantServiceRemoveMemberRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sTenantServiceRemoveMemberRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = TenantServiceRemoveMemberRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = TenantServiceRemoveMemberRequestValidationError{} + +// Validate checks the field values on TenantServiceRemoveMemberResponse with +// the rules defined in the proto definition for this message. If any rules +// are violated, the first error encountered is returned, or nil if there are +// no violations. +func (m *TenantServiceRemoveMemberResponse) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on TenantServiceRemoveMemberResponse +// with the rules defined in the proto definition for this message. If any +// rules are violated, the result is a list of violation errors wrapped in +// TenantServiceRemoveMemberResponseMultiError, or nil if none found. +func (m *TenantServiceRemoveMemberResponse) ValidateAll() error { + return m.validate(true) +} + +func (m *TenantServiceRemoveMemberResponse) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if len(errors) > 0 { + return TenantServiceRemoveMemberResponseMultiError(errors) + } + + return nil +} + +// TenantServiceRemoveMemberResponseMultiError is an error wrapping multiple +// validation errors returned by +// TenantServiceRemoveMemberResponse.ValidateAll() if the designated +// constraints aren't met. +type TenantServiceRemoveMemberResponseMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m TenantServiceRemoveMemberResponseMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m TenantServiceRemoveMemberResponseMultiError) AllErrors() []error { return m } + +// TenantServiceRemoveMemberResponseValidationError is the validation error +// returned by TenantServiceRemoveMemberResponse.Validate if the designated +// constraints aren't met. +type TenantServiceRemoveMemberResponseValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e TenantServiceRemoveMemberResponseValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e TenantServiceRemoveMemberResponseValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e TenantServiceRemoveMemberResponseValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e TenantServiceRemoveMemberResponseValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e TenantServiceRemoveMemberResponseValidationError) ErrorName() string { + return "TenantServiceRemoveMemberResponseValidationError" +} + +// Error satisfies the builtin error interface +func (e TenantServiceRemoveMemberResponseValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sTenantServiceRemoveMemberResponse.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = TenantServiceRemoveMemberResponseValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = TenantServiceRemoveMemberResponseValidationError{} + +// Validate checks the field values on TenantServiceInviteAcceptRequest with +// the rules defined in the proto definition for this message. If any rules +// are violated, the first error encountered is returned, or nil if there are +// no violations. +func (m *TenantServiceInviteAcceptRequest) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on TenantServiceInviteAcceptRequest with +// the rules defined in the proto definition for this message. If any rules +// are violated, the result is a list of violation errors wrapped in +// TenantServiceInviteAcceptRequestMultiError, or nil if none found. +func (m *TenantServiceInviteAcceptRequest) ValidateAll() error { + return m.validate(true) +} + +func (m *TenantServiceInviteAcceptRequest) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Secret + + if len(errors) > 0 { + return TenantServiceInviteAcceptRequestMultiError(errors) + } + + return nil +} + +// TenantServiceInviteAcceptRequestMultiError is an error wrapping multiple +// validation errors returned by +// TenantServiceInviteAcceptRequest.ValidateAll() if the designated +// constraints aren't met. +type TenantServiceInviteAcceptRequestMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m TenantServiceInviteAcceptRequestMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m TenantServiceInviteAcceptRequestMultiError) AllErrors() []error { return m } + +// TenantServiceInviteAcceptRequestValidationError is the validation error +// returned by TenantServiceInviteAcceptRequest.Validate if the designated +// constraints aren't met. +type TenantServiceInviteAcceptRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e TenantServiceInviteAcceptRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e TenantServiceInviteAcceptRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e TenantServiceInviteAcceptRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e TenantServiceInviteAcceptRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e TenantServiceInviteAcceptRequestValidationError) ErrorName() string { + return "TenantServiceInviteAcceptRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e TenantServiceInviteAcceptRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sTenantServiceInviteAcceptRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = TenantServiceInviteAcceptRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = TenantServiceInviteAcceptRequestValidationError{} + +// Validate checks the field values on TenantServiceInviteAcceptResponse with +// the rules defined in the proto definition for this message. If any rules +// are violated, the first error encountered is returned, or nil if there are +// no violations. +func (m *TenantServiceInviteAcceptResponse) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on TenantServiceInviteAcceptResponse +// with the rules defined in the proto definition for this message. If any +// rules are violated, the result is a list of violation errors wrapped in +// TenantServiceInviteAcceptResponseMultiError, or nil if none found. +func (m *TenantServiceInviteAcceptResponse) ValidateAll() error { + return m.validate(true) +} + +func (m *TenantServiceInviteAcceptResponse) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Tenant + + // no validation rules for TenantName + + if len(errors) > 0 { + return TenantServiceInviteAcceptResponseMultiError(errors) + } + + return nil +} + +// TenantServiceInviteAcceptResponseMultiError is an error wrapping multiple +// validation errors returned by +// TenantServiceInviteAcceptResponse.ValidateAll() if the designated +// constraints aren't met. +type TenantServiceInviteAcceptResponseMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m TenantServiceInviteAcceptResponseMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m TenantServiceInviteAcceptResponseMultiError) AllErrors() []error { return m } + +// TenantServiceInviteAcceptResponseValidationError is the validation error +// returned by TenantServiceInviteAcceptResponse.Validate if the designated +// constraints aren't met. +type TenantServiceInviteAcceptResponseValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e TenantServiceInviteAcceptResponseValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e TenantServiceInviteAcceptResponseValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e TenantServiceInviteAcceptResponseValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e TenantServiceInviteAcceptResponseValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e TenantServiceInviteAcceptResponseValidationError) ErrorName() string { + return "TenantServiceInviteAcceptResponseValidationError" +} + +// Error satisfies the builtin error interface +func (e TenantServiceInviteAcceptResponseValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sTenantServiceInviteAcceptResponse.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = TenantServiceInviteAcceptResponseValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = TenantServiceInviteAcceptResponseValidationError{} + +// Validate checks the field values on TenantServiceInviteDeleteRequest with +// the rules defined in the proto definition for this message. If any rules +// are violated, the first error encountered is returned, or nil if there are +// no violations. +func (m *TenantServiceInviteDeleteRequest) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on TenantServiceInviteDeleteRequest with +// the rules defined in the proto definition for this message. If any rules +// are violated, the result is a list of violation errors wrapped in +// TenantServiceInviteDeleteRequestMultiError, or nil if none found. +func (m *TenantServiceInviteDeleteRequest) ValidateAll() error { + return m.validate(true) +} + +func (m *TenantServiceInviteDeleteRequest) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Login + + // no validation rules for Secret + + if len(errors) > 0 { + return TenantServiceInviteDeleteRequestMultiError(errors) + } + + return nil +} + +// TenantServiceInviteDeleteRequestMultiError is an error wrapping multiple +// validation errors returned by +// TenantServiceInviteDeleteRequest.ValidateAll() if the designated +// constraints aren't met. +type TenantServiceInviteDeleteRequestMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m TenantServiceInviteDeleteRequestMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m TenantServiceInviteDeleteRequestMultiError) AllErrors() []error { return m } + +// TenantServiceInviteDeleteRequestValidationError is the validation error +// returned by TenantServiceInviteDeleteRequest.Validate if the designated +// constraints aren't met. +type TenantServiceInviteDeleteRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e TenantServiceInviteDeleteRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e TenantServiceInviteDeleteRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e TenantServiceInviteDeleteRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e TenantServiceInviteDeleteRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e TenantServiceInviteDeleteRequestValidationError) ErrorName() string { + return "TenantServiceInviteDeleteRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e TenantServiceInviteDeleteRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sTenantServiceInviteDeleteRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = TenantServiceInviteDeleteRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = TenantServiceInviteDeleteRequestValidationError{} + +// Validate checks the field values on TenantServiceInviteDeleteResponse with +// the rules defined in the proto definition for this message. If any rules +// are violated, the first error encountered is returned, or nil if there are +// no violations. +func (m *TenantServiceInviteDeleteResponse) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on TenantServiceInviteDeleteResponse +// with the rules defined in the proto definition for this message. If any +// rules are violated, the result is a list of violation errors wrapped in +// TenantServiceInviteDeleteResponseMultiError, or nil if none found. +func (m *TenantServiceInviteDeleteResponse) ValidateAll() error { + return m.validate(true) +} + +func (m *TenantServiceInviteDeleteResponse) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if len(errors) > 0 { + return TenantServiceInviteDeleteResponseMultiError(errors) + } + + return nil +} + +// TenantServiceInviteDeleteResponseMultiError is an error wrapping multiple +// validation errors returned by +// TenantServiceInviteDeleteResponse.ValidateAll() if the designated +// constraints aren't met. +type TenantServiceInviteDeleteResponseMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m TenantServiceInviteDeleteResponseMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m TenantServiceInviteDeleteResponseMultiError) AllErrors() []error { return m } + +// TenantServiceInviteDeleteResponseValidationError is the validation error +// returned by TenantServiceInviteDeleteResponse.Validate if the designated +// constraints aren't met. +type TenantServiceInviteDeleteResponseValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e TenantServiceInviteDeleteResponseValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e TenantServiceInviteDeleteResponseValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e TenantServiceInviteDeleteResponseValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e TenantServiceInviteDeleteResponseValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e TenantServiceInviteDeleteResponseValidationError) ErrorName() string { + return "TenantServiceInviteDeleteResponseValidationError" +} + +// Error satisfies the builtin error interface +func (e TenantServiceInviteDeleteResponseValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sTenantServiceInviteDeleteResponse.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = TenantServiceInviteDeleteResponseValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = TenantServiceInviteDeleteResponseValidationError{} + +// Validate checks the field values on TenantServiceUpdateMemberRequest with +// the rules defined in the proto definition for this message. If any rules +// are violated, the first error encountered is returned, or nil if there are +// no violations. +func (m *TenantServiceUpdateMemberRequest) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on TenantServiceUpdateMemberRequest with +// the rules defined in the proto definition for this message. If any rules +// are violated, the result is a list of violation errors wrapped in +// TenantServiceUpdateMemberRequestMultiError, or nil if none found. +func (m *TenantServiceUpdateMemberRequest) ValidateAll() error { + return m.validate(true) +} + +func (m *TenantServiceUpdateMemberRequest) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Login + + // no validation rules for MemberId + + // no validation rules for Role + + if len(errors) > 0 { + return TenantServiceUpdateMemberRequestMultiError(errors) + } + + return nil +} + +// TenantServiceUpdateMemberRequestMultiError is an error wrapping multiple +// validation errors returned by +// TenantServiceUpdateMemberRequest.ValidateAll() if the designated +// constraints aren't met. +type TenantServiceUpdateMemberRequestMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m TenantServiceUpdateMemberRequestMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m TenantServiceUpdateMemberRequestMultiError) AllErrors() []error { return m } + +// TenantServiceUpdateMemberRequestValidationError is the validation error +// returned by TenantServiceUpdateMemberRequest.Validate if the designated +// constraints aren't met. +type TenantServiceUpdateMemberRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e TenantServiceUpdateMemberRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e TenantServiceUpdateMemberRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e TenantServiceUpdateMemberRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e TenantServiceUpdateMemberRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e TenantServiceUpdateMemberRequestValidationError) ErrorName() string { + return "TenantServiceUpdateMemberRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e TenantServiceUpdateMemberRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sTenantServiceUpdateMemberRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = TenantServiceUpdateMemberRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = TenantServiceUpdateMemberRequestValidationError{} + +// Validate checks the field values on TenantServiceUpdateMemberResponse with +// the rules defined in the proto definition for this message. If any rules +// are violated, the first error encountered is returned, or nil if there are +// no violations. +func (m *TenantServiceUpdateMemberResponse) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on TenantServiceUpdateMemberResponse +// with the rules defined in the proto definition for this message. If any +// rules are violated, the result is a list of violation errors wrapped in +// TenantServiceUpdateMemberResponseMultiError, or nil if none found. +func (m *TenantServiceUpdateMemberResponse) ValidateAll() error { + return m.validate(true) +} + +func (m *TenantServiceUpdateMemberResponse) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if all { + switch v := interface{}(m.GetTenantMember()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, TenantServiceUpdateMemberResponseValidationError{ + field: "TenantMember", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, TenantServiceUpdateMemberResponseValidationError{ + field: "TenantMember", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetTenantMember()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return TenantServiceUpdateMemberResponseValidationError{ + field: "TenantMember", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if len(errors) > 0 { + return TenantServiceUpdateMemberResponseMultiError(errors) + } + + return nil +} + +// TenantServiceUpdateMemberResponseMultiError is an error wrapping multiple +// validation errors returned by +// TenantServiceUpdateMemberResponse.ValidateAll() if the designated +// constraints aren't met. +type TenantServiceUpdateMemberResponseMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m TenantServiceUpdateMemberResponseMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m TenantServiceUpdateMemberResponseMultiError) AllErrors() []error { return m } + +// TenantServiceUpdateMemberResponseValidationError is the validation error +// returned by TenantServiceUpdateMemberResponse.Validate if the designated +// constraints aren't met. +type TenantServiceUpdateMemberResponseValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e TenantServiceUpdateMemberResponseValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e TenantServiceUpdateMemberResponseValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e TenantServiceUpdateMemberResponseValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e TenantServiceUpdateMemberResponseValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e TenantServiceUpdateMemberResponseValidationError) ErrorName() string { + return "TenantServiceUpdateMemberResponseValidationError" +} + +// Error satisfies the builtin error interface +func (e TenantServiceUpdateMemberResponseValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sTenantServiceUpdateMemberResponse.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = TenantServiceUpdateMemberResponseValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = TenantServiceUpdateMemberResponseValidationError{} diff --git a/go/api/v1/volume.pb.go b/go/api/v1/volume.pb.go index b61922d8..e30d72a3 100644 --- a/go/api/v1/volume.pb.go +++ b/go/api/v1/volume.pb.go @@ -266,11 +266,11 @@ type VolumeStatistics struct { // // Physical storage space used by volume excluding parity, given in bytes. PhysicalUsedStorage uint64 `protobuf:"varint,2,opt,name=physical_used_storage,json=physicalUsedStorage,proto3" json:"physical_used_storage,omitempty"` - // CommpressionRatio + // CompressionRatio // // compression ratio userWritten/physicalCapacity CompressionRatio float64 `protobuf:"fixed64,3,opt,name=compression_ratio,json=compressionRatio,proto3" json:"compression_ratio,omitempty"` - // TotalCommpressionRatio + // TotalCompressionRatio // // compression ratio sum(userWritten) / sum(physical capacity) TotalCompressionRatio float64 `protobuf:"fixed64,4,opt,name=total_compression_ratio,json=totalCompressionRatio,proto3" json:"total_compression_ratio,omitempty"` diff --git a/go/permissions/servicepermissions.go b/go/permissions/servicepermissions.go index 7ee3691f..1d96d581 100755 --- a/go/permissions/servicepermissions.go +++ b/go/permissions/servicepermissions.go @@ -64,7 +64,6 @@ func GetServicePermissions() *ServicePermissions { "/api.v1.PaymentService/RequestAdmission", "/api.v1.PaymentService/HasChargeableResources", "/api.v1.ProjectService/Create", - "/api.v1.TenantService/Create", "/api.v1.TenantService/Get", "/api.v1.TenantService/Update", "/api.v1.TenantService/Delete", @@ -84,10 +83,14 @@ func GetServicePermissions() *ServicePermissions { "/api.v1.PaymentService/SetOnboarded", "/api.v1.PaymentService/GetOnboarded", "/api.v1.ProjectService/Create", - "/api.v1.TenantService/Create", "/api.v1.TenantService/Get", "/api.v1.TenantService/Update", "/api.v1.TenantService/Delete", + "/api.v1.TenantService/RemoveMember", + "/api.v1.TenantService/UpdateMember", + "/api.v1.TenantService/Invite", + "/api.v1.TenantService/InviteDelete", + "/api.v1.TenantService/InvitesList", }, "TENANT_ROLE_VIEWER": []string{ "/api.v1.PaymentService/HasPaymentMethod", @@ -228,7 +231,15 @@ func GetServicePermissions() *ServicePermissions { "/api.v1.TenantService/CreateOrUpdate": true, "/api.v1.TenantService/Delete": true, "/api.v1.TenantService/Get": true, + "/api.v1.TenantService/Invite": true, + "/api.v1.TenantService/InviteAccept": true, + "/api.v1.TenantService/InviteDelete": true, + "/api.v1.TenantService/InviteGet": true, + "/api.v1.TenantService/InvitesList": true, + "/api.v1.TenantService/List": true, + "/api.v1.TenantService/RemoveMember": true, "/api.v1.TenantService/Update": true, + "/api.v1.TenantService/UpdateMember": true, "/api.v1.TokenService/Create": true, "/api.v1.TokenService/List": true, "/api.v1.TokenService/Revoke": true, @@ -260,6 +271,10 @@ func GetServicePermissions() *ServicePermissions { "/api.v1.ProjectService/InviteAccept": true, "/api.v1.ProjectService/InviteGet": true, "/api.v1.ProjectService/List": true, + "/api.v1.TenantService/Create": true, + "/api.v1.TenantService/InviteAccept": true, + "/api.v1.TenantService/InviteGet": true, + "/api.v1.TenantService/List": true, "/api.v1.TokenService/Create": true, "/api.v1.TokenService/List": true, "/api.v1.TokenService/Revoke": true, @@ -337,7 +352,15 @@ func GetServicePermissions() *ServicePermissions { "/api.v1.TenantService/CreateOrUpdate": true, "/api.v1.TenantService/Delete": true, "/api.v1.TenantService/Get": false, + "/api.v1.TenantService/Invite": true, + "/api.v1.TenantService/InviteAccept": true, + "/api.v1.TenantService/InviteDelete": true, + "/api.v1.TenantService/InviteGet": false, + "/api.v1.TenantService/InvitesList": false, + "/api.v1.TenantService/List": false, + "/api.v1.TenantService/RemoveMember": true, "/api.v1.TenantService/Update": true, + "/api.v1.TenantService/UpdateMember": true, "/api.v1.TokenService/Create": true, "/api.v1.TokenService/List": true, "/api.v1.TokenService/Revoke": true, diff --git a/go/tests/mocks/admin/v1/adminv1connect/ClusterServiceClient.go b/go/tests/mocks/admin/v1/adminv1connect/ClusterServiceClient.go index 0bcf626c..141a3d36 100644 --- a/go/tests/mocks/admin/v1/adminv1connect/ClusterServiceClient.go +++ b/go/tests/mocks/admin/v1/adminv1connect/ClusterServiceClient.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package adminv1connect diff --git a/go/tests/mocks/admin/v1/adminv1connect/ClusterServiceHandler.go b/go/tests/mocks/admin/v1/adminv1connect/ClusterServiceHandler.go index 8fe402a3..ad146f12 100644 --- a/go/tests/mocks/admin/v1/adminv1connect/ClusterServiceHandler.go +++ b/go/tests/mocks/admin/v1/adminv1connect/ClusterServiceHandler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package adminv1connect diff --git a/go/tests/mocks/admin/v1/adminv1connect/PaymentServiceClient.go b/go/tests/mocks/admin/v1/adminv1connect/PaymentServiceClient.go index 7ec484f9..04a336e4 100644 --- a/go/tests/mocks/admin/v1/adminv1connect/PaymentServiceClient.go +++ b/go/tests/mocks/admin/v1/adminv1connect/PaymentServiceClient.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package adminv1connect diff --git a/go/tests/mocks/admin/v1/adminv1connect/PaymentServiceHandler.go b/go/tests/mocks/admin/v1/adminv1connect/PaymentServiceHandler.go index 74fdd454..95c512b0 100644 --- a/go/tests/mocks/admin/v1/adminv1connect/PaymentServiceHandler.go +++ b/go/tests/mocks/admin/v1/adminv1connect/PaymentServiceHandler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package adminv1connect diff --git a/go/tests/mocks/admin/v1/adminv1connect/StorageServiceClient.go b/go/tests/mocks/admin/v1/adminv1connect/StorageServiceClient.go index 2a4a25d5..70dacf3a 100644 --- a/go/tests/mocks/admin/v1/adminv1connect/StorageServiceClient.go +++ b/go/tests/mocks/admin/v1/adminv1connect/StorageServiceClient.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package adminv1connect diff --git a/go/tests/mocks/admin/v1/adminv1connect/StorageServiceHandler.go b/go/tests/mocks/admin/v1/adminv1connect/StorageServiceHandler.go index c3b4ec85..80e158ef 100644 --- a/go/tests/mocks/admin/v1/adminv1connect/StorageServiceHandler.go +++ b/go/tests/mocks/admin/v1/adminv1connect/StorageServiceHandler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package adminv1connect diff --git a/go/tests/mocks/admin/v1/adminv1connect/TenantServiceClient.go b/go/tests/mocks/admin/v1/adminv1connect/TenantServiceClient.go index 7de8205e..258c8a1e 100644 --- a/go/tests/mocks/admin/v1/adminv1connect/TenantServiceClient.go +++ b/go/tests/mocks/admin/v1/adminv1connect/TenantServiceClient.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package adminv1connect diff --git a/go/tests/mocks/admin/v1/adminv1connect/TenantServiceHandler.go b/go/tests/mocks/admin/v1/adminv1connect/TenantServiceHandler.go index da8f130a..290dd99a 100644 --- a/go/tests/mocks/admin/v1/adminv1connect/TenantServiceHandler.go +++ b/go/tests/mocks/admin/v1/adminv1connect/TenantServiceHandler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package adminv1connect diff --git a/go/tests/mocks/admin/v1/adminv1connect/TokenServiceClient.go b/go/tests/mocks/admin/v1/adminv1connect/TokenServiceClient.go index e3d4ba09..b6312f12 100644 --- a/go/tests/mocks/admin/v1/adminv1connect/TokenServiceClient.go +++ b/go/tests/mocks/admin/v1/adminv1connect/TokenServiceClient.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package adminv1connect diff --git a/go/tests/mocks/admin/v1/adminv1connect/TokenServiceHandler.go b/go/tests/mocks/admin/v1/adminv1connect/TokenServiceHandler.go index bd7293d1..36956dca 100644 --- a/go/tests/mocks/admin/v1/adminv1connect/TokenServiceHandler.go +++ b/go/tests/mocks/admin/v1/adminv1connect/TokenServiceHandler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package adminv1connect diff --git a/go/tests/mocks/api/v1/apiv1connect/AssetServiceClient.go b/go/tests/mocks/api/v1/apiv1connect/AssetServiceClient.go index ad8bf2be..d5175551 100644 --- a/go/tests/mocks/api/v1/apiv1connect/AssetServiceClient.go +++ b/go/tests/mocks/api/v1/apiv1connect/AssetServiceClient.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package apiv1connect diff --git a/go/tests/mocks/api/v1/apiv1connect/AssetServiceHandler.go b/go/tests/mocks/api/v1/apiv1connect/AssetServiceHandler.go index 7d1051e1..3976d42c 100644 --- a/go/tests/mocks/api/v1/apiv1connect/AssetServiceHandler.go +++ b/go/tests/mocks/api/v1/apiv1connect/AssetServiceHandler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package apiv1connect diff --git a/go/tests/mocks/api/v1/apiv1connect/ClusterServiceClient.go b/go/tests/mocks/api/v1/apiv1connect/ClusterServiceClient.go index 95e58e8a..e7fc9ea9 100644 --- a/go/tests/mocks/api/v1/apiv1connect/ClusterServiceClient.go +++ b/go/tests/mocks/api/v1/apiv1connect/ClusterServiceClient.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package apiv1connect diff --git a/go/tests/mocks/api/v1/apiv1connect/ClusterServiceHandler.go b/go/tests/mocks/api/v1/apiv1connect/ClusterServiceHandler.go index 1c0d5667..c95c53e5 100644 --- a/go/tests/mocks/api/v1/apiv1connect/ClusterServiceHandler.go +++ b/go/tests/mocks/api/v1/apiv1connect/ClusterServiceHandler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package apiv1connect diff --git a/go/tests/mocks/api/v1/apiv1connect/HealthServiceClient.go b/go/tests/mocks/api/v1/apiv1connect/HealthServiceClient.go index 5a6f6f8e..aa846a24 100644 --- a/go/tests/mocks/api/v1/apiv1connect/HealthServiceClient.go +++ b/go/tests/mocks/api/v1/apiv1connect/HealthServiceClient.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package apiv1connect diff --git a/go/tests/mocks/api/v1/apiv1connect/HealthServiceHandler.go b/go/tests/mocks/api/v1/apiv1connect/HealthServiceHandler.go index 7705ae35..fb28ec85 100644 --- a/go/tests/mocks/api/v1/apiv1connect/HealthServiceHandler.go +++ b/go/tests/mocks/api/v1/apiv1connect/HealthServiceHandler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package apiv1connect diff --git a/go/tests/mocks/api/v1/apiv1connect/IPServiceClient.go b/go/tests/mocks/api/v1/apiv1connect/IPServiceClient.go index 501baf61..1b20e0ce 100644 --- a/go/tests/mocks/api/v1/apiv1connect/IPServiceClient.go +++ b/go/tests/mocks/api/v1/apiv1connect/IPServiceClient.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package apiv1connect diff --git a/go/tests/mocks/api/v1/apiv1connect/IPServiceHandler.go b/go/tests/mocks/api/v1/apiv1connect/IPServiceHandler.go index ddbbad4c..5b1658b3 100644 --- a/go/tests/mocks/api/v1/apiv1connect/IPServiceHandler.go +++ b/go/tests/mocks/api/v1/apiv1connect/IPServiceHandler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package apiv1connect diff --git a/go/tests/mocks/api/v1/apiv1connect/MethodServiceClient.go b/go/tests/mocks/api/v1/apiv1connect/MethodServiceClient.go index 1dd5f698..4de3038c 100644 --- a/go/tests/mocks/api/v1/apiv1connect/MethodServiceClient.go +++ b/go/tests/mocks/api/v1/apiv1connect/MethodServiceClient.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package apiv1connect diff --git a/go/tests/mocks/api/v1/apiv1connect/MethodServiceHandler.go b/go/tests/mocks/api/v1/apiv1connect/MethodServiceHandler.go index f168e8bd..eed01a20 100644 --- a/go/tests/mocks/api/v1/apiv1connect/MethodServiceHandler.go +++ b/go/tests/mocks/api/v1/apiv1connect/MethodServiceHandler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package apiv1connect diff --git a/go/tests/mocks/api/v1/apiv1connect/PaymentServiceClient.go b/go/tests/mocks/api/v1/apiv1connect/PaymentServiceClient.go index 8bba5bf6..381188dd 100644 --- a/go/tests/mocks/api/v1/apiv1connect/PaymentServiceClient.go +++ b/go/tests/mocks/api/v1/apiv1connect/PaymentServiceClient.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package apiv1connect diff --git a/go/tests/mocks/api/v1/apiv1connect/PaymentServiceHandler.go b/go/tests/mocks/api/v1/apiv1connect/PaymentServiceHandler.go index ab733d34..3b8b3cce 100644 --- a/go/tests/mocks/api/v1/apiv1connect/PaymentServiceHandler.go +++ b/go/tests/mocks/api/v1/apiv1connect/PaymentServiceHandler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package apiv1connect diff --git a/go/tests/mocks/api/v1/apiv1connect/ProjectServiceClient.go b/go/tests/mocks/api/v1/apiv1connect/ProjectServiceClient.go index ad090710..cc270735 100644 --- a/go/tests/mocks/api/v1/apiv1connect/ProjectServiceClient.go +++ b/go/tests/mocks/api/v1/apiv1connect/ProjectServiceClient.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package apiv1connect diff --git a/go/tests/mocks/api/v1/apiv1connect/ProjectServiceHandler.go b/go/tests/mocks/api/v1/apiv1connect/ProjectServiceHandler.go index da2decfc..44b81303 100644 --- a/go/tests/mocks/api/v1/apiv1connect/ProjectServiceHandler.go +++ b/go/tests/mocks/api/v1/apiv1connect/ProjectServiceHandler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package apiv1connect diff --git a/go/tests/mocks/api/v1/apiv1connect/SnapshotServiceClient.go b/go/tests/mocks/api/v1/apiv1connect/SnapshotServiceClient.go index ec21559e..8ba7cf1c 100644 --- a/go/tests/mocks/api/v1/apiv1connect/SnapshotServiceClient.go +++ b/go/tests/mocks/api/v1/apiv1connect/SnapshotServiceClient.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package apiv1connect diff --git a/go/tests/mocks/api/v1/apiv1connect/SnapshotServiceHandler.go b/go/tests/mocks/api/v1/apiv1connect/SnapshotServiceHandler.go index bb1efa99..92da0eee 100644 --- a/go/tests/mocks/api/v1/apiv1connect/SnapshotServiceHandler.go +++ b/go/tests/mocks/api/v1/apiv1connect/SnapshotServiceHandler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package apiv1connect diff --git a/go/tests/mocks/api/v1/apiv1connect/TenantServiceClient.go b/go/tests/mocks/api/v1/apiv1connect/TenantServiceClient.go index 05a5218e..a6d9bc14 100644 --- a/go/tests/mocks/api/v1/apiv1connect/TenantServiceClient.go +++ b/go/tests/mocks/api/v1/apiv1connect/TenantServiceClient.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package apiv1connect @@ -136,6 +136,216 @@ func (_m *TenantServiceClient) Get(_a0 context.Context, _a1 *connect.Request[api return r0, r1 } +// Invite provides a mock function with given fields: _a0, _a1 +func (_m *TenantServiceClient) Invite(_a0 context.Context, _a1 *connect.Request[apiv1.TenantServiceInviteRequest]) (*connect.Response[apiv1.TenantServiceInviteResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for Invite") + } + + var r0 *connect.Response[apiv1.TenantServiceInviteResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceInviteRequest]) (*connect.Response[apiv1.TenantServiceInviteResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceInviteRequest]) *connect.Response[apiv1.TenantServiceInviteResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.Response[apiv1.TenantServiceInviteResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[apiv1.TenantServiceInviteRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// InviteAccept provides a mock function with given fields: _a0, _a1 +func (_m *TenantServiceClient) InviteAccept(_a0 context.Context, _a1 *connect.Request[apiv1.TenantServiceInviteAcceptRequest]) (*connect.Response[apiv1.TenantServiceInviteAcceptResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for InviteAccept") + } + + var r0 *connect.Response[apiv1.TenantServiceInviteAcceptResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceInviteAcceptRequest]) (*connect.Response[apiv1.TenantServiceInviteAcceptResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceInviteAcceptRequest]) *connect.Response[apiv1.TenantServiceInviteAcceptResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.Response[apiv1.TenantServiceInviteAcceptResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[apiv1.TenantServiceInviteAcceptRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// InviteDelete provides a mock function with given fields: _a0, _a1 +func (_m *TenantServiceClient) InviteDelete(_a0 context.Context, _a1 *connect.Request[apiv1.TenantServiceInviteDeleteRequest]) (*connect.Response[apiv1.TenantServiceInviteDeleteResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for InviteDelete") + } + + var r0 *connect.Response[apiv1.TenantServiceInviteDeleteResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceInviteDeleteRequest]) (*connect.Response[apiv1.TenantServiceInviteDeleteResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceInviteDeleteRequest]) *connect.Response[apiv1.TenantServiceInviteDeleteResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.Response[apiv1.TenantServiceInviteDeleteResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[apiv1.TenantServiceInviteDeleteRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// InviteGet provides a mock function with given fields: _a0, _a1 +func (_m *TenantServiceClient) InviteGet(_a0 context.Context, _a1 *connect.Request[apiv1.TenantServiceInviteGetRequest]) (*connect.Response[apiv1.TenantServiceInviteGetResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for InviteGet") + } + + var r0 *connect.Response[apiv1.TenantServiceInviteGetResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceInviteGetRequest]) (*connect.Response[apiv1.TenantServiceInviteGetResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceInviteGetRequest]) *connect.Response[apiv1.TenantServiceInviteGetResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.Response[apiv1.TenantServiceInviteGetResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[apiv1.TenantServiceInviteGetRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// InvitesList provides a mock function with given fields: _a0, _a1 +func (_m *TenantServiceClient) InvitesList(_a0 context.Context, _a1 *connect.Request[apiv1.TenantServiceInvitesListRequest]) (*connect.Response[apiv1.TenantServiceInvitesListResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for InvitesList") + } + + var r0 *connect.Response[apiv1.TenantServiceInvitesListResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceInvitesListRequest]) (*connect.Response[apiv1.TenantServiceInvitesListResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceInvitesListRequest]) *connect.Response[apiv1.TenantServiceInvitesListResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.Response[apiv1.TenantServiceInvitesListResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[apiv1.TenantServiceInvitesListRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// List provides a mock function with given fields: _a0, _a1 +func (_m *TenantServiceClient) List(_a0 context.Context, _a1 *connect.Request[apiv1.TenantServiceListRequest]) (*connect.Response[apiv1.TenantServiceListResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for List") + } + + var r0 *connect.Response[apiv1.TenantServiceListResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceListRequest]) (*connect.Response[apiv1.TenantServiceListResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceListRequest]) *connect.Response[apiv1.TenantServiceListResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.Response[apiv1.TenantServiceListResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[apiv1.TenantServiceListRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RemoveMember provides a mock function with given fields: _a0, _a1 +func (_m *TenantServiceClient) RemoveMember(_a0 context.Context, _a1 *connect.Request[apiv1.TenantServiceRemoveMemberRequest]) (*connect.Response[apiv1.TenantServiceRemoveMemberResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for RemoveMember") + } + + var r0 *connect.Response[apiv1.TenantServiceRemoveMemberResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceRemoveMemberRequest]) (*connect.Response[apiv1.TenantServiceRemoveMemberResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceRemoveMemberRequest]) *connect.Response[apiv1.TenantServiceRemoveMemberResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.Response[apiv1.TenantServiceRemoveMemberResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[apiv1.TenantServiceRemoveMemberRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // Update provides a mock function with given fields: _a0, _a1 func (_m *TenantServiceClient) Update(_a0 context.Context, _a1 *connect.Request[apiv1.TenantServiceUpdateRequest]) (*connect.Response[apiv1.TenantServiceUpdateResponse], error) { ret := _m.Called(_a0, _a1) @@ -166,6 +376,36 @@ func (_m *TenantServiceClient) Update(_a0 context.Context, _a1 *connect.Request[ return r0, r1 } +// UpdateMember provides a mock function with given fields: _a0, _a1 +func (_m *TenantServiceClient) UpdateMember(_a0 context.Context, _a1 *connect.Request[apiv1.TenantServiceUpdateMemberRequest]) (*connect.Response[apiv1.TenantServiceUpdateMemberResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for UpdateMember") + } + + var r0 *connect.Response[apiv1.TenantServiceUpdateMemberResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceUpdateMemberRequest]) (*connect.Response[apiv1.TenantServiceUpdateMemberResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceUpdateMemberRequest]) *connect.Response[apiv1.TenantServiceUpdateMemberResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.Response[apiv1.TenantServiceUpdateMemberResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[apiv1.TenantServiceUpdateMemberRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // NewTenantServiceClient creates a new instance of TenantServiceClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. // The first argument is typically a *testing.T value. func NewTenantServiceClient(t interface { diff --git a/go/tests/mocks/api/v1/apiv1connect/TenantServiceHandler.go b/go/tests/mocks/api/v1/apiv1connect/TenantServiceHandler.go index 69d52890..0915f2ce 100644 --- a/go/tests/mocks/api/v1/apiv1connect/TenantServiceHandler.go +++ b/go/tests/mocks/api/v1/apiv1connect/TenantServiceHandler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package apiv1connect @@ -136,6 +136,216 @@ func (_m *TenantServiceHandler) Get(_a0 context.Context, _a1 *connect.Request[ap return r0, r1 } +// Invite provides a mock function with given fields: _a0, _a1 +func (_m *TenantServiceHandler) Invite(_a0 context.Context, _a1 *connect.Request[apiv1.TenantServiceInviteRequest]) (*connect.Response[apiv1.TenantServiceInviteResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for Invite") + } + + var r0 *connect.Response[apiv1.TenantServiceInviteResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceInviteRequest]) (*connect.Response[apiv1.TenantServiceInviteResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceInviteRequest]) *connect.Response[apiv1.TenantServiceInviteResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.Response[apiv1.TenantServiceInviteResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[apiv1.TenantServiceInviteRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// InviteAccept provides a mock function with given fields: _a0, _a1 +func (_m *TenantServiceHandler) InviteAccept(_a0 context.Context, _a1 *connect.Request[apiv1.TenantServiceInviteAcceptRequest]) (*connect.Response[apiv1.TenantServiceInviteAcceptResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for InviteAccept") + } + + var r0 *connect.Response[apiv1.TenantServiceInviteAcceptResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceInviteAcceptRequest]) (*connect.Response[apiv1.TenantServiceInviteAcceptResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceInviteAcceptRequest]) *connect.Response[apiv1.TenantServiceInviteAcceptResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.Response[apiv1.TenantServiceInviteAcceptResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[apiv1.TenantServiceInviteAcceptRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// InviteDelete provides a mock function with given fields: _a0, _a1 +func (_m *TenantServiceHandler) InviteDelete(_a0 context.Context, _a1 *connect.Request[apiv1.TenantServiceInviteDeleteRequest]) (*connect.Response[apiv1.TenantServiceInviteDeleteResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for InviteDelete") + } + + var r0 *connect.Response[apiv1.TenantServiceInviteDeleteResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceInviteDeleteRequest]) (*connect.Response[apiv1.TenantServiceInviteDeleteResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceInviteDeleteRequest]) *connect.Response[apiv1.TenantServiceInviteDeleteResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.Response[apiv1.TenantServiceInviteDeleteResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[apiv1.TenantServiceInviteDeleteRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// InviteGet provides a mock function with given fields: _a0, _a1 +func (_m *TenantServiceHandler) InviteGet(_a0 context.Context, _a1 *connect.Request[apiv1.TenantServiceInviteGetRequest]) (*connect.Response[apiv1.TenantServiceInviteGetResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for InviteGet") + } + + var r0 *connect.Response[apiv1.TenantServiceInviteGetResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceInviteGetRequest]) (*connect.Response[apiv1.TenantServiceInviteGetResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceInviteGetRequest]) *connect.Response[apiv1.TenantServiceInviteGetResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.Response[apiv1.TenantServiceInviteGetResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[apiv1.TenantServiceInviteGetRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// InvitesList provides a mock function with given fields: _a0, _a1 +func (_m *TenantServiceHandler) InvitesList(_a0 context.Context, _a1 *connect.Request[apiv1.TenantServiceInvitesListRequest]) (*connect.Response[apiv1.TenantServiceInvitesListResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for InvitesList") + } + + var r0 *connect.Response[apiv1.TenantServiceInvitesListResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceInvitesListRequest]) (*connect.Response[apiv1.TenantServiceInvitesListResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceInvitesListRequest]) *connect.Response[apiv1.TenantServiceInvitesListResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.Response[apiv1.TenantServiceInvitesListResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[apiv1.TenantServiceInvitesListRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// List provides a mock function with given fields: _a0, _a1 +func (_m *TenantServiceHandler) List(_a0 context.Context, _a1 *connect.Request[apiv1.TenantServiceListRequest]) (*connect.Response[apiv1.TenantServiceListResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for List") + } + + var r0 *connect.Response[apiv1.TenantServiceListResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceListRequest]) (*connect.Response[apiv1.TenantServiceListResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceListRequest]) *connect.Response[apiv1.TenantServiceListResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.Response[apiv1.TenantServiceListResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[apiv1.TenantServiceListRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RemoveMember provides a mock function with given fields: _a0, _a1 +func (_m *TenantServiceHandler) RemoveMember(_a0 context.Context, _a1 *connect.Request[apiv1.TenantServiceRemoveMemberRequest]) (*connect.Response[apiv1.TenantServiceRemoveMemberResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for RemoveMember") + } + + var r0 *connect.Response[apiv1.TenantServiceRemoveMemberResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceRemoveMemberRequest]) (*connect.Response[apiv1.TenantServiceRemoveMemberResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceRemoveMemberRequest]) *connect.Response[apiv1.TenantServiceRemoveMemberResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.Response[apiv1.TenantServiceRemoveMemberResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[apiv1.TenantServiceRemoveMemberRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // Update provides a mock function with given fields: _a0, _a1 func (_m *TenantServiceHandler) Update(_a0 context.Context, _a1 *connect.Request[apiv1.TenantServiceUpdateRequest]) (*connect.Response[apiv1.TenantServiceUpdateResponse], error) { ret := _m.Called(_a0, _a1) @@ -166,6 +376,36 @@ func (_m *TenantServiceHandler) Update(_a0 context.Context, _a1 *connect.Request return r0, r1 } +// UpdateMember provides a mock function with given fields: _a0, _a1 +func (_m *TenantServiceHandler) UpdateMember(_a0 context.Context, _a1 *connect.Request[apiv1.TenantServiceUpdateMemberRequest]) (*connect.Response[apiv1.TenantServiceUpdateMemberResponse], error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for UpdateMember") + } + + var r0 *connect.Response[apiv1.TenantServiceUpdateMemberResponse] + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceUpdateMemberRequest]) (*connect.Response[apiv1.TenantServiceUpdateMemberResponse], error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, *connect.Request[apiv1.TenantServiceUpdateMemberRequest]) *connect.Response[apiv1.TenantServiceUpdateMemberResponse]); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*connect.Response[apiv1.TenantServiceUpdateMemberResponse]) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *connect.Request[apiv1.TenantServiceUpdateMemberRequest]) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // NewTenantServiceHandler creates a new instance of TenantServiceHandler. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. // The first argument is typically a *testing.T value. func NewTenantServiceHandler(t interface { diff --git a/go/tests/mocks/api/v1/apiv1connect/TokenServiceClient.go b/go/tests/mocks/api/v1/apiv1connect/TokenServiceClient.go index 1ca1ea12..351eb86e 100644 --- a/go/tests/mocks/api/v1/apiv1connect/TokenServiceClient.go +++ b/go/tests/mocks/api/v1/apiv1connect/TokenServiceClient.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package apiv1connect diff --git a/go/tests/mocks/api/v1/apiv1connect/TokenServiceHandler.go b/go/tests/mocks/api/v1/apiv1connect/TokenServiceHandler.go index 21b4e356..6794dbd5 100644 --- a/go/tests/mocks/api/v1/apiv1connect/TokenServiceHandler.go +++ b/go/tests/mocks/api/v1/apiv1connect/TokenServiceHandler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package apiv1connect diff --git a/go/tests/mocks/api/v1/apiv1connect/UserServiceClient.go b/go/tests/mocks/api/v1/apiv1connect/UserServiceClient.go index 663376b6..dba5cb7b 100644 --- a/go/tests/mocks/api/v1/apiv1connect/UserServiceClient.go +++ b/go/tests/mocks/api/v1/apiv1connect/UserServiceClient.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package apiv1connect diff --git a/go/tests/mocks/api/v1/apiv1connect/UserServiceHandler.go b/go/tests/mocks/api/v1/apiv1connect/UserServiceHandler.go index 9b93ba73..3ffbdfb4 100644 --- a/go/tests/mocks/api/v1/apiv1connect/UserServiceHandler.go +++ b/go/tests/mocks/api/v1/apiv1connect/UserServiceHandler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package apiv1connect diff --git a/go/tests/mocks/api/v1/apiv1connect/VersionServiceClient.go b/go/tests/mocks/api/v1/apiv1connect/VersionServiceClient.go index 46379008..ce241e91 100644 --- a/go/tests/mocks/api/v1/apiv1connect/VersionServiceClient.go +++ b/go/tests/mocks/api/v1/apiv1connect/VersionServiceClient.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package apiv1connect diff --git a/go/tests/mocks/api/v1/apiv1connect/VersionServiceHandler.go b/go/tests/mocks/api/v1/apiv1connect/VersionServiceHandler.go index cf5b51a9..b9d5f514 100644 --- a/go/tests/mocks/api/v1/apiv1connect/VersionServiceHandler.go +++ b/go/tests/mocks/api/v1/apiv1connect/VersionServiceHandler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package apiv1connect diff --git a/go/tests/mocks/api/v1/apiv1connect/VolumeServiceClient.go b/go/tests/mocks/api/v1/apiv1connect/VolumeServiceClient.go index 77d74b96..816e9dab 100644 --- a/go/tests/mocks/api/v1/apiv1connect/VolumeServiceClient.go +++ b/go/tests/mocks/api/v1/apiv1connect/VolumeServiceClient.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package apiv1connect diff --git a/go/tests/mocks/api/v1/apiv1connect/VolumeServiceHandler.go b/go/tests/mocks/api/v1/apiv1connect/VolumeServiceHandler.go index 59d4deb8..2fd56c0f 100644 --- a/go/tests/mocks/api/v1/apiv1connect/VolumeServiceHandler.go +++ b/go/tests/mocks/api/v1/apiv1connect/VolumeServiceHandler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package apiv1connect diff --git a/go/tests/mocks/client/Adminv1.go b/go/tests/mocks/client/Adminv1.go index 6c215383..3a4b7387 100644 --- a/go/tests/mocks/client/Adminv1.go +++ b/go/tests/mocks/client/Adminv1.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package client diff --git a/go/tests/mocks/client/Apiv1.go b/go/tests/mocks/client/Apiv1.go index 192a1b62..8f92a7e4 100644 --- a/go/tests/mocks/client/Apiv1.go +++ b/go/tests/mocks/client/Apiv1.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package client diff --git a/go/tests/mocks/client/Client.go b/go/tests/mocks/client/Client.go index e10a8aa4..4184cc08 100644 --- a/go/tests/mocks/client/Client.go +++ b/go/tests/mocks/client/Client.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package client diff --git a/go/tests/mocks/client/Statusv1.go b/go/tests/mocks/client/Statusv1.go index 190928cf..5d013592 100644 --- a/go/tests/mocks/client/Statusv1.go +++ b/go/tests/mocks/client/Statusv1.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package client diff --git a/go/tests/mocks/status/v1/statusv1connect/MessageServiceClient.go b/go/tests/mocks/status/v1/statusv1connect/MessageServiceClient.go index 4ddd8ba8..9c768491 100644 --- a/go/tests/mocks/status/v1/statusv1connect/MessageServiceClient.go +++ b/go/tests/mocks/status/v1/statusv1connect/MessageServiceClient.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package statusv1connect diff --git a/go/tests/mocks/status/v1/statusv1connect/MessageServiceHandler.go b/go/tests/mocks/status/v1/statusv1connect/MessageServiceHandler.go index f7f07bd4..7df2681a 100644 --- a/go/tests/mocks/status/v1/statusv1connect/MessageServiceHandler.go +++ b/go/tests/mocks/status/v1/statusv1connect/MessageServiceHandler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package statusv1connect diff --git a/go/tests/mocks/status/v1/statusv1connect/StatusServiceClient.go b/go/tests/mocks/status/v1/statusv1connect/StatusServiceClient.go index 78f185ab..f19ced70 100644 --- a/go/tests/mocks/status/v1/statusv1connect/StatusServiceClient.go +++ b/go/tests/mocks/status/v1/statusv1connect/StatusServiceClient.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package statusv1connect diff --git a/go/tests/mocks/status/v1/statusv1connect/StatusServiceHandler.go b/go/tests/mocks/status/v1/statusv1connect/StatusServiceHandler.go index 6a0401c6..3e10e239 100644 --- a/go/tests/mocks/status/v1/statusv1connect/StatusServiceHandler.go +++ b/go/tests/mocks/status/v1/statusv1connect/StatusServiceHandler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.41.0. DO NOT EDIT. +// Code generated by mockery v2.42.0. DO NOT EDIT. package statusv1connect diff --git a/js/admin/v1/cluster_pb.d.ts b/js/admin/v1/cluster_pb.d.ts index 142633df..d521aeba 100644 --- a/js/admin/v1/cluster_pb.d.ts +++ b/js/admin/v1/cluster_pb.d.ts @@ -54,7 +54,7 @@ export declare class ClusterServiceListRequest extends Message { */ network: string; /** - * Prefixes availalble in this network + * Prefixes available in this network * * @generated from field: repeated string prefixes = 2; */ diff --git a/js/admin/v1/machine_pb.js b/js/admin/v1/machine_pb.js index 404af8d5..9c4de419 100644 --- a/js/admin/v1/machine_pb.js +++ b/js/admin/v1/machine_pb.js @@ -159,7 +159,7 @@ export class MachineNetwork extends Message { */ this.network = ""; /** - * Prefixes availalble in this network + * Prefixes available in this network * * @generated from field: repeated string prefixes = 2; */ diff --git a/js/admin/v1/machine_pb.ts b/js/admin/v1/machine_pb.ts index 4151aeca..d85c03a6 100644 --- a/js/admin/v1/machine_pb.ts +++ b/js/admin/v1/machine_pb.ts @@ -197,7 +197,7 @@ export class MachineNetwork extends Message { network = ""; /** - * Prefixes availalble in this network + * Prefixes available in this network * * @generated from field: repeated string prefixes = 2; */ diff --git a/js/admin/v1/storage_pb.d.ts b/js/admin/v1/storage_pb.d.ts index 6a11689d..9b370585 100644 --- a/js/admin/v1/storage_pb.d.ts +++ b/js/admin/v1/storage_pb.d.ts @@ -319,7 +319,7 @@ export declare class ClusterStatisticsApi extends Message */ estimatedLogicalStorage: bigint; /** - * commpression ratio + * compression ratio * * compression ratio logicalUsedStorage/physicalUsedStorage * diff --git a/js/admin/v1/storage_pb.js b/js/admin/v1/storage_pb.js index b98ff33a..c3d1d7fe 100644 --- a/js/admin/v1/storage_pb.js +++ b/js/admin/v1/storage_pb.js @@ -392,7 +392,7 @@ export class ClusterStatisticsApi extends Message { */ this.estimatedLogicalStorage = protoInt64.zero; /** - * commpression ratio + * compression ratio * * compression ratio logicalUsedStorage/physicalUsedStorage * diff --git a/js/admin/v1/storage_pb.ts b/js/admin/v1/storage_pb.ts index 65e1f117..cb5ddbd9 100644 --- a/js/admin/v1/storage_pb.ts +++ b/js/admin/v1/storage_pb.ts @@ -477,7 +477,7 @@ export class ClusterStatisticsApi extends Message { estimatedLogicalStorage = protoInt64.zero; /** - * commpression ratio + * compression ratio * * compression ratio logicalUsedStorage/physicalUsedStorage * diff --git a/js/api/v1/assets_pb.d.ts b/js/api/v1/assets_pb.d.ts index c6b907d7..bcac700a 100644 --- a/js/api/v1/assets_pb.d.ts +++ b/js/api/v1/assets_pb.d.ts @@ -284,7 +284,7 @@ export declare class AssetServiceListRequest extends Message | undefined, b: AssetServiceListRequest | PlainMessage | undefined): boolean; } /** - * AssetServiceListResponse is the response payload which containes the the Asset list + * AssetServiceListResponse is the response payload which contains the the Asset list * * @generated from message api.v1.AssetServiceListResponse */ diff --git a/js/api/v1/assets_pb.js b/js/api/v1/assets_pb.js index 36928cb3..62fb4855 100644 --- a/js/api/v1/assets_pb.js +++ b/js/api/v1/assets_pb.js @@ -377,7 +377,7 @@ AssetServiceListRequest.runtime = proto3; AssetServiceListRequest.typeName = "api.v1.AssetServiceListRequest"; AssetServiceListRequest.fields = proto3.util.newFieldList(() => []); /** - * AssetServiceListResponse is the response payload which containes the the Asset list + * AssetServiceListResponse is the response payload which contains the the Asset list * * @generated from message api.v1.AssetServiceListResponse */ diff --git a/js/api/v1/assets_pb.ts b/js/api/v1/assets_pb.ts index 1dd2ccf7..35304a8b 100644 --- a/js/api/v1/assets_pb.ts +++ b/js/api/v1/assets_pb.ts @@ -470,7 +470,7 @@ export class AssetServiceListRequest extends Message { } /** - * AssetServiceListResponse is the response payload which containes the the Asset list + * AssetServiceListResponse is the response payload which contains the the Asset list * * @generated from message api.v1.AssetServiceListResponse */ diff --git a/js/api/v1/cluster_pb.d.ts b/js/api/v1/cluster_pb.d.ts index 73ef1e89..12a3bd34 100644 --- a/js/api/v1/cluster_pb.d.ts +++ b/js/api/v1/cluster_pb.d.ts @@ -1,7 +1,7 @@ import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; import { Duration, Message, proto3, Timestamp } from "@bufbuild/protobuf"; /** - * Operate defines the types of reconcilation to be triggered + * Operate defines the types of reconciliation to be triggered * * @generated from enum api.v1.Operate */ @@ -25,7 +25,7 @@ export declare enum Operate { */ MAINTAIN = 2, /** - * OPERATE_RETRY retry the reconcilation of the cluster + * OPERATE_RETRY retry the reconciliation of the cluster * * @generated from enum value: OPERATE_RETRY = 3; */ @@ -623,7 +623,7 @@ export declare class ClusterStatus extends Message { */ uuid: string; /** - * Progress of the cluster reconcilation + * Progress of the cluster reconciliation * * @generated from field: uint32 progress = 2; */ @@ -665,7 +665,7 @@ export declare class ClusterStatus extends Message { */ systemComponentsReady: string; /** - * LastErrors is a list of the last known errors occured during the cluster reconcilation + * LastErrors is a list of the last known errors occurred during the cluster reconciliation * * @generated from field: repeated api.v1.ClusterStatusLastError last_errors = 14; */ diff --git a/js/api/v1/cluster_pb.js b/js/api/v1/cluster_pb.js index 5d3b0385..861a8314 100644 --- a/js/api/v1/cluster_pb.js +++ b/js/api/v1/cluster_pb.js @@ -4,7 +4,7 @@ // @ts-nocheck import { Duration, Message, proto3, Timestamp } from "@bufbuild/protobuf"; /** - * Operate defines the types of reconcilation to be triggered + * Operate defines the types of reconciliation to be triggered * * @generated from enum api.v1.Operate */ @@ -29,7 +29,7 @@ export var Operate; */ Operate[Operate["MAINTAIN"] = 2] = "MAINTAIN"; /** - * OPERATE_RETRY retry the reconcilation of the cluster + * OPERATE_RETRY retry the reconciliation of the cluster * * @generated from enum value: OPERATE_RETRY = 3; */ @@ -731,7 +731,7 @@ export class ClusterStatus extends Message { */ this.uuid = ""; /** - * Progress of the cluster reconcilation + * Progress of the cluster reconciliation * * @generated from field: uint32 progress = 2; */ @@ -773,7 +773,7 @@ export class ClusterStatus extends Message { */ this.systemComponentsReady = ""; /** - * LastErrors is a list of the last known errors occured during the cluster reconcilation + * LastErrors is a list of the last known errors occurred during the cluster reconciliation * * @generated from field: repeated api.v1.ClusterStatusLastError last_errors = 14; */ diff --git a/js/api/v1/cluster_pb.ts b/js/api/v1/cluster_pb.ts index c895a89b..e0430ccb 100644 --- a/js/api/v1/cluster_pb.ts +++ b/js/api/v1/cluster_pb.ts @@ -7,7 +7,7 @@ import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialM import { Duration, Message, proto3, Timestamp } from "@bufbuild/protobuf"; /** - * Operate defines the types of reconcilation to be triggered + * Operate defines the types of reconciliation to be triggered * * @generated from enum api.v1.Operate */ @@ -34,7 +34,7 @@ export enum Operate { MAINTAIN = 2, /** - * OPERATE_RETRY retry the reconcilation of the cluster + * OPERATE_RETRY retry the reconciliation of the cluster * * @generated from enum value: OPERATE_RETRY = 3; */ @@ -1029,7 +1029,7 @@ export class ClusterStatus extends Message { uuid = ""; /** - * Progress of the cluster reconcilation + * Progress of the cluster reconciliation * * @generated from field: uint32 progress = 2; */ @@ -1078,7 +1078,7 @@ export class ClusterStatus extends Message { systemComponentsReady = ""; /** - * LastErrors is a list of the last known errors occured during the cluster reconcilation + * LastErrors is a list of the last known errors occurred during the cluster reconciliation * * @generated from field: repeated api.v1.ClusterStatusLastError last_errors = 14; */ diff --git a/js/api/v1/project_pb.d.ts b/js/api/v1/project_pb.d.ts index fe3f3451..c58b2a74 100644 --- a/js/api/v1/project_pb.d.ts +++ b/js/api/v1/project_pb.d.ts @@ -437,7 +437,7 @@ export declare class ProjectServiceInviteRequest extends Message { /** * Inviter contains a secret which can be sent to a potential user - * can appended to the invitation endpoint at our api server like + * can be appended to the invitation endpoint at our cloud console like * console.metalstack.cloud/invite/ * * @generated from field: api.v1.ProjectInvite invite = 1; diff --git a/js/api/v1/project_pb.ts b/js/api/v1/project_pb.ts index b7ec2784..338b6537 100644 --- a/js/api/v1/project_pb.ts +++ b/js/api/v1/project_pb.ts @@ -767,7 +767,7 @@ export class ProjectServiceInviteRequest extends Message { /** * Inviter contains a secret which can be sent to a potential user - * can appended to the invitation endpoint at our api server like + * can be appended to the invitation endpoint at our cloud console like * console.metalstack.cloud/invite/ * * @generated from field: api.v1.ProjectInvite invite = 1; diff --git a/js/api/v1/tenant_connect.d.ts b/js/api/v1/tenant_connect.d.ts index 60d9430a..796cde2b 100644 --- a/js/api/v1/tenant_connect.d.ts +++ b/js/api/v1/tenant_connect.d.ts @@ -1,4 +1,4 @@ -import { TenantServiceCreateOrUpdateRequest, TenantServiceCreateOrUpdateResponse, TenantServiceCreateRequest, TenantServiceCreateResponse, TenantServiceDeleteRequest, TenantServiceDeleteResponse, TenantServiceGetRequest, TenantServiceGetResponse, TenantServiceUpdateRequest, TenantServiceUpdateResponse } from "./tenant_pb.js"; +import { TenantServiceCreateOrUpdateRequest, TenantServiceCreateOrUpdateResponse, TenantServiceCreateRequest, TenantServiceCreateResponse, TenantServiceDeleteRequest, TenantServiceDeleteResponse, TenantServiceGetRequest, TenantServiceGetResponse, TenantServiceInviteAcceptRequest, TenantServiceInviteAcceptResponse, TenantServiceInviteDeleteRequest, TenantServiceInviteDeleteResponse, TenantServiceInviteGetRequest, TenantServiceInviteGetResponse, TenantServiceInviteRequest, TenantServiceInviteResponse, TenantServiceInvitesListRequest, TenantServiceInvitesListResponse, TenantServiceListRequest, TenantServiceListResponse, TenantServiceRemoveMemberRequest, TenantServiceRemoveMemberResponse, TenantServiceUpdateMemberRequest, TenantServiceUpdateMemberResponse, TenantServiceUpdateRequest, TenantServiceUpdateResponse } from "./tenant_pb.js"; import { MethodKind } from "@bufbuild/protobuf"; /** * TenantService serves tenant related functions @@ -31,6 +31,17 @@ export declare const TenantService: { readonly O: typeof TenantServiceCreateOrUpdateResponse; readonly kind: MethodKind.Unary; }; + /** + * List tenants + * + * @generated from rpc api.v1.TenantService.List + */ + readonly list: { + readonly name: "List"; + readonly I: typeof TenantServiceListRequest; + readonly O: typeof TenantServiceListResponse; + readonly kind: MethodKind.Unary; + }; /** * Get a tenant * @@ -64,5 +75,82 @@ export declare const TenantService: { readonly O: typeof TenantServiceDeleteResponse; readonly kind: MethodKind.Unary; }; + /** + * RemoveMember remove a member of a tenant + * + * @generated from rpc api.v1.TenantService.RemoveMember + */ + readonly removeMember: { + readonly name: "RemoveMember"; + readonly I: typeof TenantServiceRemoveMemberRequest; + readonly O: typeof TenantServiceRemoveMemberResponse; + readonly kind: MethodKind.Unary; + }; + /** + * UpdateMember update a member of a tenant + * + * @generated from rpc api.v1.TenantService.UpdateMember + */ + readonly updateMember: { + readonly name: "UpdateMember"; + readonly I: typeof TenantServiceUpdateMemberRequest; + readonly O: typeof TenantServiceUpdateMemberResponse; + readonly kind: MethodKind.Unary; + }; + /** + * Invite a user to a tenant + * + * @generated from rpc api.v1.TenantService.Invite + */ + readonly invite: { + readonly name: "Invite"; + readonly I: typeof TenantServiceInviteRequest; + readonly O: typeof TenantServiceInviteResponse; + readonly kind: MethodKind.Unary; + }; + /** + * InviteAccept is called from a user to accept an invitation + * + * @generated from rpc api.v1.TenantService.InviteAccept + */ + readonly inviteAccept: { + readonly name: "InviteAccept"; + readonly I: typeof TenantServiceInviteAcceptRequest; + readonly O: typeof TenantServiceInviteAcceptResponse; + readonly kind: MethodKind.Unary; + }; + /** + * InviteDelete deletes a pending invitation + * + * @generated from rpc api.v1.TenantService.InviteDelete + */ + readonly inviteDelete: { + readonly name: "InviteDelete"; + readonly I: typeof TenantServiceInviteDeleteRequest; + readonly O: typeof TenantServiceInviteDeleteResponse; + readonly kind: MethodKind.Unary; + }; + /** + * InvitesList list all invites to a tenant + * + * @generated from rpc api.v1.TenantService.InvitesList + */ + readonly invitesList: { + readonly name: "InvitesList"; + readonly I: typeof TenantServiceInvitesListRequest; + readonly O: typeof TenantServiceInvitesListResponse; + readonly kind: MethodKind.Unary; + }; + /** + * InviteGet get an invite + * + * @generated from rpc api.v1.TenantService.InviteGet + */ + readonly inviteGet: { + readonly name: "InviteGet"; + readonly I: typeof TenantServiceInviteGetRequest; + readonly O: typeof TenantServiceInviteGetResponse; + readonly kind: MethodKind.Unary; + }; }; }; diff --git a/js/api/v1/tenant_connect.js b/js/api/v1/tenant_connect.js index 5c4cb934..7cf2df12 100644 --- a/js/api/v1/tenant_connect.js +++ b/js/api/v1/tenant_connect.js @@ -2,7 +2,7 @@ // @generated from file api/v1/tenant.proto (package api.v1, syntax proto3) /* eslint-disable */ // @ts-nocheck -import { TenantServiceCreateOrUpdateRequest, TenantServiceCreateOrUpdateResponse, TenantServiceCreateRequest, TenantServiceCreateResponse, TenantServiceDeleteRequest, TenantServiceDeleteResponse, TenantServiceGetRequest, TenantServiceGetResponse, TenantServiceUpdateRequest, TenantServiceUpdateResponse } from "./tenant_pb.js"; +import { TenantServiceCreateOrUpdateRequest, TenantServiceCreateOrUpdateResponse, TenantServiceCreateRequest, TenantServiceCreateResponse, TenantServiceDeleteRequest, TenantServiceDeleteResponse, TenantServiceGetRequest, TenantServiceGetResponse, TenantServiceInviteAcceptRequest, TenantServiceInviteAcceptResponse, TenantServiceInviteDeleteRequest, TenantServiceInviteDeleteResponse, TenantServiceInviteGetRequest, TenantServiceInviteGetResponse, TenantServiceInviteRequest, TenantServiceInviteResponse, TenantServiceInvitesListRequest, TenantServiceInvitesListResponse, TenantServiceListRequest, TenantServiceListResponse, TenantServiceRemoveMemberRequest, TenantServiceRemoveMemberResponse, TenantServiceUpdateMemberRequest, TenantServiceUpdateMemberResponse, TenantServiceUpdateRequest, TenantServiceUpdateResponse } from "./tenant_pb.js"; import { MethodKind } from "@bufbuild/protobuf"; /** * TenantService serves tenant related functions @@ -35,6 +35,17 @@ export const TenantService = { O: TenantServiceCreateOrUpdateResponse, kind: MethodKind.Unary, }, + /** + * List tenants + * + * @generated from rpc api.v1.TenantService.List + */ + list: { + name: "List", + I: TenantServiceListRequest, + O: TenantServiceListResponse, + kind: MethodKind.Unary, + }, /** * Get a tenant * @@ -68,5 +79,82 @@ export const TenantService = { O: TenantServiceDeleteResponse, kind: MethodKind.Unary, }, + /** + * RemoveMember remove a member of a tenant + * + * @generated from rpc api.v1.TenantService.RemoveMember + */ + removeMember: { + name: "RemoveMember", + I: TenantServiceRemoveMemberRequest, + O: TenantServiceRemoveMemberResponse, + kind: MethodKind.Unary, + }, + /** + * UpdateMember update a member of a tenant + * + * @generated from rpc api.v1.TenantService.UpdateMember + */ + updateMember: { + name: "UpdateMember", + I: TenantServiceUpdateMemberRequest, + O: TenantServiceUpdateMemberResponse, + kind: MethodKind.Unary, + }, + /** + * Invite a user to a tenant + * + * @generated from rpc api.v1.TenantService.Invite + */ + invite: { + name: "Invite", + I: TenantServiceInviteRequest, + O: TenantServiceInviteResponse, + kind: MethodKind.Unary, + }, + /** + * InviteAccept is called from a user to accept an invitation + * + * @generated from rpc api.v1.TenantService.InviteAccept + */ + inviteAccept: { + name: "InviteAccept", + I: TenantServiceInviteAcceptRequest, + O: TenantServiceInviteAcceptResponse, + kind: MethodKind.Unary, + }, + /** + * InviteDelete deletes a pending invitation + * + * @generated from rpc api.v1.TenantService.InviteDelete + */ + inviteDelete: { + name: "InviteDelete", + I: TenantServiceInviteDeleteRequest, + O: TenantServiceInviteDeleteResponse, + kind: MethodKind.Unary, + }, + /** + * InvitesList list all invites to a tenant + * + * @generated from rpc api.v1.TenantService.InvitesList + */ + invitesList: { + name: "InvitesList", + I: TenantServiceInvitesListRequest, + O: TenantServiceInvitesListResponse, + kind: MethodKind.Unary, + }, + /** + * InviteGet get an invite + * + * @generated from rpc api.v1.TenantService.InviteGet + */ + inviteGet: { + name: "InviteGet", + I: TenantServiceInviteGetRequest, + O: TenantServiceInviteGetResponse, + kind: MethodKind.Unary, + }, } }; diff --git a/js/api/v1/tenant_connect.ts b/js/api/v1/tenant_connect.ts index cce8e57c..553be482 100644 --- a/js/api/v1/tenant_connect.ts +++ b/js/api/v1/tenant_connect.ts @@ -3,7 +3,7 @@ /* eslint-disable */ // @ts-nocheck -import { TenantServiceCreateOrUpdateRequest, TenantServiceCreateOrUpdateResponse, TenantServiceCreateRequest, TenantServiceCreateResponse, TenantServiceDeleteRequest, TenantServiceDeleteResponse, TenantServiceGetRequest, TenantServiceGetResponse, TenantServiceUpdateRequest, TenantServiceUpdateResponse } from "./tenant_pb.js"; +import { TenantServiceCreateOrUpdateRequest, TenantServiceCreateOrUpdateResponse, TenantServiceCreateRequest, TenantServiceCreateResponse, TenantServiceDeleteRequest, TenantServiceDeleteResponse, TenantServiceGetRequest, TenantServiceGetResponse, TenantServiceInviteAcceptRequest, TenantServiceInviteAcceptResponse, TenantServiceInviteDeleteRequest, TenantServiceInviteDeleteResponse, TenantServiceInviteGetRequest, TenantServiceInviteGetResponse, TenantServiceInviteRequest, TenantServiceInviteResponse, TenantServiceInvitesListRequest, TenantServiceInvitesListResponse, TenantServiceListRequest, TenantServiceListResponse, TenantServiceRemoveMemberRequest, TenantServiceRemoveMemberResponse, TenantServiceUpdateMemberRequest, TenantServiceUpdateMemberResponse, TenantServiceUpdateRequest, TenantServiceUpdateResponse } from "./tenant_pb.js"; import { MethodKind } from "@bufbuild/protobuf"; /** @@ -37,6 +37,17 @@ export const TenantService = { O: TenantServiceCreateOrUpdateResponse, kind: MethodKind.Unary, }, + /** + * List tenants + * + * @generated from rpc api.v1.TenantService.List + */ + list: { + name: "List", + I: TenantServiceListRequest, + O: TenantServiceListResponse, + kind: MethodKind.Unary, + }, /** * Get a tenant * @@ -70,6 +81,83 @@ export const TenantService = { O: TenantServiceDeleteResponse, kind: MethodKind.Unary, }, + /** + * RemoveMember remove a member of a tenant + * + * @generated from rpc api.v1.TenantService.RemoveMember + */ + removeMember: { + name: "RemoveMember", + I: TenantServiceRemoveMemberRequest, + O: TenantServiceRemoveMemberResponse, + kind: MethodKind.Unary, + }, + /** + * UpdateMember update a member of a tenant + * + * @generated from rpc api.v1.TenantService.UpdateMember + */ + updateMember: { + name: "UpdateMember", + I: TenantServiceUpdateMemberRequest, + O: TenantServiceUpdateMemberResponse, + kind: MethodKind.Unary, + }, + /** + * Invite a user to a tenant + * + * @generated from rpc api.v1.TenantService.Invite + */ + invite: { + name: "Invite", + I: TenantServiceInviteRequest, + O: TenantServiceInviteResponse, + kind: MethodKind.Unary, + }, + /** + * InviteAccept is called from a user to accept an invitation + * + * @generated from rpc api.v1.TenantService.InviteAccept + */ + inviteAccept: { + name: "InviteAccept", + I: TenantServiceInviteAcceptRequest, + O: TenantServiceInviteAcceptResponse, + kind: MethodKind.Unary, + }, + /** + * InviteDelete deletes a pending invitation + * + * @generated from rpc api.v1.TenantService.InviteDelete + */ + inviteDelete: { + name: "InviteDelete", + I: TenantServiceInviteDeleteRequest, + O: TenantServiceInviteDeleteResponse, + kind: MethodKind.Unary, + }, + /** + * InvitesList list all invites to a tenant + * + * @generated from rpc api.v1.TenantService.InvitesList + */ + invitesList: { + name: "InvitesList", + I: TenantServiceInvitesListRequest, + O: TenantServiceInvitesListResponse, + kind: MethodKind.Unary, + }, + /** + * InviteGet get an invite + * + * @generated from rpc api.v1.TenantService.InviteGet + */ + inviteGet: { + name: "InviteGet", + I: TenantServiceInviteGetRequest, + O: TenantServiceInviteGetResponse, + kind: MethodKind.Unary, + }, } } as const; diff --git a/js/api/v1/tenant_pb.d.ts b/js/api/v1/tenant_pb.d.ts index 02a55f26..7a388b2c 100644 --- a/js/api/v1/tenant_pb.d.ts +++ b/js/api/v1/tenant_pb.d.ts @@ -1,6 +1,6 @@ import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; import { Message, proto3, Timestamp } from "@bufbuild/protobuf"; -import { OAuthProvider } from "./common_pb.js"; +import { OAuthProvider, TenantRole } from "./common_pb.js"; import { Coupon } from "./payment_pb.js"; /** * Tenant is a customer of the platform @@ -15,7 +15,7 @@ export declare class Tenant extends Message { */ login: string; /** - * Name if the tenant + * Name of the tenant * * @generated from field: string name = 2; */ @@ -26,6 +26,12 @@ export declare class Tenant extends Message { * @generated from field: string email = 3; */ email: string; + /** + * Description of this tenant + * + * @generated from field: string description = 4; + */ + description: string; /** * AvatarUrl of the tenant * @@ -74,6 +80,18 @@ export declare class Tenant extends Message { * @generated from field: bool onboarded = 13; */ onboarded: boolean; + /** + * TenantMembers of this tenant + * + * @generated from field: repeated api.v1.TenantMember tenant_members = 14; + */ + tenantMembers: TenantMember[]; + /** + * CreatedBy stores who created this tenant + * + * @generated from field: string created_by = 15; + */ + createdBy: string; /** * CreatedAt the date when this tenant was created * @@ -101,6 +119,108 @@ export declare class Tenant extends Message { static fromJsonString(jsonString: string, options?: Partial): Tenant; static equals(a: Tenant | PlainMessage | undefined, b: Tenant | PlainMessage | undefined): boolean; } +/** + * TenantMember defines a user that participates at a tenant + * + * @generated from message api.v1.TenantMember + */ +export declare class TenantMember extends Message { + /** + * Id is the user id of the member + * + * @generated from field: string id = 1; + */ + id: string; + /** + * Role is the role of the member + * + * @generated from field: api.v1.TenantRole role = 2; + */ + role: TenantRole; + /** + * CreatedAt the date when the member was added to the tenant + * + * @generated from field: google.protobuf.Timestamp created_at = 10; + */ + createdAt?: Timestamp; + constructor(data?: PartialMessage); + static readonly runtime: typeof proto3; + static readonly typeName = "api.v1.TenantMember"; + static readonly fields: FieldList; + static fromBinary(bytes: Uint8Array, options?: Partial): TenantMember; + static fromJson(jsonValue: JsonValue, options?: Partial): TenantMember; + static fromJsonString(jsonString: string, options?: Partial): TenantMember; + static equals(a: TenantMember | PlainMessage | undefined, b: TenantMember | PlainMessage | undefined): boolean; +} +/** + * TenantInvite defines invite to tenant + * + * @generated from message api.v1.TenantInvite + */ +export declare class TenantInvite extends Message { + /** + * Secret is the secret part of the invite, typically part of the url + * + * @generated from field: string secret = 1; + */ + secret: string; + /** + * TargetTenant is the tenant id for which this invite was created + * + * @generated from field: string target_tenant = 2; + */ + targetTenant: string; + /** + * Role is the role in this tenant the user will get after accepting the invitation + * + * @generated from field: api.v1.TenantRole role = 3; + */ + role: TenantRole; + /** + * Joined is false as long as a user has not accepted the invite + * + * @generated from field: bool joined = 4; + */ + joined: boolean; + /** + * TargetTenantName is the tenant name for which this invite was created + * + * @generated from field: string target_tenant_name = 5; + */ + targetTenantName: string; + /** + * Tenant is the login of tenant who invites to join this tenant + * + * @generated from field: string tenant = 6; + */ + tenant: string; + /** + * TenantName is the name of tenant who invites to join this tenant + * + * @generated from field: string tenant_name = 7; + */ + tenantName: string; + /** + * ExpiresAt the date when this invite expires + * + * @generated from field: google.protobuf.Timestamp expires_at = 10; + */ + expiresAt?: Timestamp; + /** + * JoinedAt the date when the member accepted this invite + * + * @generated from field: google.protobuf.Timestamp joined_at = 11; + */ + joinedAt?: Timestamp; + constructor(data?: PartialMessage); + static readonly runtime: typeof proto3; + static readonly typeName = "api.v1.TenantInvite"; + static readonly fields: FieldList; + static fromBinary(bytes: Uint8Array, options?: Partial): TenantInvite; + static fromJson(jsonValue: JsonValue, options?: Partial): TenantInvite; + static fromJsonString(jsonString: string, options?: Partial): TenantInvite; + static equals(a: TenantInvite | PlainMessage | undefined, b: TenantInvite | PlainMessage | undefined): boolean; +} /** * PaymentDetails of a tenant * @@ -239,6 +359,33 @@ export declare class TermsAndConditionsUpdate extends Message): TermsAndConditionsUpdate; static equals(a: TermsAndConditionsUpdate | PlainMessage | undefined, b: TermsAndConditionsUpdate | PlainMessage | undefined): boolean; } +/** + * TenantServiceListRequest is the request payload of the tenant list request + * + * @generated from message api.v1.TenantServiceListRequest + */ +export declare class TenantServiceListRequest extends Message { + /** + * Id filters tenants by id + * + * @generated from field: optional string id = 1; + */ + id?: string; + /** + * Name filters tenants by name + * + * @generated from field: optional string name = 2; + */ + name?: string; + constructor(data?: PartialMessage); + static readonly runtime: typeof proto3; + static readonly typeName = "api.v1.TenantServiceListRequest"; + static readonly fields: FieldList; + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceListRequest; + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceListRequest; + static fromJsonString(jsonString: string, options?: Partial): TenantServiceListRequest; + static equals(a: TenantServiceListRequest | PlainMessage | undefined, b: TenantServiceListRequest | PlainMessage | undefined): boolean; +} /** * TenantServiceGetRequest is the request payload of the tenant get request * @@ -267,11 +414,35 @@ export declare class TenantServiceGetRequest extends Message { /** - * Tenant the tenant to create + * Name of this tenant * - * @generated from field: api.v1.Tenant tenant = 1; + * @generated from field: string name = 1; */ - tenant?: Tenant; + name: string; + /** + * Description of this tenant + * + * @generated from field: optional string description = 2; + */ + description?: string; + /** + * Email of the tenant, if not set will be inherited from the creator + * + * @generated from field: optional string email = 3; + */ + email?: string; + /** + * AvatarUrl of the tenant + * + * @generated from field: optional string avatar_url = 4; + */ + avatarUrl?: string; + /** + * PhoneNumber of the tenant + * + * @generated from field: optional string phone_number = 5; + */ + phoneNumber?: string; constructor(data?: PartialMessage); static readonly runtime: typeof proto3; static readonly typeName = "api.v1.TenantServiceCreateRequest"; @@ -326,6 +497,12 @@ export declare class TenantServiceUpdateRequest extends Message): TenantServiceGetResponse; static equals(a: TenantServiceGetResponse | PlainMessage | undefined, b: TenantServiceGetResponse | PlainMessage | undefined): boolean; } +/** + * TenantServiceListResponse is the response payload of the tenant list request + * + * @generated from message api.v1.TenantServiceListResponse + */ +export declare class TenantServiceListResponse extends Message { + /** + * Tenants is the list of tenants + * + * @generated from field: repeated api.v1.Tenant tenants = 1; + */ + tenants: Tenant[]; + constructor(data?: PartialMessage); + static readonly runtime: typeof proto3; + static readonly typeName = "api.v1.TenantServiceListResponse"; + static readonly fields: FieldList; + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceListResponse; + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceListResponse; + static fromJsonString(jsonString: string, options?: Partial): TenantServiceListResponse; + static equals(a: TenantServiceListResponse | PlainMessage | undefined, b: TenantServiceListResponse | PlainMessage | undefined): boolean; +} /** * TenantServiceCreateResponse is the response payload of the tenant create request * @@ -485,3 +683,323 @@ export declare class TenantServiceDeleteResponse extends Message): TenantServiceDeleteResponse; static equals(a: TenantServiceDeleteResponse | PlainMessage | undefined, b: TenantServiceDeleteResponse | PlainMessage | undefined): boolean; } +/** + * TenantServiceInviteRequest is used to invite a member to a tenant + * + * @generated from message api.v1.TenantServiceInviteRequest + */ +export declare class TenantServiceInviteRequest extends Message { + /** + * Login of the tenant + * + * @generated from field: string login = 1; + */ + login: string; + /** + * Role of this user in this tenant + * + * @generated from field: api.v1.TenantRole role = 2; + */ + role: TenantRole; + constructor(data?: PartialMessage); + static readonly runtime: typeof proto3; + static readonly typeName = "api.v1.TenantServiceInviteRequest"; + static readonly fields: FieldList; + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceInviteRequest; + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceInviteRequest; + static fromJsonString(jsonString: string, options?: Partial): TenantServiceInviteRequest; + static equals(a: TenantServiceInviteRequest | PlainMessage | undefined, b: TenantServiceInviteRequest | PlainMessage | undefined): boolean; +} +/** + * TenantServiceInviteRequest is the response payload to a invite member request + * + * @generated from message api.v1.TenantServiceInviteResponse + */ +export declare class TenantServiceInviteResponse extends Message { + /** + * Invite contains a secret which can be sent to a potential user + * can be appended to the invitation endpoint at our cloud console like + * console.metalstack.cloud/invite/ + * + * @generated from field: api.v1.TenantInvite invite = 1; + */ + invite?: TenantInvite; + constructor(data?: PartialMessage); + static readonly runtime: typeof proto3; + static readonly typeName = "api.v1.TenantServiceInviteResponse"; + static readonly fields: FieldList; + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceInviteResponse; + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceInviteResponse; + static fromJsonString(jsonString: string, options?: Partial): TenantServiceInviteResponse; + static equals(a: TenantServiceInviteResponse | PlainMessage | undefined, b: TenantServiceInviteResponse | PlainMessage | undefined): boolean; +} +/** + * TenantServiceInvitesListRequest is the request payload to a list invites request + * + * @generated from message api.v1.TenantServiceInvitesListRequest + */ +export declare class TenantServiceInvitesListRequest extends Message { + /** + * Login of the tenant + * + * @generated from field: string login = 1; + */ + login: string; + constructor(data?: PartialMessage); + static readonly runtime: typeof proto3; + static readonly typeName = "api.v1.TenantServiceInvitesListRequest"; + static readonly fields: FieldList; + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceInvitesListRequest; + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceInvitesListRequest; + static fromJsonString(jsonString: string, options?: Partial): TenantServiceInvitesListRequest; + static equals(a: TenantServiceInvitesListRequest | PlainMessage | undefined, b: TenantServiceInvitesListRequest | PlainMessage | undefined): boolean; +} +/** + * TenantServiceInvitesListResponse is the response payload to a list invites request + * + * @generated from message api.v1.TenantServiceInvitesListResponse + */ +export declare class TenantServiceInvitesListResponse extends Message { + /** + * Invites not already accepted the invitation to this tenant + * + * @generated from field: repeated api.v1.TenantInvite invites = 1; + */ + invites: TenantInvite[]; + constructor(data?: PartialMessage); + static readonly runtime: typeof proto3; + static readonly typeName = "api.v1.TenantServiceInvitesListResponse"; + static readonly fields: FieldList; + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceInvitesListResponse; + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceInvitesListResponse; + static fromJsonString(jsonString: string, options?: Partial): TenantServiceInvitesListResponse; + static equals(a: TenantServiceInvitesListResponse | PlainMessage | undefined, b: TenantServiceInvitesListResponse | PlainMessage | undefined): boolean; +} +/** + * TenantServiceInviteGetRequest is the request payload to get a invite + * + * @generated from message api.v1.TenantServiceInviteGetRequest + */ +export declare class TenantServiceInviteGetRequest extends Message { + /** + * Secret of the invite to get + * + * @generated from field: string secret = 1; + */ + secret: string; + constructor(data?: PartialMessage); + static readonly runtime: typeof proto3; + static readonly typeName = "api.v1.TenantServiceInviteGetRequest"; + static readonly fields: FieldList; + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceInviteGetRequest; + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceInviteGetRequest; + static fromJsonString(jsonString: string, options?: Partial): TenantServiceInviteGetRequest; + static equals(a: TenantServiceInviteGetRequest | PlainMessage | undefined, b: TenantServiceInviteGetRequest | PlainMessage | undefined): boolean; +} +/** + * TenantServiceInviteGetResponse is the response payload to a get invite request + * + * @generated from message api.v1.TenantServiceInviteGetResponse + */ +export declare class TenantServiceInviteGetResponse extends Message { + /** + * Invite is the invite + * + * @generated from field: api.v1.TenantInvite invite = 1; + */ + invite?: TenantInvite; + constructor(data?: PartialMessage); + static readonly runtime: typeof proto3; + static readonly typeName = "api.v1.TenantServiceInviteGetResponse"; + static readonly fields: FieldList; + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceInviteGetResponse; + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceInviteGetResponse; + static fromJsonString(jsonString: string, options?: Partial): TenantServiceInviteGetResponse; + static equals(a: TenantServiceInviteGetResponse | PlainMessage | undefined, b: TenantServiceInviteGetResponse | PlainMessage | undefined): boolean; +} +/** + * TenantServiceRemoveMemberRequest is used to remove a member from a tenant + * + * @generated from message api.v1.TenantServiceRemoveMemberRequest + */ +export declare class TenantServiceRemoveMemberRequest extends Message { + /** + * Login of the tenant + * + * @generated from field: string login = 1; + */ + login: string; + /** + * MemberID is the id of the member to remove from this tenant + * + * @generated from field: string member_id = 2; + */ + memberId: string; + constructor(data?: PartialMessage); + static readonly runtime: typeof proto3; + static readonly typeName = "api.v1.TenantServiceRemoveMemberRequest"; + static readonly fields: FieldList; + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceRemoveMemberRequest; + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceRemoveMemberRequest; + static fromJsonString(jsonString: string, options?: Partial): TenantServiceRemoveMemberRequest; + static equals(a: TenantServiceRemoveMemberRequest | PlainMessage | undefined, b: TenantServiceRemoveMemberRequest | PlainMessage | undefined): boolean; +} +/** + * TenantServiceRemoveMemberResponse is the response payload to a remove member request + * + * @generated from message api.v1.TenantServiceRemoveMemberResponse + */ +export declare class TenantServiceRemoveMemberResponse extends Message { + constructor(data?: PartialMessage); + static readonly runtime: typeof proto3; + static readonly typeName = "api.v1.TenantServiceRemoveMemberResponse"; + static readonly fields: FieldList; + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceRemoveMemberResponse; + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceRemoveMemberResponse; + static fromJsonString(jsonString: string, options?: Partial): TenantServiceRemoveMemberResponse; + static equals(a: TenantServiceRemoveMemberResponse | PlainMessage | undefined, b: TenantServiceRemoveMemberResponse | PlainMessage | undefined): boolean; +} +/** + * TenantServiceInviteAcceptRequest is the request payload to a accept invite request + * + * @generated from message api.v1.TenantServiceInviteAcceptRequest + */ +export declare class TenantServiceInviteAcceptRequest extends Message { + /** + * Secret is the invitation secret part of the invitation url + * + * @generated from field: string secret = 1; + */ + secret: string; + constructor(data?: PartialMessage); + static readonly runtime: typeof proto3; + static readonly typeName = "api.v1.TenantServiceInviteAcceptRequest"; + static readonly fields: FieldList; + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceInviteAcceptRequest; + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceInviteAcceptRequest; + static fromJsonString(jsonString: string, options?: Partial): TenantServiceInviteAcceptRequest; + static equals(a: TenantServiceInviteAcceptRequest | PlainMessage | undefined, b: TenantServiceInviteAcceptRequest | PlainMessage | undefined): boolean; +} +/** + * TenantServiceInvitesListResponse is the response payload to a accept invite request + * + * @generated from message api.v1.TenantServiceInviteAcceptResponse + */ +export declare class TenantServiceInviteAcceptResponse extends Message { + /** + * Tenant ID of the joined tenant + * + * @generated from field: string tenant = 1; + */ + tenant: string; + /** + * TenantName of the joined tenant + * + * @generated from field: string tenant_name = 2; + */ + tenantName: string; + constructor(data?: PartialMessage); + static readonly runtime: typeof proto3; + static readonly typeName = "api.v1.TenantServiceInviteAcceptResponse"; + static readonly fields: FieldList; + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceInviteAcceptResponse; + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceInviteAcceptResponse; + static fromJsonString(jsonString: string, options?: Partial): TenantServiceInviteAcceptResponse; + static equals(a: TenantServiceInviteAcceptResponse | PlainMessage | undefined, b: TenantServiceInviteAcceptResponse | PlainMessage | undefined): boolean; +} +/** + * TenantServiceInviteDeleteRequest is the request payload to a delete invite + * + * @generated from message api.v1.TenantServiceInviteDeleteRequest + */ +export declare class TenantServiceInviteDeleteRequest extends Message { + /** + * Login of the tenant + * + * @generated from field: string login = 1; + */ + login: string; + /** + * Secret of the invite to delete + * + * @generated from field: string secret = 2; + */ + secret: string; + constructor(data?: PartialMessage); + static readonly runtime: typeof proto3; + static readonly typeName = "api.v1.TenantServiceInviteDeleteRequest"; + static readonly fields: FieldList; + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceInviteDeleteRequest; + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceInviteDeleteRequest; + static fromJsonString(jsonString: string, options?: Partial): TenantServiceInviteDeleteRequest; + static equals(a: TenantServiceInviteDeleteRequest | PlainMessage | undefined, b: TenantServiceInviteDeleteRequest | PlainMessage | undefined): boolean; +} +/** + * TenantServiceInviteDeleteResponse is the response payload of a delete invite request + * + * @generated from message api.v1.TenantServiceInviteDeleteResponse + */ +export declare class TenantServiceInviteDeleteResponse extends Message { + constructor(data?: PartialMessage); + static readonly runtime: typeof proto3; + static readonly typeName = "api.v1.TenantServiceInviteDeleteResponse"; + static readonly fields: FieldList; + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceInviteDeleteResponse; + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceInviteDeleteResponse; + static fromJsonString(jsonString: string, options?: Partial): TenantServiceInviteDeleteResponse; + static equals(a: TenantServiceInviteDeleteResponse | PlainMessage | undefined, b: TenantServiceInviteDeleteResponse | PlainMessage | undefined): boolean; +} +/** + * TenantServiceUpdateMemberRequest is used to update a member from a tenant + * + * @generated from message api.v1.TenantServiceUpdateMemberRequest + */ +export declare class TenantServiceUpdateMemberRequest extends Message { + /** + * Login of the tenant + * + * @generated from field: string login = 1; + */ + login: string; + /** + * MemberID is the id of the member to update in this tenant + * + * @generated from field: string member_id = 2; + */ + memberId: string; + /** + * Role of this user in this tenant + * + * @generated from field: api.v1.TenantRole role = 3; + */ + role: TenantRole; + constructor(data?: PartialMessage); + static readonly runtime: typeof proto3; + static readonly typeName = "api.v1.TenantServiceUpdateMemberRequest"; + static readonly fields: FieldList; + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceUpdateMemberRequest; + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceUpdateMemberRequest; + static fromJsonString(jsonString: string, options?: Partial): TenantServiceUpdateMemberRequest; + static equals(a: TenantServiceUpdateMemberRequest | PlainMessage | undefined, b: TenantServiceUpdateMemberRequest | PlainMessage | undefined): boolean; +} +/** + * TenantServiceUpdateMemberResponse is the response payload to a update member request + * + * @generated from message api.v1.TenantServiceUpdateMemberResponse + */ +export declare class TenantServiceUpdateMemberResponse extends Message { + /** + * TenantMember is the updated membership + * + * @generated from field: api.v1.TenantMember tenant_member = 1; + */ + tenantMember?: TenantMember; + constructor(data?: PartialMessage); + static readonly runtime: typeof proto3; + static readonly typeName = "api.v1.TenantServiceUpdateMemberResponse"; + static readonly fields: FieldList; + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceUpdateMemberResponse; + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceUpdateMemberResponse; + static fromJsonString(jsonString: string, options?: Partial): TenantServiceUpdateMemberResponse; + static equals(a: TenantServiceUpdateMemberResponse | PlainMessage | undefined, b: TenantServiceUpdateMemberResponse | PlainMessage | undefined): boolean; +} diff --git a/js/api/v1/tenant_pb.js b/js/api/v1/tenant_pb.js index e9c5e59b..11f8c793 100644 --- a/js/api/v1/tenant_pb.js +++ b/js/api/v1/tenant_pb.js @@ -3,7 +3,7 @@ /* eslint-disable */ // @ts-nocheck import { Message, proto3, Timestamp } from "@bufbuild/protobuf"; -import { OAuthProvider } from "./common_pb.js"; +import { OAuthProvider, TenantRole } from "./common_pb.js"; import { Coupon } from "./payment_pb.js"; /** * Tenant is a customer of the platform @@ -20,7 +20,7 @@ export class Tenant extends Message { */ this.login = ""; /** - * Name if the tenant + * Name of the tenant * * @generated from field: string name = 2; */ @@ -31,6 +31,12 @@ export class Tenant extends Message { * @generated from field: string email = 3; */ this.email = ""; + /** + * Description of this tenant + * + * @generated from field: string description = 4; + */ + this.description = ""; /** * AvatarUrl of the tenant * @@ -67,6 +73,18 @@ export class Tenant extends Message { * @generated from field: bool onboarded = 13; */ this.onboarded = false; + /** + * TenantMembers of this tenant + * + * @generated from field: repeated api.v1.TenantMember tenant_members = 14; + */ + this.tenantMembers = []; + /** + * CreatedBy stores who created this tenant + * + * @generated from field: string created_by = 15; + */ + this.createdBy = ""; proto3.util.initPartial(data, this); } static fromBinary(bytes, options) { @@ -88,6 +106,7 @@ Tenant.fields = proto3.util.newFieldList(() => [ { no: 1, name: "login", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 2, name: "name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 3, name: "email", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 4, name: "description", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 5, name: "avatar_url", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 6, name: "oauth_provider", kind: "enum", T: proto3.getEnumType(OAuthProvider) }, { no: 8, name: "payment_details", kind: "message", T: PaymentDetails }, @@ -96,10 +115,132 @@ Tenant.fields = proto3.util.newFieldList(() => [ { no: 11, name: "terms_and_conditions", kind: "message", T: TermsAndConditions }, { no: 12, name: "email_consent", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, { no: 13, name: "onboarded", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, + { no: 14, name: "tenant_members", kind: "message", T: TenantMember, repeated: true }, + { no: 15, name: "created_by", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 20, name: "created_at", kind: "message", T: Timestamp }, { no: 21, name: "updated_at", kind: "message", T: Timestamp }, { no: 22, name: "deleted_at", kind: "message", T: Timestamp }, ]); +/** + * TenantMember defines a user that participates at a tenant + * + * @generated from message api.v1.TenantMember + */ +export class TenantMember extends Message { + constructor(data) { + super(); + /** + * Id is the user id of the member + * + * @generated from field: string id = 1; + */ + this.id = ""; + /** + * Role is the role of the member + * + * @generated from field: api.v1.TenantRole role = 2; + */ + this.role = TenantRole.UNSPECIFIED; + proto3.util.initPartial(data, this); + } + static fromBinary(bytes, options) { + return new TenantMember().fromBinary(bytes, options); + } + static fromJson(jsonValue, options) { + return new TenantMember().fromJson(jsonValue, options); + } + static fromJsonString(jsonString, options) { + return new TenantMember().fromJsonString(jsonString, options); + } + static equals(a, b) { + return proto3.util.equals(TenantMember, a, b); + } +} +TenantMember.runtime = proto3; +TenantMember.typeName = "api.v1.TenantMember"; +TenantMember.fields = proto3.util.newFieldList(() => [ + { no: 1, name: "id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "role", kind: "enum", T: proto3.getEnumType(TenantRole) }, + { no: 10, name: "created_at", kind: "message", T: Timestamp }, +]); +/** + * TenantInvite defines invite to tenant + * + * @generated from message api.v1.TenantInvite + */ +export class TenantInvite extends Message { + constructor(data) { + super(); + /** + * Secret is the secret part of the invite, typically part of the url + * + * @generated from field: string secret = 1; + */ + this.secret = ""; + /** + * TargetTenant is the tenant id for which this invite was created + * + * @generated from field: string target_tenant = 2; + */ + this.targetTenant = ""; + /** + * Role is the role in this tenant the user will get after accepting the invitation + * + * @generated from field: api.v1.TenantRole role = 3; + */ + this.role = TenantRole.UNSPECIFIED; + /** + * Joined is false as long as a user has not accepted the invite + * + * @generated from field: bool joined = 4; + */ + this.joined = false; + /** + * TargetTenantName is the tenant name for which this invite was created + * + * @generated from field: string target_tenant_name = 5; + */ + this.targetTenantName = ""; + /** + * Tenant is the login of tenant who invites to join this tenant + * + * @generated from field: string tenant = 6; + */ + this.tenant = ""; + /** + * TenantName is the name of tenant who invites to join this tenant + * + * @generated from field: string tenant_name = 7; + */ + this.tenantName = ""; + proto3.util.initPartial(data, this); + } + static fromBinary(bytes, options) { + return new TenantInvite().fromBinary(bytes, options); + } + static fromJson(jsonValue, options) { + return new TenantInvite().fromJson(jsonValue, options); + } + static fromJsonString(jsonString, options) { + return new TenantInvite().fromJsonString(jsonString, options); + } + static equals(a, b) { + return proto3.util.equals(TenantInvite, a, b); + } +} +TenantInvite.runtime = proto3; +TenantInvite.typeName = "api.v1.TenantInvite"; +TenantInvite.fields = proto3.util.newFieldList(() => [ + { no: 1, name: "secret", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "target_tenant", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 3, name: "role", kind: "enum", T: proto3.getEnumType(TenantRole) }, + { no: 4, name: "joined", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, + { no: 5, name: "target_tenant_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 6, name: "tenant", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 7, name: "tenant_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 10, name: "expires_at", kind: "message", T: Timestamp }, + { no: 11, name: "joined_at", kind: "message", T: Timestamp }, +]); /** * PaymentDetails of a tenant * @@ -251,6 +392,35 @@ TermsAndConditionsUpdate.fields = proto3.util.newFieldList(() => [ { no: 1, name: "accepted", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, { no: 2, name: "when", kind: "message", T: Timestamp, opt: true }, ]); +/** + * TenantServiceListRequest is the request payload of the tenant list request + * + * @generated from message api.v1.TenantServiceListRequest + */ +export class TenantServiceListRequest extends Message { + constructor(data) { + super(); + proto3.util.initPartial(data, this); + } + static fromBinary(bytes, options) { + return new TenantServiceListRequest().fromBinary(bytes, options); + } + static fromJson(jsonValue, options) { + return new TenantServiceListRequest().fromJson(jsonValue, options); + } + static fromJsonString(jsonString, options) { + return new TenantServiceListRequest().fromJsonString(jsonString, options); + } + static equals(a, b) { + return proto3.util.equals(TenantServiceListRequest, a, b); + } +} +TenantServiceListRequest.runtime = proto3; +TenantServiceListRequest.typeName = "api.v1.TenantServiceListRequest"; +TenantServiceListRequest.fields = proto3.util.newFieldList(() => [ + { no: 1, name: "id", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, + { no: 2, name: "name", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, +]); /** * TenantServiceGetRequest is the request payload of the tenant get request * @@ -293,6 +463,12 @@ TenantServiceGetRequest.fields = proto3.util.newFieldList(() => [ export class TenantServiceCreateRequest extends Message { constructor(data) { super(); + /** + * Name of this tenant + * + * @generated from field: string name = 1; + */ + this.name = ""; proto3.util.initPartial(data, this); } static fromBinary(bytes, options) { @@ -311,7 +487,11 @@ export class TenantServiceCreateRequest extends Message { TenantServiceCreateRequest.runtime = proto3; TenantServiceCreateRequest.typeName = "api.v1.TenantServiceCreateRequest"; TenantServiceCreateRequest.fields = proto3.util.newFieldList(() => [ - { no: 1, name: "tenant", kind: "message", T: Tenant }, + { no: 1, name: "name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "description", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, + { no: 3, name: "email", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, + { no: 4, name: "avatar_url", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, + { no: 5, name: "phone_number", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, ]); /** * TenantServiceCreateOrUpdateRequest is the request payload of the tenant create or update request @@ -376,6 +556,7 @@ TenantServiceUpdateRequest.fields = proto3.util.newFieldList(() => [ { no: 1, name: "login", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 2, name: "name", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, { no: 3, name: "email", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, + { no: 4, name: "description", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, { no: 5, name: "avatar_url", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, { no: 8, name: "payment_details", kind: "message", T: PaymentDetailsUpdate, opt: true }, { no: 9, name: "terms_and_conditions", kind: "message", T: TermsAndConditionsUpdate, opt: true }, @@ -443,6 +624,40 @@ TenantServiceGetResponse.typeName = "api.v1.TenantServiceGetResponse"; TenantServiceGetResponse.fields = proto3.util.newFieldList(() => [ { no: 1, name: "tenant", kind: "message", T: Tenant }, ]); +/** + * TenantServiceListResponse is the response payload of the tenant list request + * + * @generated from message api.v1.TenantServiceListResponse + */ +export class TenantServiceListResponse extends Message { + constructor(data) { + super(); + /** + * Tenants is the list of tenants + * + * @generated from field: repeated api.v1.Tenant tenants = 1; + */ + this.tenants = []; + proto3.util.initPartial(data, this); + } + static fromBinary(bytes, options) { + return new TenantServiceListResponse().fromBinary(bytes, options); + } + static fromJson(jsonValue, options) { + return new TenantServiceListResponse().fromJson(jsonValue, options); + } + static fromJsonString(jsonString, options) { + return new TenantServiceListResponse().fromJsonString(jsonString, options); + } + static equals(a, b) { + return proto3.util.equals(TenantServiceListResponse, a, b); + } +} +TenantServiceListResponse.runtime = proto3; +TenantServiceListResponse.typeName = "api.v1.TenantServiceListResponse"; +TenantServiceListResponse.fields = proto3.util.newFieldList(() => [ + { no: 1, name: "tenants", kind: "message", T: Tenant, repeated: true }, +]); /** * TenantServiceCreateResponse is the response payload of the tenant create request * @@ -555,3 +770,487 @@ TenantServiceDeleteResponse.typeName = "api.v1.TenantServiceDeleteResponse"; TenantServiceDeleteResponse.fields = proto3.util.newFieldList(() => [ { no: 1, name: "tenant", kind: "message", T: Tenant }, ]); +/** + * TenantServiceInviteRequest is used to invite a member to a tenant + * + * @generated from message api.v1.TenantServiceInviteRequest + */ +export class TenantServiceInviteRequest extends Message { + constructor(data) { + super(); + /** + * Login of the tenant + * + * @generated from field: string login = 1; + */ + this.login = ""; + /** + * Role of this user in this tenant + * + * @generated from field: api.v1.TenantRole role = 2; + */ + this.role = TenantRole.UNSPECIFIED; + proto3.util.initPartial(data, this); + } + static fromBinary(bytes, options) { + return new TenantServiceInviteRequest().fromBinary(bytes, options); + } + static fromJson(jsonValue, options) { + return new TenantServiceInviteRequest().fromJson(jsonValue, options); + } + static fromJsonString(jsonString, options) { + return new TenantServiceInviteRequest().fromJsonString(jsonString, options); + } + static equals(a, b) { + return proto3.util.equals(TenantServiceInviteRequest, a, b); + } +} +TenantServiceInviteRequest.runtime = proto3; +TenantServiceInviteRequest.typeName = "api.v1.TenantServiceInviteRequest"; +TenantServiceInviteRequest.fields = proto3.util.newFieldList(() => [ + { no: 1, name: "login", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "role", kind: "enum", T: proto3.getEnumType(TenantRole) }, +]); +/** + * TenantServiceInviteRequest is the response payload to a invite member request + * + * @generated from message api.v1.TenantServiceInviteResponse + */ +export class TenantServiceInviteResponse extends Message { + constructor(data) { + super(); + proto3.util.initPartial(data, this); + } + static fromBinary(bytes, options) { + return new TenantServiceInviteResponse().fromBinary(bytes, options); + } + static fromJson(jsonValue, options) { + return new TenantServiceInviteResponse().fromJson(jsonValue, options); + } + static fromJsonString(jsonString, options) { + return new TenantServiceInviteResponse().fromJsonString(jsonString, options); + } + static equals(a, b) { + return proto3.util.equals(TenantServiceInviteResponse, a, b); + } +} +TenantServiceInviteResponse.runtime = proto3; +TenantServiceInviteResponse.typeName = "api.v1.TenantServiceInviteResponse"; +TenantServiceInviteResponse.fields = proto3.util.newFieldList(() => [ + { no: 1, name: "invite", kind: "message", T: TenantInvite }, +]); +/** + * TenantServiceInvitesListRequest is the request payload to a list invites request + * + * @generated from message api.v1.TenantServiceInvitesListRequest + */ +export class TenantServiceInvitesListRequest extends Message { + constructor(data) { + super(); + /** + * Login of the tenant + * + * @generated from field: string login = 1; + */ + this.login = ""; + proto3.util.initPartial(data, this); + } + static fromBinary(bytes, options) { + return new TenantServiceInvitesListRequest().fromBinary(bytes, options); + } + static fromJson(jsonValue, options) { + return new TenantServiceInvitesListRequest().fromJson(jsonValue, options); + } + static fromJsonString(jsonString, options) { + return new TenantServiceInvitesListRequest().fromJsonString(jsonString, options); + } + static equals(a, b) { + return proto3.util.equals(TenantServiceInvitesListRequest, a, b); + } +} +TenantServiceInvitesListRequest.runtime = proto3; +TenantServiceInvitesListRequest.typeName = "api.v1.TenantServiceInvitesListRequest"; +TenantServiceInvitesListRequest.fields = proto3.util.newFieldList(() => [ + { no: 1, name: "login", kind: "scalar", T: 9 /* ScalarType.STRING */ }, +]); +/** + * TenantServiceInvitesListResponse is the response payload to a list invites request + * + * @generated from message api.v1.TenantServiceInvitesListResponse + */ +export class TenantServiceInvitesListResponse extends Message { + constructor(data) { + super(); + /** + * Invites not already accepted the invitation to this tenant + * + * @generated from field: repeated api.v1.TenantInvite invites = 1; + */ + this.invites = []; + proto3.util.initPartial(data, this); + } + static fromBinary(bytes, options) { + return new TenantServiceInvitesListResponse().fromBinary(bytes, options); + } + static fromJson(jsonValue, options) { + return new TenantServiceInvitesListResponse().fromJson(jsonValue, options); + } + static fromJsonString(jsonString, options) { + return new TenantServiceInvitesListResponse().fromJsonString(jsonString, options); + } + static equals(a, b) { + return proto3.util.equals(TenantServiceInvitesListResponse, a, b); + } +} +TenantServiceInvitesListResponse.runtime = proto3; +TenantServiceInvitesListResponse.typeName = "api.v1.TenantServiceInvitesListResponse"; +TenantServiceInvitesListResponse.fields = proto3.util.newFieldList(() => [ + { no: 1, name: "invites", kind: "message", T: TenantInvite, repeated: true }, +]); +/** + * TenantServiceInviteGetRequest is the request payload to get a invite + * + * @generated from message api.v1.TenantServiceInviteGetRequest + */ +export class TenantServiceInviteGetRequest extends Message { + constructor(data) { + super(); + /** + * Secret of the invite to get + * + * @generated from field: string secret = 1; + */ + this.secret = ""; + proto3.util.initPartial(data, this); + } + static fromBinary(bytes, options) { + return new TenantServiceInviteGetRequest().fromBinary(bytes, options); + } + static fromJson(jsonValue, options) { + return new TenantServiceInviteGetRequest().fromJson(jsonValue, options); + } + static fromJsonString(jsonString, options) { + return new TenantServiceInviteGetRequest().fromJsonString(jsonString, options); + } + static equals(a, b) { + return proto3.util.equals(TenantServiceInviteGetRequest, a, b); + } +} +TenantServiceInviteGetRequest.runtime = proto3; +TenantServiceInviteGetRequest.typeName = "api.v1.TenantServiceInviteGetRequest"; +TenantServiceInviteGetRequest.fields = proto3.util.newFieldList(() => [ + { no: 1, name: "secret", kind: "scalar", T: 9 /* ScalarType.STRING */ }, +]); +/** + * TenantServiceInviteGetResponse is the response payload to a get invite request + * + * @generated from message api.v1.TenantServiceInviteGetResponse + */ +export class TenantServiceInviteGetResponse extends Message { + constructor(data) { + super(); + proto3.util.initPartial(data, this); + } + static fromBinary(bytes, options) { + return new TenantServiceInviteGetResponse().fromBinary(bytes, options); + } + static fromJson(jsonValue, options) { + return new TenantServiceInviteGetResponse().fromJson(jsonValue, options); + } + static fromJsonString(jsonString, options) { + return new TenantServiceInviteGetResponse().fromJsonString(jsonString, options); + } + static equals(a, b) { + return proto3.util.equals(TenantServiceInviteGetResponse, a, b); + } +} +TenantServiceInviteGetResponse.runtime = proto3; +TenantServiceInviteGetResponse.typeName = "api.v1.TenantServiceInviteGetResponse"; +TenantServiceInviteGetResponse.fields = proto3.util.newFieldList(() => [ + { no: 1, name: "invite", kind: "message", T: TenantInvite }, +]); +/** + * TenantServiceRemoveMemberRequest is used to remove a member from a tenant + * + * @generated from message api.v1.TenantServiceRemoveMemberRequest + */ +export class TenantServiceRemoveMemberRequest extends Message { + constructor(data) { + super(); + /** + * Login of the tenant + * + * @generated from field: string login = 1; + */ + this.login = ""; + /** + * MemberID is the id of the member to remove from this tenant + * + * @generated from field: string member_id = 2; + */ + this.memberId = ""; + proto3.util.initPartial(data, this); + } + static fromBinary(bytes, options) { + return new TenantServiceRemoveMemberRequest().fromBinary(bytes, options); + } + static fromJson(jsonValue, options) { + return new TenantServiceRemoveMemberRequest().fromJson(jsonValue, options); + } + static fromJsonString(jsonString, options) { + return new TenantServiceRemoveMemberRequest().fromJsonString(jsonString, options); + } + static equals(a, b) { + return proto3.util.equals(TenantServiceRemoveMemberRequest, a, b); + } +} +TenantServiceRemoveMemberRequest.runtime = proto3; +TenantServiceRemoveMemberRequest.typeName = "api.v1.TenantServiceRemoveMemberRequest"; +TenantServiceRemoveMemberRequest.fields = proto3.util.newFieldList(() => [ + { no: 1, name: "login", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "member_id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, +]); +/** + * TenantServiceRemoveMemberResponse is the response payload to a remove member request + * + * @generated from message api.v1.TenantServiceRemoveMemberResponse + */ +export class TenantServiceRemoveMemberResponse extends Message { + constructor(data) { + super(); + proto3.util.initPartial(data, this); + } + static fromBinary(bytes, options) { + return new TenantServiceRemoveMemberResponse().fromBinary(bytes, options); + } + static fromJson(jsonValue, options) { + return new TenantServiceRemoveMemberResponse().fromJson(jsonValue, options); + } + static fromJsonString(jsonString, options) { + return new TenantServiceRemoveMemberResponse().fromJsonString(jsonString, options); + } + static equals(a, b) { + return proto3.util.equals(TenantServiceRemoveMemberResponse, a, b); + } +} +TenantServiceRemoveMemberResponse.runtime = proto3; +TenantServiceRemoveMemberResponse.typeName = "api.v1.TenantServiceRemoveMemberResponse"; +TenantServiceRemoveMemberResponse.fields = proto3.util.newFieldList(() => []); +/** + * TenantServiceInviteAcceptRequest is the request payload to a accept invite request + * + * @generated from message api.v1.TenantServiceInviteAcceptRequest + */ +export class TenantServiceInviteAcceptRequest extends Message { + constructor(data) { + super(); + /** + * Secret is the invitation secret part of the invitation url + * + * @generated from field: string secret = 1; + */ + this.secret = ""; + proto3.util.initPartial(data, this); + } + static fromBinary(bytes, options) { + return new TenantServiceInviteAcceptRequest().fromBinary(bytes, options); + } + static fromJson(jsonValue, options) { + return new TenantServiceInviteAcceptRequest().fromJson(jsonValue, options); + } + static fromJsonString(jsonString, options) { + return new TenantServiceInviteAcceptRequest().fromJsonString(jsonString, options); + } + static equals(a, b) { + return proto3.util.equals(TenantServiceInviteAcceptRequest, a, b); + } +} +TenantServiceInviteAcceptRequest.runtime = proto3; +TenantServiceInviteAcceptRequest.typeName = "api.v1.TenantServiceInviteAcceptRequest"; +TenantServiceInviteAcceptRequest.fields = proto3.util.newFieldList(() => [ + { no: 1, name: "secret", kind: "scalar", T: 9 /* ScalarType.STRING */ }, +]); +/** + * TenantServiceInvitesListResponse is the response payload to a accept invite request + * + * @generated from message api.v1.TenantServiceInviteAcceptResponse + */ +export class TenantServiceInviteAcceptResponse extends Message { + constructor(data) { + super(); + /** + * Tenant ID of the joined tenant + * + * @generated from field: string tenant = 1; + */ + this.tenant = ""; + /** + * TenantName of the joined tenant + * + * @generated from field: string tenant_name = 2; + */ + this.tenantName = ""; + proto3.util.initPartial(data, this); + } + static fromBinary(bytes, options) { + return new TenantServiceInviteAcceptResponse().fromBinary(bytes, options); + } + static fromJson(jsonValue, options) { + return new TenantServiceInviteAcceptResponse().fromJson(jsonValue, options); + } + static fromJsonString(jsonString, options) { + return new TenantServiceInviteAcceptResponse().fromJsonString(jsonString, options); + } + static equals(a, b) { + return proto3.util.equals(TenantServiceInviteAcceptResponse, a, b); + } +} +TenantServiceInviteAcceptResponse.runtime = proto3; +TenantServiceInviteAcceptResponse.typeName = "api.v1.TenantServiceInviteAcceptResponse"; +TenantServiceInviteAcceptResponse.fields = proto3.util.newFieldList(() => [ + { no: 1, name: "tenant", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "tenant_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, +]); +/** + * TenantServiceInviteDeleteRequest is the request payload to a delete invite + * + * @generated from message api.v1.TenantServiceInviteDeleteRequest + */ +export class TenantServiceInviteDeleteRequest extends Message { + constructor(data) { + super(); + /** + * Login of the tenant + * + * @generated from field: string login = 1; + */ + this.login = ""; + /** + * Secret of the invite to delete + * + * @generated from field: string secret = 2; + */ + this.secret = ""; + proto3.util.initPartial(data, this); + } + static fromBinary(bytes, options) { + return new TenantServiceInviteDeleteRequest().fromBinary(bytes, options); + } + static fromJson(jsonValue, options) { + return new TenantServiceInviteDeleteRequest().fromJson(jsonValue, options); + } + static fromJsonString(jsonString, options) { + return new TenantServiceInviteDeleteRequest().fromJsonString(jsonString, options); + } + static equals(a, b) { + return proto3.util.equals(TenantServiceInviteDeleteRequest, a, b); + } +} +TenantServiceInviteDeleteRequest.runtime = proto3; +TenantServiceInviteDeleteRequest.typeName = "api.v1.TenantServiceInviteDeleteRequest"; +TenantServiceInviteDeleteRequest.fields = proto3.util.newFieldList(() => [ + { no: 1, name: "login", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "secret", kind: "scalar", T: 9 /* ScalarType.STRING */ }, +]); +/** + * TenantServiceInviteDeleteResponse is the response payload of a delete invite request + * + * @generated from message api.v1.TenantServiceInviteDeleteResponse + */ +export class TenantServiceInviteDeleteResponse extends Message { + constructor(data) { + super(); + proto3.util.initPartial(data, this); + } + static fromBinary(bytes, options) { + return new TenantServiceInviteDeleteResponse().fromBinary(bytes, options); + } + static fromJson(jsonValue, options) { + return new TenantServiceInviteDeleteResponse().fromJson(jsonValue, options); + } + static fromJsonString(jsonString, options) { + return new TenantServiceInviteDeleteResponse().fromJsonString(jsonString, options); + } + static equals(a, b) { + return proto3.util.equals(TenantServiceInviteDeleteResponse, a, b); + } +} +TenantServiceInviteDeleteResponse.runtime = proto3; +TenantServiceInviteDeleteResponse.typeName = "api.v1.TenantServiceInviteDeleteResponse"; +TenantServiceInviteDeleteResponse.fields = proto3.util.newFieldList(() => []); +/** + * TenantServiceUpdateMemberRequest is used to update a member from a tenant + * + * @generated from message api.v1.TenantServiceUpdateMemberRequest + */ +export class TenantServiceUpdateMemberRequest extends Message { + constructor(data) { + super(); + /** + * Login of the tenant + * + * @generated from field: string login = 1; + */ + this.login = ""; + /** + * MemberID is the id of the member to update in this tenant + * + * @generated from field: string member_id = 2; + */ + this.memberId = ""; + /** + * Role of this user in this tenant + * + * @generated from field: api.v1.TenantRole role = 3; + */ + this.role = TenantRole.UNSPECIFIED; + proto3.util.initPartial(data, this); + } + static fromBinary(bytes, options) { + return new TenantServiceUpdateMemberRequest().fromBinary(bytes, options); + } + static fromJson(jsonValue, options) { + return new TenantServiceUpdateMemberRequest().fromJson(jsonValue, options); + } + static fromJsonString(jsonString, options) { + return new TenantServiceUpdateMemberRequest().fromJsonString(jsonString, options); + } + static equals(a, b) { + return proto3.util.equals(TenantServiceUpdateMemberRequest, a, b); + } +} +TenantServiceUpdateMemberRequest.runtime = proto3; +TenantServiceUpdateMemberRequest.typeName = "api.v1.TenantServiceUpdateMemberRequest"; +TenantServiceUpdateMemberRequest.fields = proto3.util.newFieldList(() => [ + { no: 1, name: "login", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "member_id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 3, name: "role", kind: "enum", T: proto3.getEnumType(TenantRole) }, +]); +/** + * TenantServiceUpdateMemberResponse is the response payload to a update member request + * + * @generated from message api.v1.TenantServiceUpdateMemberResponse + */ +export class TenantServiceUpdateMemberResponse extends Message { + constructor(data) { + super(); + proto3.util.initPartial(data, this); + } + static fromBinary(bytes, options) { + return new TenantServiceUpdateMemberResponse().fromBinary(bytes, options); + } + static fromJson(jsonValue, options) { + return new TenantServiceUpdateMemberResponse().fromJson(jsonValue, options); + } + static fromJsonString(jsonString, options) { + return new TenantServiceUpdateMemberResponse().fromJsonString(jsonString, options); + } + static equals(a, b) { + return proto3.util.equals(TenantServiceUpdateMemberResponse, a, b); + } +} +TenantServiceUpdateMemberResponse.runtime = proto3; +TenantServiceUpdateMemberResponse.typeName = "api.v1.TenantServiceUpdateMemberResponse"; +TenantServiceUpdateMemberResponse.fields = proto3.util.newFieldList(() => [ + { no: 1, name: "tenant_member", kind: "message", T: TenantMember }, +]); diff --git a/js/api/v1/tenant_pb.ts b/js/api/v1/tenant_pb.ts index 33446a86..b1c49518 100644 --- a/js/api/v1/tenant_pb.ts +++ b/js/api/v1/tenant_pb.ts @@ -5,7 +5,7 @@ import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; import { Message, proto3, Timestamp } from "@bufbuild/protobuf"; -import { OAuthProvider } from "./common_pb.js"; +import { OAuthProvider, TenantRole } from "./common_pb.js"; import { Coupon } from "./payment_pb.js"; /** @@ -22,7 +22,7 @@ export class Tenant extends Message { login = ""; /** - * Name if the tenant + * Name of the tenant * * @generated from field: string name = 2; */ @@ -35,6 +35,13 @@ export class Tenant extends Message { */ email = ""; + /** + * Description of this tenant + * + * @generated from field: string description = 4; + */ + description = ""; + /** * AvatarUrl of the tenant * @@ -91,6 +98,20 @@ export class Tenant extends Message { */ onboarded = false; + /** + * TenantMembers of this tenant + * + * @generated from field: repeated api.v1.TenantMember tenant_members = 14; + */ + tenantMembers: TenantMember[] = []; + + /** + * CreatedBy stores who created this tenant + * + * @generated from field: string created_by = 15; + */ + createdBy = ""; + /** * CreatedAt the date when this tenant was created * @@ -123,6 +144,7 @@ export class Tenant extends Message { { no: 1, name: "login", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 2, name: "name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 3, name: "email", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 4, name: "description", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 5, name: "avatar_url", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 6, name: "oauth_provider", kind: "enum", T: proto3.getEnumType(OAuthProvider) }, { no: 8, name: "payment_details", kind: "message", T: PaymentDetails }, @@ -131,6 +153,8 @@ export class Tenant extends Message { { no: 11, name: "terms_and_conditions", kind: "message", T: TermsAndConditions }, { no: 12, name: "email_consent", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, { no: 13, name: "onboarded", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, + { no: 14, name: "tenant_members", kind: "message", T: TenantMember, repeated: true }, + { no: 15, name: "created_by", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 20, name: "created_at", kind: "message", T: Timestamp }, { no: 21, name: "updated_at", kind: "message", T: Timestamp }, { no: 22, name: "deleted_at", kind: "message", T: Timestamp }, @@ -153,6 +177,168 @@ export class Tenant extends Message { } } +/** + * TenantMember defines a user that participates at a tenant + * + * @generated from message api.v1.TenantMember + */ +export class TenantMember extends Message { + /** + * Id is the user id of the member + * + * @generated from field: string id = 1; + */ + id = ""; + + /** + * Role is the role of the member + * + * @generated from field: api.v1.TenantRole role = 2; + */ + role = TenantRole.UNSPECIFIED; + + /** + * CreatedAt the date when the member was added to the tenant + * + * @generated from field: google.protobuf.Timestamp created_at = 10; + */ + createdAt?: Timestamp; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "api.v1.TenantMember"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "role", kind: "enum", T: proto3.getEnumType(TenantRole) }, + { no: 10, name: "created_at", kind: "message", T: Timestamp }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): TenantMember { + return new TenantMember().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): TenantMember { + return new TenantMember().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): TenantMember { + return new TenantMember().fromJsonString(jsonString, options); + } + + static equals(a: TenantMember | PlainMessage | undefined, b: TenantMember | PlainMessage | undefined): boolean { + return proto3.util.equals(TenantMember, a, b); + } +} + +/** + * TenantInvite defines invite to tenant + * + * @generated from message api.v1.TenantInvite + */ +export class TenantInvite extends Message { + /** + * Secret is the secret part of the invite, typically part of the url + * + * @generated from field: string secret = 1; + */ + secret = ""; + + /** + * TargetTenant is the tenant id for which this invite was created + * + * @generated from field: string target_tenant = 2; + */ + targetTenant = ""; + + /** + * Role is the role in this tenant the user will get after accepting the invitation + * + * @generated from field: api.v1.TenantRole role = 3; + */ + role = TenantRole.UNSPECIFIED; + + /** + * Joined is false as long as a user has not accepted the invite + * + * @generated from field: bool joined = 4; + */ + joined = false; + + /** + * TargetTenantName is the tenant name for which this invite was created + * + * @generated from field: string target_tenant_name = 5; + */ + targetTenantName = ""; + + /** + * Tenant is the login of tenant who invites to join this tenant + * + * @generated from field: string tenant = 6; + */ + tenant = ""; + + /** + * TenantName is the name of tenant who invites to join this tenant + * + * @generated from field: string tenant_name = 7; + */ + tenantName = ""; + + /** + * ExpiresAt the date when this invite expires + * + * @generated from field: google.protobuf.Timestamp expires_at = 10; + */ + expiresAt?: Timestamp; + + /** + * JoinedAt the date when the member accepted this invite + * + * @generated from field: google.protobuf.Timestamp joined_at = 11; + */ + joinedAt?: Timestamp; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "api.v1.TenantInvite"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "secret", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "target_tenant", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 3, name: "role", kind: "enum", T: proto3.getEnumType(TenantRole) }, + { no: 4, name: "joined", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, + { no: 5, name: "target_tenant_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 6, name: "tenant", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 7, name: "tenant_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 10, name: "expires_at", kind: "message", T: Timestamp }, + { no: 11, name: "joined_at", kind: "message", T: Timestamp }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): TenantInvite { + return new TenantInvite().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): TenantInvite { + return new TenantInvite().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): TenantInvite { + return new TenantInvite().fromJsonString(jsonString, options); + } + + static equals(a: TenantInvite | PlainMessage | undefined, b: TenantInvite | PlainMessage | undefined): boolean { + return proto3.util.equals(TenantInvite, a, b); + } +} + /** * PaymentDetails of a tenant * @@ -389,6 +575,55 @@ export class TermsAndConditionsUpdate extends Message } } +/** + * TenantServiceListRequest is the request payload of the tenant list request + * + * @generated from message api.v1.TenantServiceListRequest + */ +export class TenantServiceListRequest extends Message { + /** + * Id filters tenants by id + * + * @generated from field: optional string id = 1; + */ + id?: string; + + /** + * Name filters tenants by name + * + * @generated from field: optional string name = 2; + */ + name?: string; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "api.v1.TenantServiceListRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "id", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, + { no: 2, name: "name", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceListRequest { + return new TenantServiceListRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceListRequest { + return new TenantServiceListRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): TenantServiceListRequest { + return new TenantServiceListRequest().fromJsonString(jsonString, options); + } + + static equals(a: TenantServiceListRequest | PlainMessage | undefined, b: TenantServiceListRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(TenantServiceListRequest, a, b); + } +} + /** * TenantServiceGetRequest is the request payload of the tenant get request * @@ -437,11 +672,39 @@ export class TenantServiceGetRequest extends Message { */ export class TenantServiceCreateRequest extends Message { /** - * Tenant the tenant to create + * Name of this tenant * - * @generated from field: api.v1.Tenant tenant = 1; + * @generated from field: string name = 1; */ - tenant?: Tenant; + name = ""; + + /** + * Description of this tenant + * + * @generated from field: optional string description = 2; + */ + description?: string; + + /** + * Email of the tenant, if not set will be inherited from the creator + * + * @generated from field: optional string email = 3; + */ + email?: string; + + /** + * AvatarUrl of the tenant + * + * @generated from field: optional string avatar_url = 4; + */ + avatarUrl?: string; + + /** + * PhoneNumber of the tenant + * + * @generated from field: optional string phone_number = 5; + */ + phoneNumber?: string; constructor(data?: PartialMessage) { super(); @@ -451,7 +714,11 @@ export class TenantServiceCreateRequest extends Message [ - { no: 1, name: "tenant", kind: "message", T: Tenant }, + { no: 1, name: "name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "description", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, + { no: 3, name: "email", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, + { no: 4, name: "avatar_url", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, + { no: 5, name: "phone_number", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceCreateRequest { @@ -539,6 +806,13 @@ export class TenantServiceUpdateRequest extends Message } } +/** + * TenantServiceListResponse is the response payload of the tenant list request + * + * @generated from message api.v1.TenantServiceListResponse + */ +export class TenantServiceListResponse extends Message { + /** + * Tenants is the list of tenants + * + * @generated from field: repeated api.v1.Tenant tenants = 1; + */ + tenants: Tenant[] = []; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "api.v1.TenantServiceListResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "tenants", kind: "message", T: Tenant, repeated: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceListResponse { + return new TenantServiceListResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceListResponse { + return new TenantServiceListResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): TenantServiceListResponse { + return new TenantServiceListResponse().fromJsonString(jsonString, options); + } + + static equals(a: TenantServiceListResponse | PlainMessage | undefined, b: TenantServiceListResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(TenantServiceListResponse, a, b); + } +} + /** * TenantServiceCreateResponse is the response payload of the tenant create request * @@ -847,3 +1163,611 @@ export class TenantServiceDeleteResponse extends Message { + /** + * Login of the tenant + * + * @generated from field: string login = 1; + */ + login = ""; + + /** + * Role of this user in this tenant + * + * @generated from field: api.v1.TenantRole role = 2; + */ + role = TenantRole.UNSPECIFIED; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "api.v1.TenantServiceInviteRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "login", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "role", kind: "enum", T: proto3.getEnumType(TenantRole) }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceInviteRequest { + return new TenantServiceInviteRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceInviteRequest { + return new TenantServiceInviteRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): TenantServiceInviteRequest { + return new TenantServiceInviteRequest().fromJsonString(jsonString, options); + } + + static equals(a: TenantServiceInviteRequest | PlainMessage | undefined, b: TenantServiceInviteRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(TenantServiceInviteRequest, a, b); + } +} + +/** + * TenantServiceInviteRequest is the response payload to a invite member request + * + * @generated from message api.v1.TenantServiceInviteResponse + */ +export class TenantServiceInviteResponse extends Message { + /** + * Invite contains a secret which can be sent to a potential user + * can be appended to the invitation endpoint at our cloud console like + * console.metalstack.cloud/invite/ + * + * @generated from field: api.v1.TenantInvite invite = 1; + */ + invite?: TenantInvite; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "api.v1.TenantServiceInviteResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "invite", kind: "message", T: TenantInvite }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceInviteResponse { + return new TenantServiceInviteResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceInviteResponse { + return new TenantServiceInviteResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): TenantServiceInviteResponse { + return new TenantServiceInviteResponse().fromJsonString(jsonString, options); + } + + static equals(a: TenantServiceInviteResponse | PlainMessage | undefined, b: TenantServiceInviteResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(TenantServiceInviteResponse, a, b); + } +} + +/** + * TenantServiceInvitesListRequest is the request payload to a list invites request + * + * @generated from message api.v1.TenantServiceInvitesListRequest + */ +export class TenantServiceInvitesListRequest extends Message { + /** + * Login of the tenant + * + * @generated from field: string login = 1; + */ + login = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "api.v1.TenantServiceInvitesListRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "login", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceInvitesListRequest { + return new TenantServiceInvitesListRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceInvitesListRequest { + return new TenantServiceInvitesListRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): TenantServiceInvitesListRequest { + return new TenantServiceInvitesListRequest().fromJsonString(jsonString, options); + } + + static equals(a: TenantServiceInvitesListRequest | PlainMessage | undefined, b: TenantServiceInvitesListRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(TenantServiceInvitesListRequest, a, b); + } +} + +/** + * TenantServiceInvitesListResponse is the response payload to a list invites request + * + * @generated from message api.v1.TenantServiceInvitesListResponse + */ +export class TenantServiceInvitesListResponse extends Message { + /** + * Invites not already accepted the invitation to this tenant + * + * @generated from field: repeated api.v1.TenantInvite invites = 1; + */ + invites: TenantInvite[] = []; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "api.v1.TenantServiceInvitesListResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "invites", kind: "message", T: TenantInvite, repeated: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceInvitesListResponse { + return new TenantServiceInvitesListResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceInvitesListResponse { + return new TenantServiceInvitesListResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): TenantServiceInvitesListResponse { + return new TenantServiceInvitesListResponse().fromJsonString(jsonString, options); + } + + static equals(a: TenantServiceInvitesListResponse | PlainMessage | undefined, b: TenantServiceInvitesListResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(TenantServiceInvitesListResponse, a, b); + } +} + +/** + * TenantServiceInviteGetRequest is the request payload to get a invite + * + * @generated from message api.v1.TenantServiceInviteGetRequest + */ +export class TenantServiceInviteGetRequest extends Message { + /** + * Secret of the invite to get + * + * @generated from field: string secret = 1; + */ + secret = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "api.v1.TenantServiceInviteGetRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "secret", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceInviteGetRequest { + return new TenantServiceInviteGetRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceInviteGetRequest { + return new TenantServiceInviteGetRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): TenantServiceInviteGetRequest { + return new TenantServiceInviteGetRequest().fromJsonString(jsonString, options); + } + + static equals(a: TenantServiceInviteGetRequest | PlainMessage | undefined, b: TenantServiceInviteGetRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(TenantServiceInviteGetRequest, a, b); + } +} + +/** + * TenantServiceInviteGetResponse is the response payload to a get invite request + * + * @generated from message api.v1.TenantServiceInviteGetResponse + */ +export class TenantServiceInviteGetResponse extends Message { + /** + * Invite is the invite + * + * @generated from field: api.v1.TenantInvite invite = 1; + */ + invite?: TenantInvite; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "api.v1.TenantServiceInviteGetResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "invite", kind: "message", T: TenantInvite }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceInviteGetResponse { + return new TenantServiceInviteGetResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceInviteGetResponse { + return new TenantServiceInviteGetResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): TenantServiceInviteGetResponse { + return new TenantServiceInviteGetResponse().fromJsonString(jsonString, options); + } + + static equals(a: TenantServiceInviteGetResponse | PlainMessage | undefined, b: TenantServiceInviteGetResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(TenantServiceInviteGetResponse, a, b); + } +} + +/** + * TenantServiceRemoveMemberRequest is used to remove a member from a tenant + * + * @generated from message api.v1.TenantServiceRemoveMemberRequest + */ +export class TenantServiceRemoveMemberRequest extends Message { + /** + * Login of the tenant + * + * @generated from field: string login = 1; + */ + login = ""; + + /** + * MemberID is the id of the member to remove from this tenant + * + * @generated from field: string member_id = 2; + */ + memberId = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "api.v1.TenantServiceRemoveMemberRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "login", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "member_id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceRemoveMemberRequest { + return new TenantServiceRemoveMemberRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceRemoveMemberRequest { + return new TenantServiceRemoveMemberRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): TenantServiceRemoveMemberRequest { + return new TenantServiceRemoveMemberRequest().fromJsonString(jsonString, options); + } + + static equals(a: TenantServiceRemoveMemberRequest | PlainMessage | undefined, b: TenantServiceRemoveMemberRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(TenantServiceRemoveMemberRequest, a, b); + } +} + +/** + * TenantServiceRemoveMemberResponse is the response payload to a remove member request + * + * @generated from message api.v1.TenantServiceRemoveMemberResponse + */ +export class TenantServiceRemoveMemberResponse extends Message { + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "api.v1.TenantServiceRemoveMemberResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceRemoveMemberResponse { + return new TenantServiceRemoveMemberResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceRemoveMemberResponse { + return new TenantServiceRemoveMemberResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): TenantServiceRemoveMemberResponse { + return new TenantServiceRemoveMemberResponse().fromJsonString(jsonString, options); + } + + static equals(a: TenantServiceRemoveMemberResponse | PlainMessage | undefined, b: TenantServiceRemoveMemberResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(TenantServiceRemoveMemberResponse, a, b); + } +} + +/** + * TenantServiceInviteAcceptRequest is the request payload to a accept invite request + * + * @generated from message api.v1.TenantServiceInviteAcceptRequest + */ +export class TenantServiceInviteAcceptRequest extends Message { + /** + * Secret is the invitation secret part of the invitation url + * + * @generated from field: string secret = 1; + */ + secret = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "api.v1.TenantServiceInviteAcceptRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "secret", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceInviteAcceptRequest { + return new TenantServiceInviteAcceptRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceInviteAcceptRequest { + return new TenantServiceInviteAcceptRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): TenantServiceInviteAcceptRequest { + return new TenantServiceInviteAcceptRequest().fromJsonString(jsonString, options); + } + + static equals(a: TenantServiceInviteAcceptRequest | PlainMessage | undefined, b: TenantServiceInviteAcceptRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(TenantServiceInviteAcceptRequest, a, b); + } +} + +/** + * TenantServiceInvitesListResponse is the response payload to a accept invite request + * + * @generated from message api.v1.TenantServiceInviteAcceptResponse + */ +export class TenantServiceInviteAcceptResponse extends Message { + /** + * Tenant ID of the joined tenant + * + * @generated from field: string tenant = 1; + */ + tenant = ""; + + /** + * TenantName of the joined tenant + * + * @generated from field: string tenant_name = 2; + */ + tenantName = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "api.v1.TenantServiceInviteAcceptResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "tenant", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "tenant_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceInviteAcceptResponse { + return new TenantServiceInviteAcceptResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceInviteAcceptResponse { + return new TenantServiceInviteAcceptResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): TenantServiceInviteAcceptResponse { + return new TenantServiceInviteAcceptResponse().fromJsonString(jsonString, options); + } + + static equals(a: TenantServiceInviteAcceptResponse | PlainMessage | undefined, b: TenantServiceInviteAcceptResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(TenantServiceInviteAcceptResponse, a, b); + } +} + +/** + * TenantServiceInviteDeleteRequest is the request payload to a delete invite + * + * @generated from message api.v1.TenantServiceInviteDeleteRequest + */ +export class TenantServiceInviteDeleteRequest extends Message { + /** + * Login of the tenant + * + * @generated from field: string login = 1; + */ + login = ""; + + /** + * Secret of the invite to delete + * + * @generated from field: string secret = 2; + */ + secret = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "api.v1.TenantServiceInviteDeleteRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "login", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "secret", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceInviteDeleteRequest { + return new TenantServiceInviteDeleteRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceInviteDeleteRequest { + return new TenantServiceInviteDeleteRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): TenantServiceInviteDeleteRequest { + return new TenantServiceInviteDeleteRequest().fromJsonString(jsonString, options); + } + + static equals(a: TenantServiceInviteDeleteRequest | PlainMessage | undefined, b: TenantServiceInviteDeleteRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(TenantServiceInviteDeleteRequest, a, b); + } +} + +/** + * TenantServiceInviteDeleteResponse is the response payload of a delete invite request + * + * @generated from message api.v1.TenantServiceInviteDeleteResponse + */ +export class TenantServiceInviteDeleteResponse extends Message { + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "api.v1.TenantServiceInviteDeleteResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceInviteDeleteResponse { + return new TenantServiceInviteDeleteResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceInviteDeleteResponse { + return new TenantServiceInviteDeleteResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): TenantServiceInviteDeleteResponse { + return new TenantServiceInviteDeleteResponse().fromJsonString(jsonString, options); + } + + static equals(a: TenantServiceInviteDeleteResponse | PlainMessage | undefined, b: TenantServiceInviteDeleteResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(TenantServiceInviteDeleteResponse, a, b); + } +} + +/** + * TenantServiceUpdateMemberRequest is used to update a member from a tenant + * + * @generated from message api.v1.TenantServiceUpdateMemberRequest + */ +export class TenantServiceUpdateMemberRequest extends Message { + /** + * Login of the tenant + * + * @generated from field: string login = 1; + */ + login = ""; + + /** + * MemberID is the id of the member to update in this tenant + * + * @generated from field: string member_id = 2; + */ + memberId = ""; + + /** + * Role of this user in this tenant + * + * @generated from field: api.v1.TenantRole role = 3; + */ + role = TenantRole.UNSPECIFIED; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "api.v1.TenantServiceUpdateMemberRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "login", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "member_id", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 3, name: "role", kind: "enum", T: proto3.getEnumType(TenantRole) }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceUpdateMemberRequest { + return new TenantServiceUpdateMemberRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceUpdateMemberRequest { + return new TenantServiceUpdateMemberRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): TenantServiceUpdateMemberRequest { + return new TenantServiceUpdateMemberRequest().fromJsonString(jsonString, options); + } + + static equals(a: TenantServiceUpdateMemberRequest | PlainMessage | undefined, b: TenantServiceUpdateMemberRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(TenantServiceUpdateMemberRequest, a, b); + } +} + +/** + * TenantServiceUpdateMemberResponse is the response payload to a update member request + * + * @generated from message api.v1.TenantServiceUpdateMemberResponse + */ +export class TenantServiceUpdateMemberResponse extends Message { + /** + * TenantMember is the updated membership + * + * @generated from field: api.v1.TenantMember tenant_member = 1; + */ + tenantMember?: TenantMember; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "api.v1.TenantServiceUpdateMemberResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "tenant_member", kind: "message", T: TenantMember }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): TenantServiceUpdateMemberResponse { + return new TenantServiceUpdateMemberResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): TenantServiceUpdateMemberResponse { + return new TenantServiceUpdateMemberResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): TenantServiceUpdateMemberResponse { + return new TenantServiceUpdateMemberResponse().fromJsonString(jsonString, options); + } + + static equals(a: TenantServiceUpdateMemberResponse | PlainMessage | undefined, b: TenantServiceUpdateMemberResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(TenantServiceUpdateMemberResponse, a, b); + } +} + diff --git a/js/api/v1/volume_pb.d.ts b/js/api/v1/volume_pb.d.ts index 4e5a8254..88f2edf2 100644 --- a/js/api/v1/volume_pb.d.ts +++ b/js/api/v1/volume_pb.d.ts @@ -164,7 +164,7 @@ export declare class VolumeStatistics extends Message { */ physicalUsedStorage: bigint; /** - * CommpressionRatio + * CompressionRatio * * compression ratio userWritten/physicalCapacity * @@ -172,7 +172,7 @@ export declare class VolumeStatistics extends Message { */ compressionRatio: number; /** - * TotalCommpressionRatio + * TotalCompressionRatio * * compression ratio sum(userWritten) / sum(physical capacity) * diff --git a/js/api/v1/volume_pb.js b/js/api/v1/volume_pb.js index f3803a1b..f81af5d2 100644 --- a/js/api/v1/volume_pb.js +++ b/js/api/v1/volume_pb.js @@ -196,7 +196,7 @@ export class VolumeStatistics extends Message { */ this.physicalUsedStorage = protoInt64.zero; /** - * CommpressionRatio + * CompressionRatio * * compression ratio userWritten/physicalCapacity * @@ -204,7 +204,7 @@ export class VolumeStatistics extends Message { */ this.compressionRatio = 0; /** - * TotalCommpressionRatio + * TotalCompressionRatio * * compression ratio sum(userWritten) / sum(physical capacity) * diff --git a/js/api/v1/volume_pb.ts b/js/api/v1/volume_pb.ts index 08f92dee..a79190d3 100644 --- a/js/api/v1/volume_pb.ts +++ b/js/api/v1/volume_pb.ts @@ -232,7 +232,7 @@ export class VolumeStatistics extends Message { physicalUsedStorage = protoInt64.zero; /** - * CommpressionRatio + * CompressionRatio * * compression ratio userWritten/physicalCapacity * @@ -241,7 +241,7 @@ export class VolumeStatistics extends Message { compressionRatio = 0; /** - * TotalCommpressionRatio + * TotalCompressionRatio * * compression ratio sum(userWritten) / sum(physical capacity) * diff --git a/js/bun.lockb b/js/bun.lockb index 19aac88701f30629c20cd452336e84806b249105..2e0924b9d71ac1643ea0b3fc1e962c510fac5928 100755 GIT binary patch delta 141 zcmV;80CNAF7MvE4E+9m}n-auRoKZqDaG#(Q+;CTb3mtD*BZ7KDtDN&sNYt@T>Hz@* zk>M+|WCAGyK`OJ|-13?Ty8H0PrGhL8oDI1)ZwCTra5s6FQHEd}{36VXJrSsHz@) zk>M+|WCAGyLHlpu&{u5KL}fpsY-&Uh4S3mglMMR0scKk2v1!l7}1zQ3EGP95e?*aiblYk1GEd4!G diff --git a/js/package.json b/js/package.json index 73e7bdb2..7b7219ee 100644 --- a/js/package.json +++ b/js/package.json @@ -15,6 +15,6 @@ "@connectrpc/connect-web": "^1.4.0" }, "devDependencies": { - "typescript": "^5.4.2" + "typescript": "^5.4.3" } } \ No newline at end of file diff --git a/js/permissions/servicepermissions.json b/js/permissions/servicepermissions.json index c83774aa..a7a9cd1f 100755 --- a/js/permissions/servicepermissions.json +++ b/js/permissions/servicepermissions.json @@ -35,7 +35,6 @@ "/api.v1.PaymentService/RequestAdmission", "/api.v1.PaymentService/HasChargeableResources", "/api.v1.ProjectService/Create", - "/api.v1.TenantService/Create", "/api.v1.TenantService/Get", "/api.v1.TenantService/Update", "/api.v1.TenantService/Delete" @@ -55,10 +54,14 @@ "/api.v1.PaymentService/SetOnboarded", "/api.v1.PaymentService/GetOnboarded", "/api.v1.ProjectService/Create", - "/api.v1.TenantService/Create", "/api.v1.TenantService/Get", "/api.v1.TenantService/Update", - "/api.v1.TenantService/Delete" + "/api.v1.TenantService/Delete", + "/api.v1.TenantService/RemoveMember", + "/api.v1.TenantService/UpdateMember", + "/api.v1.TenantService/Invite", + "/api.v1.TenantService/InviteDelete", + "/api.v1.TenantService/InvitesList" ], "TENANT_ROLE_VIEWER": [ "/api.v1.PaymentService/HasPaymentMethod", @@ -199,7 +202,15 @@ "/api.v1.TenantService/CreateOrUpdate": true, "/api.v1.TenantService/Delete": true, "/api.v1.TenantService/Get": true, + "/api.v1.TenantService/Invite": true, + "/api.v1.TenantService/InviteAccept": true, + "/api.v1.TenantService/InviteDelete": true, + "/api.v1.TenantService/InviteGet": true, + "/api.v1.TenantService/InvitesList": true, + "/api.v1.TenantService/List": true, + "/api.v1.TenantService/RemoveMember": true, "/api.v1.TenantService/Update": true, + "/api.v1.TenantService/UpdateMember": true, "/api.v1.TokenService/Create": true, "/api.v1.TokenService/List": true, "/api.v1.TokenService/Revoke": true, @@ -231,6 +242,10 @@ "/api.v1.ProjectService/InviteAccept": true, "/api.v1.ProjectService/InviteGet": true, "/api.v1.ProjectService/List": true, + "/api.v1.TenantService/Create": true, + "/api.v1.TenantService/InviteAccept": true, + "/api.v1.TenantService/InviteGet": true, + "/api.v1.TenantService/List": true, "/api.v1.TokenService/Create": true, "/api.v1.TokenService/List": true, "/api.v1.TokenService/Revoke": true, @@ -308,7 +323,15 @@ "/api.v1.TenantService/CreateOrUpdate": true, "/api.v1.TenantService/Delete": true, "/api.v1.TenantService/Get": false, + "/api.v1.TenantService/Invite": true, + "/api.v1.TenantService/InviteAccept": true, + "/api.v1.TenantService/InviteDelete": true, + "/api.v1.TenantService/InviteGet": false, + "/api.v1.TenantService/InvitesList": false, + "/api.v1.TenantService/List": false, + "/api.v1.TenantService/RemoveMember": true, "/api.v1.TenantService/Update": true, + "/api.v1.TenantService/UpdateMember": true, "/api.v1.TokenService/Create": true, "/api.v1.TokenService/List": true, "/api.v1.TokenService/Revoke": true, diff --git a/proto/admin/v1/cluster.proto b/proto/admin/v1/cluster.proto index 0c3d1d35..a1cde2e4 100644 --- a/proto/admin/v1/cluster.proto +++ b/proto/admin/v1/cluster.proto @@ -42,7 +42,7 @@ message ClusterServiceListRequest { optional string project = 2; // Tenant of the cluster optional string tenant = 3; - // Partiton of the cluster + // Partition of the cluster optional string partition = 4; // Seed of the cluster optional string seed = 5; diff --git a/proto/admin/v1/machine.proto b/proto/admin/v1/machine.proto index d13a7379..247d35fb 100644 --- a/proto/admin/v1/machine.proto +++ b/proto/admin/v1/machine.proto @@ -48,7 +48,7 @@ message Machine { message MachineNetwork { // Network is the uuid of this network string network = 1; - // Prefixes availalble in this network + // Prefixes available in this network repeated string prefixes = 2; // Ips attached for the machine in this network repeated string ips = 3; diff --git a/proto/admin/v1/storage.proto b/proto/admin/v1/storage.proto index 1f3bf0ed..16ad140e 100644 --- a/proto/admin/v1/storage.proto +++ b/proto/admin/v1/storage.proto @@ -139,7 +139,7 @@ message ClusterStatisticsApi { // // Estimate of total available logical storage based on current compression ratio (effective * compression) uint64 estimated_logical_storage = 10; - // commpression ratio + // compression ratio // // compression ratio logicalUsedStorage/physicalUsedStorage double compression_ratio = 11; diff --git a/proto/api/v1/assets.proto b/proto/api/v1/assets.proto index 9cac45ae..139d6b67 100644 --- a/proto/api/v1/assets.proto +++ b/proto/api/v1/assets.proto @@ -99,7 +99,7 @@ message AssetDefaults { // AssetServiceListRequest is the request payload to list all Assets message AssetServiceListRequest {} -// AssetServiceListResponse is the response payload which containes the the Asset list +// AssetServiceListResponse is the response payload which contains the the Asset list message AssetServiceListResponse { // Assets defines a list of assets repeated Asset assets = 2; diff --git a/proto/api/v1/cluster.proto b/proto/api/v1/cluster.proto index c166f4b3..1dd24d0d 100644 --- a/proto/api/v1/cluster.proto +++ b/proto/api/v1/cluster.proto @@ -295,7 +295,7 @@ message ClusterServiceWatchStatusRequest { message ClusterStatus { // Uuid of the cluster string uuid = 1; - // Progress of the cluster reconcilation + // Progress of the cluster reconciliation uint32 progress = 2; // State of the cluster string state = 3; @@ -309,7 +309,7 @@ message ClusterStatus { string nodes_ready = 12; // SystemComponentsReady represents the ready state of the system components string system_components_ready = 13; - // LastErrors is a list of the last known errors occured during the cluster reconcilation + // LastErrors is a list of the last known errors occurred during the cluster reconciliation repeated ClusterStatusLastError last_errors = 14; // ClusterStatusConditions is a list of status conditions of the cluster repeated ClusterStatusCondition conditions = 15; @@ -399,7 +399,7 @@ message ClusterServiceOperateResponse { Cluster cluster = 1; } -// Operate defines the types of reconcilation to be triggered +// Operate defines the types of reconciliation to be triggered enum Operate { // OPERATE_UNSPECIFIED is not specified OPERATE_UNSPECIFIED = 0; @@ -407,6 +407,6 @@ enum Operate { OPERATE_RECONCILE = 1; // OPERATE_MAINTAIN maintain the cluster OPERATE_MAINTAIN = 2; - // OPERATE_RETRY retry the reconcilation of the cluster + // OPERATE_RETRY retry the reconciliation of the cluster OPERATE_RETRY = 3; } diff --git a/proto/api/v1/payment.proto b/proto/api/v1/payment.proto index 41f46de5..1f8bb1d3 100644 --- a/proto/api/v1/payment.proto +++ b/proto/api/v1/payment.proto @@ -95,7 +95,7 @@ message PaymentCustomer { // SubscriptionId of the customer string subscription_id = 5; // Email of the customer - optional string email = 6; + optional string email = 6 [(validate.rules).string.email = true]; // Card the customer supplied optional Card card = 7; // Prices which apply to customer resources diff --git a/proto/api/v1/project.proto b/proto/api/v1/project.proto index 5cfbe532..6d63e91c 100644 --- a/proto/api/v1/project.proto +++ b/proto/api/v1/project.proto @@ -229,7 +229,7 @@ message ProjectServiceInviteRequest { // ProjectServiceInviteRequest is the response payload to a invite member request message ProjectServiceInviteResponse { // Inviter contains a secret which can be sent to a potential user - // can appended to the invitation endpoint at our api server like + // can be appended to the invitation endpoint at our cloud console like // console.metalstack.cloud/invite/ ProjectInvite invite = 1; } diff --git a/proto/api/v1/tenant.proto b/proto/api/v1/tenant.proto index f5942549..33836d8b 100644 --- a/proto/api/v1/tenant.proto +++ b/proto/api/v1/tenant.proto @@ -5,19 +5,25 @@ package api.v1; import "api/v1/common.proto"; import "api/v1/payment.proto"; import "google/protobuf/timestamp.proto"; +import "validate/validate.proto"; // TenantService serves tenant related functions service TenantService { // Create a tenant rpc Create(TenantServiceCreateRequest) returns (TenantServiceCreateResponse) { - option (tenant_roles) = TENANT_ROLE_OWNER; - option (tenant_roles) = TENANT_ROLE_EDITOR; + option (visibility) = VISIBILITY_SELF; + option (auditing) = AUDITING_INCLUDED; } // CreateOrUpdate should only be used from within the application // will check if tenant already exists and updates if necessary, otherwise create a new tenant rpc CreateOrUpdate(TenantServiceCreateOrUpdateRequest) returns (TenantServiceCreateOrUpdateResponse) { option (visibility) = VISIBILITY_PRIVATE; } + // List tenants + rpc List(TenantServiceListRequest) returns (TenantServiceListResponse) { + option (visibility) = VISIBILITY_SELF; + option (auditing) = AUDITING_EXCLUDED; + } // Get a tenant rpc Get(TenantServiceGetRequest) returns (TenantServiceGetResponse) { option (tenant_roles) = TENANT_ROLE_OWNER; @@ -29,11 +35,51 @@ service TenantService { rpc Update(TenantServiceUpdateRequest) returns (TenantServiceUpdateResponse) { option (tenant_roles) = TENANT_ROLE_OWNER; option (tenant_roles) = TENANT_ROLE_EDITOR; + option (auditing) = AUDITING_INCLUDED; } // Delete a tenant rpc Delete(TenantServiceDeleteRequest) returns (TenantServiceDeleteResponse) { option (tenant_roles) = TENANT_ROLE_OWNER; option (tenant_roles) = TENANT_ROLE_EDITOR; + option (auditing) = AUDITING_INCLUDED; + } + + // RemoveMember remove a member of a tenant + rpc RemoveMember(TenantServiceRemoveMemberRequest) returns (TenantServiceRemoveMemberResponse) { + option (tenant_roles) = TENANT_ROLE_OWNER; + option (auditing) = AUDITING_INCLUDED; + } + + // UpdateMember update a member of a tenant + rpc UpdateMember(TenantServiceUpdateMemberRequest) returns (TenantServiceUpdateMemberResponse) { + option (tenant_roles) = TENANT_ROLE_OWNER; + option (auditing) = AUDITING_INCLUDED; + } + + // Invite a user to a tenant + rpc Invite(TenantServiceInviteRequest) returns (TenantServiceInviteResponse) { + option (tenant_roles) = TENANT_ROLE_OWNER; + option (auditing) = AUDITING_INCLUDED; + } + // InviteAccept is called from a user to accept an invitation + rpc InviteAccept(TenantServiceInviteAcceptRequest) returns (TenantServiceInviteAcceptResponse) { + option (visibility) = VISIBILITY_SELF; + option (auditing) = AUDITING_INCLUDED; + } + // InviteDelete deletes a pending invitation + rpc InviteDelete(TenantServiceInviteDeleteRequest) returns (TenantServiceInviteDeleteResponse) { + option (tenant_roles) = TENANT_ROLE_OWNER; + option (auditing) = AUDITING_INCLUDED; + } + // InvitesList list all invites to a tenant + rpc InvitesList(TenantServiceInvitesListRequest) returns (TenantServiceInvitesListResponse) { + option (tenant_roles) = TENANT_ROLE_OWNER; + option (auditing) = AUDITING_EXCLUDED; + } + // InviteGet get an invite + rpc InviteGet(TenantServiceInviteGetRequest) returns (TenantServiceInviteGetResponse) { + option (visibility) = VISIBILITY_SELF; + option (auditing) = AUDITING_EXCLUDED; } } @@ -41,10 +87,12 @@ service TenantService { message Tenant { // Login of the tenant string login = 1; - // Name if the tenant + // Name of the tenant string name = 2; // Email of the tenant string email = 3; + // Description of this tenant + string description = 4; // AvatarUrl of the tenant string avatar_url = 5; // OauthProvider of the tenant @@ -61,6 +109,10 @@ message Tenant { bool email_consent = 12; // Onboarded checks if the tenant was asked to be onboarded bool onboarded = 13; + // TenantMembers of this tenant + repeated TenantMember tenant_members = 14; + // CreatedBy stores who created this tenant + string created_by = 15; // CreatedAt the date when this tenant was created google.protobuf.Timestamp created_at = 20; // UpdatedAt the date when this tenant was updated @@ -69,6 +121,38 @@ message Tenant { google.protobuf.Timestamp deleted_at = 22; } +// TenantMember defines a user that participates at a tenant +message TenantMember { + // Id is the user id of the member + string id = 1; + // Role is the role of the member + TenantRole role = 2; + // CreatedAt the date when the member was added to the tenant + google.protobuf.Timestamp created_at = 10; +} + +// TenantInvite defines invite to tenant +message TenantInvite { + // Secret is the secret part of the invite, typically part of the url + string secret = 1; + // TargetTenant is the tenant id for which this invite was created + string target_tenant = 2; + // Role is the role in this tenant the user will get after accepting the invitation + TenantRole role = 3; + // Joined is false as long as a user has not accepted the invite + bool joined = 4; + // TargetTenantName is the tenant name for which this invite was created + string target_tenant_name = 5; + // Tenant is the login of tenant who invites to join this tenant + string tenant = 6; + // TenantName is the name of tenant who invites to join this tenant + string tenant_name = 7; + // ExpiresAt the date when this invite expires + google.protobuf.Timestamp expires_at = 10; + // JoinedAt the date when the member accepted this invite + google.protobuf.Timestamp joined_at = 11; +} + // PaymentDetails of a tenant message PaymentDetails { // CustomerId at the payment processor @@ -111,6 +195,17 @@ message TermsAndConditionsUpdate { optional google.protobuf.Timestamp when = 2; } +// TenantServiceListRequest is the request payload of the tenant list request +message TenantServiceListRequest { + // Id filters tenants by id + optional string id = 1; + // Name filters tenants by name + optional string name = 2 [(validate.rules).string = { + min_len: 2, + max_len: 64, + }]; +} + // TenantServiceGetRequest is the request payload of the tenant get request message TenantServiceGetRequest { // Login of the tenant @@ -119,8 +214,22 @@ message TenantServiceGetRequest { // TenantServiceCreateRequest is the request payload of the tenant create request message TenantServiceCreateRequest { - // Tenant the tenant to create - Tenant tenant = 1; + // Name of this tenant + string name = 1 [(validate.rules).string = { + min_len: 2, + max_len: 64, + }]; + // Description of this tenant + optional string description = 2 [(validate.rules).string = { + min_len: 2, + max_len: 512, + }]; + // Email of the tenant, if not set will be inherited from the creator + optional string email = 3 [(validate.rules).string.email = true]; + // AvatarUrl of the tenant + optional string avatar_url = 4; + // PhoneNumber of the tenant + optional string phone_number = 5; } // TenantServiceCreateOrUpdateRequest is the request payload of the tenant create or update request @@ -134,9 +243,17 @@ message TenantServiceUpdateRequest { // Login of the tenant string login = 1; // Name of the tenant - optional string name = 2; + optional string name = 2 [(validate.rules).string = { + min_len: 2, + max_len: 64, + }]; // Email of the tenant - optional string email = 3; + optional string email = 3 [(validate.rules).string.email = true]; + // Description of this tenant + optional string description = 4 [(validate.rules).string = { + min_len: 2, + max_len: 512, + }]; // AvatarUrl of the tenant optional string avatar_url = 5; // PaymentDetails of the tenant @@ -159,6 +276,12 @@ message TenantServiceGetResponse { Tenant tenant = 1; } +// TenantServiceListResponse is the response payload of the tenant list request +message TenantServiceListResponse { + // Tenants is the list of tenants + repeated Tenant tenants = 1; +} + // TenantServiceCreateResponse is the response payload of the tenant create request message TenantServiceCreateResponse { // Tenant is the tenant @@ -182,3 +305,95 @@ message TenantServiceDeleteResponse { // Tenant is the tenant Tenant tenant = 1; } + +// TenantServiceInviteRequest is used to invite a member to a tenant +message TenantServiceInviteRequest { + // Login of the tenant + string login = 1; + // Role of this user in this tenant + TenantRole role = 2; +} + +// TenantServiceInviteRequest is the response payload to a invite member request +message TenantServiceInviteResponse { + // Invite contains a secret which can be sent to a potential user + // can be appended to the invitation endpoint at our cloud console like + // console.metalstack.cloud/invite/ + TenantInvite invite = 1; +} + +// TenantServiceInvitesListRequest is the request payload to a list invites request +message TenantServiceInvitesListRequest { + // Login of the tenant + string login = 1; +} + +// TenantServiceInvitesListResponse is the response payload to a list invites request +message TenantServiceInvitesListResponse { + // Invites not already accepted the invitation to this tenant + repeated TenantInvite invites = 1; +} + +// TenantServiceInviteGetRequest is the request payload to get a invite +message TenantServiceInviteGetRequest { + // Secret of the invite to get + string secret = 1; +} + +// TenantServiceInviteGetResponse is the response payload to a get invite request +message TenantServiceInviteGetResponse { + // Invite is the invite + TenantInvite invite = 1; +} + +// TenantServiceRemoveMemberRequest is used to remove a member from a tenant +message TenantServiceRemoveMemberRequest { + // Login of the tenant + string login = 1; + // MemberID is the id of the member to remove from this tenant + string member_id = 2; +} + +// TenantServiceRemoveMemberResponse is the response payload to a remove member request +message TenantServiceRemoveMemberResponse {} + +// TenantServiceInviteAcceptRequest is the request payload to a accept invite request +message TenantServiceInviteAcceptRequest { + // Secret is the invitation secret part of the invitation url + string secret = 1; +} + +// TenantServiceInvitesListResponse is the response payload to a accept invite request +message TenantServiceInviteAcceptResponse { + // Tenant ID of the joined tenant + string tenant = 1; + // TenantName of the joined tenant + string tenant_name = 2; +} + +// TenantServiceInviteDeleteRequest is the request payload to a delete invite +message TenantServiceInviteDeleteRequest { + // Login of the tenant + string login = 1; + // Secret of the invite to delete + string secret = 2; +} + +// TenantServiceInviteDeleteResponse is the response payload of a delete invite request +message TenantServiceInviteDeleteResponse {} + +// TenantServiceUpdateMemberRequest is used to update a member from a tenant +message TenantServiceUpdateMemberRequest { + // Login of the tenant + string login = 1; + // MemberID is the id of the member to update in this tenant + string member_id = 2; + // Role of this user in this tenant + TenantRole role = 3; +} + +// TenantServiceUpdateMemberResponse is the response payload to a update member request +message TenantServiceUpdateMemberResponse { + // TenantMember is the updated membership + TenantMember tenant_member = 1; +} diff --git a/proto/api/v1/volume.proto b/proto/api/v1/volume.proto index 2f0f2791..5e055762 100644 --- a/proto/api/v1/volume.proto +++ b/proto/api/v1/volume.proto @@ -109,11 +109,11 @@ message VolumeStatistics { // // Physical storage space used by volume excluding parity, given in bytes. uint64 physical_used_storage = 2; - // CommpressionRatio + // CompressionRatio // // compression ratio userWritten/physicalCapacity double compression_ratio = 3; - // TotalCommpressionRatio + // TotalCompressionRatio // // compression ratio sum(userWritten) / sum(physical capacity) double total_compression_ratio = 4; diff --git a/proto/buf.gen.yaml b/proto/buf.gen.yaml index 8cc97ebf..618813bd 100644 --- a/proto/buf.gen.yaml +++ b/proto/buf.gen.yaml @@ -1,3 +1,4 @@ +--- version: v1 managed: enabled: true @@ -36,7 +37,7 @@ plugins: # - plugin: buf.build/community/neoeinstein-tonic:v0.4.0 # out: ../rs # Create python client - # - plugin: buf.build/protocolbuffers/python:v25.3 + # - plugin: buf.build/protocolbuffers/python:v26.1 # out: ../python - # - plugin: buf.build/grpc/python:v1.62.0 + # - plugin: buf.build/grpc/python:v1.62.1 # out: ../python diff --git a/proto/buf.lock b/proto/buf.lock index 26d1ebc8..7e30502a 100644 --- a/proto/buf.lock +++ b/proto/buf.lock @@ -9,5 +9,5 @@ deps: - remote: buf.build owner: googleapis repository: googleapis - commit: ee48893a270147348e3edc6c1a03de0e - digest: shake256:a35b0576a2b55dad72747e786af05c03539c2b96be236c9de39fe10d551931ac252eb68445c0cef6bbd27fa20e8c26eee5b8a9fe9c2fde6f63a03e18f8cf980d + commit: 7a6bc1e3207144b38e9066861e1de0ff + digest: shake256:d646836485c34192401253703c4e7ce899c826fceec060bf4b2a62c4749bd9976dc960833e134a1f814725e1ffd60b1bb3cf0335a7e99ef0e8cec34b070ffb66 diff --git a/proto/buf.yaml b/proto/buf.yaml index cf1c375d..8c0a90b2 100644 --- a/proto/buf.yaml +++ b/proto/buf.yaml @@ -7,6 +7,7 @@ lint: - DEFAULT - COMMENTS - PACKAGE_NO_IMPORT_CYCLE + - RPC_NO_CLIENT_STREAMING deps: - buf.build/envoyproxy/protoc-gen-validate - buf.build/googleapis/googleapis